




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言復習
概念及要點聯系方式:fyang@main()函數的基本結構//必包含I/O函數的頭文件#include<stdio.h>//數學函數<math.h>//字符串函數<string.h>voidmain(){按需定義變量;按需輸入數據;按需處理數據;按需輸出數據;}例:從鍵盤輸入三個整數,輸出最大值#include<stdio.h>voidmain(){
inta,b,c,max;
scanf("%d,%d,%d",&a,&b,&c);max=a;if(b>max)max=b;if(c>max)max=c;printf("max=%d\n",max);}autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunsignedunionvoidvolatilewhileC語言關鍵字
(系統定義,不能重定義)很少
C89共32個
boolimaginaryrestrictcomplexinlineC99增加了5個關鍵字C語言運算符豐富有34種運算符把括號、賦值、強制類型轉換等都作為運算符處理表達式類型多樣化算術運算符:+-*/%++--關系運算符:<<===>>=!=邏輯運算符:!&&||位運算符:<<>>~|^&賦值運算符:=及其擴展條件運算符:?:逗號運算符:,指針運算符:*&求字節數:sizeof強制類型轉換:(類型)分量運算符:.->下標運算符:[]其它:()-C語言提供的數據結構是以數據類型的形式出現的
整型
字符型char實型(浮點型)
枚舉類型enum單精度型float
雙精度型double數組類型[]結構體類型struct
共用體類型union基本類型構造類型指針類型*空類型void數據類型無符號整型unsigned基本整型int長整型long短整型shortC99增加longlong等類型基本數據類型int整數,VC6默認占4個字節(與long同
),
TC2默認占2個字節(與short同
)。float單精度浮點數,占4個字節double雙精度浮點數,占8個字節char字符,占1個字節用來表示256個ASCII字符,或者0~255的整數字符常量轉義字符——特殊的字符常量一些特殊字符(無法從鍵盤輸入或者另有它用)用轉義字符表示charc1,c2;c1='a';可以
c2="a";錯誤
合法的字符常量
?變量類型定義字節數范圍整型inta,b;4或2見long和short短整型shortx,y;2-32768~32767無符號整型unsignedinta;20~65535無符號短整型unsignedshortb;20~65535長整型longl;4-2147483648~2147483647無符號長整型unsignedlongd;40~4294967295單精度實型floatf;43.4e-38~3.4e38(7位)雙精度實型doubled;81.7e-308~1.7e308(15位)長雙精度實型longdoubleld;163.4e-4932~3.4e4932(19位)字符型charc1,c2;1-128~127無符號字符型unsignedcharc3;10~255算術運算符及其優先次序1.算術運算符(1)基本的算術運算符*:乘法運算符/:除法運算符%:求余運算符+:加法運算符
-:減法運算符(2)自增、自減運算符
/
整數除整數,得整數%
只針對整型數據,結果為余數如:if(a%b==0)//a是否被b整除i++,i--在變量使用之后,使變量的值加(減)1++i,--i在變量使用之前,使變量的值加(減)1關系運算符及其優先次序C語言提供6種關系運算符:①<
(小于)②<=(小于或等于)③>
(大于)④>=(大于或等于)
⑤==(等于)⑥!=(不等于)
優先級相同
(高)優先級相同
(低)
邏輯運算符及其優先次序3種邏輯運算符:!(邏輯非)&&(邏輯與)||(邏輯或)(1)&&(邏輯與)a&&b(如果a和b都為真則結果為真,否則為假)(2)||(邏輯或)a||b(如果a和b中有一個以上為真則結果為真,只有二者都為假時結果為假)(3)!(邏輯非)!a(如果a為真則結果為假,如果a為假則結果為真)運算符的優先次序!高++,--算術運算符*,/,%高于→
+,-關系運算符<
,<=,>,>=高于→
==,!=邏輯運算符&&高于→
||賦值運算符=,+=,-=,…逗號運算符低(1)算術>關系>邏輯
(2)單目(!,++,--)>雙目
(3)同一優先級的運算次序由結合方向決定格式:printf("格式控制串",輸出表)功能:按指定格式向顯示器輸出數據返值:正常,返回輸出字節數;出錯,返回EOF(-1)輸出表:要輸出的數據(可以沒有,多個時以","分隔)格式控制串:包含兩種信息格式說明:
%[修飾符]格式字符
,用于指定輸出格式普通字符或轉義序列:原樣輸出格式字符printf格式輸出函數d,ix,Xoucse,Efg%%十六進制無符號整數不帶符號十進制整數十進制整數指數形式浮點小數單一字符字符串八進制無符號整數小數形式浮點小數e和f中較短一種百分號本身inta=567;printf("%d",a);inta=255;printf("%x",a);inta=65;printf("%o",a);inta=567;printf("%u",a);chara=65;printf("%c",a);printf("%s","ABC");floata=567.789;printf("%e",a);floata=567.789;printf("%f",a);floata=567.789;printf("%g",a);printf("%%");567ff101567AABC5.677890e+02567.789000567.789%說明 格式字符要用小寫格式字符與輸出項個數應相同,按先后順序一一對應輸出轉換:格式字符與輸出項類型不一致,自動按指定格式輸出%[修飾符]格式字符附加格式說明符(%[修飾符]格式字符).n對實數,指定小數點后位數(四舍五入)修飾符功能m輸出數據域寬,數據長度<m,左補空格;否則按實際輸出輸出數據在域內左對齊(缺省右對齊)-指定在有符號數的正數前顯示正號(+)+輸出數值時域內左側的空位自動填00在八進制和十六進制數前顯示前導0,0x#在d,o,x,u前,指定輸出精度為long型在e,f,g前,指定輸出精度為double型l,L對字符串,指定實際輸出位數用于d,o,x,u前,指定輸入為short型整數h格式:scanf("格式控制串",地址表)功能:按指定格式從鍵盤讀入數據,存入地址表指定的存儲單元中,并按回車鍵結束返值:正常,返回輸入數據個數地址表:變量的地址,常用取地址運算符&&格式字符:d,i,o,x,u,c,s,f,e(意義同前表)例scanf("%d",&a);
輸入:10
則a=10例scanf("%x",&a);
輸入:11
則a=17scanf格式輸入函數例floatf;charcs[80];scanf("%f%s",&f,cs);
輸入10.15hellozhang!
則10.15f“hello”csl修飾符功能hm*用于d,o,x前,指定輸入為short型整數用于d,o,x前,指定輸入為long型整數用于e,f前,指定輸入為double型實數指定輸入數據寬度,遇空格或不可轉換字符則結束抑制符,指定輸入項讀入后不賦給變量例scanf("%4d%2d%2d",&yy,&mm,&dd);
輸入19991015
則1999yy,10mm,15ddscanf修飾符功能%[修飾符]格式字符例doubled;scanf("%lf",&d);——字符輸入輸出函數字符輸出函數:putchar(ch)
輸出一個字符ch字符輸入函數:
ch=getchar()無參數函數值為從輸入設備接收的字符——字符串輸入輸出函數字符串輸出函數:
puts(str)
str字符數組或指針字符串輸入函數:gets(str)str字符數組或指針類比(文件操作)字符輸出函數--fputc(ch,fp)
字符輸入函數--fgetc(fp)
字符串輸出函數--fputs(str,fp)
字符串輸入函數--fgets(fp)
C語句概述語句是算法實現的程序表示,是算法實現的最小單位。語句說明了一種行為,它是用計算語言編寫的控制計算機完成確定操作的句子。空語句(;)復合語句({一條或多條語句})流程控制語句結構化語句條件語句(if語句,switch語句)while語句do-while語句
for語句非結構化語句break語句continue語句
return語句非限定轉向語句(goto)C語言數據操作語句循環語句簡單語句函數調用語句(函數名(實參表);)表達式語句(表達式;)1)
表達式語句4)復合語句2)
函數調用語句5)空語句3)
控制語句if(e)~else~條件語句for(e1;e2;e3)~循環語句while(e)~循環語句do~while(e);循環語句continue結束本次循環語句break中止switch或循環語句switch(e){}多分支選擇語句goto轉向語句return從函數返回語句(e)表示條件,~表示內嵌的語句構成程序的三種基本結構順序結構選擇結構循環結構已經證明,任何程序均可只用這三種結構綜合描述只用這三種結構編制的程序,叫結構化程序程序必須符合結構化規則典型算法:如累加、累乘、統計、遞推、迭代、窮舉等最常用的3種if語句形式:if(表達式)語句1;(單選,沒有else子句)if(表達式)語句1;else語句2;(2選1)
ifelse嵌套if語句(多選1)
if(表達式1)
語句1
elseif(表達式2)語句2
。。。
elseif(表達式n-1)語句nelse語句nIf語句if(a>b)t=a;a=b;b=t;if/else只管一個語句,欲管控多個語句,須標為“{復合語句}”if(a>b){t=a;a=b;b=t;}①if語句(單分支,分段獨立分割)#include<stdio.h>#include<math.h>voidmain(){
intx;doubley;scanf(“%d”,&x);if(x<0)
y=fabs(x);if(x>=0&&x<10)
y=2*x-1;if(x>=10)y=sqrt(3*x-10);printf(“y=%lf\n”,y);}例:寫一段程序,實現以下函數,輸入整數x,輸出y的值:②ifelse語句(雙分支,二選一)請寫成鋸齒的形式,每嵌套一層縮進一層else總是與它上面最近的未配對的if配對if(x<0)
y=fabs(x);else
{
if(x<10)y=2*x-1;
elsey=sqrt(3*x-10);
}if(x<0)
y=fabs(x);else
if(x<10)y=2*x-1;
elsey=sqrt(3*x-10);if(x<0)
y=fabs(x);else
if(x<10)y=2*x-1;elsey=sqrt(3*x-10);ifelse演變為ifelseif③If~elseif語句(多選一,逐段排除)doublef(intx){doubley;if(x<0)
y=fabs(x);elseif(x<10)y=2*x-1;
elsey=sqrt(3*x-10);returny;}#include<stdio.h>voidmain(){
intx;doubley;scanf(“%d”,&x);
y=f(x);printf(“y=%lf\n”,y);}例:有一個函數,輸入整數x,輸出y的值:switch語句一般形式switch(整型表達式){case整型常量1
:語句1case整型常量2
:語句2
┇
┇
┇default:語句n+1}//成績百分制轉為5級記分制voidmain(){floatscore;intg;doscanf(“%f”,&score);while(score>100||score<0);switch((int)score/10){case10:case9:g=1;break;case8:g=2;break;case7:g=3;break;case6:g=4;break;default:g=5;}printf(“g=%d\n”,g);}注意:整型表達式與某一整型常量匹配后,將按順序執行(不再關心其它case),直到break跳出整個switch語句;//等價的ifelseif實現if(score>=90)g=1;
elseif(score>=80)g=2;elseif(score>=70)g=3;elseif(score>=60)g=4;elseg=5;//百分制成績轉為5級記分制//寫成通用函數:
intscore100to5(floatscore){intg;if(score>100||score<0)return-1;//or6,errorswitch((int)score/10){case10:case9:g=1;break;case8:g=2;break;case7:g=3;break;case6:g=4;break;default:g=5;}returng;}//百分制成績轉為5級記分制#include<stdio.h>intscore100to5(floatscore);voidmain(){floatx;intgrage;scanf(“%f”,&x);
grade=f(x);printf(“g=%c\n”,grade);}代碼重用(詳見:函數)對于常用的代碼片段,可自定義為通用函數
循環結構3種類型的循環語句while(循環條件)
語句1;do語句1;while(循環條件);for(expr1;循環條件;expr3)語句1;輔助控制語句breakcontinue//sum=1+2+3+…10#include<stdio.h>main(){inti,sum;
sum=0;i=1;while(i<=10){sum=sum+i;
i++;}printf("%d",sum);}循環初值循環終值循環變量增值根據輸入、輸出數據的性質,確定變量名及類型循環體例子:sum=1+2+3+4+5+6+7+8+9+10編程的核心問題:找規律,如何實現任意的第i項
循環條件注意:統計變量賦初值一般形式:執行流程:expr2循環體假(0)真(非0)forexpr1expr3for語句說明:expr1,expr2,expr3類型任意,
都可省略,但分號;不可省for語句可以轉換成while結構for(expr1
;
expr2
;expr3
)
循環體語句;expr1;
//循環前初始化while(expr2){循環體語句;
expr3;}當expr1和expr3空時,while(expr2)
循環體語句;for(;
expr2
;
)
循環體語句;expr2為空時,
無限循環:for(expr1;;expr3)~;main(){inti,sum=0;i=1;for(;i<=10;){sum=sum+i;
i++;}printf("%d",sum);}常用形式://sum=1+2+3+…10#include<stdio.h>main(){inti,sum=0;
for(i=1;i<=10;i++){sum=sum+i;
}printf("%d",sum);}//sum=1+2+3+…10#include<stdio.h>main(){inti,sum=0;
i=1;while(i<=10){sum=sum+i;i++;}printf("%d",sum);}for(循環變量賦初值;循環條件;循環變量增值)
循環體語句;循環變量賦初值;while(循環條件){
循環體語句;循環變量增值;}求階乘:選擇合適的數據類型:long或double求累加和:s=s+t(k),關鍵問題找出:
通項t(k)及遞推關系,注意:初始值、終止條件和步長統計:統計正數、平均分以上、n個成績中100~90、89~80、79~70、69~60、<60的人數;輸入字符串中字母d的個數設置一個計數變量k:初始化為0,每遇到一次將其加1:k++;典型的編程題累加的項較復雜時,得專門求,例:前后項之間無關1m+3m+5m+7m+.…t(k)=pow(k,m)π/4=1-1/3+1/5-1/7+...直到最后項的絕對值小于10-6前后項之間有關(遞推公式)1!+2!+...+n!
t(k)
=t(k-1)*k,t(0)=1x0+x1+x2+x3+.…t(k)
=t(k-1)*x,t(0)=11+1+2+3+5+8+13+21+...t(k)
=t(k-1)+t(k-2)2/1+3/2+5/3+8/5+13/8+21/13+...a+aa+aaa+aaaa+aaaaa+....a是一個數字,例a=2,2+22+222+2222+....t(k)=t(k-1)*10+a,t(1)=a通項t(k)及遞推關系流程的轉移控制
breakcontinuegotoreturn有返回值的函數體內應含:
return
表達式;#include<math.h>voidmain(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)>=1E-6)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}運行結果:pi=3.141397#include<stdio.h>程序:判別是否素數?#include"math.h"Voidmain(){intm,i,k;scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)
if(m%i==0)break;if(i>k)printf("%d是素數\n",m);else
printf("%d不是素數\n",m);}運行結果:
17↙17isaprimenumber
第六章循環控制整數分解例:讀入一個整數,逐位分割各位數字,如輸入7358,則輸出
8537分離后逆序輸出。#include<stdio.h>voidmain(){intn;scanf("%d",&n);while(n>0){printf("%d",n%10);n/=10;}}數組(Array)inta[10];定義一個有10個元素的數組,每個元素的類型均為int使用a[0]、a[1]、a[2]、……、a[9]這樣的形式訪問每個元素。它們與普通變量沒有任何區別系統會在內存分配連續的10個int空間給此數組數組下標可以是整型表達式a是此數組的首地址a數組首地址a[9]a[8]a[7]a[1]a[0]…數組是一組共用同一個名字、具有一定順序關系和相同數據類型的變量的集合。其中,共用的名字稱作?,集合中的變量稱為?
。一維數組的定義定義方式:數據類型數組名[常量表達式];
合法標識符表示元素個數下標從0開始[]:數組運算符單目運算符優先級(1)左結合不能用()例
inta[6];a[0]a[1]a[2]a[3]a[4]a[5]a編譯時分配連續內存內存字節數=數組維數*
sizeof(元素的數據類型)數組名表示內存首地址,是地址常量
一維數組intn=10;inta[n];(定義時不能用變量)數組的定義與初始化數組定義后的初值仍然是隨機數,一般需要我們來初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};數組大小最好用宏來定義,以適應未來可能的變化
#defineSIZE10
inta[SIZE];數組大小,在運行時不可改變數組的使用數組的下標都是從0開始數組的每個元素與普通變量無異可以用任意表達式作為下標,動態決定訪問哪個元素for(i=0;i<SIZE;i++)
a[i]=2*i;下標越界是大忌!可能帶來嚴重后果下標i>=SIZE,將訪問數組以外的空間。sizeof可以用來獲得數組大小:n=sizeof(a)/sizeof(a[0]);只能逐個對數組元素進行操作(字符數組例外)輸入方法:inta[10],i;輸入第i個數組元素:scanf("%d",&a[i]);輸入整個數組元素:for(i=0;i<10;i++)scanf("%d",&a[i]);輸出方法:輸出第i個數組元素:printf("%d",a[i]);輸出整個數組元素:for(i=0;i<10;i++)printf("%d",a[i]);一維數組的輸入和輸出&a[i]≡
a+i
a[i]≡*(a+i)二維數組a:由3個行元素a[i]組成每個行元素a[i],由4個列元素組成,a[i]相當于一個一維數組a[0]a[1]a[2]行元素名a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]a[0]a[1]a[2]二維數組行元素列元素二維數組的輸入和輸出數組的輸入和輸出只能逐個對數組元素進行操作(字符數組例外)inta[2][3],i,j;輸入方法:輸入第i行第j列元素:scanf("%d",&a[i][j]);輸入整個數組元素:for(i=0;i<2;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);
輸出方法:輸出第i行第j列元素:printf("%d",a[i][j]);輸出整個數組元素:for(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);&a[i][j]≡
a[i]+j≡
*(a+i)+j
a[i][j]≡
*(*(a+i)+j)#defineN10voidmain(){inta[N][N],i,j;for(i=0;i<N;i++){a[i][0]=a[i][i]=1;if(i>0)printf(“%5d”,a[i][0]);//每行第一個1for(j=1;j<i;j++){a[i][j]=a[i-1][j-1]+a[i-1][j];printf("%5d",a[i][j]);}printf(“%5d\n”,a[i][i]);//對角線上的1}}要打印出以下的楊輝三角形(若打印出10行),要求:1①正確的定義一個數組11
121②給出第0列元素的表達式1331③給出對角線元素的表達式,
14641④給出第i行第j列元素的表達式15101051⑤打印“直角三角形”………
例有三個學生四門課成績,二維表格的統計與打印(按行統計和按列統計求均值)928568755488984561798140張三李四王二數學C語言英語物理#include<stdio.h>main(){//變量定義及初始化inta[3][4]={92,85,68,75,54,88,98,45,61,79,81,40},x,k,sum;charxm[3][9]={"張三","李四","王二"};charkc[4][6]={"數學","英語","C語言","物理"};floatxa[3]/*各行均值*/,ka[4]={0};//各列均值,初始化為全0//數據處理for(x=0;x<3;x++){xa[x]=0;//學生x成績,累加前賦初值為0for(k=sum=0;k<4;k++){xa[x]+=a[x][k];
//學生x各門課程k成績累加
ka[k]+=a[x][k];//課程k累加}
xa[x]/=4.0f;//學生x成績求均值}//打印,如何實現”二維表”(何時計算各門課程的平均分)?}如何找出最高分及其對應的姓名和課程?如何按平均成績排序,保持姓名的對應關系?
字符數組初始化的兩種形式:用字符型數據對數組進行初始化charstr[]={'C','h','i','n','a','\0'};用字符串常量直接對數組初始化charstr[6]={"China"};charstr[]="China";//或去掉{}字符逐個方式字符串賦值方式字符串采用‘
\0’標志字符串和數組字符串存放在字符數組中字符串
處理函數#include
<string.h>
charcs[100];gets(cs);puts(cs);charcs[100];scanf(“%s”,cs);printf(“%s”,cs);注意:輸入輸出字符串時,實參為數組名例題:輸入一個以回車結束的字符串(少于80個字符),然后逆序輸出。voidmain(){chars[80];
inti=0;
while((s[i]=getchar())!=‘\n’)
i++;
s[i]=’\0’;
//----------------等價于gets(s);for(i=strlen(s);
i>0;i--
)
putchar(s[i]);}IamaBoy\0//等價于while(s[i]=getchar(),s[i]!=‘\n’)
注:函數參數:str,str1,str2是字符數組名或字符型指針charstr[]="BBI";puts(str);charstr[]="\nbbi"puts(str);gets(str);
鍵入:Iamstdcharc1[20]="Iamstud";charc2[]="aboy"printf("%s",
strcat(c1,c2));
strcpy(str1,"BBI");charstr2[]="bbi";strcpy(str2,str1)strcmp("CCTV",“ZTV");printf("%d\n",strlen("bbi"));puts(str或字串)在屏幕上顯示一個字符串(以
‘\0’結束);附加換行gets(str)從鍵盤輸入一個串給字符數組,返回是該數組在內存的
首地址;字符串里可含空格
strcat(str1,str2)將串2接在串1后,其結果放在字符數組中strcpy(str1,字串)將字符串拷貝到字符數組里
strcmp(str1,str2)兩串相同,返回值是0;串1>串2,返回值是正整數串1<串2,返回值是負整數strlen(str)返回不包括'\0'字符串的長度函數格式功能舉例字符串處理函數<string.h>數組的應用了解了在什么情況下使用數組這種數據類型向函數傳遞一維數組和二維數組的方法用數組名作為函數參數和用簡單變量作為函數參數的不同之處程序設計常用算法:求最大值,排序,查找,統計斐比數列的設計幾種方法逆序存放數據回文問題函數C中庫函數按功能分類:使用系統提供的標準函數(稱庫函數),需要#include命令
函數
頭文件
輸入、輸出函數stdio.h
數學函數math.h
字符和字符串函數string.h
動態分配函數malloc.h………………..
對于常用的代碼片段,可自定義為通用函數
目的:代碼重用一般格式見名知意返回值的類型缺省int型無返回值void函數體:完成某功能函數類型函數名(形參類型說明表){
說明部分 語句部分}現代風格:函數的定義例有參函數的定義
intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}與外部交換數據#include<stdio.h>intmax(intx,inty);//函數聲明voidmain(){inta,b,c;scanf("%d,%d",&a,&b);
c=max(a,b);//函數調用printf("Max=%d\n",c);}各形參都帶類型說明各實參與形參一一對應自定義函數的編程思路//輸入兩個整數,返回較大者
intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}
例:函數功能:輸入兩個整數,返回最大值①確定函數名:根據函數功能,取名max②確定參數的個數及類型:應當有兩個參數,以便從主函數接收兩個整數,參數的類型應當是整型③確定函數的類型:根據返回值的類型,應為int{④根據需要定義內部變量;⑤根據功能處理數據⑥求出返回值,并返回}main函數的寫法
(調用自定義函數時)#include<stdio.h>voidmain(){必要的函數聲明(可外移);根據需要定義變量;必要的數據輸入;
函數調用;
必要的結果輸出;}#include<stdio.h>voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);
c=max(a,b);
printf("Max=%d\n",c);}intmax(intx,inty){return(x>y)?x:y;}自定義函數的編程思路//計算xn,x為實數,n為整數
doublecal_power(doublex,intn){inti;doublepow=1.0;for(i=1;i<=n;i++)pow=pow*x;returnpow;}
函數功能:計算xn,x為實數,n為整數①確定函數名:根據函數功能,取名cal_power②確定參數的個數及類型:應當有兩個參數,以便從主函數接收x和n的值,參數類型:doublex,intn③確定函數的類型:根據返回值的類型,應為double{④根據需要定義內部變量;⑤根據功能處理數據⑥求出返回值,并返回}main函數的寫法
(調用自定義函數時)#include<stdio.h>必要的函數聲明;voidmain(){根據需要定義變量;必要的數據輸入;
必要的數據處理(調用函數);
必要的數據輸出;}#include<stdio.h>doublecal_power(doublex,intn);voidmain(){doublex,s;intn,i;scanf("%lf,%d",&x,&n);
for(i=1,s=0;i<=n;i++)s=s+1/cal_power(x,i);
printf(“s=%lf\n",s);}函數調用時的數據傳遞形式參數:intmax(intx,inty);實際參數:c=max(3,5);形參為帶類型說明的變量,而實參可以是常量、變量或表達式:在調用函數過程中,系統會把實參的值傳遞給被調用函數的形參,c=max(3,b);c=max(a,b);c=max(a+3,b);實參形參單向性形參必須指定類型,實參必須有確定的值實參不帶類型說明,但實參需與形參類型一致,個數相同若實參類型與形參不一致,自動轉換為形參的類型例比較兩個數并輸出大者#include<stdio.h>intmax(intx,inty);//函數聲明voidmain(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);//函數調用printf("Max=%d\n",c);}intmax(intx,inty)//函數定義{if(y>x)x=y;return(x);}7.5函數參數及其傳遞方式調用的主要過程:
(1)先將實參a,b的值,
分別傳遞給形參x,y
(2)然后轉去執行max()函數體
(3)函數返回時,返回值z被帶回調用函數,賦值給cmax實參max形參單向傳值max函數只對局部變量x、y操作對main中的變量a、b沒影響#include<stdio.h>voidswap(intx,inty);voidmain(){inta=5,b=10;swap(a,b);printf(“%d,%d”,a,b);}voidswap(intx,inty)
{intt=x;//①
x=y;//②
y=t;//③}swap函數只對局部變量x、y、t操作,對main中的變量a、b沒影響函數間參數傳遞main函數swap函數510變量a變量b形參x形參y105變量tempmain函數變量a5變量b10①t=x;②
x=y;③y=t;5#include<stdio.h>intmain(){intb[10];printf(“輸入:");
input1(b,10);
sort(b,10);printf(“輸出:");
print1(b,10);return0;}數組名作函數的形參形參的數組名≡指針
input1(inta[],intn)≡input1(int*a,intn)voidprint1(inta[],intn){inti;for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}voidinput1(inta[],intn){inti;
for(i=0;i<10;i++)scanf("%d",a+i);}a=b=&b[0]內存地址數組元組輸入數據1000b[0]611004b[1]821008b[2]531012b[3]751016b[4]921020b[5]621024b[6]711028b[7]671032b[8]801036b[9]85實參將&b[0]值傳給形參a,形參和實參共享同一數組:a≡b,a+i≡&b[i],a[i]≡b[i]
數組名作函數參數
(選擇法排序)
用選擇法對數組中10個整數按由小到大排序解題思路:所謂選擇法就是先將10個數中最小的數與a[0]對換;第一輪結果a[0]最小再將a[1]到a[9]中最小的數與a[1]對換;第二輪結果a[1]最小……依次類推:每一輪,在未排序的數中找出最小的一個,交換到前端共比較9輪voidsort(inta[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;//從a[i]到a[n-1]中找最小值a[k]for(j=i+1;j<n;j++)if(a[j]<a[k])k=j; t=a[k];//a[k]交換到a[i]a[k]=a[i];a[i]=t; }}需要n-1輪比較數組名作函數的形參內存地址數組元組輸入數據1000a[0]611004a[1]821008a[2]531012a[3]751016a[4]921020a[5]621024a[6]711028a[7]671032a[8]801036a[9]85定義:函數直接或間接的調用自身叫函數的遞歸調用f()調f調f2調f1f1()f2()說明C編譯系統對遞歸函數的自調用次數沒有限制每調用函數一次,在內存堆棧區分配空間,用于存放函數變量、返回值等信息,所以遞歸次數過多,可能引起堆棧溢出intf(intx){inty,z;……
z=f(y);…….return(2*z);}intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}遞歸調用#include<stdio.h>intf(intn){intt;if(n==0||n==1)t=1;elset=f(n-1)*n;return(t);}voidmain(){intn=5,y;y=fac(n);printf("%d!=%d",n,y);}例:求n的階乘如何實現求xn的遞歸函數?f(n)=1(n=0,1)n*f(n-1)(n>1)遞歸函數必須有一個結束條件:
當條件成立時,不再遞歸調用本函數,完成適當操作后返回。f(5)t=5*f(4)f(4)t=4*f(3)f(3)t=3*f(2)f(2)t=2*f(1)f(1)t=1f(1)=1遞歸調用階段
返回階段intf(intn){intt;if(n<=1)t=1;elset=n*f(n-1);return(t);}f(2)=2f(3)=6f(4)=24f(n)=1(n=0,1)n*f(n-1)(n>1)f(5)=120典型例子:參見實驗十(7)從f(1)開始反向推演出f(5)遞歸函數的跟蹤局部變量局部變量在函數和復合語句塊內定義的變量形參也是局部變量只能在定義它的函數內部使用和識別特點進入語句塊時獲得內存,僅能由語句塊內語句訪問,退出語句塊時釋放內存。每次進入需重新初始化intm=1;intf(inta){if(a>m){intt;
t=m;m=a;a=t;}
returna;}voidmain(){inti=0;while(i<3)printf("%d",m+f(i++));}全局變量全局變量在所有函數之外定義的變量特點在程序中定義它的位置以后都有效在定義點之前或在其他文件中引用,應該進行如下聲明:
extern類型名變量名;從程序運行起即占據內存,程序運行過程中可隨時訪問,程序退出時釋放內存使函數之間的數據交換更容易,也更高效但是并不推薦使用,盡量少用因誰都可改寫它,難維護externintm;intf(inta){if(a>m){intt;
t=m;m=a;a=t;}
returna;}intm;//自動初值為0voidmain(){inti=0;while(i<3)printf("k=%d,",m+f(i++));}自動變量(auto)"自動"體現在進入語句塊時自動申請內存,初值不確定,退出時自動釋放是缺省的存儲類型標準定義格式
auto類型名變量名;動態局部變量,函數每次進入要重新賦初值(初始化),在函數退出后失效intk=1;voidfun();voidmain(){
intj;for(j=0;j<2;j++)fun();printf("k=%d",k);}voidfun(){
intk=1;printf("k=%d,",k);k++;}靜態變量(static)靜態變量在變量類型前面用static修飾
staticinti;靜態變量處于內存靜態區,函數退出不釋放。變量的值僅初始化一次(默認值為0),再次進入函數仍然保存上次修改的值。intk=1;voidfun();voidmain(){fun();fun();printf("k=%d",k);}voidfun(){
staticintk=1;printf("k=%d,",k);
k++;}寄存器變量(register)寄存器CPU的內部容量很有限、但速度極快的存儲器使用頻率比較高的變量聲明為register,可以使程序更小、執行速度更快register類型名變量名;
registerinti;現代編譯器有能力自動把普通變量優化為寄存器變量,并且可以忽略用戶的指定,所以一般無需特別聲明變量為register#include<stdio.h>intAverage(intx,inty);//函數聲明main(){
inta=12,b=24,ave;ave=Average(a,b);
printf("Averageof%dand%dis%d.\n",a,b,ave);}//計算平均數intAverage(intx,inty){
intresult; result=(x+y)/2;
returnresult;}函數調用在前,函數定義在后float
average(floata[10],intn){inti;
floatsum=a[0];
for(i=1;i<n;i++)
;//求累加和
return(sum/n);}例如:#defineN5longfac(intn){longf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=N;i++)printf("%d!=%ld\n",i,fac(i));}
運行結果:1!=12!=23!=34!=45!=5
運行結果:1!=12!=23!=64!=245!=120staticlongf=1;變量:在C語言中,一個變量對應于一組用于保存數據的內存單元。例如:整型變量占用4個字節的內存空間。變量的地址:變量內存單元的起始地址。指針:就是一個變量的地址.在C語言中,變量在內存中的地址是由編譯系統分配的,它是指針常量,例如數組名。指針類型:指針是C語言的一種數據類型(類型說明符*).指針變量:聲明為指針類型的,專用于存放變量地址的變量。8、指針(Pointer)的概念指針變量賦值只能賦予同類型變量的地址,不能賦予除0或NULL以外的任何其它數據。空指針:無指向#defineNULL0類型說明符*變量名;
int*p;定義一個指針變量:對指針變量的定義包括三個內容:(1)
指針類型說明:int*(2)
指針變量名:p(3)
指針所指向的變量的數據類型:int。p究竟指向哪一個變量,應由p所賦予的變量地址來決定。利用指針間接訪問時,務必明白p指向誰?
指針變量初始化intx;int*p;//(int*)是類型p=&x;//變量x的地址賦給指針變量p//表述為:p指向x*p=5;//x=5;
//通過指針p間接訪問所指的變量x
即:*p和
x等價*p≡
x*p就像普通變量一樣使用,其值就是x的值。兩個有關的運算符:&與*運算符
&
取地址運算符
*
指針運算符(或稱“間接訪問”運算符,對所指向的變量進行存取操作,“存取地址中的數值")例如:voidswap(int*px,int*py){intt=*px;*px=*py;*py=t;}voidmain(){intx=3,y=5;
swap(&x,&y);printf("x=%d,y=%d",x,y);}等價p可以指向不同的內存單元,從而使*p代表不同的變量例如:inta[10];
//定義a為包含10個整型數據的數組int*p;
//定義p為指向整型變量的指針p=&a[0];//a[0]的地址賦給指針變量p若:p=a或&a[0],即p指向數組a之首。則:*p、p[0]、*a、a[0]相互等價其中:a是指針常量,而p是指針變量(更靈活)。指針變量初始化等價通過數組名a對數組元素的操作,可以用指針變量p等效實現。二、通過指針引用數組元素
C語言規定:如果指針變量p已指向數組中的一個元素,則p+1指向它的下一個元素。引入指針變量后,就可以用多種方法來訪問數組元素了。例如:inta[10],*p,i;//使用指針常量a:更高效for(i=0;i<10;i++)scanf("%d",a+i);//a+i即&a[i]for(i=0;i<10;i++)printf("%d",*(a+i));//*(a+i)即a[i]//使用指針變量p:更高效,且不要inti;for(p=a;p<a+10;p++)scanf("%d",p);for(p=a;p<a+10;p++)printf("%d",*p);二種等效的表示方式下標表示指針表示a[i]*(a+i)p[i]*(p+i)a[0]*a(i=0)inta[]={0,1,2,3,4,5},*p;p=&a[2];p[1]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 母豬飼養技術考核試題及答案
- 系統架構設計師職業生涯與考試的關系探索試題及答案
- 2025版高考化學一輪復習課后限時集訓10富集在海水中的元素-鹵素ClBrI含解析新人教版
- 綜合性藥劑考試考題試題及答案
- 三年級數學上冊第3單元圖形的運動一3.2旋轉現象教案2冀教版
- 2025版高中數學第一章解三角形1.2應用舉例第2課時角度問題及其他學案含解析新人教B版必修5
- 文化產業管理資格考試試題及答案
- 2024-2025學年高中地理第二章旅游景觀的欣賞2.2中國名景欣賞課時訓練湘教版選修3
- 實現高效學習的光電工程師證書考試試題及答案
- 2024-2025學年高中化學第二章官能團與有機化學反應烴的衍生物2.2.1醇學案魯科版選修5
- 初中道德與法治八年級第四課書面作業設計樣例(第3-4周)
- GB∕T 17626.5-2019 電磁兼容 試驗和測量技術 浪涌(沖擊)抗擾度試驗
- 《檢驗檢測機構監督管理辦法》培訓結業考核試題附答案
- 基于SolidWorks球閥參數化設計
- 首件檢驗記錄表(標準樣版)
- 重慶森林工程林業項目營造林檢查驗收辦法(試行)
- 《江南園林分析》ppt課件
- 市政工程施工質量檢查表
- 施工日志填寫范本
- 土及部分巖石力學參數經驗值
- 如何做好銀行業IT審計
評論
0/150
提交評論