
期末復(fù)習(xí)C語(yǔ)言知識(shí)點(diǎn)歸納
一、概述部分
主要考察知識(shí)點(diǎn):
C程序的結(jié)構(gòu)特點(diǎn);C程序的擴(kuò)展名;程
序的開發(fā)過程;
函數(shù)的構(gòu)成;
C語(yǔ)言使用的基本符號(hào):ASCII字符集;
標(biāo)識(shí)符的命名規(guī)則;
關(guān)鍵字、用戶自定義標(biāo)識(shí)符
1.C程序的基本模塊是函數(shù),一個(gè)C語(yǔ)言源程序可以由一個(gè)
或多個(gè)函數(shù)組成,有且只有1個(gè)main()函數(shù),可以放在程序
中的任何位置.
2.函數(shù)的定義是平行的,不能嵌套定義,但可以進(jìn)行嵌套
調(diào)用。
3.一個(gè)C程序不論有幾個(gè)函數(shù),都是從main()函數(shù)開始執(zhí)
行.
4.C源程序文件的擴(kuò)展名".c"。
++6.0下C語(yǔ)言程序的完整實(shí)現(xiàn)過程包括4個(gè)基本步驟:
?
編輯形成源文件(.c)
?
編譯,形成目標(biāo)文件(.obj)
?
鏈接,形成可執(zhí)行文件(.exe)
?
運(yùn)行.
6.函數(shù)的構(gòu)成:變量定義、語(yǔ)句、注釋
7.標(biāo)識(shí)符
按照
C
語(yǔ)言所定義的規(guī)則來(lái)命名的符號(hào),用作變量名、數(shù)組
名、函數(shù)名等,系統(tǒng)定義的關(guān)鍵字也遵循該規(guī)則。
規(guī)則:由字母、數(shù)字、下劃線組成,第一個(gè)字符必須
是字母或下劃線。
C
語(yǔ)言中的標(biāo)識(shí)符分:關(guān)鍵字、用戶定義標(biāo)識(shí)符
例如
:area
、
a234
、
_1234
為合法標(biāo)識(shí)符
6x
、
a-b
、
a+b
為非法標(biāo)識(shí)符
注意
:
標(biāo)識(shí)符區(qū)分大小寫。
PRINTF
和
printf
是不同的標(biāo)識(shí)符
用戶自定義的標(biāo)識(shí)符應(yīng)避開
C
語(yǔ)言的關(guān)鍵字及庫(kù)函數(shù)
名。
4.c語(yǔ)言的32個(gè)關(guān)鍵字:看附表,留印象
二、數(shù)據(jù)類型、常量、變量、表達(dá)式
注意:
常用數(shù)據(jù)類型的關(guān)鍵字;
常量的表達(dá)形式;
變量的定義及賦值;
各類表達(dá)式的計(jì)算規(guī)則;
不同數(shù)據(jù)類型數(shù)據(jù)混合運(yùn)算時(shí)的類型轉(zhuǎn)
換;
典型問題:數(shù)據(jù)的混合計(jì)算、整數(shù)的分
解、數(shù)據(jù)交換
1.數(shù)據(jù)類型
c語(yǔ)言中,整型、實(shí)型、字符型是最基本的數(shù)
據(jù)類型.
此外還有構(gòu)造類型,如數(shù)組,結(jié)構(gòu)體,共用體等。
2.常量
指在程序運(yùn)行中,其值不能被改變。
分為整型常量、實(shí)型常量、字符常量、字符串常量。
?
整型常量
C
語(yǔ)言中主要有十進(jìn)制、八進(jìn)制、十六進(jìn)制等:8進(jìn)制以0
引導(dǎo),16進(jìn)制以0x或0X引導(dǎo),十進(jìn)制不能以0開頭.
十進(jìn)制例如12、-3、32767等。
八進(jìn)制用數(shù)字0開頭,由0-7這8個(gè)數(shù)字組成。
例如010、016為合法八進(jìn)制數(shù)
127、018為非法八進(jìn)制數(shù)
十六進(jìn)制用數(shù)字0和字母x或X開頭,用0-9表示前10
個(gè)數(shù)字,字母A-F(可小寫)表示后6個(gè)數(shù)字。
例如0xAF、0x10、0x34為合法十六進(jìn)制數(shù)
100、ABC、0xAFH為非法十六進(jìn)制數(shù)
?實(shí)型常量(float或double型)
表示方式有兩種:小數(shù)形式和指數(shù)形式。
小數(shù)形式:
例如:0.123、.123、123.都是合法形式,為double型。
0.123F(float型)
指數(shù)形式:
例如:2.3026可用以下任何一種指數(shù)表示
0.23026E1
、
2.3026e0
、
23.026E-1
但下面的指數(shù)形式為非法
E3.5e3.6
?
字符型常量
一個(gè)字符常量占一個(gè)字節(jié)存儲(chǔ)空間.用單引號(hào)限定。有普
通字符和轉(zhuǎn)義字符。如:
普通字符:如
‘A’
、
’c’
、
’5‘
都是合法的字符常量。
轉(zhuǎn)義字符:如
’n’換行’’反斜杠
’’’單引號(hào)’”’雙引號(hào)
’ddd’三位八進(jìn)制’xhh’二位十六進(jìn)制
’
0x41
’
(表示以十六進(jìn)制數(shù)41為ASCII碼值的字符,即
’
A
’
的轉(zhuǎn)義字符形式).
‘
0
’
(表示空字符,在字符串中用作字符串的結(jié)束標(biāo)志)
注意:轉(zhuǎn)義字符表面上由多個(gè)字符
組成,但在內(nèi)存中只占1字節(jié)的空
間。
?字符串常量
用英文雙引號(hào)括起來(lái).如:”hellon”
?
字符串中的字符個(gè)數(shù)稱為字符串的長(zhǎng)度.空字符串長(zhǎng)度為
0.
?
字符串存儲(chǔ)中每個(gè)字符占一個(gè)字節(jié),字符串結(jié)尾自動(dòng)加一
個(gè)結(jié)束標(biāo)志符’0’,所以字符串存儲(chǔ)的時(shí)候,占用的空
間長(zhǎng)度要比串的實(shí)際長(zhǎng)度多1.
strlen(“china”),求字符串的字
符個(gè)數(shù),5(個(gè))
sizeof(“china”),求字符串占用
的存儲(chǔ)空間,6(字節(jié))
注意下面兩種情況:
(1)charch[100]={“Hello”};
該串的長(zhǎng)度(字符個(gè)數(shù))為5,但數(shù)組ch
的空間長(zhǎng)度為100。
(2)charch[]={“Hello”};
該串的長(zhǎng)度(字符個(gè)數(shù))為5,但數(shù)組ch
的空間長(zhǎng)度為6。
3.變量
指在程序運(yùn)行過程中其值可以改變的量,表示存儲(chǔ)數(shù)據(jù)的空
間,需要時(shí)要先定義。
變量的命名必須符合標(biāo)識(shí)符的命名規(guī)則,且不能和
C
語(yǔ)言
中關(guān)鍵字同名。
(
例如
:main
是關(guān)鍵字
)
例如
:a
、
b
、
ab
、
a_1
為合法變量
define
、
printf
為非法變量
注意
:ab
是一個(gè)整體,含義不同于
a
乘以
b
。
變量定義,如:
intx,a1,a2;
charch1,ch2;
floatm;
doubles;
?
VC++6.0下,int型數(shù)據(jù)占4個(gè)字節(jié),float型數(shù)據(jù)占4
個(gè)字節(jié),double型數(shù)據(jù)占8個(gè)字節(jié),.char型數(shù)據(jù)占
1個(gè)字節(jié).
?自加和自減運(yùn)算符
例如:a++和++a等價(jià)于a=a+1
b--和--b等價(jià)于b=b-1
a++和++a的區(qū)別:
假設(shè)a的初值為5
表達(dá)式a++值為5,最后a值為6。
表達(dá)式++a值為6,最后a值為6。
?
條件運(yùn)算
由"?"和":"構(gòu)成,它是根據(jù)條件從兩個(gè)表達(dá)式中選擇一個(gè)
進(jìn)行計(jì)算取值的操作,優(yōu)先級(jí)高于賦值運(yùn)算符,低于算術(shù)運(yùn)
算和關(guān)系運(yùn)算.
例如:inta=1,b=2,c=3,d=4,z;
z=(a>b)?c:d;結(jié)果:z值為4
三、輸入輸出函數(shù)
重點(diǎn):輸入輸出的格式控制
1.數(shù)據(jù)輸出printf
格式:printf(格式符,輸出項(xiàng)1,輸出項(xiàng)2,….)
格式符功能
%c輸出一個(gè)字符
%d輸出十進(jìn)制整數(shù)
%f輸出小數(shù)形式浮點(diǎn)數(shù)
%e輸出指數(shù)形式浮點(diǎn)數(shù)
%s輸出一個(gè)字符串
數(shù)據(jù)寬度說(shuō)明:
1)在%和格式字符之間插入一個(gè)整數(shù)來(lái)指定輸出寬度。
例如:%4d、%5c
2)對(duì)于float和double類型的實(shí)數(shù),可以用n1.n2形式
n1指定輸出數(shù)據(jù)的寬度(包括小數(shù)點(diǎn)),n2指定小數(shù)
點(diǎn)后小數(shù)的位數(shù)。
例如:%12.3f、%12.0f
題型:判斷輸出結(jié)果時(shí)格式的正確與否!
例1輸出整型變量a和b的值,數(shù)據(jù)寬度均為4。
printf(“a=%4d,b=%4d”,a,b);
例
2
輸出單精度變量
k
的值。
printf(“%10.2f”,k);
2.
數(shù)據(jù)輸入
scanf
格式
:scanf(
格式符,輸入項(xiàng)
1
,輸入項(xiàng)
2
,
…)
格式符功能
%c
輸入一個(gè)字符
%d
輸入十進(jìn)制整數(shù)
%f
輸入單精度數(shù)
%lf
輸入雙精度數(shù)
%s
輸入一個(gè)字符串
題型:判斷輸入數(shù)據(jù)時(shí)的格式正確與否!
例
1
從鍵盤上輸入兩個(gè)整數(shù),保存在變量
a
和
b
中。
scanf(“%d%d”,&a,&b);
例
2
從鍵盤上輸入一個(gè)雙精度數(shù),保存在變量
data
中。
scanf(“data=%lf”,&data);
鍵盤輸入
23.5
,則輸入格式應(yīng)為:
data=23.5
3.
字符專用的
getchar
函數(shù)和
putchar
函數(shù)
分別用來(lái)輸入字符和輸出字符。
例
1
從鍵盤上輸入一個(gè)字符保存在
ch
中。
charch;
ch=getchar();
例
2charc1=’A’,c2;
c2=c1+1;
putchar(c2);
輸出結(jié)果是
’B’
。
例
3
輸出一個(gè)回車換行符。
putchar(‘n’);
例
:
從鍵盤上輸入一串字符,最后以
’!’
為結(jié)束標(biāo)志。分別
統(tǒng)計(jì)大寫字母,小寫字母、數(shù)字出現(xiàn)的次數(shù)。
#include
main()
{
charch;
intn1=0,n2=0,n3=0;
printf(“
請(qǐng)輸入一串字符以
!
結(jié)束
:n”);
ch=getchar();//
先輸入一個(gè)字符
while(ch!='!')
{
if(ch>='A'&&ch<='Z')
n1++;
if(ch>='a'&&ch<='z')
n2++;
if(ch>='0'&&ch<='9')
n3++;
ch=getchar();//
繼續(xù)輸入下一個(gè)字符
}
printf("
大寫字母出現(xiàn)次數(shù)是
%dn",n1);
printf("
小寫字母出現(xiàn)次數(shù)是
%dn",n2);
printf(“
數(shù)字出現(xiàn)次數(shù)是
%dn",n3);
}
4.
字符串專用的輸入輸出函數(shù)
gets()
和
puts()
例如:
charstr[100];
gets(ch);//
輸入一個(gè)字符串存入字符數(shù)組
str
puts(ch);//
輸出字符數(shù)組
str
中存放的字符串
6
.復(fù)合語(yǔ)句
格式
:
{
語(yǔ)句
1
語(yǔ)句
2
….
語(yǔ)句
n
}
例
2若已經(jīng)定義
inta,b;
且已賦值,要將
a
和
b
中的
數(shù)進(jìn)行交換,下面選項(xiàng)中不正確的是
A){a=a+b,b=a-b,a=a-b}
B){t=a,a=b,b=t;}
C){a=t;t=b;b=a;}
D){t=b;b=a;a=t;}
結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu):
順序結(jié)構(gòu)、選擇結(jié)構(gòu)(分支結(jié)構(gòu))、循
環(huán)結(jié)構(gòu)
四、選擇結(jié)構(gòu)
注意:
條件表達(dá)式的構(gòu)造;關(guān)系運(yùn)算、邏輯運(yùn)
算;
選擇結(jié)構(gòu)的基本語(yǔ)句:
if語(yǔ)句
if-el
if-el的嵌套結(jié)構(gòu)(el與if的匹配
規(guī)則)
switch語(yǔ)句的語(yǔ)法要求,執(zhí)行流程
1.關(guān)系運(yùn)算符
>
、
<
、
>=
、
<=
、
==
、
!=
關(guān)系運(yùn)算的結(jié)果只有兩種
:
真或假
C語(yǔ)言中關(guān)系運(yùn)算的結(jié)果為真用1表示,假
用0表示。
例
16>=6‘a(chǎn)’>’A’’1’<‘5’
結(jié)果均為真,值為
1
例
26!=6‘D’==’d’‘9’>’F’
結(jié)果均為假,值為
0
2.邏輯運(yùn)算符
&&(
與
)||(
或
)!(
非
)
優(yōu)先級(jí)
:!>&&>||
例
1
若變量
a
值為
10
,變量
b
值為
16
,計(jì)算表達(dá)式。
a>b||a>sqrt(b)&&b>=16
最后結(jié)果為真,表達(dá)式的值為
1
3.
條件表達(dá)式的構(gòu)造:
注意:
數(shù)學(xué)上的表達(dá)式:0≤x≤10
在C程序中的表達(dá):x>=0&&x<=10
判斷char型變量ch中存放的是大寫字母或小寫字母:
判斷整數(shù)n能否被整除m整除:
判斷年份是否是閏年:
語(yǔ)句
單分支結(jié)構(gòu):
if(條件表達(dá)式)語(yǔ)句
若表達(dá)式為真,則執(zhí)行語(yǔ)句;否則if語(yǔ)句結(jié)束。
注意:
條件表達(dá)式可以是常量、變量、關(guān)系
表達(dá)式、邏輯表達(dá)式
當(dāng)常量、變量、關(guān)系表達(dá)式、邏輯表
達(dá)式的取值不是0的時(shí)候,條件為真;
若取值為0,則條件為假。
-el:二選一
if(條件表達(dá)式)
{語(yǔ)句組1}
el
{語(yǔ)句組2}
表達(dá)式的值非0表示真,執(zhí)行語(yǔ)句組1;否則,執(zhí)
行語(yǔ)句組2.
例1從鍵盤上輸入兩個(gè)整數(shù),輸出較大的數(shù)。
#include
main()
{
intx,y;
printf(“請(qǐng)輸入兩個(gè)整數(shù):n”);
scanf(“%d%d”,&x,&y);
if(x>y)
printf(“%d”,x);
el
printf(“%d”,y);
}
語(yǔ)句的嵌套
多選一結(jié)構(gòu):
if(表達(dá)式1)
{語(yǔ)句組1}
elif(表達(dá)式2)
{語(yǔ)句組2}
elif(表達(dá)式3)
{語(yǔ)句組3}
el
{語(yǔ)句組n}
注意:
el與if的配對(duì)規(guī)則:
el總是與它前面的、最近的、沒有
與其他el進(jìn)行配對(duì)的if進(jìn)行配對(duì)。
例
1
根據(jù)輸入的學(xué)生成績(jī),大于或等于
90
分為
A
,
60
分以下等級(jí)為
E
,其余每
10
分一個(gè)等級(jí)。
#include
main()
{
intg;
printf(“
請(qǐng)輸入一個(gè)整數(shù)
:n”);
scanf(“%d”,&g);
if(g>=90)printf(“An”);
elif(g>=80)printf(“Bn”);
elif(g>=70)printf(“Cn”);
elif(g>=60)printf(“Dn”);
elprintf(“En”);
}
語(yǔ)句
一般格式:
switch(表達(dá)式)/*switch表達(dá)式為整
型或字符型值!*/
{
ca常量1:語(yǔ)句組1/*ca后面必須是
常量或常量表達(dá)式!*/
ca常量2:語(yǔ)句組2
.........
default:語(yǔ)句組//也可省略該語(yǔ)句
}
可以使用break語(yǔ)句來(lái)中止后面語(yǔ)句的執(zhí)行.
?
switch表達(dá)式通常為整型或字符型值,ca中的常量類
型與之對(duì)應(yīng),ca后面的表達(dá)式可以是常量或常量表達(dá)
式,不能為變量表達(dá)式.
若表達(dá)式的值與表達(dá)式1相等,則執(zhí)行語(yǔ)句1;若與表達(dá)
式2相等,則執(zhí)行語(yǔ)句2……若均不相等則執(zhí)行語(yǔ)句n。
例1分析switch語(yǔ)句的執(zhí)行
#include
main()
{
intg=3;
switch(g)
{
ca1:printf(“****n”);break;
ca2:printf(“
n”);break;
ca3:printf(“&&&&n”);
ca4:printf(“@@@@n”);break;
ca5:printf(“$$$$n”);break;
default:printf(“~~~~n”);
}
}
程序運(yùn)行結(jié)果:&&&&@@@@
五、循環(huán)結(jié)構(gòu)
注意:
三種循環(huán)語(yǔ)句:
while語(yǔ)句、do-while語(yǔ)句、for語(yǔ)句
語(yǔ)法格式,流程理解;運(yùn)用;while循
環(huán)和do-while循環(huán)的區(qū)別
典型問題:
一組有規(guī)律的數(shù)的求和、求積數(shù)、
素?cái)?shù)判斷(特別重要)
循環(huán)
格式
:
while(
條件表達(dá)式
)
循環(huán)體
若條件表達(dá)式為真,則執(zhí)行循環(huán)體。再判斷表達(dá)式,若仍為
真,則重復(fù)執(zhí)行循環(huán)體直到表達(dá)式為假時(shí)循環(huán)結(jié)束。
注意:
條件表達(dá)式可以是常量、變量、關(guān)系
表達(dá)式、邏輯表達(dá)式
當(dāng)常量、變量、關(guān)系表達(dá)式、邏輯表
達(dá)式的取值不是0的時(shí)候,條件為真;
若取值為0,則條件為假。
例
1
編程計(jì)算
S=1+2+……100
。
#include
main()
{
intk=1
;
s=0;//
和數(shù)變量初始值為
0
,切記!
while(k<=100)
{s=s+k;
k=k+1;//
循環(huán)變量變化,必須的!
}
printf(“%d”,s);
}
-while循環(huán)
格式
:
do
循環(huán)體
while(
表達(dá)式
);
先執(zhí)行循環(huán)體,然后判斷表達(dá)式。若為真則重復(fù)執(zhí)行
循環(huán)體直到表達(dá)式為假時(shí)循環(huán)結(jié)束。
例
1
用
do-while
循環(huán)計(jì)算
10!
#include
main()
{
intk=1;
doubles=1;//
積數(shù)變量初始值為
1
,切記!
do
{s=s*k;k++;}
while(k<=10);
printf(“%ld”,s);
}
注意:while循環(huán)和do-while循環(huán)
的區(qū)別
while循環(huán)是先判斷表達(dá)式,因
此循環(huán)體有可能一次也不執(zhí)行。
do-while循環(huán)是先執(zhí)行一次循
環(huán)體,再判斷表達(dá)式,所以不論
表達(dá)式為真為假,循環(huán)體至少要
執(zhí)行一次。
循環(huán)
格式
:
for(
表達(dá)式
1;
表達(dá)式
2;
表達(dá)式
3)
循環(huán)體
先執(zhí)行表達(dá)式
1
,然后判斷表達(dá)式
2
,若為真則執(zhí)行
循環(huán)體。然后執(zhí)行表達(dá)式
3
,再判斷表達(dá)式
2
,若仍
為真則重復(fù)執(zhí)行循環(huán)體直到表達(dá)式
2
為假時(shí)結(jié)束。
例
1
用
for
循環(huán)計(jì)算
S=1+2+…100
。
#include
main()
{
intk,sum=0;
for(k=1;k<=100;k++)
sum=sum+k;
printf(“%d”,sum);
}
例
2
若一個(gè)三位數(shù)個(gè)位、十位、百位的立方和等于它本身
則稱這個(gè)數(shù)為水仙花數(shù)。例如
153
是一個(gè)水仙花數(shù)。
編程輸出所有的水仙花數(shù)。
#include
main()
{
inta,b,c,i;
for(i=100;i<=999;i++)
{
a=i/100;
b=i%100/10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i)
printf("%dn",i);
}
}
4.令循環(huán)中斷的break語(yǔ)句
break語(yǔ)句可以用在switch語(yǔ)句中用于結(jié)束某分
支的執(zhí)行,也可用在循環(huán)語(yǔ)句中,使循環(huán)提前結(jié)束。
用在循環(huán)體內(nèi)表示強(qiáng)行退出循環(huán)。
例1計(jì)算S=1+2+3+…n,直到累加和大于5000為止。
#include
main()
{
inti,s=0;
for(i=1;;i++)
{
s=s+i;
if(s>5000)break;
}
printf(“%d”,s);
}
注意:當(dāng)有多重循環(huán)時(shí),break只能退出最內(nèi)層循環(huán)。
素?cái)?shù)判斷的算法!
ue語(yǔ)句
用在循環(huán)體中用來(lái)跳過本次循環(huán)余下的語(yǔ)句,立即開
始下一輪循環(huán)的判斷和執(zhí)行,整個(gè)循環(huán)并未因
continue
結(jié)束。
例
1
寫出下列程序運(yùn)行結(jié)果。
inti,k=0,s=0;
for(i=1;i<=5;i++)
{
s=s+i;
if(s>5)
{printf(“i=%d,s=%d,k=%dn”,i,s,k);
continue;
}
k=k+s;
printf(“i=%d,s=%d,k=%dn”,i,s,k);
}
運(yùn)行結(jié)果
:
i=1,s=1,k=1
i=2,s=3,k=4
i=3,s=6,k=4
i=4,s=10,k=4
i=5,s=15,k=4
六、數(shù)組
注意:
數(shù)組的定義和初始化、數(shù)組與循環(huán)的結(jié)
合、數(shù)組的應(yīng)用(如:最大值最小值問
題、)、字符串與字符數(shù)組
數(shù)組是包含多項(xiàng)相同類型數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),它使用同一
個(gè)名字命名,再用下標(biāo)進(jìn)行分量標(biāo)識(shí).數(shù)組元素的下標(biāo)從0
開始,數(shù)組長(zhǎng)度為n時(shí),最末元素的下標(biāo)是n-1.
1.
定義一維數(shù)組
一維數(shù)組定義格式
數(shù)據(jù)類型數(shù)組名[數(shù)組長(zhǎng)度];
//數(shù)組長(zhǎng)度指數(shù)組中可以存放的數(shù)據(jù)元素的個(gè)數(shù),用整數(shù)
常量表示,也可用代表一個(gè)正整數(shù)的符號(hào)常量表示
例
1
定義一個(gè)包含
4
個(gè)整數(shù)的數(shù)組
a
inta[4];
例
2
定義一個(gè)包含
3
個(gè)雙精度數(shù)的數(shù)組
b
doubleb[3];
注意
:C
語(yǔ)言中數(shù)組的下界從
0
開始計(jì)數(shù)。
例如
:a[4]
的
4
個(gè)元素分別為
a[0]
、
a[1]
、
a[2]
、
a[3]
數(shù)組有一維數(shù)組,二維數(shù)組,和多維數(shù)組.數(shù)組中的每一個(gè)分
量稱為一個(gè)數(shù)組元素。
2.
數(shù)值型一維數(shù)組的初始化
用一對(duì)大括號(hào)將數(shù)組的初值括起來(lái)。
例如:inta[6]={10,20,30,40,50,60};
注意:C語(yǔ)言中,不允許初值個(gè)數(shù)多于數(shù)組定義的長(zhǎng)度。
inta[]={10,20,30,40,50,60};
給初值的情況下,數(shù)組的長(zhǎng)度可省略,系統(tǒng)以初值的個(gè)數(shù)作
為數(shù)組的長(zhǎng)度。
?
對(duì)部分元素的初始化,例如:inta[6]={10,20,30}是對(duì)前
3個(gè)元素的賦值.
例1inta[3]={1,2,3};
此例中a[0]值為1、a[1]值為2、a[2]值為3
例2inta[5]={0};
此例中數(shù)組a的全部元素值均為0
例3inta[3]={1,2,3,4};
此例中由于初值個(gè)數(shù)多于數(shù)組元素個(gè)數(shù),所以非法。
例
4inta[]={0,0,0,0};
此例中省略數(shù)組元素個(gè)數(shù),初值為
4
個(gè)
0
等價(jià)于
inta[4]={0};
注意
:
數(shù)組名是一個(gè)常量值,不能對(duì)它賦值。
例如
:inta[3];
a=5;
此語(yǔ)句非法,應(yīng)改為
a[0]=5;
3.一維數(shù)組應(yīng)用
例1從鍵盤上輸入10個(gè)整數(shù),輸出最大數(shù)和最小數(shù)。
#include
main()
{
inta[10],i,max,min;
printf("
請(qǐng)輸入
10
個(gè)整數(shù)
:n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
max=a[0];
min=a[0];
for(i=1;i<=9;i++)
{
if(a[i]>max)max=a[i];
if(a[i]
}
printf("
最大數(shù)是
%dn",max);
printf("
最小數(shù)是
%dn",min);
}
例2斐波數(shù)列的定義如下:
1、1、2、3、5、8、13、……
編程輸出斐波數(shù)列的第40項(xiàng)值。
#include
main()
{
longa[40];
inti;
a[0]=1;
a[1]=1;
for(i=2;i<=39;i++)
a[i]=a[i-1]+a[i-2];
printf("%ld",a[39]);
}
4.
字符數(shù)組
字符串用字符數(shù)組存放。每元素存放一個(gè)字符.
如:
charch[]={'x10','x21','x1f','x5a'};
該數(shù)組中的初值字符為轉(zhuǎn)義字符。
?
字符串
用雙引號(hào)將一串字符括起來(lái)稱字符串。如:
”Hello,world!”
C
語(yǔ)言中用一維數(shù)組來(lái)存放,并以
’0’
作為結(jié)束標(biāo)志。
‘0’
就是
0
,占用空間但不計(jì)入串的實(shí)際長(zhǎng)度。
例如
:
字符串
”student”
的長(zhǎng)度為
7
,占用空間為
8
通常利用字符數(shù)組存放字符串。如:
charstr[20]={"hello"};
該字符串的實(shí)際長(zhǎng)度為5個(gè)字符,占用的數(shù)組空間長(zhǎng)度為20
'0'是字符串的結(jié)束標(biāo)志.系統(tǒng)在存放一個(gè)字符串時(shí),會(huì)在
串的最后一個(gè)字符后添加'0'。
?
任何一個(gè)一維數(shù)組在內(nèi)存中都占用一段連續(xù)的空間.
?
用"%s"格式輸入字符串時(shí),遇到回車鍵結(jié)束,但獲得的字
符中不包含回車鍵本身,而是在字符串末尾添加'0'.
?
使用一個(gè)一維scanf()函數(shù)使用"%s"格式輸入多個(gè)字符
串時(shí),輸入的各字符串之間要以空格鍵分隔.
如:charch[20];
scanf(“%s”,ch);//從鍵盤輸入一個(gè)字符串存入數(shù)組ch
?
用%s格式符為一個(gè)字符數(shù)組輸入字符串時(shí),只有第一個(gè)
空格之前的字符串被讀入到字符數(shù)組中.
如:對(duì)上面的ch數(shù)組,輸入“Helloworld!”則只有空
格前面的“Hello”被存入數(shù)組。
?字符串常用函數(shù)
使用下列函數(shù)時(shí)要包含頭文件
1)字符串拷貝函數(shù)
strcpy(s1,s2)
表示將s2復(fù)制到s1中。
2)字符串連接函數(shù)
strcat(s1,s2)
表示將s2連接到s1后面形成一個(gè)新字符串。
3)字符串長(zhǎng)度函數(shù)
strlen(s)
計(jì)算出
s
的實(shí)際長(zhǎng)度不包括
’0’
。
4)
字符串比較函數(shù)
strcmp(s1,s2)
若
s1>s2,
函數(shù)返回值大于
0
若
s1=s2,
函數(shù)返回值等于
0
若
s1
函數(shù)返回值小于
0
?
字符串應(yīng)用
例
1
從鍵盤上輸入一個(gè)字符串,輸出它的長(zhǎng)度。
#include
#include
main()
{
char*p,str[100];
p=str;
printf("
請(qǐng)輸入一個(gè)字符串
:n");
gets(p);
printf("%d",strlen(p));
}
5.定義二維數(shù)組
?
定義格式
:
類型名數(shù)組名
[
一維上界
][
二維上界
]
例
1
定義一個(gè)
2
行
2
列的整型數(shù)組
a
inta[2][2];
此例中數(shù)組
a
共有
4
個(gè)元素,分別是
a[0][0]
、
a[0][1]
、
a[1][0]
、
a[1][1]
。
例
2
定義一個(gè)
4
行
4
列的整型矩陣
a
inta[4][4];
?
二維數(shù)組的初始化
用嵌套的大括號(hào)將數(shù)組初值括起來(lái)。
例
1inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
例
2inta[4][3]={{1,2},{4,5},{7},{10}};
此例中系統(tǒng)自動(dòng)給空缺的地方補(bǔ)
0
例
3inta[4][3]={{1,2},{4,5}};
系統(tǒng)自動(dòng)給后面的行補(bǔ)初值
0
例
4inta[4][3]={1,2,4,5};
此例中數(shù)組
a
的第一行中元素和第二行的第一個(gè)
元素依次為
1,2,4,5
其余全部為
0
?
定義二維數(shù)組大小
例
1inta[][3]={{1,2,3},{4,5},{6},{8}};
有
4
個(gè)行花括號(hào)
,
因此說(shuō)明是
4
行
3
列。
例
2inta[][3]={1,2,3,4,5};
表示一個(gè)
2
行
3
列數(shù)組。
?定義并初始化二維數(shù)組時(shí),數(shù)組的列
數(shù)(第二維)不能省略!
如:
inta[2][]={{1,2},{3,4,5}};是錯(cuò)誤的。
?二維數(shù)組應(yīng)用
例:從鍵盤上輸入5個(gè)學(xué)生3門課程的成績(jī),分別計(jì)算
每個(gè)學(xué)生的平均分和每門課程的平均分。
#include
#defineM5
#defineN3
main()
{
inta[M][N],i,j,sum;
printf("請(qǐng)輸入15個(gè)分?jǐn)?shù)(0-100):n");
for(i=0;i<=M-1;i++)
for(j=0;j<=N-1;j++)
scanf("%d",&a[i][j]);
printf("每個(gè)學(xué)生的平均分n");
for(i=0;i<=M-1;i++)
{
sum=0;
for(j=0;j<=N-1;j++)
sum=sum+a[i][j];
printf("%4d",sum/N);
}
printf("n");
printf("
每門課程的平均分
n");
for(i=0;i<=N-1;i++)
{
sum=0;
for(j=0;j<=M-1;j++)
sum=sum+a[j][i];
printf("%4d",sum/M);
}
}
七、函數(shù)
注意:
函數(shù)的種類:庫(kù)函數(shù)、自定義函數(shù);
函數(shù)的定義;
函數(shù)的參數(shù):形參、實(shí)參、參數(shù)的個(gè)數(shù);
函數(shù)的類型;
函數(shù)的聲明;
函數(shù)調(diào)用過程中參數(shù)傳遞問題;
1.函數(shù)的定義
?
帶返回值的函數(shù)
格式
:
類型名函數(shù)名
(
參數(shù)列表
)
{
語(yǔ)句
return
返回值
}
例
1
已知
F(X)=2*X+3
,計(jì)算
F(1)+F(2)+….F(10)
的值。
#include
intf(intx)
{
return2*x+3;
}
voidmain()
{
inti,sum=0;
for(i=1;i<=10;i++)
sum=sum+f(i);
printf("%d",sum);
}
例
2
編程輸出
2
至
100
之間所有的素?cái)?shù)之和。
#include
intisprime(intnum)
{
inti;
for(i=2;i<=num-1;i++)
if(num%i==0)
return0;
return1;
}
voidmain()
{
inti,sum=0;
for(i=2;i<=100;i++)
if(isprime(i)==1)
sum=sum+i;
printf("%d",sum);
}
例
3
從鍵盤上輸入兩個(gè)整數(shù),分別輸出它們的最大公約數(shù)
和最小公倍數(shù)。
#include
intgetmax(inta,intb)
{
intresult;
result=a
while(a%result!=0||b%result!=0)
result=result-1;
returnresult;
}
intgetmin(inta,intb)
{
intresult=1;
while(result%a!=0||result%b!=0)
result=result+1;
returnresult;
}
voidmain()
{
inta,b;
printf("
請(qǐng)輸入兩個(gè)整數(shù)
:n");
scanf("%d%d",&a,&b);
printf("
最大公約數(shù)是
%dn",getmax(a,b));
printf("
最小公倍數(shù)是
%dn",getmin(a,b));
}
?
不帶返回值的函數(shù)
格式
:
void
函數(shù)名
(
參數(shù)列表
)
{
語(yǔ)句
}
?
函數(shù)的類型
表示函數(shù)返回值的類型,是函數(shù)定義
時(shí),函數(shù)名前面的標(biāo)識(shí)符,若缺省,則
系統(tǒng)默認(rèn)為int型。
?
函數(shù)調(diào)用過程中的傳值和傳地址
傳值是指子程序中變量的變化不會(huì)影響主程序變量。
傳地址是指子程序中變量的變化會(huì)影響主程序變量。
例
1
交換兩變量
a
和
b
的值。
(
傳值方式
)
#include
voidchange(inta,intb)
{
intt;
{t=a;a=b;b=t;}
}
voidmain()
{
inta=3,b=5;
printf("a=%db=%dn",a,b);
change(a,b);
printf("a=%db=%dn",a,b);
}
運(yùn)行結(jié)果
:
a=3b=5
a=3b=5
函數(shù)
change(inta,intb)
為傳值方式,最后
a
和
b
的值
并未交換。故傳值方式不能改變主程序變量的值。
例
2
交換兩變量
a
和
b
的值。
(
傳地址方式
)
#include
voidchange(int*a,int*b)
{
intt;
{t=*a;*a=*b;*b=t;}
}
voidmain()
{inta=3,b=5;
printf("a=%db=%dn",a,b);
change(&a,&b);
printf("a=%db=%dn",a,b);
}
運(yùn)行結(jié)果
:
a=3b=5
a=5b=3
函數(shù)
change(int*a,int*b)
為傳地址方式,最后
a
和
b
的值
成功交換。故傳地址方式能改變主程序變量的值。
八、指針
?
指針變量初始化的方法inta;
int*p=&a;
?
賦值語(yǔ)句的方法inta;
int*p;
p=&a;
不允許把一個(gè)數(shù)賦予指針變量,故下面的賦值是錯(cuò)誤
的:int*p;p=1000;被賦值的指針變量前不能再加“*”
說(shuō)明符,如寫為*p=&a也是錯(cuò)誤的。
?
通過指針變量獲得地址值
通過賦值語(yǔ)句將一個(gè)指針變量的值賦給另一個(gè)指針變量。
如:int*p,*q,a=0;
p=&a;
q=p;
則指針變量p和q保存的是同一個(gè)變量a的地址,即p
和q指向同一個(gè)整型變量。對(duì)p指向的變量的操作也就是對(duì)
q指向的變量的操作。
如:*p++;printf(“%d”,*q);的輸出結(jié)果為1。
?
給指針變量賦“空”值
在stdio.h頭文件中,系統(tǒng)定義了一個(gè)符號(hào)常量NULL,
其值為0,可通過給指針變量賦一個(gè)“空”值(即0值),使
其不指向任何內(nèi)存單元,方法為:
p=NULL;或p=0;或p=’0’;
指針變量定義及賦值,舉例:
例
1
定義兩個(gè)指向整型變量的指針
p1
和
p2
。
int*p1,*p2;
例
2
定義兩個(gè)整型變量
m
和
n
及兩個(gè)指針
p
和
q
,并使
p
和
q
分別指向
m
和
n
。
intm,n,*p,*q;
p=&m;
表示
p
存放變量
m
的地址
q=&n;
表示
q
存放變量
n
的地址
例
3
定義一個(gè)包含
10
個(gè)整數(shù)的數(shù)組
a
和一個(gè)指針
p
,并
使
p
指向
a
。
inta[10],*p;
p=a;
表示
p
指向數(shù)組
a
的首地址,即
a[0]
的地址。
注意
:
例
3
中
p=a
不能寫成
p=&a
,因?yàn)?/p>
a
本身就是地址。
例
3
指針間的賦值
假設(shè)已有下列定義
:
int*q,*p,k=0;
q=&k;
例如
:p=q;
表示兩指針間賦值,讀作
p
指向
q
。
此時(shí)
p
和
q
均指向變量
k
的地址。
例
4
空指針
在
C
語(yǔ)言中空值用
NULL
表示,其值為
0
例
5
定義指針時(shí)可以給指針賦值
NULL
例如
:int*p=NULL;
表示
p
沒有指向任何地址
等價(jià)于
p=’0’;
或
p=0;
注意
:
此時(shí)指針
p
沒有實(shí)際單元,所以暫時(shí)不能訪問。
例
6
通過指針引用存儲(chǔ)單元
假設(shè)已有下列定義
:
int*p,m,n=0;
p=&n;
例如
:m=*p;
表示將
p
指向存儲(chǔ)單元內(nèi)容給變量
m
等價(jià)于
m=n;
*p=*p+1;
等價(jià)于
n=n+1;
注意
:*p=*p+1;
還可以寫成下面的形式
*p+=1;
或
++*p;
或
(*p)++;
例
7
指針的移動(dòng)
當(dāng)指針指向一片連續(xù)空間時(shí),移動(dòng)才有意義。
假設(shè)已有下列定義
:
inta[5],*p,*q,k;
p=a;
例如
:q=p+2;
表示將
q
指向元素
a[2]
的地址
p++;
表示將
p
向后移一個(gè)單元
q--;
表示將
q
向前移一個(gè)單元
k=p[2];
等價(jià)于
k=a[3];
例
8
指針的比較
若兩指針指向一片連續(xù)空間,可比較大小。
假設(shè)已有下列定義
:
inta[10],*p,*q,k;
p=a;
q=p+2;
例如
:if(p
小于
q”);
由于條件成立,所以輸出
p
小于
q
。
k=q-p;
表示
p
和
q
之間相差的元素個(gè)數(shù)
最后
k
值為
2
?
函數(shù)之間地址值的傳遞
1)形參為指針變量時(shí)實(shí)參和形參之間的數(shù)據(jù)傳遞
在函數(shù)調(diào)用過程中,主調(diào)函數(shù)通過實(shí)參傳遞給被調(diào)函數(shù)的
形參,這種調(diào)用稱為傳值調(diào)用。形參的改變不會(huì)影響實(shí)參。
如果實(shí)參傳遞給形參的不是普通變量,而是地址,則形參
和實(shí)參指向的實(shí)際上是同一個(gè)內(nèi)存單元,形參指向的存儲(chǔ)
單元的改變,也就是實(shí)參指向的存儲(chǔ)單元的改變。這種將
地址作為參數(shù)傳遞的調(diào)用方式稱為傳引用調(diào)用。
例:
傳值調(diào)用:
main()
{
inta=1,b=2;
fun(a,b);
printf(“%d,%d”,a,b);
}
voidfun(intp,intq)
{
intt;
t=p;p=q;q=t;
}
輸出結(jié)果:1,2輸出結(jié)果:2,1
傳引用調(diào)用時(shí)應(yīng)當(dāng)注意實(shí)參的基類型必須與形參的基類
型一致。
通過這種方式,可以在被調(diào)函數(shù)中直接改變主調(diào)函數(shù)中變
量的值。
傳引用調(diào)用:
main()
{
inta=1,b=2;
fun(&a,&b);
printf(“%d,%d”,a,b);
}
voidfun(int*p,int*q)
{
int*t;
t=p;p=q;q=t;
}
?
函數(shù)返回地址值
函數(shù)的返回值不光可以為基本類型,還可以為指針類型,
即可以定義返回指針的函數(shù),稱為指針型函數(shù)。
其一般定義形式如下:
基類型*函數(shù)名(形參表)
{
函數(shù)體
}
其形參一般為指針。
注意:在被調(diào)函數(shù)中定義的變量屬于局部變量,其生存期
為函數(shù)執(zhí)行過程中。當(dāng)被調(diào)函數(shù)執(zhí)行完返回主調(diào)函數(shù)中時(shí),
被調(diào)函數(shù)中定義的變量將不再存在。所以,如果被調(diào)函數(shù)返
回的地址是被調(diào)函數(shù)中定義的變量的地址,則返回的地址值
無(wú)效。
?
指針的應(yīng)用
例
1
從鍵盤上輸入兩個(gè)整數(shù),輸出較大數(shù)。
(
要求使用指針
)
#include
main()
{
inta,b,*p,*q;
p=&a;
q=&b;
printf("
請(qǐng)輸入兩個(gè)整數(shù)
:n");
scanf("%d%d",p,q);
if(*p>*q)
printf("%d",*p);
el
printf("%d",*q);
}
例
2
從鍵盤上輸入
10
個(gè)整數(shù),輸出最大數(shù)和最小數(shù)。
#include
main()
{
inta[10],*p,k,max,min;
p=a;
printf("
請(qǐng)輸入
10
個(gè)整數(shù)
:n");
for(k=0;k<=9;k++)
scanf("%d",&p[k]);
max=p[0];
min=p[0];
for(k=1;k<=9;k++)
{
if(p[k]>max)max=p[k];
if(p[k]
}
printf("
最大數(shù)是
%dn",max);
printf("
最小數(shù)是
%dn",min);
}
九、指針處理字符串
例1定義一個(gè)未知長(zhǎng)度的字符串s。
char*s=”Hello”;
此例采用指針方式,
s
指向字符串
”Hello”
的起始地址
?
字符串的賦值
假設(shè)已有下列定義
:
char*sp,s[6];
例
1
給
sp
賦值
”hello”
,讓指針變量
sp
指向字符串。
sp=”hello”;
例
2
給字符數(shù)組
s
賦值
”hello”
。
strcpy(s,”hello”);
表示將
”hello”
復(fù)制到
s
中
例
3
給字符數(shù)組
s
賦值
”student”
。
strcpy(s,”student”);
此例語(yǔ)法上沒有錯(cuò)誤,但數(shù)組
s
空間不夠,最后
會(huì)產(chǎn)生錯(cuò)誤結(jié)果。
注意:
1)例2不能寫成s=”hello”;因?yàn)閟是數(shù)組名即地址常量,
故不能直接賦值。
2)strcpy為字符串函數(shù),需要包含頭文件
?
字符數(shù)組的單獨(dú)賦值
例
1charstr[10]={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘!’,‘0’};
此例中數(shù)組
str
共
10
個(gè)元素
,
最后
2
個(gè)元素也是
’0’
此字符串共占
10
個(gè)空間,實(shí)際長(zhǎng)度為
7
。此例中
若省略
’0’
效果相同。
例
2charstr[]={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘!’,‘0’};
此例定義一個(gè)包含
7
個(gè)字符的字符串,最后一個(gè)
’0’
不能省略。此時(shí)
str
可以作為字符串使用。
例
3charstr[]={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘!’};
此例只是定義一個(gè)
7
個(gè)字符的數(shù)組,但由于沒有
’0’
str
不能作為字符串使用,否則會(huì)產(chǎn)生錯(cuò)誤。
例
9
字符數(shù)組的整體賦值
例
1charstr[10]={“string!”};
charstr[10]=”string!”;
以上兩種寫法都是合法的,效果相同。
例
2charstr[7]=”string!”;
這種方法雖然語(yǔ)法上沒有錯(cuò),但由于
’0’
沒有放入
注意:
數(shù)組中,可能會(huì)產(chǎn)生錯(cuò)誤結(jié)果。
將上述語(yǔ)句改為charstr[]=”string!”;
就完全正確了,系統(tǒng)自動(dòng)計(jì)算數(shù)組大小。
這種寫法簡(jiǎn)單又不會(huì)出錯(cuò),推薦使用。
例
10
字符串的輸入和輸出
使用
scanf
和
printf
時(shí),格式符均為
%s
。
例
1charstr[15];
scanf(“%s”,str);
表示將輸入的一串字符依次存放在
str
中。
例
2charstr[15];
scanf(“%s”,&str[3]);
表示將輸入的一串字符從第
4
個(gè)元素的地址開始
依次存放。
例
3charstr[15],*p;
p=str;
scanf(“%s”,p);
這和例
1
功能相同,只是使用指針方法。
例
4charstr[]=”student”;
printf(“%s”,str);
表示輸出整個(gè)字符串
str
的內(nèi)容。
?
字符串應(yīng)用
例
1
從鍵盤上輸入一個(gè)字符串,輸出它的長(zhǎng)度。
#include
#include
main()
{
char*p,str[100];
p=str;
printf("
請(qǐng)輸入一個(gè)字符串
:n");
gets(p);
printf("%d",strlen(p));
}
例
2
從鍵盤上輸入一個(gè)字符串,輸出其反字符串。
方法一
(
單個(gè)輸出法
)
#include
#include
main()
{
chars[100];
inti;
printf("
請(qǐng)輸入一個(gè)字符串
:n");
scanf("%s",s);
for(i=strlen(s)-1;i>=0;i--)
printf("%c",s[i]);
}
方法二
(
整體輸出法
)
#include
#include
main()
{
chars1[100],s2[100];
inti,j=0;
printf("
請(qǐng)輸入一個(gè)字符串
:n");
scanf("%s",s1);
for(i=strlen(s1)-1;i>=0;i--)
s2[j++]=s1[i];
s2[j]='0';
printf("%s",s2);
}
本文發(fā)布于:2023-03-03 12:51:37,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/1677819098121003.html
版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:c語(yǔ)言知識(shí)點(diǎn).doc
本文 PDF 下載地址:c語(yǔ)言知識(shí)點(diǎn).pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |