




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE73PAGE第7章函數(shù)與指針一.運(yùn)行程序?qū)懡Y(jié)果1.下列程序運(yùn)行的結(jié)果為。intx1=30,x2=40;main(){intx3=10,x4=20;swap(x3,x4);swap(x2,x1);printf("%d,%d,%d,%d\n",x3,x4,x1,x2);}swap(intx,inty){x1=x;x=y;y=x1;}【提示】本題考查全局變量的作用范圍?!窘獯稹?0,20,40,402.下列程序運(yùn)行的結(jié)果為。#include<stdio.h>voidnum(){externintx,y;inta=15,b=10;x=a-b;y=a+b;}intx,y;main(){inta=7,b=5;x=a+b;y=a-b;num();printf("%d,%d\n",x,y);}【分析與提示】用extern進(jìn)行外部變量說明?!窘獯稹?,253.下列程序運(yùn)行的結(jié)果為。main(){inta[5]={5,10,-7,3,7},i,j,t;sort(a);for(i=0;i<=4;i++)printf("%3d",a[i]);}sort(inta[]){inti,j,t;for(i=0;i<4;i++)for(j=0;j<4-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}【提示】該程序的功能是將5個(gè)數(shù)由小到大進(jìn)行排序?!窘獯稹?7357104.下列程序運(yùn)行的結(jié)果為。#defineSQR(x)2*x+1main(){inta,b,c;a=3;b=2;c=1;a*=SQR(b+c)/SQR(b+c);printf("%d\n",a);}【提示】a*=SQR(b+c)/SQR(b+c);宏展開為a*=2*b+c+1/2*b+c+1;【解答】215.下列程序運(yùn)行的結(jié)果為。voidswap1(intx,inty){intt;t=x;x=y;y=t;return;}voidswap2(int*x,int*y){intt;t=*x;*x=*y;*y=t;return;}main(){intx=3,y=5;printf("%d,%d\n",x,y);swap1(x,y);printf("%d,%d\n",x,y);swap2(&x,&y)
;printf("%d,%d\n",x,y);}【提示】注意指針變量做函數(shù)參數(shù)時(shí),改變形參的值就等同與改變了實(shí)參的值?!窘獯稹?,53,55,36.下列程序運(yùn)行的結(jié)果為。longfib(intg){switch(g){Case0:return0;case1:case2:return1;}return(fib(g-1)+fib(g-2));}main(){longk;k=fib(7);printf("k=%ld\n",k);}【提示】注意函數(shù)遞歸調(diào)用的條件?!窘獯稹縦=13二.編程題1.已知圓的半徑為R,求它的面積。#include<stdio.h>/*包含文件*/#include<math.h>/*包含數(shù)學(xué)庫函數(shù)*/#definePI3.14159/*宏定義*/main()/*主函數(shù)*/{floatarea(float);/*函數(shù)area的原型,即函數(shù)說明*/floatr,s;/*主函數(shù)中的局部變量定義*/printf(“請(qǐng)輸入半徑:\n”);scanf(“%f”,&r);s=area(r);/*調(diào)用area函數(shù)*/printf(“圓的半徑為:%f\n”,r);printf(“圓的面積為:%f\n”,s);}floatarea(floata)/*定義函數(shù)area*/{floatd;d=PI*a*a;return(d);/*返回計(jì)算結(jié)果*/}【提示】本程序由主函數(shù)main()和自定義函數(shù)area()組成。程序的前2句是文件包含語句,即把輸入、輸出標(biāo)準(zhǔn)函數(shù)和數(shù)學(xué)函數(shù)的文件包含到本程序中。第3句是宏定義語句,即用標(biāo)識(shí)符PI來代替數(shù)字3.14159。運(yùn)行:請(qǐng)輸入半徑:1.1↙ 顯示:圓的半徑為:1.1圓的面積為:3.8013242.編寫一個(gè)函數(shù)輸出三個(gè)數(shù)中的最大值?!咎崾尽吭趍ain()函數(shù)中輸入數(shù)據(jù),調(diào)用求3個(gè)數(shù)最大值函數(shù)。intmax(intx,inty,intz){intt;if(x>=y)t=x;elset=y;if(t<z)t=z;return(t);}main(){intx,y,z;printf("input3numbers:");scanf("%d%d%d",&x,&y,&z);printf("max=%d\n",max(x,y,z));}3.編寫一個(gè)函數(shù),將一個(gè)任意三位數(shù)n逆序輸出。即若n=456,則輸出654?!咎崾尽繉⒁粋€(gè)三位數(shù)n分解為個(gè)位、十位和百位分別放入c,b,a中,然后逆序輸出。intrec(intx){inta,b,c;a=x/100;b=x%100/10;c=x%10;return(c*100+b*10+a);}main(){intrec(intx);inty,z;printf("inputanumber(100-999):");scanf("%d",&y);z=rec(y);printf("thechangednumberis:%d\n",z);}4.編寫比較兩字符串是否相等的函數(shù)?!咎崾尽堪碅SCII碼值大小比較,將兩個(gè)字符串自左至右逐個(gè)字符相比,直到出現(xiàn)不同的字符或遇到'\0'為止。如果全部字符相同,則認(rèn)為相等,如果出現(xiàn)不同的字符,則以第一個(gè)不同的字符的比較結(jié)果為準(zhǔn)。比較結(jié)果由函數(shù)值帶回。參考代碼:#include<stdio.h>intcmp();main(){intresu;chars1[100],s2[100];printf("Pleaseinputs1:\n");gets(s1);printf("Pleaseints2:\n");gets(s2);resu=cmp(s1,s2);printf("%s與%s的比較結(jié)果是%d.",s1,s2,resu);}intcmp(s1,s2)chars1[],s2[];{inti=0;while((s1[i]==s2[i])&&(s1[i]!=0)&&(s2[i]!=0))i++;if(s1[i]==’\0’&&s2[i]==’\0’)return0;elsereturn(s1[i]-s2[i]);}5.編寫求字符串長(zhǎng)的函數(shù)?!咎崾尽孔址拈L(zhǎng)度不包括'\0'在內(nèi)。參考代碼:#include<stdio.h>main(){inttest();intn;charstr[100];gets(str);n=test(str);printf("thenumbersis:%d\n",n);}inttest(str)charstr[];{intn=0;while(str[n]!=’\0’)n++;return(n);}6.編寫一個(gè)函數(shù)判定一個(gè)數(shù)是否是素?cái)?shù),在主函數(shù)中調(diào)用該函數(shù),輸入一個(gè)整數(shù),輸出是否是素?cái)?shù)的信息?!痉治雠c提示】由主函數(shù)任意輸入一個(gè)整數(shù)m,將其值傳遞給子函數(shù)isprime(m)由子函數(shù)判斷這個(gè)數(shù)是否為素?cái)?shù),是return(1),否則return(0)。參考代碼:#include<math.h>main(){intm;printf("Pleaseinputadatam=:");scanf("%d",&m);isprime(m);}isprime(intn){inti,k;k=n/2;for(i=2;i<=k;i++)if(n%i==0)break;if(i>=k+1)printf("Thisisaprimenumber");elseprintf("Thisisnotaprimenumber");}7.用指針寫一個(gè)刪除字符串中空格的函數(shù)?!咎崾尽坑弥羔榩1指向待處理的字符串,用*p1從串頭到串尾逐一走動(dòng),每走到一個(gè)字符判斷其是否為空格,若不是空格,則將其保存到指針*p2中。參考代碼:#include<stdio.h>voiddele(char*str){char*p1,*p2;for(p1=p2=str;*p1!=’\0’;p1++)if(*p1==’’)continue;else*p2++=*p1;*p2='\0';}main(){charstr[100];gets(str);dele(str);puts(str);}8.用指針寫合并兩個(gè)字符串的函數(shù)?!痉治雠c提示】先將字符串str1從串頭到串尾逐一拷貝到字符串str3中,接著將字符串str2從串頭到串尾逐一拷貝到字符串str3中。參考代碼:#include<stdio.h>charunitestring(char*str1,char*str2,char*str3)/*合并函數(shù)*/{inti=0;while((*str1)!=’\0’){*(str3+i)=*str1;i++;str1++;}while((*str2)!=’\0’){*(str3+i)=*str2;i++;str2++;}*(str3+i)=’\0’;/*不能自動(dòng)加入\0*/}main(){charp[50],q[50],r[100];/*r為連接后的字符串*/printf("Pleaseenterthefirststring:\n");gets(p); /*輸入字符串*/printf("Pleaseenterthesecondstring:\n");gets(q);/*輸入字符串*/unitestring(p,q,r);puts(r);/*輸出結(jié)果*/}9.輸入15個(gè)正整數(shù),放在a數(shù)組中,要求:奇數(shù)放在a數(shù)組前部,偶數(shù)放在a數(shù)組后部。再分別對(duì)奇數(shù)和偶數(shù)排序?!痉治雠c提示】在main函數(shù)中將數(shù)組中的奇數(shù)放在a數(shù)組前部,偶數(shù)放在a數(shù)組后部。在分別兩次調(diào)用sort函數(shù)將奇數(shù)和偶數(shù)進(jìn)行排序。參考代碼:voidsort();main(){inta[15];inti,j=14,n=0,t;for(i=0;i<15;i++)scanf("%d",&a[i]);i=0;while(j>=i){if(a[i]%2!=0){i++;n++;}else{t=a[i];a[i]=a[j];a[j]=t;j--;}}sort(a,n);sort(&a[n],15-n);for(i=0;i<15;i++)printf("%3d",a[i]);printf("\n");}voidsort(a,n)inta[];intn;{inti,j,t;for(j=1;j<=n;j++)for(i=0;i<n-j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}10.編寫一個(gè)程序完成“菜單”功能。提供三種選擇途徑:(1)求水仙花數(shù)(narcissusnumber),找出100至999之間的所有水仙花數(shù)。(2)求出素?cái)?shù)(primenumber),找出2至n之間的所有素?cái)?shù)。(3)求Faibonacci數(shù)列前n項(xiàng)的值。#include“math.h”main(){intm,xz;voidnarcissus();voidprime();voidfaibonacci();clrscr();m=0;while(m==0){printf(“\n\n”);printf(“1findnarcissusnumber\n”);printf(“2findprimenumber\n”);printf(“3findFaibonaccinumber\n”);printf(“othernumberexit!\n”);printf(“inputnumberplease!\n”);scanf(“%d”,&xz);switch(xz){case1:narcissus();break;case2:prime();break;case3:faibonacci();break;default:m=1;}m=1;}}voidnarcissus(){intk,a,b,c,d;for(k=100;k<1000;k++){a=k/100;b=k%100/10;c=k%10;d=a*a*a+b*b*b+c*c*c;if(d==k)printf(“%5d\n”,k);}}voidprime(){inti,j,k,n,m=0;printf(“inputnplease!\n”);scanf(“%d”,&n);for(i=2;i<n;i++){j=sqrt(i);for(k=2;k<=j;k++)if(i%k==0)break;if(k>j){m++;printf(“%6d”,i);if(m%10==0)printf(“\n”);}}}voidfaibonacci(){longf1,f2;intk,n;printf(“intnplease!\n”);scanf(“%d”,&n);f1=1;f2=1;for(k=1;k<=n/2;k++){printf(“%8d%8d”,f1,f2);if(k%20)printf(“\n”);f1=f1+f2;f2=f1+f2;}}【提示】程序共有4個(gè)函數(shù),其中主函數(shù)提供了主菜單,允許選擇三種情況之一,否則就退出。通過開關(guān)語句switch進(jìn)行選擇。為了不斷的提供菜單,用while來永遠(yuǎn)循環(huán)。一開始給變量m賦值為0,m=0就繼續(xù)循環(huán),一旦選擇了不存在的情況,則將m置1,循環(huán)就結(jié)束。7.2補(bǔ)充習(xí)題一.單選題1.以下程序的輸出結(jié)果是( )fun(intx,inty,intz){z=x*x+y*y;}main(){inta=31;fun(5,2,a);printf("%d",a);}A、0 B、29 C、31 D、無定值【分析與提示】變量作參數(shù)時(shí),形參值的改變不會(huì)影響實(shí)參的值?!窘獯稹看鸢福篊2.當(dāng)調(diào)用函數(shù)時(shí),實(shí)參是一個(gè)數(shù)組名,則向函數(shù)傳送的是( )A、數(shù)組的長(zhǎng)度 B、數(shù)組的首地址C、數(shù)組每一個(gè)元素的地址 D、數(shù)組每個(gè)元素中的值【解答】答案:B3.以下程序的輸出結(jié)果是( )intf(){staticinti=0;ints=1;s+=i;i++;returns;}main(){inti,a=0;for(i=0;i<5;i++)a+=f();printf("%d\n",a);} A、20 B、24 C、25 D、15【分析與提示】自動(dòng)變量在函數(shù)每次調(diào)用時(shí),都進(jìn)行初始化,而靜態(tài)變量只在編譯階段初始化一次?!窘獯稹看鸢福篋4.以下程序運(yùn)行后的輸出結(jié)果是( )f(intb[],intm,intn){inti,s=0;for(i=m;i<n;i=i+2)s=s+b[i];returns;}main(){intx,a[]={1,2,3,4,5,6,7,8,9};x=f(a,3,7);printf("%d\n",x);} A、10 B、18 C、8 D、15【分析與提示】數(shù)組名作參數(shù)時(shí)傳送的是數(shù)組的首地址?!窘獯稹看鸢福篈5.當(dāng)執(zhí)行下面的程序時(shí),如果輸入ABC,則輸出結(jié)果是( )#include"stdio.h"#include"string.h"main(){charss[10]="1,2,3,4,5";gets(ss);strcat(ss,"6789");printf("%s\n",ss);}A、ABC6789 B、ABC67 C、12345ABC6 D、ABC456789【分析與提示】注意庫函數(shù)gets()、strcat()的用法?!窘獯稹看鸢福篈6.以下程序運(yùn)行后的輸出結(jié)果是( )voidfun(char*c,intd){*c=*c+1;d=d+1;printf("%c,%c,",*c,d);}main(){chara='A',b='a';fun(&b,a);printf("%c,%c\n",a,b);}A、B,a,B,aB、a,B,a,BC、A,b,A,bD、b,B,A,b【分析與提示】注意指針作參數(shù)與普通變量作參數(shù)的“值傳遞”?!窘獯稹看鸢福篋7.以下程序運(yùn)行后的輸出結(jié)果是( )voidsort(inta[],intn){inti,j,t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(a[i]<a[j]){t=a[i];a[i]=a[j];a[j]=t;}}main(){intaa[10]={1,2,3,4,5,6,7,8,9,10},i;sort(&aa[3],5);for(i=0;i<10;i++)printf("%d,",aa[i]);printf("\n");}A、1,2,3,4,5,6,7,8,9,10,B、10,9,8,7,6,5,4,3,2,1,C、1,2,3,8,7,6,5,4,9,10,D、1,2,10,9,8,7,6,5,4,3,【分析與提示】注意實(shí)參的“值”。【解答】答案:C8.以下程序運(yùn)行后的輸出結(jié)果是( )intf(intn){if(n==1)return1;elsereturnf(n-1)+1;}main(){inti,j=0;for(i=1;i<3;i++)j+=f(i);printf("%d\n",j);}A、4B、3C、2D、1【分析與提示】本題為遞歸調(diào)用?!窘獯稹看鸢福築二.運(yùn)行程序?qū)懡Y(jié)果1.下列程序運(yùn)行的運(yùn)行結(jié)果為。#include"stdio.h"main(){inti,num;for(i=0;i<3;i++){num=2;printf("\nThenumequal:%d\n",num);num++;{staticintnum=1;printf("\nTheinternalblocknumequal:%d\n",num);num++;}}}【分析與提示】注意static的用法?!窘獯稹縏henumequal:2Theinternalblocknumequal:1Thenumequal:2Theinternalblocknumequal:2Thenumequal:2Theinternalblocknumequal:32.下列程序運(yùn)行的運(yùn)行結(jié)果為。#include"stdio.h"inta,b,c;voidadd(){externinta;c=a+b;}voidmain(){a=b=4;add();printf("Thevalueofcisequalto%d\n",c);}【分析與提示】注意xternal的用法?!窘獯稹縏hevalueofcisequalto83.下列程序運(yùn)行的運(yùn)行結(jié)果為。voidswap(int*a,int*b){int*t;t=a;a=b;b=t;}main(){intx=3,y=5,*p=&x,*q=&y;swap(p,q);printf("%3d%3d\n",*p,*q);}【分析與提示】指針作參數(shù)時(shí),形參指針的改變不會(huì)影響實(shí)參?!窘獯稹?5三.改錯(cuò)題1.下列給定程序中,函數(shù)fun的功能是計(jì)算正整數(shù)num的各位上的數(shù)字之平方和。例如,輸入352,則輸出應(yīng)該是38;若輸入328,則輸出應(yīng)該是77。請(qǐng)改正程序中的錯(cuò)誤,使它能得出正確的結(jié)果。注意,不要改動(dòng)main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)。兩處錯(cuò)誤分別在/**********found************/的下一行。程序代碼:#include<stdio.h>#include<conio.h>longfun(longnum){/**********found************/longk=1;do{k+=(num%10)*(num%10);num/=10;/***********found***********/}while(num)return(k);}main(){longn;clrscr();printf("\n Pleaseenteranumber:");scanf("%ld",&n);printf("\n %ld\n",fun(n));}【分析】錯(cuò)誤1:k用來存放各位數(shù)字的平方和,初值應(yīng)為0。錯(cuò)誤2:語法錯(cuò)誤?!窘獯稹?1)longk=0;(2)while(num);2.下列給定程序中,函數(shù)fun的功能是:在字符串str中找出ASCII碼值最大的字符,將其放在第一個(gè)位置上;并將該字符前的原字符向后順序移動(dòng)。例如,調(diào)用fun函數(shù)之前給字符串輸入:ABCDeFGH,調(diào)用后字符串中的內(nèi)容為:eABCDFGH請(qǐng)改正程序中的錯(cuò)誤,使它能得出正確的結(jié)果。注意,不要改動(dòng)main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)。兩處錯(cuò)誤分別在/**********found************/的下一行。參考代碼:#include<stdio.h>voidfun(char*p){charmax,*q;inti=0;max=p[i];while(p[i]!=0){if(max<p[i]){max=p[i];/**********found************/p=q+i;}i++;}/***********found***********/while(q<p){*q=*(q-1);q--;}p[0]=max;}voidmain(){charstr[80];printf("enterastring:");gets(str);printf("\ntheoriginalstring:");puts(str);fun(str);printf("\nthestringaftermoving:");puts(str);}【分析與提示】本例考查指針指向字符串的操作。第一個(gè)錯(cuò)誤出在p=q+i;這一行,經(jīng)過觀察發(fā)現(xiàn),q是沒有賦初值的指針,這樣的指針指向不明確,是野指針,所以必須給q賦初值,這一語句更改為q=p+i;就對(duì)了,作用是把q定位在字符e所在的位置。因此在程序中,q的作用總是指向當(dāng)前最大的字符。第二個(gè)錯(cuò)誤比較隱蔽,單從語法上檢查不出來,但是分析程序的作用后可發(fā)現(xiàn)p是數(shù)組的首地址,所以它總是小于或等于q的,而第二個(gè)while循環(huán)的作用是把e前面的字符順次往后挪動(dòng),所以,這里的循環(huán)條件應(yīng)該是q>p?!窘獯稹?1)q=p+i;(2)while(q>p)四.編程題1.已知e=1+1/1!+1/2!+1/3!+…+1/n!,試用公式求e的近似值,要求累加所有不小于10-6的項(xiàng)值。用函數(shù)fun完成任何數(shù)的階乘?!痉治雠c提示】用主函數(shù)完成1與1/1!到1/n!的相加,直到1/n!的值小于10-6,通過形參傳遞給子函數(shù)fun,用1×2×3×…×n求n的階乘。參考代碼:#include<stdio.h>intfun();main(){inti;floate,n;e=1.0;i=1;n=1.0;while(n>1.0e-6){n=1.0/fun(i);i++;e=e+n;}printf("%f\n",e);}intfun(inti){intj,k;k=1;for(j=1;j<=i;j++)k=k*j;return(k);}輸出結(jié)果:2.7182152.請(qǐng)編寫函數(shù)fun(),該函數(shù)的功能是:將兩個(gè)兩位的正整數(shù)a,b合并形成一個(gè)整數(shù)放在c中。合并的方式是:將a數(shù)的十位和個(gè)位數(shù)依次放在c數(shù)的十位和千位上,b數(shù)的十位和個(gè)位數(shù)依次放在c數(shù)的百位和個(gè)位上。例如,當(dāng)a=45,b=12時(shí),調(diào)用到該函數(shù)后,c=5142。注意:部分源程序給出如下。請(qǐng)勿改動(dòng)主函數(shù)main和其他函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號(hào)中添入所編寫的若干語句。部分源程序:#include<stdio.h>#include<conio.h>voidfun(inta,intb,long*c){*c=a%10*1000+b/10*100+a/10*10+b%10;}main(){inta,b;longc;clrscr();printf("Inputa,b:");scanf("%d%d",&a,&b);fun(a,b,&c);printf("Theresultis:%ld\n",c);}3.請(qǐng)編寫函數(shù)fun(),該函數(shù)的功能是:將s所指字符串中ASCII碼值為偶數(shù)的字符刪除,串中剩余字符形成一個(gè)新串放在t所指的數(shù)組中例如,若s所指字符串中的內(nèi)容為ABCDEFG12345,最后t所指的數(shù)組中的內(nèi)容應(yīng)是ACEG135。注意:部分源程序給出如下。請(qǐng)勿改動(dòng)主函數(shù)main和其他函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號(hào)中添入所編寫的若干語句。部分源程序:#include<stdio.h>#include<string.h>#include<conio.h>voidfun(char*s,chart[]){………}main(){chars[100],t[100];clrscr();printf("\nleaseenterstrings:");scanf("%s",s);fun(s,t);printf("\nTheresultis:%s\n",t);}參考代碼:inti=0;for(;*s!='\0';s++)if(*s%2==1)t[i++]=*s;t[i]='\0';4.Hanoi漢諾塔問題?!痉治觥窟@是一個(gè)典型的用遞歸方法解決的問題。問題是這樣的:有三根針A、B、C,A針上有64個(gè)盤子,盤子大小不等,大的在下,小的在上。要求把這64個(gè)盤子從A針移到C針,在移動(dòng)的過程中可以借助B針,每次只允許移動(dòng)一個(gè)盤子,而且在移動(dòng)過程中三根針上都保持大盤在下,小盤在上。編寫程序并打印出移動(dòng)的步驟。將n個(gè)盤子從A針移到C針可以分解為以下三個(gè)步驟:①將A上n-1個(gè)盤子借助C針先移到B針上。②把A針上剩余的一個(gè)盤子移到C針上。③將n-1個(gè)盤子從B針借助A針移到C盤上。例如:要想將A針上的3個(gè)盤子移到C針上,可以分解為以下三步:①將A針上的2個(gè)盤子移到B針上(借助C針)。②將A針上的一個(gè)盤子移到C針上。③將B針上的2個(gè)盤子移到C針上(借助A針)。其中第②步可直接實(shí)現(xiàn)。第①步又可以用遞歸方法分解為:a、將A上一個(gè)盤子從A移到C。b、將A上一個(gè)盤子從A移到B。c、將C上一個(gè)盤子從C移到B。第③步可以分解為:a、將B上一個(gè)盤子從B移到A上。b、將B上一個(gè)盤子從B移到C上。c、將A上一個(gè)盤子從A移到C上。將以上綜合起來,可以得到移動(dòng)的步驟為:AC,AB,CB,AC,BA,BC,AC上面第①步和第③步,都是把n-1個(gè)盤子從一個(gè)針移到另一個(gè)針上,采用的方法是一樣的,只是針的名字不同而已。為使之一般化,可以將①步和③步表示為:將“one:”針上的n-1個(gè)盤子移到“two”針上,借助“three”針。只是在①步和第③步中,one、two、three和A、B、C的對(duì)應(yīng)關(guān)系不同。對(duì)于第①步,對(duì)應(yīng)關(guān)系是:oneA,twoB,threeC。對(duì)于第③步,對(duì)應(yīng)關(guān)系是:oneB、twoC、threeA。因此,可以將上面三個(gè)步驟分成兩類操作:第一類:將n-1個(gè)盤子從一個(gè)針移到另一個(gè)針上(n>1)。這是一個(gè)遞歸過程。第二類:將1個(gè)盤子從一個(gè)針上移到另一個(gè)針上。下面編寫程序,分別用兩個(gè)函數(shù)實(shí)現(xiàn)以上兩類操作,用hanoi函數(shù)實(shí)現(xiàn)第一類操作,用move函數(shù)實(shí)現(xiàn)上述第二類操作。hanoi(n,one,two,three)表示將n個(gè)盤子從“one”針移動(dòng)到“three”針,借助“twe”針,move(getone,putone)表示一個(gè)盤子從“getone”針移動(dòng)到“putone”針。getone和putone也是代表A、B、C針之一,根據(jù)每次不同情況分別去A、B、C代入。程序如下:voidmove(chargetone,charputone){printf("%c>%c\n",getone,putone);}voidhanoi(intn,charone,chartwo,charthree)/*將n個(gè)盤子從one借助two,移到three*/{if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}main(){intm;printf("inputthenumberofthediskes:");scanf("%d",&m);printf("thesteptomove%3ddiskes:\n",m);hanoi(m,'A','B','C');}程序運(yùn)行結(jié)果如下:Inputthenumberofdiskes:3Thesteptomove3diskes:ACABCBACBABCAC第8章結(jié)構(gòu)體與共用體一.簡(jiǎn)答題1.結(jié)構(gòu)體類型與以前的標(biāo)準(zhǔn)數(shù)據(jù)類型有什么區(qū)別?【解答】(1)結(jié)構(gòu)體類型是一種構(gòu)造出來的數(shù)據(jù)類型。它具體代表多少成員還需要由用戶定義?;绢愋筒恍枰脩舳x而可以直接使用,而結(jié)構(gòu)體類型必須先定義類型再使用。(2)結(jié)構(gòu)體類型是復(fù)合數(shù)據(jù)類型,可簡(jiǎn)單,也可復(fù)雜,而簡(jiǎn)單數(shù)據(jù)類型則比較單純。(3)用簡(jiǎn)單類型定義的變量一般都可直接參與多種運(yùn)算,而結(jié)構(gòu)體變量則往往只能對(duì)其成員進(jìn)行多種運(yùn)算,對(duì)整個(gè)結(jié)構(gòu)體變量適用的運(yùn)算很少。2.結(jié)構(gòu)體類型與共用體類型有什么異同?【解答】(1)結(jié)構(gòu)體和共同體都是構(gòu)造數(shù)據(jù)類型,使用它們都可存儲(chǔ)多種類型的數(shù)據(jù),可以方便地組織不同類型的數(shù)據(jù)。(2)結(jié)構(gòu)體占用的空間是所有成員所占用空間的和,而共用體則是最大成員所占據(jù)的空間。結(jié)構(gòu)體重在組織多種類型的數(shù)據(jù),從而構(gòu)造一個(gè)復(fù)雜的數(shù)據(jù)類型,而共用體重在強(qiáng)調(diào)內(nèi)存的共享與重復(fù)使用。3.枚舉類型適用于什么場(chǎng)合?【解答】枚舉類型用于程序中某個(gè)項(xiàng)目的所有可能選項(xiàng)是固定的,單一的表達(dá)場(chǎng)合時(shí)。4.動(dòng)態(tài)存儲(chǔ)分配有什么作用?【解答】使用動(dòng)態(tài)存儲(chǔ)分配內(nèi)存空間,可以讓程序適應(yīng)用戶對(duì)內(nèi)存變化的需要,及事先不能確定內(nèi)存用量的場(chǎng)合。它以小的犧牲(定義的指針也占用空間)換來了內(nèi)存使用效率的提高。5.類型定義有什么意義?【解答】所謂類型定義,并不是定義了一種新類型,而是為了書寫方便或使程序易于閱讀,由程序員規(guī)定的一種已有類型的新名稱而已。二.運(yùn)行程序?qū)懡Y(jié)果1.以下程序的執(zhí)行結(jié)果是。#include<stdio.h>structstudinf{char*name;floatgrad;}*p;main(){structstudinfa;p=&a;p->grad=95.5;p->name=(char*)malloc(20);strcpy(p->name,"wangpi");printf("%s\t%2f\n",p->name,p->grad);}【分析與提示】本題旨在檢查讀者通過指針訪問結(jié)構(gòu)體變量的能力。同時(shí),練習(xí)指向運(yùn)算符的用法、動(dòng)態(tài)分配的使用,及結(jié)構(gòu)體中指針成員的使用方法?!窘獯稹縲angpi 95.5000002.以下程序的執(zhí)行結(jié)果是。#include<stdio.h>typedefstructmonth{charmonth[12];intdays;}DATE;DATEmonthtab[]={"January",31,"February",28,"March",31,"April",30,"May",31,"June",30,"July",31,"August",31,"September",30,"October",31,"November",30,"December",31};main(){inti;for(i=0;i<12;i++)printf("%-10s%2d\n",monthtab[i].month,monthtab[i].days);}【分析與提示】本題意在練習(xí)比較復(fù)雜的類型定義的用法,所以,重點(diǎn)放在定義形式上?!窘獯稹窟\(yùn)行結(jié)果如下:January 31February28March 31April 30May 31June 30July 31August 31September30October31November30December313.以下程序的執(zhí)行結(jié)果是。#include<stdio.h>structtest{charx,y;};unionexec{inta;charb,c;structtestd;longe;};main(){unionexecvar;printf("\nSizeofunionexec=%dbytes.",sizeof(unionexec));printf("\nSizeofvariablevar=%dbytes.",sizeof(var));var.a=2345;printf("\nAddressofvar.ais%p,%#x.",&var.a,var.a);printf("\nAddressofvar.bis%p,%#x.",&var.b,var.b);printf("\nAddressofvar.cis%p,%#x.",&var.c,var.c);printf("\nAddressofvar.dis%p,%#x.",&var.d,var.d);printf("\nAddressofvar.d.xis%p,%#x.",&var.d.x,var.d.x);printf("\nAddressofvar.d.yis%p,%#x.",&var.d.y,var.d.y);printf("\nAddressofvar.eis%p,%#x.",&var.e,var.e);}【分析與提示】本題設(shè)計(jì)的目的是考查讀者對(duì)結(jié)構(gòu)體和共用體混合使用的認(rèn)識(shí)與理解。通過運(yùn)行程序,查看結(jié)果,并比較源程序進(jìn)行分析,可加強(qiáng)讀者對(duì)結(jié)構(gòu)體和共用體的認(rèn)識(shí)。提醒讀者注意:2345存儲(chǔ)在計(jì)算機(jī)內(nèi)是2進(jìn)制數(shù),表示成16進(jìn)制是0x929。存儲(chǔ)時(shí)先存儲(chǔ)的是低字節(jié)0x29,然后是高字節(jié)0x9?!窘獯稹磕炒芜\(yùn)行的結(jié)果如下:Sizeofunionexec=4bytes.Sizeofvariablevar=4bytes.Addressofvar.ais FFD6,0x929.Addressofvar.bis FFD6,0x29.Addressofvar.cis FFD6,0x29.Addressofvar.disFFD6,0x929.Addressofvar.d.xisFFD6,0x29.Addressofvar.d.yisFFD7,0x9.Addressofvar.eisFFD6,0x929.4.以下程序的執(zhí)行結(jié)果是。#include<stdio.h>enumprov{Beijing,Tianjin,Shanghai,Chongqing,Liaoning=5,Heilongjiang,Jilin,Shandong=10,Hebei,Henan}addr;main(){enumprovaddr;printf("\nBeijing=%d,Tianjin=%d,Shanghai=%d,",Beijing,Tianjin,Shanghai);printf("Chongqing=%d,Liaoning=%d,Heilongjiang=%d,",Chongqing,Liaoning,Heilongjiang);printf("Jilin=%d,Shandong=%d,Hebei=%d,Henan=%d.\n",Jilin,Shandong,Hebei,Henan);addr=Shanghai;addr++;printf("\nAddressis%d.\n",addr);}【提示】本題意在熟練讀者對(duì)枚舉類型的認(rèn)識(shí)與使用:如何定義一個(gè)枚舉類型;如何定義枚舉變量;如何在程序中賦值、運(yùn)算等。特別要指出的是,最后一行的輸出只是一個(gè)代表本枚舉變量的一個(gè)整數(shù),而不少初學(xué)者往往誤認(rèn)為的是一個(gè)字符串(Chongqing)?!窘獯稹緽eijing=0,Tianjin=1,Shanghai=2,Chongqing=3,Liaoning=5,Heilongjiang=6,Jilin=7,Shandong=10,Hebei=11,Henan=12Addressis3.三.編程題1.編寫一程序,定義一個(gè)點(diǎn)的坐標(biāo)。然后定義兩個(gè)點(diǎn),求這兩個(gè)點(diǎn)間的距離?!咎崾尽勘绢}屬于結(jié)構(gòu)體的簡(jiǎn)單應(yīng)用。主要練習(xí)如何使用結(jié)構(gòu)體變量的成員參與運(yùn)算等問題。參考代碼:#include<stdio.h>#include<math.h>structpoint{intx,y;};main(){structpointp1,p2; /*定義兩個(gè)點(diǎn)*/floatdist;printf("\nPleaseinputthefirstpoint\'svalue:\nx="); /*輸入第一個(gè)點(diǎn)*/scanf("%d",&p1.x);printf("y=");scanf("%d",&p1.y);printf("\nPleaseinputthesecondpoint\'svalue:\nx=");/*輸入第二個(gè)點(diǎn)*/scanf("%d",&p2.x);printf("y=");scanf("%d",&p2.y);dist=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));/*計(jì)算兩點(diǎn)距離*/printf("Distanceoftwopointis%10.2f.\n",dist);}2.請(qǐng)編寫程序:將下表數(shù)據(jù)賦給結(jié)構(gòu)體數(shù)組,并按照年齡從小到大順序?qū)⑺鼈冚敵龅狡聊簧?。姓名年齡年薪zhangsan3828000lisi2222000wangwu2427000【分析與提示】本題旨在練習(xí)結(jié)構(gòu)體數(shù)組的定義、初始化及應(yīng)用。對(duì)結(jié)構(gòu)體數(shù)組中的內(nèi)容進(jìn)行排序有多種辦法,鑒于本題數(shù)據(jù)較少,參考程序中使用了最原始的排序方法。參考代碼:#include<stdio.h>structemp{charname[20];intage;longyearsal;};main(){structempdata[3]={{"zhangsan",38,28000},{"lisi",22,22000},{"wangwu",24,27000}},tmp;inti;if(data[0].age>data[1].age) /*比較前兩個(gè)的年齡,并在可能時(shí)交換位置*/{tmp=data[0];data[0]=data[1];data[1]=tmp;}if(data[1].age>data[2].age) /*比較后兩個(gè)的年齡,并在可能時(shí)交換位置*/{tmp=data[1];data[1]=data[2];data[2]=tmp;}if(data[0].age>data[1].age) /*再次比較前兩個(gè)的年齡,并在可能時(shí)交換位置*/{tmp=data[0];data[0]=data[1];data[1]=tmp;}printf("\n%20s%4s%9s","Name","Age","Income");for(i=0;i<3;i++) /*輸出結(jié)果*/printf("\n%20s,%3d,%8ld",data[i].name,data[i].age,data[i].yearsal);}3.請(qǐng)利用教材中有關(guān)單向鏈表的例子,建立一個(gè)反向的鏈表?!痉治雠c提示】本題是一個(gè)非常常見的應(yīng)用。其中涉及的到知識(shí)點(diǎn)有:建立單向鏈表、輸出單向鏈表中的數(shù)據(jù)、鏈表的反序。其中鏈表的反序是教材中沒有涉及到的內(nèi)容。下面的代碼采用的算法是:從后向前建立鏈表。這也是另一種建立鏈表的方法。教材中建立鏈表時(shí),只要有一個(gè)結(jié)點(diǎn)存在,則表頭地址就固定了,以后就在鏈表尾部添加新結(jié)點(diǎn)。而反序時(shí)首先建立的尾部結(jié)點(diǎn),以后有新結(jié)點(diǎn)時(shí),不斷添加到其前面,即表頭指針不斷變化,直到無新結(jié)點(diǎn)時(shí)為止。此時(shí)的首地址就是鏈表的頭地址。參考代碼:#include<stdio.h>typedefstructsite{intnum;structsite*next;}SITE;main(){SITE*head1,*head2,*p1,*p;head1=head2=NULL;while(1) /*建立一個(gè)鏈表,表頭是head1*/{p=(SITE*)malloc(sizeof(SITE));if(!p){printf("\nAllocatememoryerror!\n");exit(1);}printf("\nPleaseinputdataofpersite(0=end):\n"); scanf("%d",&p->num);if(!p->num)break; /*如果輸入數(shù)為0,則結(jié)束*/else {p->next=NULL;if(!head1)head1=p; /*如果首指針為空,則為其賦值*/else /*如果不是首指針,添加到表的結(jié)尾*/{p1=head1;while(p1->next)p1=p1->next;p1->next=p;}}}free(p); /*釋放最后一個(gè)無效的結(jié)點(diǎn)*/printf("\nTheoriginaltableis:\n"); /*輸出表頭是head1的鏈表*/p1=head1;while(p1->num){printf("%8d",p1->num);p1=p1->next;} printf("\n");p1=head1; /*表頭是head1的鏈表反序*/while(p1){p=p1; /*暫存首結(jié)點(diǎn)后,并指向下一結(jié)點(diǎn)*/p1=p1->next;if(!head2) /*如果新鏈表不存在,則為頭指針賦值*/{p->next=NULL;head2=p;}else /*如果新鏈表已經(jīng)存在,則把結(jié)點(diǎn)添加到其首部*/{p->next=head2;head2=p;}}printf("\nThenewtableis:\n"); /*輸出反序后的鏈表,表頭是head2*/p1=head2;while(p1->num){printf("%8d",p1->num);p1=p1->next;}printf("\n");p1=head2; /*釋放鏈表占用的空間*/while(p1){p=p1;p1=p1->next;free(p);}}4.假設(shè)有N個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓名及三科成績(jī)。要求從鍵盤輸入各學(xué)生的數(shù)據(jù),最后輸出三科的總平均成績(jī)及最高分學(xué)生的情況?!痉治雠c提示】本題是很多教材上選用的例題或習(xí)題。但算法卻不盡相同。他們采用的做法一般是先輸入所有學(xué)生的信息,再計(jì)算,最后再輸出滿足條件的記錄。其實(shí),在一個(gè)學(xué)生的信息輸入完后,就已經(jīng)可以計(jì)算其總分和平均分了,而且還可以對(duì)平均分進(jìn)行累計(jì)。下面的參考代碼就采取這種一次性的處理方式,這樣可以大大提高程序運(yùn)行效率。另外,輸出最高分學(xué)生的詳細(xì)情況部分,我們也要考慮到,這樣的學(xué)生可能不只一個(gè)!所以,要在知道最高平均分的情況下,再逐個(gè)搜索的方式進(jìn)行,這樣才比較完美。參考代碼:#include<stdio.h>#include<math.h>#defineN5structstudent{longstudno;charname[20];floatscore[4]; /*三科成績(jī)及平均成績(jī)*/}stud[N];main(){inti,j;floataverage=0,sum,maxave=0,temp;for(i=0;i<N;i++) /*輸入各學(xué)生的數(shù)據(jù)*/{printf("\nPleaseinputthe%dstudent\'sscore:\n",i+1);printf("Studentnumber:");scanf("%ld",&stud[i].studno);getchar();printf("Studentname:");gets(stud[i].name);sum=0; /*保存每個(gè)學(xué)生總分的變量清0*/for(j=0;j<3;j++) /*輸入的同時(shí)直接計(jì)算平均值并保存*/{printf("Studentscore[%d]=",j+1);scanf("%f",&temp);stud[i].score[j]=temp;sum+=temp;}stud[i].score[j]=sum/3; /*保存每個(gè)人的平均分*/average+=stud[i].score[j]; /*累計(jì)所有人平均分之和*/maxave=(stud[i].score[j]>maxave)?stud[i].score[j]:maxave;/*求最大平均分*/} average/=N; /*計(jì)算并輸出所有學(xué)生全部課程的平均分*/ printf("\nTheaverageof%dstudents\'is%6.2f\n",N,average); printf("\nThebeststudent(s\')list:\n%studentnostudentnamescore1score2score3sumaver"); for(i=0;i<N;i++) /*輸出所有平均分最高學(xué)生的完整信息*/ {if(fabs(maxave-stud[i].score[3])<1e-6)/*只輸出平均分最高的學(xué)生信息*/{printf("\n%10ld%-20s",stud[i].studno,stud[i].name);for(j=0;j<3;j++)printf("%6.2f",stud[i].score[j]);printf("%6.2f%6.2f",stud[i].score[j]*3,stud[i].score[j]);}}}第9章文件一.簡(jiǎn)答題1.什么是文件?【解答】文件是指存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)集合。一般分為程序文件和數(shù)據(jù)文件。2.C語言可以處理的文件類型是什么?【解答】順序存取和隨機(jī)存取文件。3.C語言文件的存取方式是什么?【解答】文本文件和二進(jìn)制文件4.在C語言中,文件存取是以什么為單位的,這種文件是什么?【解答】字符,流式文件5.函數(shù)rewind()的作用是什么?【解答】使位置指針重新返回文件的開頭二.編程題1.將從鍵盤輸入的數(shù)據(jù)存儲(chǔ)到文件中,再將存儲(chǔ)的文件內(nèi)容在屏幕上顯示(用fputc(),fgetc()函數(shù))?!痉治雠c提示】先以寫的方式打開文件,運(yùn)用fputc()函數(shù)把鍵盤錄入的數(shù)據(jù)寫到文件中;再以讀的方式打開文件,運(yùn)用fgetc()函數(shù)從文件中讀取數(shù)據(jù)顯示在屏幕上。參考代碼:#include"stdio.h"voidwrite_to(){FILE*fp;charch;fp=fopen("we","wb");if(fp==NULL){printf("cannotopenfile");exit(0);}ch=getchar();while(ch!='\n'){fputc(ch,fp);ch=getchar();}fclose(fp);}/*將剛才存儲(chǔ)的文件在屏幕上顯示函數(shù)。*/voidread_in(){FILE*fp;charch;fp=fopen("we","rb");if(fp==NULL){printf("cannotopenfile");exit(0);}while(!feof(fp)){ch=fgetc(fp);putchar(ch);}}voidmain(){write_to();read_in();}2.編程實(shí)現(xiàn)兩個(gè)文件中的內(nèi)容合并到一個(gè)文件中,并顯示出來。#include<stdio.h>main(){FILE*fp1,*fp2;chars[100];if((fp1=fopen(“a1.dat”,“ab”))==NULL)/*以追加方式打開二進(jìn)制文件a1*/printf("\nCannotopenfilea1.dat!");elseif((fp2=fopen(“a2.dat”,“rb”))==NULL)/*以只讀方式打開二進(jìn)制文件a2*/printf("\nFilea2.dathasnotbeenfound!");elsewhile(fgets(s,100,fp2)!=NULL)fputs(s,fp1);/*讀取文件a2中的內(nèi)容,追加方式寫到文件a1原有內(nèi)容后面*/fclose(fp1);fclose(fp2);/*關(guān)閉a1和a2文件,防止數(shù)據(jù)丟失*/if((fp1=fopen(“a1”,“rb”))==NULL)/*以只讀方式打開二進(jìn)制文件a1*/printf(“\nFilea2.dathasnotbeenfound!”);elsewhile(fgets(s,100,fp1)!=NULL)/*在屏幕上顯示合并后存儲(chǔ)在a1中的文件內(nèi)容*/printf(“\n%s”,s);fclose(fp1);}3.編程:從鍵盤輸入一行字符,把它們存入一個(gè)磁盤文件中,然后再從該文件中讀出,并在屏幕上以大寫方式顯示出來。#include<stdio.h>main(){inti,flag;charstr[80],c;FILE*fp;fp=fopen("text","w+");for(flag=1;flag;){printf("\n請(qǐng)輸入字符串:\n");gets(str);fprintf(fp,"%s",str);flag=0;}fseek(fp,0,0);while(fscanf(fp,"%s",str)!=EOF){for(i=0;str[i]!='\0';i++)if((str[i]>='a')&&(str[i]<='z'))str[i]-=32;printf("\n%s\n",str);}fclose(fp);}運(yùn)行結(jié)果:請(qǐng)輸入字符串:Iamastudent↙IAMASTUDENT4.從鍵盤輸入10個(gè)整數(shù)保存到data.dat文件中,再把文件data.dat中的10個(gè)整數(shù)讀出,并顯示出來?!痉治雠c提示】先以寫的方式打開文件,運(yùn)用fwrite()函數(shù)把鍵盤錄入的數(shù)據(jù)寫到文件中;再以讀的方式打開文件,運(yùn)用fread()函數(shù)從文件中讀取數(shù)據(jù)顯示在屏幕上。參考代碼:#include<stdio.h>#defineN10main(){FILE*fp;intdata[N],i;printf("輸入10個(gè)數(shù):");for(i=0;i<N;i++)scanf("%d",&data[i]);if((fp=fopen("data.dat","w+"))==NULL)printf("Cannotopenfiledata.dat!");else{fwrite(data,2,N,fp);fclose(fp);}if((fp=fopen("data.dat","r"))==NULL)printf("Fileb1.dathasnotbeenfound!");else{fread(data,2,N,fp);fclose(fp);}for(i=0;i<N;i++)printf("%d",data[i]);}5.將一個(gè)磁盤文件中的信息復(fù)制到另一個(gè)磁盤文件中?!痉治雠c提示】運(yùn)用fscanf()和fprintf()函數(shù)實(shí)現(xiàn)文件中信息復(fù)制。參考代碼:#include<stdio.h>main(){FILE*fp1,*fp2;chars[100];if((fp1=fopen("a1.dat","rb"))==NULL)printf("\nFilea1.dathasnotbeenfound!");elsefscanf(fp1,"%s",s);fclose(fp1);if((fp2=fopen("a2","wb"))==NULL)printf("\nFilea2.dathasnotbeenfound!");else{fprintf(fp2,"%s",s);printf("\n%s",s);}fclose(fp1);}6.有4個(gè)學(xué)生,每個(gè)學(xué)生有5門課的成績(jī),從鍵盤輸入數(shù)據(jù)(包括學(xué)生學(xué)號(hào),姓名,5門課成績(jī)),計(jì)算出平均成績(jī),將原有數(shù)據(jù)和計(jì)算出的平均分?jǐn)?shù)存放在磁盤文件"B2"中?!痉治雠c提示】運(yùn)用結(jié)構(gòu)體數(shù)據(jù)類型存儲(chǔ)學(xué)生成績(jī)信息。參考代碼:#include<stdio.h>structstudent{charnum[10];charname[8];intscore[5];floatave;}stu[4];main(){inti,j,sum;FILE*fp;for(i=0;i<4;i++){printf("\ninputscoreofstudent%d",i+1);printf("no");scanf("%s",stu[i].num);printf("name:");scanf("%s",stu[i].name);sum=0;for(j=0;j<5;j++){printf("score%d",j+1);scanf("%d",&stu[i].score[j]);sum=sum+stu[i].score[j];}stu[i].ave=sum/5.0;}fp=fopen("B2","w");for(i=0;i<4;i++)if(fwrite(&stu[i],sizeof(structstudent),1,fp)!=1)printf("filewriteerror!");fclose(fp);fp=fopen("B2","r");for(i=0;i<4;i++){fread(&stu[i],sizeof(structstudent),1,fp);printf("%s,%s",stu[i].num,stu[i].name);for(i=0;i<5;i++)printf("%d",stu[i].score[j]);printf("%f",stu[i].ave);}}7.統(tǒng)計(jì)文件中的單詞個(gè)數(shù)?!痉治雠c提示】以空格、換行、回車符為標(biāo)志判斷是否為一個(gè)單詞。參考代碼:#include<stdio.h>main(intargc,char*argv[]){FILE*fp;charch;intwhite=1;intcount=0;if((fp=fopen(argv[1],"r"))==NULL){printf("can'topenfile%s.",argv[1]);exit(0);}while((ch=fgetc(fp))!=EOF)switch(ch){case'':case'\t':case'\n':white++;break;default:if(white){white=0;count++;}}fclose(fp);printf("file'%s'contains%dwords.",argv[1],count);}說明:(1)一般情況下,程序中的主函數(shù)不帶形參,該程序中使用了帶形參的主函數(shù),目的是為了在執(zhí)行程序時(shí),我們可以帶參數(shù),假設(shè)該程序名為countw,而要統(tǒng)計(jì)單詞的文件名為word,要想用該程序統(tǒng)計(jì)word中單詞的個(gè)數(shù),可以將該程序編譯形成可執(zhí)行文件countw,在DOS方式執(zhí)行:countwword.,這樣編程的好處是可以用countw統(tǒng)計(jì)任一個(gè)文件中單詞的個(gè)數(shù),只要執(zhí)行程序時(shí),加帶被統(tǒng)計(jì)文件的文件名即可。(2)主函數(shù)形參中的argc,用于統(tǒng)計(jì)執(zhí)行程序時(shí),命令行參數(shù)的個(gè)數(shù),而*argv[]是具體的命令行參數(shù),例如:執(zhí)行countwword.時(shí),argc=2,argv[0]為countw即程序本身,而argv[1]為word。第10章圖形與動(dòng)畫一.簡(jiǎn)答題1.文本模式下的窗口有什么特點(diǎn)?【解答】文本模式下的窗口與目前我們所使用的Windows下的窗口有很大的不同:文本下的窗口大小只能以字符為單位設(shè)置,看起來跳躍性大;文本下的窗口沒有邊框、滾動(dòng)條等可視元素,只有在操作時(shí)才能感覺邊界的存在;文本下的窗口由于顯示驅(qū)動(dòng)程序限制,可支持的顏色數(shù)較少,不可能達(dá)到很好的色彩過渡等效果;文本方式下的窗口也不可移動(dòng),擴(kuò)張大小等。2.請(qǐng)解釋圖形模式與文本模式?!窘獯稹繄D形模式與文本模式是計(jì)算機(jī)的顯示系統(tǒng)工作的兩種不同的工作方式。在文本方式下,整個(gè)屏幕被格式化成一個(gè)個(gè)矩形塊,每個(gè)矩形塊內(nèi)只能顯示一個(gè)字符。無論是編輯還是存儲(chǔ),都以字符為單位,以ASCII碼為存儲(chǔ)形式。而圖形工作方式則以像素點(diǎn)為單位,每個(gè)像素點(diǎn)都可獨(dú)立控制顯示內(nèi)容。因此,圖形方式顯示能力比較強(qiáng),內(nèi)容豐富,層次較多。但處理速度比不上文本方式。3.圖形和文本模式下輸出文本有什么異同?【解答】文本模式下輸出的文本默認(rèn)采用系統(tǒng)默認(rèn)的一種字體,輸出時(shí)可用的坐標(biāo)范圍受顯示模式的限制,比較有限。圖形方式下輸出的文本可采用多種字體和大小,且輸出點(diǎn)坐標(biāo)控制相對(duì)靈活,但控制相對(duì)于文本方式比較繁瑣。二.運(yùn)行程序?qū)懡Y(jié)果圖10-11.以下程序的執(zhí)行結(jié)果是。圖10-1#include<stdio.h>#include<graphics.h>main(){intgraphdriver=VGA;/*設(shè)置成VGA模式*/intgraphmode=VGAHI;/*采用640*480高分辨率顯示模式*/initgraph(&graphdriver,&graphmode,"");cleardevice();rectangle(100,20,150,50);/*畫矩形圖*/bar(100,80,200,260);/*畫畫條形圖*/getch();closegraph();圖10-2}圖10-2【分析與提示】本題是圖形部分的基礎(chǔ)練習(xí)題,主要用來讓讀者進(jìn)一步熟悉圖形編程的步驟及相關(guān)語句。包括設(shè)置圖形工作模式、初始化顯示方式、關(guān)閉圖形系統(tǒng)的方法等?!窘獯稹窟\(yùn)行結(jié)果如圖10-1所示。2.以下程序的執(zhí)行結(jié)果是。#include<stdio.h>#include<graphics.h>main(){intgraphdriver=DETECT,graphmode,x;initgraph(&graphdriver,&graphmode,"");cleardevice();ellipse(320,100,0,360,75,50);circle(320,220,50);pieslice(320,340,30,150,50);ellipse(320,400,180,360,50,50);getch();closegraph();}【分析與提示】本題也是一個(gè)基礎(chǔ)練習(xí)題,用來讓讀者了解自動(dòng)檢測(cè)(DETECT)的用法。同時(shí)也包括畫圓、橢圓,餅圖等基礎(chǔ)函數(shù)的應(yīng)用內(nèi)容。【解答】運(yùn)行結(jié)果如圖10-2所示。3.以下程序的執(zhí)行結(jié)果是。圖10-3include"graphics.h"圖10-3main(){intdriver,mode;driver=DETECT;mode=2;initgraph(&driver,&mode,"");c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公用房租賃合同范本
- 個(gè)人車庫互換合同范本
- 單個(gè)房子改造合同范本
- 農(nóng)田租合同范本
- 合伙創(chuàng)業(yè)餐廳合同范本
- ktv勞務(wù)合同范本
- 高壓電工作業(yè)測(cè)試題及答案
- 出售二手房車庫合同范本
- 獸醫(yī)傳染病學(xué)模擬試題及參考答案
- 倉儲(chǔ)維保合同范本
- 疫苗冰箱溫度記錄表
- 2023年海東地區(qū)互助土族自治縣人民醫(yī)院醫(yī)護(hù)人員招聘筆試模擬試題及答案解析
- X射線衍射課件(XRD)
- 福建省三明市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)
- 托物言志寫詩 知行合一做人
- 化工分離過程1緒論第1講ppt課件精選
- 陶板幕墻施工方法
- 設(shè)備管理培訓(xùn)教材
- 財(cái)務(wù)報(bào)表分析財(cái)務(wù)報(bào)表分析課件
- T∕CCCMHPIE 1.2-2016 植物提取物 檳榔多糖多酚
- 局域網(wǎng)規(guī)劃設(shè)計(jì)_畢業(yè)論文
評(píng)論
0/150
提交評(píng)論