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