1、C语言程序设计习题与参考答案第I章c语言程序设计基础思考与练习一、填空题1、C程序是由构成的,一个C程序中至少包含。2、C程序的注释是由和所界定的文字信息组成的。3、开发一个C程序要经过编辑、和运行4个环节。4、C语言中,头文件的扩展名是。5、C语言源程序的扩展名;经过编译后,生成文件的后缀是:经过连接后,生成文件的扩展名是o二、简答题1、简述C语言程序的运行步骤。2、软件编程中的可读性原那么一般包括那些内容?3、什么是算法?算法的特点有哪些?4、参照本章例题,编写一个C程序,输出以下内容。*Hello, world!*5、写出算法。圆的半径,求周长和面积。第1章思考与练习参考答案一、填空题1
2、、函数、一个主函数main()2、/*、*/3、编译、连接A .求x, y, z最大值C .求x, y, z中间值6、有如下程序段B.求x, y,z最小值D.求x, y,z平均值int a=!4,b=15,x;char c=A;x=(a&b)&(c,B);执行该程序段后,x的值为。A.ture B .false C . 0 D . 17、以下程序的输出结果是。main()int a=O,i=l;switch case 0:case 3:a+=2;case 1:case 2:a+=3;default:a+=5;Iprintf(”dn”,a);二、写出以下程序的运行结果#include stdio
3、.hmain()ini,j;i=j=2;if(i=l)if(i=2)primf(”d,i=i+j);elseprintf(”d”,i);2、下面程序的输出结果是。#includc stdio.hmain()(intiX=3;switch(iX) case 1:case 2:printf(iX3n); default:printf(iXunknown);3、下面程序的输出结果是main()(charchT=w,ch A=m,chB=dchC=,x,chM;chM=(chTch A)?chT:ch A;chM=(chMchB)?chM:chBchM=(chMchC)?chM:chC;printf(
4、c%,chM);三、编程1、小明去参加一个同学的生日聚会,同学的家长规定18岁以上的才可以饮酒,所 以需要编一程序根据输入的年龄打印一张饮酒卷,使的能饮酒的同学可以获取饮酒卷。2、根据指定月份,打印该月份所属的季节。3,4,5春季;6,7,8夏季;9,10,11秋 季;12, 1,2冬季。3、根据用户输入显示对应的星期时间(charfl),如果“星期一”,显示“干煽豆角”如果 “星期二,显示“醋溜土豆”如果“星期三”,显示“红烧狮子头如果“星期四”,显示“油炸 花生米”如果“星期五”,显示“蒜蓉扇贝”如果“星期六”,显示“东北乱炖”如果“星期日”, 显示“大盘鸡。第4章思考与练习参考答案一、1
5、、D 2、C 3、C 4、B 5、A 6、D 7 B、1、22、Ix=3Ix3lx unknow3、x1 #includestdio.hvoid main(/*main 函数 */ intil;/*定义整型变量*/printf(请输入你的年龄:);scanf(”d”,&il);if(il=18)/*判断函数*/printfC1恭喜你获得饮酒券!”);12、#includcint main()int month;scanf(%d,&month);if(month = 3) printf(春n”);else if(month = 6)printf(夏n”); else if(month = 9)p
6、rintf(秋n”); else printf(冬n”);return 0;方法二:#includeIntmain()lntmonlh=0;printf(“请输入月份:n”);scanf_s(n%d,&month);switch(month)case 1:casc2:case3:printf(“ 春);break;case4:casc5:case6:printff 夏勺;break;casc7:case8:casc9:printR“ 秋);brcak;case 10:case 11:case 12:printf(冬);break;default:!printf(输入错误);rcturnO;I3
7、、#includevoidmain() stringweck;printfC请输入星期几:, scanf(M%c,&week);switch ( week)case ”星期一”:prinlf(干煽豆角”);break;case ”星期二”:printf( ”醋溜土豆”);break;case ”星期三:printfC,红烧狮子头,break;case ”星期四”:printfC,油炸花生米,break;case ”星期五:printf(蒜蓉扇贝);break;case ”星期六:printfC 东北乱炖”);break;case ”星期日“:print盘鸡”);break;default:pr
8、intf(您输入错误”)第5章 循环结构程序设计及其应用思考与练习一、选择题int iNum=O;while(iNum=2)printf(%d,iNum);A. 2B. 3C.死循环,无限个0 D.有语法错2、下面程序的运行结果是。#includestdio.hvoid main()int iNum=0;while(iNum=2)iNum+;printf(%dn,iNum);A. 1B. 1C. ID. 12223343、以下程序段iNum1;doiNum=iNum*iNum;while(!iNum);A.是死循环B.循环执行2次C.循环执行一次D.有语法错误4、假设i为整型变量,那么以下循环
9、执行次数是ofor(i=2;i=0;)printf(,%d,i);A.无限次 B. 0次C. 1次D. 2次5、以下正确的描述是oA. continue语句的作用是结束整个循环的执行B. 只能在循环体内和switch语句体内使用break语句C. 在循环体内使用break语句或continue语句的作用相同D. 从多层循环嵌套中退出时,只能使用got。语句二、填空题1、下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。填空使程 序完整。int iNum=O,chLetter;chLetter=getchar();whil e( )(if()iNum+;chLetter=get
10、char();2、下面程序段的运行结果是。i=l;iSum=3;doiSurn+=i+;if(iSum%7=0)continue;else+i;whilc(iSum=* 1 & chLetter=,9,2、8三、编程题1、计算1 一 10()的所有偶数之和和所有奇数之和。#include stdio.hvoid main()int k, iSuml, iSum2:k=l : iSuml=0; iSum2=0while(k= 100) if(k%2=0)iSuml=iSuml+k;elseiSum2=iSuni2+k;k+;printf(n 偶数和是:d,奇数和是:d”,iSuml, iSum2
11、);2、计算n!。#include stdio.hvoid main()int k, iSum,n:k=l ; iSum =1 ;scanfd”,&n);while(k= n)iSum= iSum*k:k+;)printf(n the sum is %d iSum);3、编写程序打印出数字1一10,但其中不包括4和7,在4或7时跳过不输出(用break 还是continue?分别尝试一下,写出两者的区别)。#include stdio.hint isDaff(int iNum);void main()int i;for(i=l;i=10; i+)If(i!=4|i!=7)printf(d ,
12、i);4、.h5、.c、.obj、.exc二、简答题1、简述C语言程序的运行步骤。答:(1)编辑C程序源文件;(2) 编译,将编辑好的源程序文件翻译成二进制目标代码文件“*.obj”;(3) 连接,将编译生成的各个日标程序模块和系统或第三方提供的库函数连接 在一起,生成可以脱离开发环境、直接在操作系统下运行的可执行文件“*.exe”;(4) 运行程序。如果运行出错,这说明程序处理的逻辑存在问题,需要再次回到编辑 环境针对程序出现的逻辑错误进一步检查、修改源程序,重复编辑-编译一连接一运行的过 程,直到取得预期结果为止。2、软件编程中的可读性原那么一般包括那些内容?答:1.编程规范概要(1) 程
13、序结构清晰,简单易懂,单个函数的程序行数不得超过100行。(2) 打算干什么,要简单,直截了当,代码精简,防止垃圾程序。(3) 尽量使用标准库函数和公共函数。(4) 不要随意定义全局变量,尽量使用局部变量。(5) 使用括号以防止二义性。2.可读性要求(1) 可读性第一,效率第二。(2) 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。(3) 常量定义(define)有相应说明。(4) 处理过程的每个阶段都有相关注释说明。(5) 利用缩进来显示程序的逻辑结构,缩进量一致,可以以Tab键为单位。(6) 循环、分支层次不要超过五层。(7) 适当的使用注释,注释可以与语句在同一行,也可
14、以在上行。4、猴子吃桃问题:猴子第一天摘下假设干个桃子,当即吃了一半,还不瘾,又多吃了一个第 二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一 半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。#include stdio.hvoid main()int k, iSum;k=l ; iSum =1:while(k10) iSum=(iSum+l)*2;k+;printf(d, iSum);5、百钱百鸡问题。公鸡:5元;母鸡:3元;小鸡:3只I元,10()元钱刚好买100只鸡, 假设每种鸡都必须买,求公鸡、母鸡、小鸡各有几只?输出所有的购买方
15、案。#include stdio.hvoid main()int i,j:for(i=1;i20;i+)for(j=l;j33;j+)if(i*5+j*3+( 100-i-j)/3)= 100)Printf(“公鸡:d 母鸡:d 小鸡:%d ”,ij,100-ij)6、将1980至2008年间的所有闰年打印输出。#include stdio.hint isDaff(int iNum);void main()int i;for (i= 1980; i=20()8; i+)If(i%4=0&i%100!=0)|(i%400=0)printf(M%d , i);I第6章数组思考与练习1. 读io个整
16、数存入数组,找出其中最大值和最小值。2. 将-个数组逆序输出。3. 设计一个程序,输出以下矩阵1 234567894. 求一个三行三列矩阵对角线和。5. 求100到999之间的所有水仙花数。(水仙花数:一个n位数,它的每个位上 的n次蓦的和,等于这个数本身,如:153、370)o6. 用筛选法求100以内的素数(素数是除了 1和自己以外,不能被其他整数整除的 整数。)。7. 个打印杨辉三角的案例来加深对数组的理解。杨辉三角的前1()行样式如下所 /Ko11 1I21I331146411510105 1I61520156172135352171I828567056288 119368412612
17、68436 9第6章思考与练习参考答案#include #dcfinc SIZE 10void niain() int xSIZE,i,max,niin;prinlf(Enler 10 inlegers:n);for(i=0;iSIZE;i+)( printf(d:”,i+l);scanf(%d&xi);max=min=x0;for(i=l;iSIZE;i+) if(maxxi) min=xi;prinlfCMaximum value is %dn”,max); printf(Minimurn value is %dn,rnin);/*将个数组逆序输出。*/#include stdio.h#i
18、nclude conio.h#dcfinc N 5main()(int aN=9,6,5,4,l ,i,temp;printf(n original array:n);fbr(i=0;iN;i+)printf(4d”,a);for(i=0;iN/2;i+) temp=a;a=aN-i-l; aN-i-l =temp;printf(n sorted array:n);for(i=0;iN;i+)prinlf(%4d,a);gctch();1. #include main() static inta33=1,2,3,4,5,6,7,8,9); int i,j;printf(output a:rT)
19、;for(i=0;i3;i+)for(j=0;j3;j+)printf(”3d”,aij); printf(”n”);main()float a33,sum=O;int i,j;printf(please input rectangle element:);for(i=0;i3;i+)for(j=0;j3;j+)scanf(%f,&ai|j);for(i=0;i3;i+)sum=sum+a|ii;printf(duijiaoxian he is %6.2f,sum);I#inckide#includeint i,g,s,b;int sum = 0;for(i= 100:i 1000:i+)(g
20、 = i%10;/ 个位s = i/!0%10;/ 十位b = i/100;/ 百位/sum = g*g*g+s*s*s+b*b*b;sum = pow(g,3)+pow(s,3)+pow(b,3); / pow(a,b) a 为底数,b 为 指数if(sum=i)printfC冰仙花数:%dn”,i);return 0:include #define SIZE l(X)main() int aSIZE+l,ij;for(i=2;ivl00;i+) ai=i;for(i=2;iIOO;i+)for(j=i+ l;j= 10();j+) if(ai!=O&aj%ai=O) a|j=O; prin
21、tf(n);j=O;for(i=2;i=100;i+) if(ai!=O)printf(”4d”,ai);j+; if(j=10)j=0; printf(”虹);2. #include #includevoid niain()(ini i, j, n = 0;intarr101l0 = 1 ;/定义一个10行10列的二维数组,初始化为1while (n 10) 此while循环控制用户只能输入n = 10printf(u请输入n的值:n”);scanf(d”, &n);for(i=l;in;i+) 外层循环控制杨辉三角的行数arril01 = 1;每一行第1个元素都赋值为1,即第1列都为1fo
22、r(j= l;j v=i;j+) 内层控制杨辉三角的列数每个元素等于其上一行左边和上边两个元素之和arrij = arri - lj- 1 + arri - ljl;for (i = 0; i n; i+) 双重for循环打印这个二维数组中的元素for(j=0;jiNum2)return iNuml;else;2、以下程序的运行结果是int iNuml=5;int iNum2=7;main() int iNuml =4,iNum2=5,iSuni:iSum=fnPlus(iNum 1 ,iNum2);printf(A+B=%dn,iSum);fnPlus(in( iNuml,int iNum2
23、)inliSum;iSum=iNuml+iNum2;retuni(iSum);3、以下程序的运行结果。#includc stdio.hinlfnFun()(staticintiNum=l;iNum=iNum+2;rcturniNum;main()(printf(%dn,fnFun()+fnFun();三、编程题1、编写函数求 1 + 1 / 2+1 / 3+1 / 4+I / n 的值。2、使用函数,利用遍历数组找出全班同学成绩的最高分。3、使用递归方法,求Fibonacci数列的第N项。第7章思考与练习参考答案一、选择题1、C 2、C 3、A 4、B5、B 6、D 7、A 8、D二、填空题1
24、、intfnMax(int iNuml,int iNum2);fnMax(iNuml,iNuni2)return iNuml;2、A+B=43、8三、编程题1 编写函数求 1 + 1 / 2+1 / 3+1 / 4+l/n 的值。include sldio.hdoublcdSum(int n);void main()ini n;scanf(%d”, &n);printf(the result is %.2fn dSum(n);doubledSum(int n)ini i;doubicdRcsult = 0;for (i=l; i=n; i+)dResult += 1.0 / i;relunid
25、Result;I2、使用函数,利用遍历数组找出全班同学成绩的最高分。#includc #define SIZE 5(8)保持各种运算的标准形式,通过括号防止运算符的二义性。3、什么是算法?算法的特点有哪些?答:算法(Algorithm)是对特定问题求解方法与步骤的描述,是程序求解问题的核心 内容。算法的特点:有穷性、确定性、可行性、有零个或多个输入、有一个或多个输出。4、参照本章例题,编写一个C程序,输出以下内容。#include stdio.hvoid main()printf(”*n)printf(Hello, world! nH);printf(”*n)5、写出算法。圆的半径,求周长和面
26、积。算法:(1) 定义3个变量fR、fL fS分别存储圆的半径、周长和面积。(2) 输入圆的半径fR的值。(3) 分别计算圆的周长和面积,fL=2*3.14*fR, fS=3.14*1R*fR。(4) 输出fL和fS。第2章 基本数据及其运算思考与练习一、选择题1、下面表达错误的选项是。A. C程序中,各种括号应成对出现A. C程序中,赋值号的左边不可以是表达式floacfMax(float fScore, intiSize);void main()floatfScorcSIZE = ();int i = 0;floatfRcsult = 0;for (i = 0; i SIZE; i+)sc
27、anf(%r &fScorei);printf(the max score is %.2fn”, fMax(fScore, SIZE); getch();floatfMax(float fScore, intiSizc)(int i = 0;intfValue = fScorefOJ;for (i = 1; i fValuc)fValuc = fScorefi;return fValue;3、使用递归方法,求Fibonacci数列的第N项。include int f(int a)函数f的定义(int i;if(a=l )return 0;if( a= 2 )return 1;else if(a
28、 = 3)for(i = 1 ; i a ;i+)return (f(a-l)+f(a-2);/函数 f 的递归调用void main()int n;printf(input a numbcr:n);scanfT%d”,&n);函数f的调用第8章结构体、共用体和枚举类型思考与练习一、选择题1、设有以下结构体定义:struct student)charchNamc8;intiAge;charchScx;stStaff;那么下面的表达不正确的选项是oA. struct是定义结构体类型的关键字B, struct student是用户定义的结构体类型stStaff是用户定义的结构体类型名 D. chN
29、ame、iAge和chSex都是结构 体成员名2、在第(1)小题中定义的结构体变量stStaff,那么系统分配的内存空间字节数是 OA. 8B. 10 C. 11 D. 33、设有以下结构体定义:struct student)charchName8;intiAge;charchScx;)stStaffl3;对结构体变景成员的正确引用是。A、scanR%d, &stStaH.iAge) B. scanl(s, stStaffO.iAge)C. scanRs, stStaff)C. scanRs, stStaff)D. scanf(%d”,&iAgc)二、填空题1、引用结构体变量中成员的一般形式是
30、。:2、假设有以下结构体类型说明和数组的初始化:structstTest(intiNum;charchLetter6;stAlpha2 = 2, “abcde”,4, “EDCB”;那么执行语句 printf ( %s, %c n“, &stAlpha0.chLetter2, stAlphal.ch2);后的输出结果是:。3、以下程序的执行结果是:。fnChange(s(ruct test stHuman);struct testinliAge;charchSex;(stStaff = 18,M ;fnChange(struct test stHuman) stHuman. iAge = 20
31、 ;stHuman. chScx = F;void main() fnChange(stStaff);printf (%d, %c n , stStaff.iAgc, stStaff. chScx);第8章思考与练习参考答案一、1、C 2、A 3、B1、结构体变量:名.成员名2、cde,C3、I8,M第9章指针思考与练习1. 编写一个函数,将-个3*4的二维数组矩阵转置。用指向数组的指针实现。2. 编写一个程序统计候选人得票数。设有4名候选人,以输入候选人人名方式模拟 唱票,最后输出每个候选人的得票数。计算得票数的过程用函数实现。3. 指针作为函数参数,实现两个数值交换。4. 利用指针查找数列
32、中的最大值和最小值在窗体上输入10个整数,自动查找这些数 中的最大值和最小值,并显示在窗体上。5. 用函数指针来实现对函数的调用,返回两个整数中的最大值。6. 编写一个函数,其功能是从一个字符指针数组中寻找指定的一个字符串,假设找到 返回1 ,否那么就返回0。7. 编写函数,将一个字符串的指定字符全部删除。要求函数的原型可声明为:void fnDelChar(char *str, char ch);其中,参数sir为要删除字符的字符串,ch为要删除的字符。第9章思考与练习参考答案1. #include void func(int(*pa)4,int (*pb)3jnt x, int y)int
33、 i, j;输出pa指向的二维数组的元素for (i = 0; i v x; i+)(for(j=0;jvy;j+)printf(%dt, paij);pbji = paij;/ 矩阵转置printf(on);printf(nn);for (i = 0; i y; i+)for(j = 0;jx;j+)(printf(%dt”, pbiljl);Iprinif(侦);ini main()(int i,j;int arr34,brr43;for (i = 0;i3; i+)for(j =0;j 4;j+)scanf(%d, &arri|j);return 0;2. #include string
34、.hstruct person/*定义结构体类型*/ char chName15;int iCount;;void fnCount(struct person *pStr)/*计算每个人的票数int i,j;char chNamel51; printf(n Input name n); for(i=l;ichName)=O)(pStr+j)-iCount+;)void fnData_put(struct person *pStr) /*输出每个候选人及票数*/(int j;printf(n result:);for(j=0;jchName, (pStr+j) -iCount);void nia
35、in()(struct person stLeader4= Li,0),Wang,0,Zhang,0,Shen,0;fnCount(stLeader);fnData_put(stLcadcr);3. #include void swap(int * a, int * b) /函数参数为指针类型(int temp;temp=*a;*a=*b;*b=temp;)void main()int a=IO, b=20;printfC1调用函数前变量a和b的值为:d %d n”, a, b);swap(&a, &b);printfC*调用函数后变最a和b的值为:%d %d n”, a, b);4. #in
36、clude void fnMax_min(int n.int *max,int *min)int *p;*max = *min = *a;for(p = a+1 ;pva+n;p+) if(*p*max)*max = *p;else if(*pv*min)*min = *p; return;void main()int i,a10,max,min;printfC请输入10个整数:”); for(i=0;i10:i+) scanf(d”,&ai);fnMax_min(a, 1 (),&max、&min); printf(最大数是 %dnmax); printf(最小数是 dn”,niin);)5. int max(int a, int b);int main()(int x, y, max Vai;int (*pmax)(ini, int) = max; printf(Input two numbers:); scanf(%d %d, &x, &y); max Vai = (*pmax)(x, y); printf(Max value: %dn, max Vai); getchar();getchar();/*初始化最大值、最小值*/*最大值*/*最小值*/*输入数组元素*/*返回最大值和最小值*7/*输出最大值*/*输出最小值*/