1. 程式人生 > >C程式設計 | C語句及資料的輸入輸出

C程式設計 | C語句及資料的輸入輸出

C程式結構

C語句的分類

  • 控制語句
  • 函式呼叫語句
  • 表示式語句
  • 空語句
  • 複合語句

(1)控制語句:控制語句用於完成一定的控制功能,C共有9種控制語句

  • if()…else…(條件語句)
  • for()…(迴圈語句)
  • while()…(迴圈語句)
  • do…while ()(迴圈語句)
  • continue(結束本次迴圈語句)
  • break(中止執行switch或迴圈語句)
  • switch(多分支選擇語句)
  • return(從函式返回語句)
  • goto(轉向語句,在結構化程式中基本不用goto語句) ()表示括號中是一個判別條件 …表示內嵌的語句

(2)函式呼叫語句:函式呼叫語句由一個函式呼叫加一個分號

構成。

         printf("This is a C statement. ");   //其中printf("This is a C statement. ")是一個函式呼叫,加一個分號成為一個語句。

(3)表示式語句:表示式語句由一個表示式加一個分號構成,最典型的是由賦值表示式構成一個賦值語句。

         a=3 是一個賦值表示式,而 a=3; 是一個賦值語句

(4)空語句:只有一個分號的語句即為空語句。

  • 可用來作為流程的轉向點(流程從程式其他地方轉到此語句處) 
  • 也可用來作為迴圈語句中的迴圈體(迴圈體是空語句,表示迴圈體什麼也不做)

(5)複合語句:可以{}

把一些語句和宣告括起來成為複合語句(又稱語句塊)。

{
	float pi=3.14159, r=2.5, area; //定義變數
	area=pi*r*r;
	printf("area=%f",area);
}

複合語句常用在if語句或迴圈中,此時程式需要連續執行一組語句。複合語句中最後一個語句末尾的分號不能忽略不寫。

最基本的語句——賦值語句

1、賦值運算子"="

"="的作用是將一個數據賦給一個變數(也可以將一個表示式的值賦給一個變數)。

例如:a=3的作用是執行一次賦值操作(或稱賦值運算)。把常量3賦給變數a。

2、複合賦值運算子

賦值符"="之前加上其他運算子,可以構成複合的運算子。

  • a+=3    等價於a=a+3

  • x*=y+8     等價於x=x*(y+8)
  • x%=3    等價於x=x%3

凡是二元(二目)運算子,都可以與賦值符一起組合成複合賦值符。

有關算術運算的複合賦值運算子有+=,-=,*=,/=,%=.

注意:如果賦值符右邊是包含若干項的表示式,則相當於它有括號。例如, x%=y+3等價於x=x%(y+3),切勿錯寫為x=x%y+3。

3、賦值表示式 :變數  賦值運算子  表示式

賦值表示式的作用是將一個表示式的值賦給一個變數,因此賦值表示式具有計算和賦值的雙重功能

對賦值表示式求解的過程是: 

①求賦值運算子右側的“表示式”的值,

②賦給賦值運算子左側的變數。既然是一個表示式,就應該有一個值,表示式的值等於賦值後左側變數的值。 賦值運算子左側應該是一個可修改值的“左值”(left value,簡寫為lvalue)。 能出現在賦值運算子右側的表示式稱為“右值”(right value,簡寫為rvalue)。【並不是任何形式的資料都可以作為左值的,左值應當為儲存空間並可以被賦值變數可以作為左值,而算術表示式a+b就不能作為左值,常量也不能作為左值。】

a=(b=5):括號內的b=5是一個賦值表示式,它的值等於5。執行表示式“a=(b=5)”,就是執行b=5和a=b兩個賦值表示式。因此a的值等於5,整個賦值表示式的值也等於5。賦值運算子按照“自右而左”的結合順序,因此,(b=5)外面的括號可以不要,即a=(b=5)和a=b=5等價,都是先求b=5的值(得5),然後再賦給a。

  • a=b=c=5     表示式值為5,a,b,c值均為5
  • a=5+(c=6)     表示式值為11,a值為11,c值為6
  • a=(b=4)+(c=6)     表示式值為10,a值為10,b等於4,c等於6
  • a=(b=10)/(c=2)    表示式值為5,a等於5,b等於10,c等於2
  • a=(b=3*4)    表示式值為12,a,b值均為12

賦值表示式使得賦值操作不僅可以出現在賦值語句中,而且可以出現在其他語句中(如輸出語句、迴圈語句等) 如: printf("%d", a=b); 如果b的值為3,則輸出a的值(也是表示式a=b的值)為3。在一個printf函式中完成了賦值和輸出雙重功能。

4、賦值過程中的型別轉換

如果賦值運算子兩側的型別一致,則直接進行賦值。

 

如果賦值運算子兩側的型別不一致,但都是基本型別時,在賦值時要進行型別轉換。型別轉換是由系統自動進行的,轉換的規則是:

  • 將浮點型資料(包括單、雙精度)賦給整型變數時,先對浮點數取整,即捨棄小數部分,然後賦予整型變數。
  • 將整型資料賦給單、雙精度變數時,數值不變,但以浮點數形式儲存到變數中。
  • 將一個double型資料賦給float變數時,先將雙精度數轉換為單精度,即只取6~7位有效數字,儲存到float型變數的4個位元組中。應注意雙精度數值的大小不能超出float型變數的數值範圍;將一個float型資料賦給double型變數時,數值不變,在記憶體中以8個位元組儲存,有效位數擴充套件到15位。
  • 字元型資料賦給整型變數時,將字元的ASCII程式碼賦給整型變數。
  • 將一個佔位元組多的整型資料賦給一個佔位元組少的整型變數或字元變數時,只將其低位元組原封不動地送到被賦值的變數(即發生“截斷”)。

5、賦值表示式和賦值語句

C語言的賦值語句屬於表示式語句,由一個賦值表示式加一個分號組成。 在一個表示式中可以包含另一個表示式

區分賦值表示式和賦值語句:

  • 賦值表示式的末尾沒有分號,而賦值語句的末尾必須有分號
  • 在一個表示式中可以包含一個或多個賦值表示式,但絕不能包含賦值語句。
if ((a=b)>0)max=a; /*先進行賦值運算(將b的值賦給a),然後判斷a是否大於0,
如大於0,執行max=a。 請注意,在if語句中的a=b不是賦值語句,而是賦值表示式。*/

6、變數賦初值

可以用賦值語句對變數賦值,也可以在定義變數時對變數賦以初值。

  • int a=3;         //指定a為整型變數,初值為3;相當於int a; a=3;

  • float f=3.56;    //指定f為浮點型變數,初值為3.56
  • char c=′a′;    //指定c為字元變數,初值為′a′
  • int a,b,c=5;    //指定a,b,c為整型變數,但只對c初始化,c的初值為5,相當於int a,b,c; c=5;

對幾個變數賦予同一個初值,必須注意:

  

資料的輸入輸出

1、輸入輸出舉例

求ax²+bx+c=0方程的根。a,b,c由鍵盤輸入,設b²-4ac>0。

#include <stdio.h>
#include<math.h>						//程式中要呼叫求平方根函式sqrt
int main() 
{	double a,b,c,disc,x1,x2,p,q;			//disc用來存放判別式(bb-4ac)的值
	scanf("%lf%lf%lf",&a,&b,&c);			//輸入雙精度型變數的值要用格式宣告″%lf″
	disc=b*b-4*a*c;
	p=-b/(2.0*a);
	q=sqrt(disc)/(2.0*a);
	x1=p+q;x2=p-q; 					//求出方程的兩個根
	printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);	//輸出方程的兩個根
	return 0;
}

執行結果:

程式分析:

scanf函式用於輸入a,b,c的值。 函式中括號內變數a,b,c的前面,要用地址符&&a表示變數a在記憶體中的地址。 雙引號內用%lf格式宣告,表示輸入的是雙精度型實數。 格式宣告為“%lf%lf%lf”,要求輸入3個雙精度實數。程式執行時,輸入“1 3 2”,兩個數之間用空格分開。輸入的雖是整數,但由於指定用%lf格式輸入,因此係統會先把這3個整數轉換成實數1.0,3.0,2.0,然後賦給變數a,b,c。

在printf函式中,在格式符f的前面加了“7.2”,表示在輸出x1和x2時,指定資料佔7列,其中小數佔2列。優點: ①可以根據實際需要來輸出小數的位數; ②如果輸出多個數據,可使輸出資料整齊美觀。

2、有關輸入輸出的概念

3、用printf函式輸出資料

用來向終端(或系統隱含指定的輸出裝置)輸出若干個任意型別的資料。

一般格式:printf(格式控制,輸出表列)

(1) “格式控制”是用雙引號括起來的一個字串,稱為格式控制字串,簡稱格式字串。包括:

① 格式宣告。格式宣告由“%”和格式字元組成。作用是將輸出的資料轉換為指定的格式後輸出

② 普通字元。普通字元即需要在輸出時原樣輸出的字元。  

(2) 輸出表列是程式需要輸出的一些資料,可以是常量、變數或表示式

