C語言程序設計 課件 (張惠濤 )第3、4章 程序設計結構;數組_第1頁
C語言程序設計 課件 (張惠濤 )第3、4章 程序設計結構;數組_第2頁
C語言程序設計 課件 (張惠濤 )第3、4章 程序設計結構;數組_第3頁
C語言程序設計 課件 (張惠濤 )第3、4章 程序設計結構;數組_第4頁
C語言程序設計 課件 (張惠濤 )第3、4章 程序設計結構;數組_第5頁
已閱讀5頁,還剩101頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章

程序設計結構C語言數據類型、運算符與表達式63.1順序結構設計3.2選擇結構設計3.3循環結構設計3.1

順序結構設計3.1.1順序結構的基本語句順序結構的基本語句包括表達式語句、函數調用語句、復合語句、空語句。1、表達式語句由表達式加上分號";"組成,執行表達式語句就是計算表達式的值。例如:x=1;(賦值語句)。++i;實現i的自增(運算符表達式語句)。2、函數調用語句由函數名,實際參數加上分號組成例如:printf("粉身碎骨渾不怕,要留清白在人間");這是一個調用庫函數,輸出字符串的語句。3、復合語句把多個語句用一對花括號括起來組合在一起,在語法上相當于一條語句。一般形式:{語句1;語句2;……語句n;}4、空語句只由一個分號";"組成,什么也不執行3.1.2數據的輸入輸出1、putchar函數putchar()是字符輸出函數,用于在顯示器輸出一個字符例如:putchar(x);代表輸出字符變量x的值//例如:先后輸出Culturalconfidence(文化自信)的首字母例3.1putchar函數的應用#include<stdio.h>intmain(){ chara='C',b='c'; putchar(a); putchar(b); putchar('\n'); return0;}3.1.2數據的輸入輸出2、getchar函數getchar()函數用于從鍵盤上輸入一個字符,通常把輸入的字符賦予一個字符變量,構成賦值語句,例如:a=getchar();說明:getchar()函數只能接收單個字符,輸入數字也按字符處理。輸入多于一個字符時,只接收第一個字符getchar()函數是無參函數,后面的括號不能省略在輸入時,空格,回車鍵都作為字符讀入,且只在輸入回車鍵時讀入才開始執行3.1.2數據的輸入輸出//從鍵盤輸入Culturalconfidence(文化自信)的首字母,輸出到屏幕例3.2getchar的賦值操作#include<stdio.h>intmain(){ chara,b; a=getchar(); b=getchar(); putchar(a); putchar(b); putchar('\n'); return0;}3.1.2數據的輸入輸出3、printf函數printf函數稱為格式輸出函數,用于按照用戶指定的格式,把指定的數據輸出到顯示器上例如:printf("%d%f",a,b)printf函數的格式控制字符串(1)格式說明符:以“%”開頭,后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。格式說明的一般形式為:%[修飾符]格式字符3.1.2數據的輸入輸出格式字符代表的意義d,i以十進制形式輸出帶符號整數(正數不輸出符號)o以八進制形式輸出無符號整數(不輸出前綴0)x,X以十六進制形式輸出無符號整數(不輸出前綴0x)U以十進制形式輸出無符號整數F以小數形式輸出單、雙精度實數e,E以指數形式輸出單、雙精度實數g,G以%f、%e中較短的輸出寬度輸出單、雙精度實數c輸出單個字符s輸出字符串3.1.2數據的輸入輸出在格式說明字段中,可以根據具體情況使用修飾符。前綴修飾符的位置一般緊靠“%”,一般格式有[flags][width][.prec]等。前綴修飾符及代表的意義[]表示該項為可選項,即可有可無。-表示左對齊輸出,如果寬度大于輸出數據的寬度,右邊補空格;默認為右對齊輸出,如果寬度大于輸出數據的寬度,左邊補空格。例如:printf(“%6d\n”,123);printf(“%-6d\n”,123);輸出結果:123123[.prec]為可選的精度指示符,整數位表示至少要輸出的數字個數,不足補空格,多則原樣輸出;小數位表示小數點后至多輸出的數字個數,不足在后面補數字0,多則作四舍五入處理。3.1.2數據的輸入輸出4、scanf函數scanf()函數稱為格式輸入函數,用于按照用戶指定的格式從鍵盤把數據輸入到指定的變量中其一般形式為:scanf(“格式控制字符串”,地址表列);例如:scanf("%d%f",&a,&b)scanf()與printf()既有相似之處,也有不同:scanf()函數的格式控制字符含義與printf()函數相同;地址表列由若干個地址組成,地址是由地址運算符“&”后跟變量名組成的,代表每一個變量在內存中的地址。3.1.2數據的輸入輸出使用scanf()函數需要注意的幾點問題:scanf()中要求給出變量地址。scanf()函數中沒有精度控制。在輸入多個數值時,若格式控制字符中相鄰兩個格式指定符沒有指定分隔符,則可用空格,跳格或回車作間隔。在輸入字符時,若格式控制串中沒有非格式字符,則認為所有輸入的字符均為有效字符。另外,如果在格式控制中加入逗號作為間隔,即scanf("%c,%c,%c",&a,&b,&c);則輸入d,e,f為有效錄入。如輸入的數據類型與輸出的類型不一致時,雖然編譯能夠通過,但結果不正確。順序結構舉例解析例3.3兩個整數的“5”則運算(輸入a和b,計算并輸出它們的和、差、積、商及余數)#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&b);printf("%d%d%d%d%d",a+b,a-b,a*b,a/b,a%b);return0;}順序結構舉例解析例3.4.求三個數的平均數(保留兩位小數)#include<stdio.h>intmain(){intx,y,z;scanf("%d%d%d",&x,&y,&z);doublet=(x+y+z)/3.0;printf("%.2lf\n",t);return0;}順序結構舉例解析例3.5計算多項式f(x)=ax^3+bx^2+cx+d的值(輸入x,a,b,c,d的值)#include<stdio.h>intmain(){ doublex,a,b,c,d; scanf("%lf%lf%lf%lf%lf",&x,&a,&b,&c,&d); printf("%.7lf",a*x*x*x+b*x*x+c*x+d); return0;}順序結構舉例解析例3.6給出圓的半徑,求圓的直徑、周長和面積(π=3.14159,結果保留四位整數)#include<stdio.h>#definepi3.14159intmain(){doubler;scanf("%lf",&r);printf("%.4lf%.4lf%.4lf",2*r,2*pi*r,pi*r*r);return0;}順序結構舉例解析例3.7計算球的體積(V=4/3×π×r^3,π=3.14,結果保留兩小數)#include<stdio.h>intmain(){ doubler,v; scanf("%lf",&r); v=4.0/3*3.14*r*r*r; printf("%.2lf",v); return0;}順序結構舉例解析例3.8反向輸出一個三位數(反向輸出n,要保留前導0)#include<stdio.h>intmain(void){intx;intc,b,a;scanf("%d",&x);a=x/100;b=(x/10)%10;c=x%10;printf("%03d",c*100+b*10+a);return0;}順序結構舉例解析例3.9打印ASCII碼#include<stdio.h>intmain(){ chara; intb; scanf("%c",&a); b=a; printf("%d",b);return0;}3.2

選擇結構程序設計3.2.1if語句1單分支if語句一般形式:if(表達式)語句序列;后繼語句;if表達式與語句序列算一條語句,if就近控制一條語句if表達式結構為真時進入if字句,為假則直接執行后繼語句例3.10輸入一個數,正數則求其平方根,否則輸出該數的平方#include<stdio.h>voidmain(){floatx,y;printf("輸入一個數:");scanf("%f",&x);y=x*x;if(x>0)y=sqrt(x); /*sqrt()為求平方根函數*/printf("%f",y);}假表達式語句真3.2.1if語句2雙分支if語句一般形式:if(表達式)語句序列1;else語句序列2;后繼語句;若if表達式的值為真,執行語句序列1;否則執行語句序列2有else必須有if,有n個else就至少有n個ifif和else都只就近控制1條語句;語句序列1和語句序列2可以為復合語句{},復合語句算1條語句3.2.1if語句例3.11求二元一次方程的解#include<stdio.h>#include<math.h>intmain(){floata,b,c,disc,p,q,x1,x2;printf("請輸入a,b,c的值:");scanf("%f%f%f",&a,&b,&c);disc=b*b-4*a*c;if(disc>0){p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);

x1=p+q;x2=p-q;printf("x1=%.2f\nx2=%.2f\n",x1,x2);}else{printf("該方程沒有根,請重新輸入系數!\n");}return0;}3.2.1if語句注意事項:if表達式通常是邏輯表達式和關系表達式,也可以是其他表達式;如算數表達式或賦值表達式,也可以是一個常量或變量if(a=5)語句;表達式a=5的值永為非0,同時,將5賦給變量a,因為表達式值非0,其后的語句一定執行,雖不合理,但符合語法規則。if(b)語句;if(a=b) printf("%d",a);else printf("a=0");含義:把b賦給a,如b的值為非0,則輸出該值,否則輸出a=0在if語句的兩種形式中,語句序列1和語句序列2均為單條語句,若需執行一組語句,須把這組語句加上花括號{}組成一條復合語句,在}后無需加分號3.2.1if語句3if語句的嵌套if語句的嵌套一般格式:if(表達式1) if(表達式2) 語句1; else 語句2;else if(表達式3) 語句3; else 語句4;else與if之間的配對關系:C語言規定else總是與它上面最近的if語句配對。多分支選擇的流程3.2.1if語句使用if語句的嵌套結構實現多分支時,采用規范形式:if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;elseif(表達式4)語句4; ...elseif(表達式n)語句n;else語句n+1;語義:當表達式i(1<=i<n)為真時,執行語句i,然后跳出整個if語句執行后繼語句;否則判斷else后面表達式i+1是否為真。若所有表達式均為假,則執行語句n+1,然后執行后繼語句。3.2.1if語句#include<stdio.h>intmain(){charc;printf("輸入一個字符");c=getchar();if(c<32)printf("c為控制字符\n");elseif(c>=48&&c<=57)printf("c為數字字符\n");elseif(c>=65&&c<=90)printf("c為大寫字母\n");elseif(c>=97&&c<=122)printf("c為小寫字母\n");elseprintf("c為其他字符\n");return0;}例3.13利用輸入字符的ASCII值判斷字符類型。說明:控制字符的ASCII值為小于32;數字字符’0‘和‘9’的ASCII值為48和57;大寫字母’A‘和’Z‘的ASCII值為65和90;小寫字母’a’和’z‘的ASCII值為97和122,其余則為其他字符。3.2.2

switch語句

if語句是根據表達式的值是否為0來判斷執行哪一分支的。某些情況下,要根據表達式的不同值來判斷執行哪一分支,如表達式的值為1,2,3時,分別執行不同的操作。雖然也可以用多條if語句來完成這一工作,但c語言中提供了一條switch語句,可以更方便的完成。3.2.2

switch語句

1switch語句的形式switch語句是一種用于實現多分支選擇結構的語句,其特點是可以根據一個表達式的多種值選擇多個分支,又稱之為開關語句switch語句的一般形式為:switch(表達式){case常量表達式1:語句塊1case常量表達式2:語句塊2...case常量表達式n:語句塊ndefault:語句塊n+1}執行switch語句時,首先計算switch后面表達式的值,然后自上而下逐個與case后的常量表達式進行比較,相等的話則從該case后為入口,執行該常量表達式冒號后面的所有語句塊,直到switch語句結束(default后的語句塊也輸出);當表達式的值與所有的case后的常量表達式均不相等時,若存在default,則執行default后面的語句塊,若沒有default,則結束switch語句。3.2.2

switch語句例3.14用1~7表示星期一到星期日,先輸入數字,輸出對應的星期幾的英文單詞#include<stdio.h>intmain(){inta;printf("inputintegernumber:");scanf("%d",&a);switch(a){case1:printf("Monday\n");case2:printf("Tuesday\n");case3:printf("Wednesday\n");case4:printf("Thursdat\n");case5:printf("Friday\n");case6:printf("Saturday\n");case7:printf("Sunday\n");default:printf("error\n");}return0;}3.2.2

switch語句例3.15修改上一個程序,增加break語句#include<stdio.h>intmain(){inta;printf("inputintegernumber:");scanf("%d",&a);switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3:printf("Wednesday\n");break;case4:printf("Thursdat\n");break;case5:printf("Friday\n");break;case6:printf("Saturday\n");break;case7:printf("Sunday\n");break;default:printf("error\n");}return0;}case常量表達式只相當于一個語句標號,表達式的值和某常量表達式的相等,則轉向該標號執行,但不能執行完自動跳出整個switch語句體,此種情況可采用C語言中break語句跳出switch語句體選擇結構舉例解析例3.16輸入一個年份,判斷是否公歷中的閏年;能被4整除而不能被100整除或能被400整除的年份就是閏年#include<stdio.h>voidmain(){intyear;printf("inputtheyear:");scanf("%d",&year);if(year%4==0&&year%100!=0||year%400==0)printf("Yes");elseprintf("No");}選擇結構舉例解析例3.17有一個函數y=x(x<1)y=2x-1(1<=x<=10)y=3x-11(x>=10),編寫實現該函數的程序。#include<stdio.h>intmain(){ intx,y; printf("請輸入x的值:"); scanf("%d",&x); if(x<1)y=x;//如果x小于1,則y的值設為x if(x>=1&&x<10)y=2*x-1;//如果x大于等于1且小于10,則y的值設為2x-1 if(x>=10)y=3*x-11;//如果x大于等于10,則y的值設為3x-11 printf("y=%d",y); return0;}選擇結構舉例解析或者#include<stdio.h>intmain(){ intx,y; printf("請輸入x的值:"); scanf("%d",&x); if(x<1)y=x;//如果x小于1,則y的值設為x elseif(x<10)y=2*x-1;//否則x大于等于且小于10,則y的值設為2x-1 elsey=3*x-11;//否則y的值設為3x-11 printf("y=%d",y); return0;}選擇結構舉例解析例3.18公司員工的工資等于底薪加提成,已知員工的底薪3500,利潤profit與工資提成的關系:profit<=1000無提成;1000<profit<=2000提成10%;2000<profit<=5000提成15%;5000<profit<=10000提成20%;10000<profit提成25%,根據利潤打印員工工資。使用if語句嵌套#include<stdio.h>intmain(){floata=3500; /*定義底薪500*/intprofit; /*定義利潤*/floatb; /*定義實際工資*/printf("輸入工程利潤:");scanf("%d",&profit);if(profit<=1000)b=a;elseif(profit<=2000)b=a+profit*0.1;elseif(profit<=5000)

b=a+profit*0.15;elseif(profit<=10000)b=a+profit*0.2;elseb=a+profit*0.25;printf("員工工資為:%f",b);return0;}選擇結構舉例解析#include<stdio.h>intmain(){floata=3500;intprofit;intsymbol;printf("輸入利潤:");scanf("%ld",&profit);symbol=(profit-1)/1000;switch(symbol){case0:break;case1:a+=profit*0.1;break;case2:case3:case4:a+=profit*0.15;break;case5:case6:

case7:case8:case9:a+=profit*0.2;break;default:a+=profit*0.25;}printf("a=%.2f",a);}選擇結構舉例解析例3.19學校為同學的成績做了一下等級區分(同學的成績都在100~0分內),100~90為A級,90~80為B級,80~70為C級,70~60為D級,60以下為E級。#include<stdio.h>intmain(){intgrade;printf("輸入學生成績(0~100):");scanf("%d",&grade);if(grade>=90)printf("該同學等級為:A\n");elseif(grade>=80)printf("該同學等級為:B\n");elseif(grade>=70)printf("該同學等級為:C\n");elseif(grade>=60)printf("該同學等級為:D\n");elseprintf("該同學等級為:E\n");return0;}選擇結構舉例解析#include<stdio.h>intmain(){ intgrade; printf("請輸入該同學成績(0~100):"); scanf("%d",&grade); switch(grade/10) { case10: case9:printf("該同學等級為:A");break; case8:printf("該同學等級為:B");break; case7:printf("該同學等級為:C");break; case6:printf("該同學等級為:D");break; default:printf("該同學等級為:E\n"); } return0;}選擇結構舉例解析例3.20當a為正數時,將下面語句改為switch語句if(a<30)m=1;elseif(a<40)m=2;elseif(a<50)m=3;elseif(a<60)m=4;elsem=5;分析:a的變化點轉折是10的倍數,a<30對應3;a<40對于4,a<50對應5,a<60對應6#include<stdio.h>voidmain(){intc,a,m;printf("輸入一個數:");scanf("%d",&a);if(a<=0)c=-1;elsec=a/10;switch(c){case0:case1:case2:m=1;break;case3:m=2;break;case4:m=3;break;case5:m=4;break;default:m=5;}if(c!=-1)printf("m=%d\n",m);elseprintf("error\n");}3.3循環結構程序設計3.3.1for循環結構1、for循環結構的一般形式for(表達式1;表達式2;表達式3)循環體表達式1:初始值表達式,為循環控制變量設置初始值。表達式2:循環控制邏輯表達式,它控制循環執行的條件,決定循環次數。表達式3:循環控制變量修改表達式循環體:重復執行的語句for語句的執行流程如圖所示3.3循環結構程序設計3.3.1for循環結構for語句的執行過程如下:第一步:計算表達式1第二步:判斷表達式2,若其值為真(非0),則執行循環體語句,然后執行第3步;若值為假(0),結束循環,轉到第5步執行第三步:計算表達式3第四步:返回第2步繼續執行第五步:循環結束,繼續執行for語句的下一條語句for循環結構例3.21編寫程序計算s=1+2+3...+100的值#include<bits/stdc++.h>intmain(){ ints=0,i; for(i=1;i<=100;i++) { s=s+i;//不積跬步無以至千里 } printf("s=%d",s); return0;}for循環結構例3.22人類追求更多的是心靈的歸屬,而文化是歸屬的土壤,只有文化才是我們賴以與其他種族區別的精神內核,文化傳承,人類繁衍發展。假設今年我國人口數為13億,若按每年1%增長,計算從現在開始10年內每年人口的數量#include<stdio.h>#include<math.h>intmain(){intn=13,year;doublenumber,rate=0.01;for(year=1;year<=10;year++){number=n*pow((1+rate),year);printf("%2d年后,人數為:%.2f億\n",year,number);}return0;}for循環結構例3.23輸入一個正整數n,計算從1加到n的和程序設計思路:首先設計變量增量i,存和變量sum,必須設置sum的初始值為0,sum=sim+i語句重復n次,同時i從1變到n,就實現了從1累加到n。#include<stdio.h>intmain(){inti,n,sum;scanf_s("%d",&n);sum=0;for(i=1;i<=n;i++)sum=sum+i;printf("由1到%d的和是:%d\n",n,sum);return0;}for循環結構例3.24輸入一個正整數,求n!#include<stdio.h>intmain(){inti,n;intfactorial;printf("輸入n的值:");scanf("%d",&n);factorial=1;

for(i=1;i<=n;i++)factorial=factorial*i;printf("%d!=%.0f\n",n,factorial);return0;}for循環結構2、for語句的變形for語句的一般形式中省略表達式1格式如下:for(;表達式2;表達式3)循環語句;說明:省略表達式1時,可以將循環變量賦初值放在for之前。注意,此時不能省略第一個;(以求從1加到100為例)i=1;for(;i<=100;i++){s=s+i;}for循環結構for語句的一般形式中省略表達式2格式如下:for(表達式1;;表達式3)循環語句;(以求從1加到100為例)#include<bits/stdc++.h>intmain(){ inti,s=0; for(i=1;;i++) { if(i<=100) s=s+i; else break;//不滿足條件退出循環 } printf("%d",s); return0;}for循環結構for語句的一般形式中省略表達式3格式如下:for(表達式1;表達式2;)循環語句;(以求從1加到100為例)#include<bits/stdc++.h>intmain(){ inti,s=0;

for(i=1;i<=100;) { s=s+i; i++; } printf("%d",s); return0;}for循環結構for語句的一般形式中表達式1和表達式3也可以是逗號表達式如:#include<bits/stdc++.h>intmain(){ inti,j; for(i=1,j=10;i<=j;i++,j--) { printf("i=%d,j=%d\n",i,j); } return0;}for循環結構for語句的一般形式中循環體語句可以省略如for(sum=0,i=1;i<=100;sum=sum+i,i++)上述for語句的循環體為空語句,實際上已把累加和的運算放入到表達式3中了。for循環結構例3.25輸入十個數,輸出其中最大的數#include<stdio.h>intmain(){inti;floatx,max;printf("輸入第1個數:");scanf("%f",&x);max=x;for(i=2;i<=10;i++){printf("請輸入第%d個數:",i);

scanf("%f",&x);if(x>max)max=x;}printf("10個數的最大值是:%.0f",max);return0;}for循環結構例3.26輸出所有的水仙數(水仙數的特點是三位數中百位數字的立方與十位數字的立方與個位數字的立方之和等于三位數本身)#include<stdio.h>intmain(){intnumber,a,b,c;for(number=100;number<=999;number++){a=number/100;b=number%100/10;c=number%10;if(number==a*a*a+b*b*b+c*c*c)

printf("%5d",number);}return0;}for循環結構例3.27輸出100以內的完數(所有的真因子(除了自身以外的約數)的和恰好等于它本身的正整數成為完數)#include<stdio.h>intmain(){intnumber,sum,i,j; for(i=1;i<=100;i++) { sum=0; for(j=1;j<=i-1;j++) { if(i%j==0) sum=sum+j; } if(i==sum) printf("%d",i); }return0;}for循環結構例3.28統計由鍵盤輸入的20個字符中,大寫英文字母,小寫英文字母,數字字符和其他字符的個數#include<stdio.h>intmain(){ intupper,lower,digit,i,other; charch; upper=lower=digit=other=0; printf("輸入20個字符:"); for(i=1;i<=20;i++) { ch=getchar();for循環結構 if(ch>='a'&&ch<='z') lower++; elseif(ch>='A'&&ch<='Z') upper++; elseif(ch>='0'&&ch<='9') digit++; else other++;} printf("大寫字母%d個,小寫字母%d個,數字%d個,其他字符%d個\n",upper,lower,digit,other); return0;}for循環結構例3.29由鍵盤輸入三個數字,將其組合成一個整型數并輸出#include<stdio.h>intmain(){intn=0,i;charch;printf("輸入三個數字:");for(i=1;i<=3;i++){scanf("%c",&ch);n=n*10+ch-'0';//ch-’0’將字符型數字轉換成數字}

printf("%d\n",n);return0;}for循環結構例3.30由鍵盤輸入一個正整數,判斷其是否為素數#include<stdio.h>intmain(){ inti,flag,num; printf("輸入一個正整數:"); scanf("%d",&num); flag=1; for(i=2;i<=num-1&&flag;i++) if(num%i==0) flag=0; if(flag) printf("%d是素數\n",num); else printf("%d不是素數\n",num); return0;}3.3.2while循環結構一般形式:

while(表達式)語句表達式語句真假表達式1.計算表達式。語句2.如果表達式的值為非零,執行語句。表達式3.返回第一步,重新計算表達式。4.如果表達式的值為零,則結束循環。如果表達式的值一開始就為0,則語句一次也不會被執行。執行流程:3.3.2while循環結構例3.33輸入一個正整數n,計算n!#include<stdio.h>intmain(){ inti; intn,fact; i=2; fact=1; printf("請輸入n的值:"); scanf("%ld",&n); while(i<=n) { fact=fact*i; i=i+1; } printf("%d!=%d\n",n,fact); return0;}3.3.2dowhile循環結構一般形式:

do{

語句

}while(表達式);1.執行語句3.表達式的值為非零,返回第1步4.表達式的值為零,結束循環語句至少被執行一次。表達式語句2.計算表達式執行流程:注意:分號不能丟語句真假3.3.2dowhile循環結構intday=1;do{

printf("%d\n",day);

day++;}while(day<8);程序在執行的過程為:首先進入第一次循環顯示1并將day的值加1,然后做條件判斷day的值為2,于是day<8的結果為真,返回到do后面的循環體進入下一次循環...直到day的值為8時,day<8的結果為假,結束循環。舉例:while和

dowhile細微差別使用while執行循環:inti=0;while(i<0){ i++; printf("%d\n",i);}執行0次循環,沒有運行結果;舉例:使用dowhile執行循環:inti=0;do{ i++; printf("%d\n",i);}while(i<0);執行1次循環,運行結果為1。dowhile循環結構舉例例3.34求兩個自然數的最大公約數和最小公倍數#include<bits/stdc++.h>intmain(){inta,b,r,n,m;printf("請輸入兩個整數:");scanf("%d%d",&a,&b);m=a,n=b;do{r=a%b;a=b;b=r;}while(r!=0);printf("%d和%d的最大公約數是:%d\n",m,n,a);printf("最小公倍數是:%d",m*n/a);return0;}dowhile循環結構舉例例3.35輸入一個整數,統計該數的位數#include<stdio.h>intmain(){ longn,m; intcount=0; printf("請輸入一個整數:"); scanf("%ld",&n); m=n; if(n<0) n=-n; do { n=n/10; count++; }while(n!=0); printf("整數%ld有%d位數\n",m,count); return0;}綜合實踐解析例3.37編寫程序,由鍵盤輸入一個正整數,判斷其是否為素數程序中結束for循環的條件有兩個:一是i>m;二是break語句若i>m,說明for循環正常結束,則n一定是素數若遇到break語句,說明循環中條件n%i=0成立,n能被某個i整除,執行break語句退出循環,此時i<=m,n一定不是素數#include<bits/stdc++.h>intmain(){intn,m,i;printf("請輸入一個正整數:");scanf("%d",&n);m=sqrt(n);

for(i=2;i<=m;i++)if(n%i==0)break;if(i>m)printf("%d是素數!\n",n);elseprintf("%d不是素數!\n",n);return0;}綜合實踐解析例3.38從鍵盤輸入一批學生的成績(以負數作為結束標志),計算平均分,并統計不及格成績的個數#include<stdio.h>intmain(){ intnum,n; floatscore,total=0; num=0;n=0; while(1) { printf("請輸入分數#%d(0~100):",n+1); scanf("%f",&score); if(score<0) break; if(score<60) num++; total=total+score; n++; } printf("平均分數是:%.2f.\n",total/n); printf("不及格的有:%d.\n",num); return0;}綜合實踐解析例3.39把1到100之間能被7整除的數,以每行5個的形式在屏幕上輸出#include<stdio.h>intmain(){ inti,n=1; for(i=1;i<=100;i++) { if(i%7!=0) continue; printf("%4d",i); if(n++%5==0) printf("\n"); } return0;}綜合實踐解析例3.40分析下面程序的運行結果#include<bits/stdc++.h>intmain(){intn,s=0;n=1;while(n<10){s=s+n;if(s>5)break;if(n%2==1)continue;n++;}printf("s=%d,n=%d\n",s,n);return0;}綜合實踐解析例3.42將10-20之間的正整數分解質因數。#include<bits/stdc++.h>intmain(){inti,n,m;for(m=10;m<=20;m++){n=m,i=2;printf("%d=",n);do{if(n%i==0){printf("%d*",i);n=n/i;}elsei++;}while(n!=i);printf("%d\n",n);}return0;}綜合實踐解析例3.43猜數字游戲:由計算機隨機產生一個10-80之間的數據,然后由用戶進行猜數,在5次之內猜中則成功,否則給出大小提示。猜5次之后結束程序#include<bits/stdc++.h>intmain(){intm,n,count=0;m=rand()%71+10;loop:printf("請輸入一個10-80之間的數:");while(1){scanf("%d",&n);count++;if(m==n)綜合實踐解析{printf("踏破鐵鞋無覓處,得來全不費工夫\n");break;}elseif(m>n&&count<5)printf("會當凌絕頂,一覽眾山小\n");elseif(m<n&&count<5)printf("飛流直下三千尺,疑是銀河落九天\n");if(count==5){printf("為山九仞,功虧一簣\n這個數是:%d,結束!\n",m);break;}gotoloop;return0;}}本章小結本章介紹了C語言程序的順序結構、選擇結構、循環結構三種程序設計結構,介紹了數據的輸入和輸出函數,if和switch語句,for循環和while循環結構,在C語言學習之路中,以中國的優美詩句為例,介紹了文化自信的內容。第四章數組數組64.1一維數組4.2二維數組4.3字符數組4.4數組程序舉例數組6在使用C語言進行程序設計過程中,我們使用數組把具有相同類型的若干變量按有序的形式組織起來,這些按一定順序排列的同類型數據元素的集合稱為數組。在C語言中,數組屬于構造數據類型,它可以被分解成若干個數組元素,而這些數組元素可以是基本數據類型,也可以是構造類型。按數組元素的類型劃分,數組可分為數值數組、字符數組、指針數組、結構體數組等多種類型。本章主要介紹數值數組以及字符數組的定義及使用方法。4.1一維數組4.1.1一維數組的定義在C語言中規定,數組必須先定義再使用。一維數組定義方式為:

類型說明符數組名[整形常量或常量表達式];其中:類型說明符是int、char、float、double等基本數據類型以及構造數據類型。數組名是用戶定義的數組標識符,其命名規則與基本變量名一致。常量表達式使用中括號括起來,表示數據元素的個數,也稱為數組的長度,可以是一個大于等于1的整數、符號常數或常量表達式。例如:intarr[5];//定義數組名為arr、每個元素類型都是整型、共有5個元素的數組#defineLEN100//定義宏常量LEN,其值為100floatarr1[LEN],arr2[LEN+10];//可以使用符號常數和常量表達式來定義數組charch[8];//定義數組名為ch、每個元素類型都是字符型、共有8個元素的數組4.1一維數組4.1.1一維數組的定義對于數組定義應注意以下幾點:數組名的書寫規則應符合標識符的書寫規定,在前面章節已做介紹;數組名不能與其它變量名相同,例如對于intarr,arr[5];系統會報錯;數組的類型代表了其中每個元素的值類型,即同一個數組,其元素數據類型均相同;中括號中常量表達式表示數組元素的個數,但其下標從0開始計算,因此intarr[5];定義完成后,其元素分別為arr[0],arr[1],arr[2],arr[3],arr[4];中括號中可以是符號常數或常量表達式,但不能是變量。//正確示例#defineLEN100main(){inta[LEN],b[LEN+100];……}//錯誤示例main(){intlen=100;inta[len],b[len+100];……}4.1一維數組4.1.2一維數組的初始化數組初始化賦值,也可簡稱為初始化,是指在定義的同時給數組元素賦予初值。數組初始化在編譯階段進行,這樣的程序運行時間短,執行效率高。初始化賦值的形式為:類型說明符數組名[整形常量或常量表達式]={值1,值2,……值n};其中,使用大括號將數據值集合括起來,而{}中的數據值即為若干元素的初值,各值之間用逗號間隔。例如:intarr[5]={10,11,12,13,14};//其中arr[0]到arr[4]的值分別為10,11,12,13,144.1一維數組4.1.2一維數組的初始化C語言對數組的初始化還有以下幾點說明:可以只給部分元素賦初值當大括號中值的個數少于元素總個數時,只給靠左面的部分元素賦值,例如:intarr[5]={10,11,12};表示只給arr[0]到arr[2]分別賦值10,11,12,而后2個整形元素自動賦值0。只能給元素逐個賦值,不能給數組整體賦值例如:給5個元素全部賦值為1,只能寫為intarr[5]={1,1,1,1,1};而不能寫為:intarr[5]=1;給全部元素初始化賦值時,數組元素的個數可以不寫例如:intarr[5]={10,11,12,13,14};可寫為:intarr[]={10,11,12,13,14};4.1一維數組4.1.3一維數組元素的引用C語言規定數組必須先定義后使用,且只能逐個引用數組元素而不能一次引用所有元素,這是因為數組元素,也被稱為下標變量,是組成數組的基本單元,而每個數組元素就是一個變量,其使用方法與同類型的變量一樣。數組元素的表示形式為:數組名[下標]其中下標可以是整型常量或變量表達式,這與定義時的常量表達式不同。例如intarr[5]={10,11,12,13,14};使用arr[2],a[i+j],a[i++](其中i,j都是整形變量)引用上述數組的元素都是正確的形式。4.1一維數組4.1.3一維數組元素的引用例4.1數組的定義與元素引用#include<stdio.h>#defineLEN5voidmain(){inti,arr1[LEN];intarr2[5]={10,11,12,13,14};arr1[0]=0;arr1[1]=1;arr1[2]=2;arr1[3]=3;arr1[4]=4;for(i=0;i<=4;i++)printf("%d",arr1[i]);

printf("%d",arr2[0]);printf("%d",arr2[1]);printf("%d",arr2[2]);printf("%d",arr2[3]);printf("%d",arr2[4]);}4.1一維數組4.1.3一維數組元素的引用例4.2數組元素可以當做普通變量來使用#include<stdio.h>#defineLEN5voidmain(){inti,arr1[LEN];intarr2[5]={10,11,12,13,14};for(i=0;i<5;i++)arr1[i]=arr2[i]*2;for(i=4;i>=0;i--)printf(“%d\n”,arr1[i]);}4.1一維數組4.1.4一維數組程序舉例例4.3使用數組來實現求5個整數中的最大值#include<stdio.h>voidmain(){inti,max;//定義整型變量i當計數器變量,max存儲最大值intarr[5];printf("請輸入5個整數:\n");for(i=0;i<5;i++)scanf("%d",&arr[i]);//使用scanf函數進行動態賦值max=arr[0];for(i=1;i<5;i++)if(arr[i]>max)max=arr[i];printf("數組中最大的整數是%d\n",max);}4.1一維數組4.1.4一維數組程序舉例【例4.4】使用數組為當前數組賦值#include<stdio.h>voidmain(){inti,j,arr1[5]={1,2,3,4,5},arr2[5]={0};printf("\n數組arr2所有元素的初始值為:\n");for(i=0;i<5;i++)printf("%-5d",arr2[i]);for(i=0;i<5;i++)arr2[i]=arr1[i];printf("\n數組arr2在被arr1賦值后所有元素的值為:\n");for(i=0;i<5;i++)printf("%-5d",arr2[i]);}4.2二維數組4.2.1二維數組的定義二維數組定義的一般形式是:類型說明符數組名[常量表達式1][常量表達式2]其中常量表達式1表示第一維下標的長度,常量表達式2則表示第二維下標的長度。例如:inta[5][5];定義了一個5行5列的數組,數組名為a,其下標變量的類型與一維數組一樣,均為整型。該數組的下標變量共有5×5個,即:a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]a[1][0],a[1][1],a[1][2],a[1][3],a[1][4]a[2][0],a[2][1],a[2][2],a[2][3],a[2][4]a[3][0],a[3][1],a[3][2],a[3][3],a[3][4]a[4][0],a[4][1],a[4][2],a[4][3],a[4][4]4.2二維數組4.2.1二維數組的定義二維數組定義的一般形式是:

類型說明符數組名[常量表達式1][常量表達式2]其中常量表達式1表示第一維下標的長度,常量表達式2則表示第二維下標的長度。例如:inta[5][5];定義了一個5行5列的數組,數組名為a,其下標變量的類型與一維數組一樣,均為整型。該數組的下標變量共有5×5個,即:a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]a[1][0],a[1][1],a[1][2],a[1][3],a[1][4]a[2][0],a[2][1],a[2][2],a[2][3],a[2][4]a[3][0],a[3][1],a[3][2],a[3][3],a[3][4]a[4][0],a[4][1],a[4][2],a[4][3],a[4][4]二維數組在概念上是二維的,但是,實際的硬件存儲器卻是連續編址的,也就是說存儲器單元是按一維線性排列的。在C語言中,二維數組是按行排列的。4.2二維數組4.2.2二維數組的初始化二維數組在定義的同時也可以進行初始化操作,使數組中若干元素獲得相應的值。二維數組初始化也是在編譯階段進行,這樣的程序運行時間短,執行效率高。二維初始化賦值的形式為:

類型說明符數組名[整形常量或常量表達式1][整形常量或常量表達式2]={值1,值2,……值n};實際上,二維數組初始化時可按行分段賦值,也可按行連續賦值。例如對于數組a[4][3]:按行分段賦值可寫為:inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};按行連續賦值可寫為:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};這兩種初始化的結果是完全相同的,但推薦分段賦值的方法,這樣層次清晰,不容易出錯。4.2二維數組4.2.2二維數組的初始化例4.5二維數組初始化可以使用不同的形式#include<stdio.h>voidmain(){inti,j,a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};intb[4][3]={{1,2,3,4,5,6,7,8,9,10,11,12};printf(“\n數組a初始化之后各元素的值依次為:\n”);for(i=0;i<4;i++)for(j=0;j<3;j++)printf(“%-4d”,a[i][j];printf(“數組b初始化之后各元素的值依次為:\n”);for(i=0;i<4;i++)for(j=0;j<3;j++)printf(“%-4d”,b[i][j];)}4.2二維數組4.2.3二維數組元素的引用二維數組的元素也稱為雙下標變量,二維數組中各元素的表示形式為:

數組名[下標1][下標2]其中下標1和下標2應為整型常量或整型表達式。在C語言中,二維數組與一維數組一樣,也必須先定義后使用,且只能引用每一個元素而不能整體引用。例如:執行完語句inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};之后a[0][1]表示數組0行1列的元素,其值為2。4.2二維數組4.2.4二維數組程序舉例例4.6設計一個簡單的程序,統計學生語文、數學、英語三門課程的總分及平均分,具體如下表所示。課程語文數學英語總分平均分Alice808590

Bob908894

Clinton867892

可設一個二維數組a[3][5]存放3位同學三門課的成績、總分及平均分。根據數組的定義、初始化及引用方法,將總分及平均分計算并保存到相應的數組元素中。由于分數可能有小數,故將數組定義成單精度型。4.2二維數組4.2.4二維數組程序舉例#include<stdio.h>voidmain(){inti,j;//其中i,j為計數器floattotal=0,aver=0;//total表示總分,aver表示平均分,將兩者均初始化為0floatscore[3][5]={{80,85,90},{90,88,94},{86,78,92}};for(i=0;i<3;i++){for(j=0;j<3;j++){total+=score[i][j];}score[i][3]=total;score[i][4]=total/3.0;total=0;}printf(“3位同學的成績表打印如下:\n”);printf(“語文

數學

英語

總分

平均分\n”);for(i=0;i<3;i++){for(j=0;j<5;j++)printf(“%-8.2f”,score[i][j]);printf(“\n”);}}4.3字符數組4.3.1字符數組的定義形式與前面介紹的數值數組相同,字符數組定義的一般形式為:一維數組: char數組名[整型常量或整型常量表達式];二維數組: char數組名[整型常量或整型常量表達式1][整型常量或整型常量表達式2];例如:charc[5];//定義一維字符數組,其最大容量為5個字符,元素下標從0到4charc[4][3];//定義二維字符數組,其包含的元素第一個下標從0到3、第二個下標從0到2本節重點講述一維字符數組,讀者可參考二維數組的基礎知識來理解多維字符數組。4.3字符數組4.3.2字符數組的初始化字符數組也允許在定義時作初始化賦值,不過每個值需要使用單引號‘’引起來。例如讓字符數組存儲hello這個單詞:charc[6]={‘h’,‘e’,‘l’,‘l’,‘o’};賦值后各元素的值如表所示。其中c[5]未賦值,而系統自動為其賦予0值。當對全體元素賦初值時也像前面普通數組一樣,可以省去長度。例如:charc[]={‘h’,‘e’,‘l’,‘l’,‘o’};注意,這時數組c的長度不再是6,而是自動定為5。c[0]c[1]c[2]c[3]c[4]‘h’‘e’‘l’‘l’‘o’4.3字符數組4.3.3字符數組的引用與其他基本類型的數組相同,字符數組也必須先定義后使用,且只能逐個引用數組元素而不能一次引用所有元素,而每個字符數組元素就是一個字符變量,其使用方法與字符變量相同。字符數組元素的表示形式為:

數組名[下標]以數組初始化時,以charc[]={‘h’,‘e’,‘l’,‘l’,‘o’};為例,可使用c[1]來引用‘e’;c[1+3]來引用’o’,其與c[4]等價;c[i]來引用其中任一值,其中i為整型變量,且0≤i≤4。4.3字符數組4.3.3字符數組的引用例4.7字符數組初始化及元素引用#include<stdio.h>voidmain(){inti;charc[]={‘h’,‘e’,‘l’,‘l’,‘o’};printf(“數組中的元素值為:\n”);for(i=0;i<5;i++)printf(“%c”,c[i]);}4.3字符數組4.3.4字符串和字符串結束標志C語言使用一個字符數組來存放一個字符串,并且前面章節介紹字符串常量時,已說明字符串總是以'\0'作為串的結束標記。因此把一個字符串存入數組時,也把結束符'\0'存入數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論