C語言程序設計之第三章

3.1 順序程序設計舉例

【例3.1】有人用溫度計測量出用華氏法表示的溫度,今要求把它轉換爲以攝氏法表示的溫度

需要知道轉換公式:c=5/9(f-32)

#include<stdio.h>
int main()
{
	float f,c;
	f=64.0;
	c=(5.0/9)*(f-32);
	printf("f=%f\nc=%f\n",f,c);
	return 0;
} 

在這裏插入圖片描述
【例3.2】計算存款利息。
有1000元,想存一年。有3種方法可選:
(1)活期,年利率爲r1;
(2)一年期定期,年利率爲r2;
(3)存兩次半年定期,年利率爲r3。
請分別計算出一年後按3種方法所得到的本息和。

#include<stdio.h>
int main()
{
	float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;
	p1=p0*(1+r1);
	p2=p0*(1+r2);
	p3=p0*(1+r3/2)*(1+r3/2);
	printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3);
	return 0;
} 

在這裏插入圖片描述

3.2 數據的表現形式及其運算

3.2.1 常量和變量

在計算機高級語言中,數據有兩種表現形式:常量和變量

1.常量

在程序運行過程中,其值不能被改變的量稱爲常量。

數值常量就是數學中的常數。

1)整型常量
2)實型常量
①十進制小數形式,由數字和小數點組成
②指數形式
(規定以字母e或E代表以10爲底的指數。
e或E之前必須有數字,且e或E後面必須爲整數)
3)字符常量
①普通字符
②轉義字符
4)字符串常量
5)符號常量

2.變量

變量代表一個有名字的、具有特定屬性的一個存儲單元。用來存放數據,即存放變量的值。

變量必須先定義後使用

(注意區分)
變量值即存放在某內存單元的數據。
變量名實際上是以一個名字代表的一個存儲地址。

3.常變量

C99允許使用常變量,方法是在定義變量時,前面加一個關鍵字const

常變量和常量的異同:常變量具有變量的基本屬性:有類型,佔存儲單元,只是不允許改變其值。可以說,常變量是有名字的不變量,而常量是沒有名字的不變量。

4.標識符

在計算機高級語言中,用來對變量、符號常量名、函數、數組、類型等命名的有效字符序列統稱爲標識符。

C語言規定標識符只能由字母、數字和下劃線3種字符組成,且第一個字符必須爲字母或下劃線。

3.2.2 數據類型

所謂類型,就是對數據分配存儲單元的安排,包括存儲單元的長度(佔多少字節)以及數據的存儲形式。

在這裏插入圖片描述
基本類型和枚舉類型變量的值都是數值,統稱爲算術類型。
算術類型和指針類型統稱爲純量類型。
枚舉類型是程序中用戶定義的整數類型。
數組類型和結構體類型統稱爲組合類型,共用體類型不屬於組合類型。
函數類型用來定義函數,描述一個函數的接口,包括函數返回值的數據類型和參數的類型。

不同類型的數據在內存中佔用的存儲單元長度是不同的。

3.2.3 整型數據

1.整型數據的分類

1)基本整型(int型)
2)短整型(short int)
3)長整型(long int)
4)雙長整型(long long int)

2.整型變量的符號屬性

變量值在存儲單元中都是以補碼形式存儲的,存儲單元中的第一個二進制代表符號。

3.2.4 字符型數據

1.字符與字符代碼

ASCII字符集的基本集包括了127個字符

2.字符變量

字符變量是用類型符char定義字符變量的

在輸出字符變量的值時,用“%d”格式輸出十進制整數,用“%c”輸出字符形式

3.2.5 浮點型數據

浮點型數據是用來表示具有小數點的實數的。在C語言中,實數是以指數形式存放在存儲單元中的。

浮點數類型包括float(單精度浮點型)、double(雙精度浮點型)、long double(長雙精度浮點型)
1)float(單精度浮點型)
2)double(雙精度浮點型)
3)long double(長雙精度浮點型)

3.2.6 怎樣確定常量的類型

不帶小數點的數值是整型常量。
在一個整數的末尾加大寫字母L或小寫字母l,表示它是長整型。

凡以小數形式或指數形式出現的實數均是浮點類型常量,在內存中都是以指數形式存儲。
C編譯系統把浮點型常量都按雙精度處理,分配8個字節。

可以在常量的末尾加專用字符,強制指定常量的類型。

區分類型與變量
每一個變量都屬於一個確定的類型,類型是變量的一個重要屬性。變量是佔用存儲單元的,是具體存在的實體,在其佔用的存儲單元中可以存放數據。而類型是變量的共性,是抽象的,不佔用存儲單元,不能用來存放數據。

3.3 運算符和表達式

3.3.1 C運算符

1)算術運算符(+ - * / % ++ --)
2)關係運算符(> < == >= <= !=)
3)邏輯運算符(! && ||)
4)位運算符(<< >> ~ | ^ &)
5)賦值運算符(=及其擴展賦值運算符)
6)條件運算符(?:)
7)逗號運算符(,)
8)指針運算符(&)
9)求字節數運算符(sizeof)
10)強制類型轉換運算符((類型))
11)成員運算符(.->)
12)下標運算符([ ])
13)其他(如函數調用運算符())

3.3.2 基礎的算術運算符

3.3.3 自增、自減運算符

自增(++)和自減(–)運算符的作用是使變量的值加1或減1

自增(減)運算符常用於循環語句中,使循環變量自動加1;也用於指針變量,使指針指向下一個地址。

3.3.4 算術表達式和運算符的優先級與結合性

用算術運算符和括號將運算對象(也稱操作數)連接起來的、符合C語法規則的式子稱爲C算術表達式。

C語言規定了運算符的優先級,還規定了運算符的結合性。

C語言規定了各種運算符的結合方向(結合性),算術運算符的結合方向都是“自左向右”,賦值運算符的結合方向都是“自右向左”。

3.3.5 不同類型數據間的混合運算

規律爲:
1)+、-、*、/運算的兩個數中有一個數爲float或double型,結果是double型,因爲系統將所有float型數據都先轉換爲double型,然後進行計算。
2)如果int型與float型或double型數據進行計算,先把int型和float型轉換爲double型,然後進行計算,結果是double型。
3)字符型數據與整型數據進行計算,就是把字符的ASCII代碼與整型數據進行運算。

【例3.3】給定一個大寫字母,要求用小寫字母輸出。

#include<stdio.h>
int main()
{
	char c1,c2;
	c1='A';
	c2=c1+32;
	printf("%c\n",c2);
	printf("%d\n",c2);
	return 0;
}

在這裏插入圖片描述

3.3.6 強制類型轉換運算符

其一般形式爲:(類型名)(表達式)

3.4 C語句

3.4.1 C語句的作用與分類

分爲五類:
1)控制語句
①if() …else…(條件語句)
②for() (循環語句)
③while() (循環語句)
④do…while() (循環語句)
⑤continue (結束本次循環語句)
⑥break (中止執行switch或循環語句)
⑦switch (多分支選擇語句)
⑧retrun (從函數返回語句)
⑨goto (轉向語句,在結構化程序中基本不用該語句)

2)函數調用語句(函數調用語句由一個函數調用加一個分號構成)
3)表達式語句(表達式語句由一個表達式加一個分號構成)
一個表達式的最後一個加分號就成了一個語句。一個語句必然在最後有一個分號,分號是語句中不可缺少的組成部分。
4)空語句
5)複合語句(可以用{}把一些語句和聲明括起來稱爲複合語句(又稱語句塊))
複合語句中最後一個語句末尾的分號不能省略不寫

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

在C程序中,最常用的語句是:賦值語句和輸入輸出語句。其中,最基本的是賦值語句。

【例3.4】給出三角形的三邊長,求三角形的面積。

#include<stdio.h>
#include<math.h>
int main()
{
	double a,b,c,s,area;
	a=3.67;
	b=5.43;
	c=6.21;
	s=(a+b+c)/2;
	area=sqrt(s*(s-a)*(s-b)*(s-c));
	printf("a=%f\tb=%f\tc=%f\n",a,b,c);
	printf("area=%f\n",area);
	return 0;
}

在這裏插入圖片描述
以後凡是在程序中要用到數學函數庫中的函數,都應當在本文件的開頭包含math.h頭文件。

1.賦值運算符

賦值符號“=”就是賦值運算符,它的作用是將一個數據賦給一個變量,也可以將一個表達式賦給一個變量。

2.複合的賦值運算符

在賦值符=之前加上其他運算符,可以構成複合的運算符。如果在“=”前加一個“+”運算符就成了複合運算符“+=”。

凡是二元(二目)運算符,都可以與賦值符一起組合成複合賦值符。有關算術運算的複合賦值運算符有+=,-=,*=,/=,%=

3.賦值表達式

由賦值運算符將一個變量和一個表達式連接起來的式子稱爲“賦值表達式”。
一般形式爲:變量 賦值運算符 表達式

4.賦值過程中的類型轉換

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

如果賦值運算符兩側的類型不一致,但都是基本類型,在賦值時要進行類型轉換。類型轉換時由系統自動進行的,轉換的規則是:
1)將浮點型數據(包括單、雙精度)賦給整型變量時,先對浮點數取整,即捨棄小數部分,然後賦予整型變量
2)將整型數據賦給單、雙精度變量時,數值不變,但以浮點數形式存儲到變量中
3)將一個double型數據賦給float變量時,先將雙精度數轉換爲單精度,即只取6-7位有效數字,存儲到float型變量的4個字節中。將一個float型數據賦給double型變量時,數值不變,在內存中以8個字節存儲,有效位數擴展爲15位。
4)字符型數據賦給整型變量時,將字符的ASCII代碼賦給整型變量。
5)將一個佔字節多的整型數據賦給一個佔字節少的整型變量或字符變量時,只將低字節原封不動地送到被賦值的變量(即發生“截斷”)

5.賦值表達式和賦值語句

C語言的賦值語句屬於表達式語句,由一個賦值表達式加一個分號組成。

區分賦值表達式和賦值語句
賦值表達式的末尾沒有分號,而賦值語句的末尾必須有分號。在一個表達式中可以包含一個或多個賦值表達式,但絕對不能包含賦值語句。

6.變量賦初值

3.5 數據的輸入與輸出

3.5.1 輸入輸出舉例

【例3.5】求axx+bx+c=0方程的根,a,b,c,由鍵盤輸入,設bb-4ac>0

#include<stdio.h>
#include<math.h>
int main()
{
	double a,b,c,disc,x1,x2,p,q;
	scanf("%lf%lf%lf",a,b,c);
	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;
}

3.5.2 有關數據輸入輸出的概念

在討論程序的輸入輸出時要注意以下幾點:
1)所謂輸入輸出是以計算機主機爲主體而言的
2)C語言本身不提供輸入輸出語句
3)要在程序文件的開頭用預處理指令#include把有關頭文件放在本程序中

3.5.3 用printf函數輸出數據

在C程序中用來實現輸出和輸入的主要是printf函數和scanf函數。這兩個函數是格式輸入輸出函數。

1.printf函數的一般格式

printf(格式控制,輸出表列)
1)格式控制使用雙撇號括起來的一個字符串,稱爲格式控制字符串,簡稱格式字符串。包括以下兩個信息
①格式聲明
②普通字符
2)輸出表列是程序需要輸出的一些數據,可以是常量、變量或表達式。

printf函數的一般形式可以表示爲:
printf(參數1,參數2,參數3,…參數n)

2.格式字符

1)d格式符。用來輸出一個有符號的十進制整數
可以在格式聲明中指定輸出數據的域寬
2)c格式符。用來輸出一個字符
3)s格式符。用來輸出一個字符串
4)f格式符。用來輸出實數(包括單、雙精度、長雙精度),以小數形式輸出
①基本型,用%f
實數中的整數部分全部輸出,小數部分輸出6位

【例3.6】用%f輸出實數,只能得到六位小數。

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

在這裏插入圖片描述
②指定數據寬度和小數位數,用%m.nf

【例3.7】float型數據的有效位數

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

在這裏插入圖片描述
③輸出的數據向左對齊,用%-m.nf

5)e格式符。用格式聲明%e指定以指數形式輸出實數。

3.5.4 用scanf函數輸入數據

1.scanf函數的一般形式

scanf(格式控制,地址表列)
地址表列是由若干個地址組成的表列,可以是變量的地址,或字符串的首地址

2.scanf函數中的格式聲明

以%開始,以一個格式字符結束,中間可以插入附加的字符

3.使用scanf函數應注意的問題

1)scanf函數中的格式控制後面應當是變量地址,而不是變量名
2)如果在格式控制字符串中除了格式聲明以外還有其他字符,則在輸入數據是在對應位置上應輸入與這些字符相同的字符。
3)在用“%c”格式聲明輸入字符時,空格字符和轉義字符中的字符都作爲有效字符輸入
4)在輸入數值數據時,如輸入空格、回車、Tab鍵或遇非法字符,認爲該數據結束

3.5.5 字符輸入輸出數據

1.用putchar函數輸出一個字符

一般形式爲 putchar(c)
c可以是字符常量、整型常量、字符變量或整型變量(其值在ASCII代碼範圍內)

【例3.8】先後輸出BOY三個字符

#include<stdio.h>
int main()
{
	char a='B',b='O',c='Y';
	putchar(a);
	putchar(b);
	putchar(c);
	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; 
}

2.用getchar函數輸入一個字符

一般形式 getchar()

【例3.9】從鍵盤輸入BOY3個字符,然後把它們輸出到屏幕

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

在這裏插入圖片描述
執行getchar函數不僅可以從輸入設備獲得一個可顯示的字符,而且可以獲得在屏幕上無法顯示的字符。

【例3.10】改寫例3.3程序,使之可以適用於任何大寫字母,把它轉換爲小寫字母,然後用putchar函數輸出該小寫字母。

#include<stdio.h>
int main()
{
	char c1,c2;
	c1=getchar();
	c2=c1+32;
	putchar(c2);
	putchar('\n');
	return 0;
}

在這裏插入圖片描述

#include<stdio.h>
int main()
{
	char c1,c2;
	c1=getchar();
	c2=c1+32;
	printf("大寫字母:%c\n小寫字母:%c\n",c1,c2);
	return 0;
}

在這裏插入圖片描述
————————————————————————————————————
有些地方,我省略了,畢竟,不可能一模一樣,都應該有自己的理解……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章