·printf函式——格式宣告(%  附加字元  格式字元

格式字元

說    明

d,i

以帶符號的十進位制形式輸出整數(正數不輸出符號)

o

以八進位制無符號形式輸出整數(不輸出前導符0)

x,X

以十六進位制無符號形式輸出整數(不輸出前導符0x),用x則輸出十六進位制數的a~f時以小寫形式輸出,用X時,則以大寫字母輸出

u

以無符號十進位制形式輸出整數

c

以字元形式輸出,只輸出一個字元

s

輸出字串

f

以小數形式輸出單、雙精度數,隱含輸出6位小數

e,E

以指數形式輸出實數,用e時指數以“e”表示(如1.2e+02),用E時指數以“E”表示(如1.2E+02)

g,G

選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0。用G時,若以指數形式輸出,則指數以大寫表示

附加字元

說    明

l

長整型整數,可加在格式符d、o、x、u前面)

m

(代表一個正整數)

資料最小寬度

n

(代表一個正整數)

對實數,表示輸出n位小數;對字串,表示擷取的字元個數

-

輸出的數字或字元在域內向左靠

注意: 

  1. printf函式輸出時,務必注意輸出物件的型別應與上述格式說明匹配,否則將會出現錯誤。
  2. 除了X,E,G外,其他格式字元必須用小寫字母,如%d不能寫成%D。
  3. 可以在printf函式中的格式控制字串內包含轉義字元,如\n,\t,\b,\r,\f和\377等。
  4. 一個格式宣告以“%”開頭,以格式字元之一為結束,中間可以插入附加格式字元(也稱修飾符)。
  5. 如果想輸出字元“%”,應該在“格式控制字串”中用連續兩個“%”表示,如:printf(″%f%%\n″,1.0/3);

補充:

·printf函式舉例 

①用%f輸出實數,只能得到6位小數。

#include <stdio.h>
int main()
{	double a=1.0;
	printf("%f\n",a/3);
	return 0;
}

執行結果:

 

程式分析:

雖然a是雙精度型,a/3的結果也是雙精度型,但是用%f格式宣告只能輸出6位小數

②在“%”和格式控制符之間插進數字,表示輸出項的最大域寬

#include<stdio.h>
int main()
{
   float r=5.7,s;
   s=3.1416*r*r;   
   printf("R=%10.3f,S=%10.3f。\n",r,s);
   return 0;
}

執行結果:

 程式分析:

R與S的輸出數值都為10列,並且小時部分佔3位,並且輸出為右對齊

③在“%”和格式控制符之間加入"-" 號,控制輸出為左對齊,否則為右對齊。

#include<stdio.h>
int main()
{
	float r=5.7,s;
	s=3.1416*r*r;   
	printf("R=%-10.3f,S=%-10.3f。\n",r,s);
   return 0;
}

執行結果: 

程式分析:

程式輸出為左對齊,R與S的輸出數值都為10列,並且小時部分佔3位。

4、用scanf函式輸入資料

格式化輸入函式,從標準輸入裝置為變數輸入資料。在scanf()函式中設計資料的輸入格式,執行該函式時,即按照所設計的格式輸入資料。

一般格式:scanf(格式控制,地址表列)

(1) “格式控制”是用雙引號括起來的一個字串,含義同printf函式。包括:

① 格式宣告。以%開始,以一個格式字元結束,中間可以插入附加的字元。

② 普通字元。

 (2) 地址表列是由若干個地址組成的表列,可以是變數的地址,或字串的首地址

·scanf函式——格式宣告(%  附加字元  格式字元

格式字元

說    明

d,i

輸入有符號的十進位制整數

u

輸入無符號的十進位制整數

o

輸入無符號的八進位制整數

x,X

輸入無符號的十六進位制整數(大小寫作用相同)

c

輸入單個字元

s

輸入字串,將字串送到一個字元陣列中,在輸入時以非空白字元開始,以第一個空白字元結束。字串以串結束標誌′\0′作為其最後一個字元

f

輸入實數,可以用小數形式或指數形式輸入

e,E,g,G

與f作用相同,e與f、g可以互相替換(大小寫作用相同)

附加字元

說    明

l

輸入長整型資料(可用%ld,%lo,%lx,%lu)以及double型資料(用%lf或%le)

h

輸入短整型資料(可用%hd,%ho,%hx)

域寬

指定輸入資料所佔寬度(列數),域寬應為正整數

*

本輸入項在讀入後不賦給相應的變數

 注意:

  1. scanf函式中的格式控制後面應當是變數地址,而不是變數名。 應與上述格式說明匹配,否則將會出現錯誤。
  2. 如果在格式控制字串中除了格式宣告以外還有其他字元,則在輸入資料時在對應的位置上應輸入與這些字元相同的字元。
  3. 在用“%c”格式宣告輸入字元時,空格字元和“轉義字元”中的字元都作為有效字元輸入。
  4. 在輸入數值資料時,如輸入空格、回車、Tab鍵或遇非法字元(不屬於數值的字元),認為該資料結束。
  5. “格式化字串”中的格式控制符之間可以不使用任何分隔符號,也常用逗號分隔。 當不使用任何分隔符時,輸入的資料之間可以使用空格分隔,也可以使用回車符分隔; 使用“,”分隔時,輸入資料時各個資料之間要使用“,”分隔

 ·scanf函式舉例 

  使用逗號“,”分隔資料示例。

#include<stdio.h>
int main()
{
	 int a,b,c;  
	 printf("Input a,b:"); 
	 scanf("%d,%d",&a,&b);     
	 c=a+b;   
	 printf("%d+%d=%d\n",a,b,c); 
    return 0;
}

執行結果: 

程式分析:

%d之間用”,”分隔,輸入資料時,兩個資料之間只能以”,”分隔。全部資料輸入結束後按回車鍵。

5、putchar函式輸出字元

呼叫格式: putchar(ch)

功能:向標準輸出裝置輸出一個字元

說明:

  • ch為一個字元變數名或字元常量,putchar(ch)函式是將ch的值顯示在螢幕上。
  • 用putchar函式既可以輸出可顯示字元,也可以輸出控制字元和轉義字元
  • putchar(ch)中的ch可以是字元常量、整型常量、字元變數或整型變數(其值在字元的ASCII程式碼範圍內)。

 ·putchar函式舉例 

先後輸出BOY三個字元。

解題思路:  定義3個字元變數,分別賦以初值′B′,′O′,′Y′,然後用putchar函式輸出這3個字元變數的值。

#include <stdio.h>
int main()
{
	char a='B',b='O',c='Y';	//定義3個字元變數並初始化
	putchar(a);				//向顯示器輸出字元B
	putchar(b);				//向顯示器輸出字元O
	putchar(c);				//向顯示器輸出字元Y
	putchar ('\n');			//向顯示器輸出一個換行符
	return 0;
}

執行結果:

 

程式分析:

以上程式也等價於

#include <stdio.h>
int main()
{
	int a=66,b=79,c=89;
 	putchar(a);	
	putchar(b);	
	putchar(c);
 	putchar ('\n');
 	return 0;
}

6、getchar函式輸入字元

呼叫格式:getchar()

功能:從鍵盤輸入的字串中讀入一個字元

說明:

  • 函式沒有引數
  • 函式的值就是從輸入裝置得到的字元。 只能接收一個字元
  • 如果想輸入多個字元就要用多個函式。 不僅可以從輸入裝置獲得一個可顯示的字元,而且可以獲得控制字元。
  • 用getchar函式得到的字元可以賦給一個字元變數或整型變數,也可以作為表示式的一部分。如:putchar(getchar());將接收到的字元輸出。

 ·getchar函式舉例 

①從鍵盤輸入BOY 3個字元,然後把它們輸出到螢幕。

解題思路:用3個getchar函式先後從鍵盤向計算機輸入BOY 3個字元,然後用putchar函式輸出。

#include <stdio.h>
int main()
{	char a,b,c;	//定義字元變數a,b,c
	a=getchar();	//從鍵盤輸入一個字元,送給字元變數a
	b=getchar();	//從鍵盤輸入一個字元,送給字元變數b
	c=getchar();	//從鍵盤輸入一個字元,送給字元變數c
	putchar(a); 	//將變數a的值輸出
	putchar(b); 	//將變數b的值輸出 
	putchar(c); 	//將變數c的值輸出
	putchar('\n');//換行
	return 0;
}

執行結果:

②從鍵盤輸入一個大寫字母,在顯示屏上顯示對應的小寫字母

解題思路:用getchar函式從鍵盤讀入一個大寫字母,把它轉換為小寫字母,然後用putchar函式輸出該小寫字母。

#include <stdio.h>
int main ()
{
	char c1,c2;
	c1=getchar();	//從鍵盤讀入一個大寫字母,賦給字元變數c1
	c2=c1+32;	//得到對應的小寫字母的ASCII程式碼,放在字元變數c2中
	printf("大寫字母: %c\n小寫字母: %c\n",c1,c2);	//輸出c1,c2的值
	return 0;
}

執行結果: