还剩36页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
各章练习题答案第章语言概述1C简答题
1.1答:语言单词分为保留字、标识符、字面常量、运算符和分隔符类
1.C5答首字符必须是英文字母或下划线;其余位置上的字符必须是英文字母、十进制数字符号
2.或下划线答它们的首字符不同,此外各自还有详细的格式规定其中,数值字面常量以数字、正负号或小数点(如表示)开头,字符字面常量必须用单引号括起来,字符串字面常量必.
010.01须用双引号括起来,标识符首字符必须是英文字母或下划线答分类如下数值常量个:325-8+
3.42字符常量个:34*D字符串个7xl Vm+1al
2.c elseint x;标识符个7x2n countmain Hlistxy MaxA_l保留字个3int voidif运算符个:+1分隔符个0非法数据个:13ab以上共计个25答:语句除空语句外,按照语句功能,可分为以下类类型定义语句、变量定义语句、函
3.C8数原型语句、表达式语句、复合语句、选择语句、循环语句和跳转语句在以上类语句8中,前类属于说明性语句,后类属于执行性语句35答其格式为:<头文件>或#放“头文件对于每条预处理包含命令,在预处
4.#include111€|6理阶段将把该命令置换为所指定“头文件”中的全部内容,换句话说,是用该“头文件”保存的全部内容代替该预处理包含命令行对于上述给出的两种包含命令格式,系统处理时的查找头文件的路径有所不同对于第一种格式(即尖括号格式),将从语言系统层次目录中查找头文件,若查找不到则给出错误信息;C对于第二种格式(即双引号格式),如果头文件名没有给出磁盘号和路径名,则首先从当前工作目录(即包含该命令的程序文件所属的目录)中查找头文件,若查找不到,再接着从语言C系统层次目录中查找头文件,若还是查找不到则给出错误信息在第二种格式中,如果头文件名带有磁盘号和路径名,则只在该指定路径中查找头文件,若查找不到则给出错误信息(关于第二种格式中头文件名带有磁盘号和路径名的情况,教材的叙述是错误的)答第一步需要上机建立相应的工作区和项目并建立、输入和编辑该程序中的相应文件,通常首先建立主文件;第二步对每个程序文件进行编译生成各自的目标代码文件,通常主文件被首先编译并生成目标文件;第三步使主目标文件与同一程序中的其他目标代码文件以及有关语C言系统库函数文件相连接,生成一个可执行文件;第四步运行最后生成的可执行文件选择题L2void main{int sO,si,s2,x;sO=si=s2=0;从键盘输入一组整数以结束print-1:\n;scanfC%d1,x;结束whilex!=-1{//-1switchx%3{能被整除的数之和case0:sO+=x;break;//3除以余的数之和case1:si+=x;break;//31除以余的数之和case2:s2+=x;break;//32}scanf”%d”,x;printfsO=%d,sl=%d,s2=%d\n sO,si,s2;/学会数数,呵呵
4.ttinclude stdio.hvoid main{int cl=0,c2=0,c3=0;int i,j,k;fori=0;i5;i++{forj=i;j5;j++cl++;〃循环5+4+3+2+1=15次fork=5;k=i;k-c2++;〃循环6+5+4+3+2=20次c3++;〃5次printf%d%d%d\n cl,c2,c3;,
5.#include stdio.hconst intB=2;void main{int i=0,p=1,s=1;循环才结束whiles100{//s=100i++;p*=B;s+=p;〃循环次数i Ps23//I1〃2247〃33815//441631//553263//6664127printfi=%d\n,i;printfs=%d\n s;/对正整数分解质因数
6.10~16#include stdio.hvoid main{int i;fori=10;i=16;i++{从最小的质数开始int j=2,k=i;//j2printf%d:,i;do{/*在下面的循环中,如果能被整除,贝必为的质因数k jIJ jk因为是从最小的质数开始逐个增加的,只要能够整除的都会完全被j2k j循环分解可,所以当增加到合数/时厅的各个质因数均小于『都while k/j已经被分解完毕,故而此时的已经不能被『整除了必为的质因数k jk合数就是能够被和自身之外的数整除的数,即1其中为质数,且j=pl*p2*p3*---*pn,pi pir,2,3,•••,n,nlo*/whilek%j==0{printf%d”,j;k/=j;}j++;}whilek=j;printf\n;}不要光靠数数啊,呵呵
7.#include stdio.hconst intT=6;void main{int i,j,k=0;fori=1;i=T;i+=2//i:135f j=2;j=T;j++//j:23456orifi+j==T printfV;//i,j l,53,3else ifi*j==T printf“*“;〃i,j:1,63,2else k++;〃共循环3*5=15次,上面两种情况4次,这里11次printf\nk=%d\n,k;对照第小题这里的循环和第小题的很像吧?不错,这里的和第小题的
8.6while6while i6类似,是用来寻找质因数的只是由于的条件表达式不同,寻找的是和二者的公共j while x y质因数将所有的公共质因数乘起来,得到的是二者的最大公约数最小公倍数本应该是i Pi两数乘积除以最大公约数,但是由于在循环中和已经各自除以所有的公共质因数,whilex y也就是说和各自都已经除以一次最大公约数了,总共除了两次,所以最后反而要乘回来一x y次因此中的附加参数是printf p*x*y#include stdio.hvoid main{int x,y;int i=2,p=1;请输入两个正整数和printf x y:;scanf%d%d,x,y;do{whilex%i==0y%i==0{P*=i;x/=i;y/=i;}i++;}whilex=iy=i;和的最小公倍数为%己,printfx y5p*x*y;指出下列程序功能并上机验证
3.31程序功能计算数学公式团其中从键盘输入,要求本程序用到了函数定义的知识.n n=2o#include stdio.h函数要求一个整型参数,计算结果返回值为实数double flintn{//fl:int i;double sign=l s=1;z从开始累加至fori=2;i=n;i++{//2ns+=sign/i*i;〃sign含义见下s每次加上-l/i2sign*二・1;〃sign每次都乘以-1,初值为1二-12,故sign=-li返回计算结果return s;//svoid main{int a;“输入一个大于等于的整数:;printf2do scanf”%cr,a;whilea=1;//输入的数a不大于等于2则要重新输入printf”%lf\n「fla;〃调用fla计算,并将计算结果输出2与第章上机实验题第小题功能相同,请参照阅读注意是的码,由于在.2348O ASCIIASCII码表中连续排列,所以数字加上就成为对应的数字字符0~948#include stdio.hvoid main{int x;输入一个整数:;printfscanf%d x;zwhilex{int k=x%10;printf,,%c,k+48;x=x/10;printf\n;3答案很简单!看到最后两行就行了,呵呵考试考这题多好啊!函数.printf f2求两数的最小公倍数,与本章练习题的第小题的算法一样函数求两数的最大公约数,
3.28fl虽然中求最小公倍数的同时也得到了最大公约数但的效率高得多仕采用的算法称为辗f2p,fl转相除法,又称欧几里得算法,详细描述见教材第页对程序的说明823-12辗转相除法的证明设整除以的余数为即其中为整数将和的最大公约a bG a=q*b+r,q a b数写作和的最大公约数则为gcda,b,b r gcdb,ro由于而、均能被整除,所以显然也能被整除既然和都能被r=a-q*b,a b gcda,b r gcda b b r/整除,则是和的公约数,所以不可能大于和的最大公约数gcda,b gcda,b b rgcda b br gcdb,,ro反过来,由于和均能被整除,而所以芥也能被整除既然和brgcdb,r a=q*b+r,gcdb,r a b都能被整除,则是和的公约数,从而不可能大于和的最大公约数gcdb,rgcdb,r a b a bgcda,bo绕了半天,我们得到川并且那么就只能有:gcda,b=gcdb gcdb,r=gcda,b,gcda,b=gcdb ro/即,和的最大公约数必然也是它们的余数和它们的最大公约数这样,可以进行辗转相除,a b迅速将参与运算的两个数变小,很快得到结果#include stdio.hint flint a,int b{int r;whileb!=0{r=a%b;a=b;b=r;//此时有由于循环结束前进行了的赋值,所以实际是最后一次求得的//余b=0a=b;b=r;数也就是最后一次循环时执行前有其中为整数r=a=b;b=r;a=n*b,n//这时的和的最大公约数自然是也就是执行了后的是最大公约数a b b,a=b;areturn a;int f2int a,int b{int i=2,p=1;do{whilea%i==0b%i==0{p*=i;a/=i;b/=i;i++;}whilea=ib=i;return p*a*b;void main{int a,b;输入两个正整数:;printfdo scanf%d%d,a,b;whilea=011b=0;和%的最大公约数:printf%d1%d\n,a,b,fla,b;和%:的最小公倍数:printf%d1%d\n,a,b,f2a,b;4教材错误:函数中的语句应在语句之前.ff scanfswitch程序功能出道以内整数加减乘除运算题,统计用户得分每做对一题得分102010#include stdio.h#include stdlib.h#include time.hconst intN=10;int ffint x,int y,char op;void main{int i,a,b,c=0,d;char op;srandtime0;fori=0;iN;i++{a=rand%20+1;b=rand%20+1;d=rand%4;ifd==0op=else ifd==1op=else ifd==2op=else op=7;ifffa,b,op c++;得分:printfd%d\n,c*10;int ffint x int y,char op{zint z;printf%d%c%d=,x,op,y;scanf%d,z;//判断对指定的运算,用户给出的答案是否正确返回判断结果逻辑值opswitchop{都了,就不用了case return x+y==z;//return breakcase return x-y==z;case return x*y==z;casereturn x/y==z;//尽管本程序可以不要但可能用于别处,可能会被指定错误的值default,ff op//检查非法参数取值,这是好习惯但是简单地在大程序中是不好的处理exit default:{printf运算符错!\n;exitl;}根据下列题目要求编写程序并上机得到运行结果
5.4不要用函数啊,同志!整数的整数次方,还是这个好如果只求一两个高次塞,则有L POW更高效的办法而不要象下面那样逐次乘上去此外高次幕要小心溢出整数范围后记模事一件,居然开始的时候习惯性地把写成了,最终结果就成了哈哈,p*=3p*=i lo我还纳闷,这个程序怎么会错呢?ttinclude stdio.h void main{int i,p=1,sum=0;fori=0;i=10;i++{sum+=p;P*=3;printf%d\n,sum;见注释
2.#include stdio.hvoid main{int i,sum;fori=0,sum=0;sum1000;{1+=2;sum+=i*i;//循环结束时,已经大于等于即多加了一项sum1000,//所以最大的应是前一项,即n i-2printf%d\n,i-2;注意里为假时的求值表达式对于多项式计算,反复用高项系数乘以自变量加
3.printf x=0低项系数,可以极大地减少乘法次数即,对于多项式胤可以写成...a....an-l....an-
2....al....a0如果按原来的多项式计算,不作任何优化,则需要・.・・
1.0;void main{double x;请输入一个实数printf x:;scanf%lf,x;printfy=%lf\n,x=0sqrta*a+x*x:3*a*a*x+4*a*x-l;一般教材当然认为这种题目应该用双重循环,对、的所有可能取值情况全部判断一下不
4.a b定方程是否成立对于复杂一点的方程可能不得不如此,但是这儿用那种办法显然笨死了!对每个的取值,计算相应的然后看是否符合条件这不就够了吗?记住由于求用了整数除法,ab,bb所以得到的只是真正的解的整数部分所以在判断是否在之间的同时还要检查是bb15~36b不是真的是原方程的解由于本方程很简单,所以直接重新计算一下就行了另外,如果用b作为循环变量,只需要从循环到循环次,比用更快1536,22a#include stdio.h#include math.hvoid main{int a;fora=6;a=30;a++{复合语句开头也可以定义变量int b=126-2*a/5;//if15=bb=362*a+5*b==126printf%d,%d,a,b;printfCXn;第章数组和字符串4选择题
4.
11.B
2.C
3.B
4.D
5.A
6.C
7.A
8.D
9.B
10.D写出下列程序运行结果并上机验证
4.
21.ila中奇数个数;i2:a中偶数个数此题即形考册作业第三大题第小题21#include stdio.hvoid main{int a
[10]={12,39,26,41,55,63,72,40,83,95};int i,il=0,i2=0;fori=0;i10;i++a[i]%2il++:i2++;printf%d%d\nH,il,i2;将中元素逆序后输出
2.attinclude stdio.h#define N8void main{int a[N]={36,25,48,14,55,40,32,66;int i,x;逆序fori=0;iN/2;i++{//x=a[i];a[i]=a[N-1-i];a[N-1-i]=x;输出fori=0;iN;i++printf%d,a[i];//printf\n;统计数组中所有元素有多少个小于中各元素且不小于中该元素之前的各元素,并输
3.abb出此程序粗看非常无聊,实则在生活中可以找出很多实例例如买鞋子一一是一堆人,他a们的脚有大有小;是鞋子尺码,只有儿种,并且从小到大排列鞋子当然不能买小了,应该稍b大一点,但是又不能太大那么,对于中所有的人,中各种尺码的鞋子应该买多少双呢?用ab这个程序就可以统计出来,结果是分别应该购买双尺码为的鞋子c[i]b[i]#include stdio.httdefine N10#define M4void main{int a[N]={76,83,54,62,40,75,90,92,77,84};int b[M]={60,76,90,101};int c[M]={0};int i,j;fori=0;iN;i++{j=0;whilea[i]=b[j]j++;c[j]++;fori=0;iM;i++printf%d,c[i];printf\n;在二维数组中找最大元素,输出其值和下标
4.a此题功能与形考册作业第三大题第小题的相同,只是中数据不同25attinclude stdio.hvoid main{int a
[3]
[4]={{l,2,7,8},{5,6,11,12},{9,10,3,4};int x=a
[0]
[0];int ii=0Jj=0;int i,j;fori=0;i3;i++forj=0;j4;j++ifa[i][j]x{x=a[i][j];ii=i;jj=j;}printf”a[%d,%d]=%d\n,,ii,jj,a[ii][jj];,通过比较找出最大字符串,将其存到中;同时找出最小字符串,将其存到中第二个
5.si s2前加可提高一点效率,因为如果已经比大了,自然就不可能比小,只需要在if elsea[i]si s2a[i]不大于时才有必要和比较si s2此题功能与形考册作业第三大题第小题的相同,但本题采用数组,需要反复调用复制22strcpy字符串,效率较低#include stdio.h#include string.hvoid main{char a
[5]
[10]={student,worker,soldier,peasant,cadre};char sl
[10],s2
[10];int i;strcpysl,a
[0];strcpys2,a
[0];fori=1;i5;i++{ifstrcmpa[i],si0strcpysl,a[i];else ifstrcmpa[i],s20strcpys2,a[i];printf%s%s\n,si,s2;指出下列函数功能并上机调试和验证
4.3本题需要一点函数的知识数组作为函数参数声明时不需要指定第一维大小将一维整型数组的前个元素中大于等于的数换到小于的数后面保存
1.a n6060void flinta[],int nint i=0J=n-1,x;do{//找到第一个大于等于的数whilea[i]60i++;60//找到最后一个小于的数whilea[j]=60j60//如果大于等于的数在前面则换到后面去60ifij{x=a[i];a[i]=a[j];a[j]=x;i++;j}循环,直到大于等于的数全部在小于的数之后}whileij;//6060输出双精度数数组的前个元素中不小于平均值的元素,然后回车
2.a n此题与形考册作业第四大题第小题类似,但本函数并未统计和返回符合条件的元素个数,而36是输出它们void f2double a[],int nint i;double sum=0;fori=0;in;i++sum+=a[i];sum/=n;
1.B
2.C
3.A
4.D
5.A
6.B
7.D
8.C上机实验题程序代码#include stdio.hvoid main{int x,y;x=5;y=6;printfx+y=%d,,x+y;printfx*y=%d\nx*y;,运行结果x+y=11,x*y=30程序代码#include stdio.hint cubeint;void main{printfcube3=%d\n,cube3;printfcube5=%d\n,cube5;printfcube8=%d\n,cube⑻;int cubeint x{return x*x*x;}运行结果cube⑶=27cube5=125cube8=512程序代码主程序文件代码A.#include stdio.h#include abc.cppvoid main{double a,b,c;double averageValue;a=2;b=3;c=4;averageValue=AVEa,b,c;printfaverageValue:%lf\nn,averageValue;averageValue=AVEa+1,b+2,c+5;printfaverageValue:%Lf\n,averageValue;文件代码新建时选择注意去掉前面的勾,B.abc.cpp“File|New|C++Source File“Add toproject-以后新建其他程序文件或头文件时还要勾上fori=0;in;i++ifa[i]=sum pnntfH%
2.0lf,a[i];printf\n;统计并输出一维字符数组中逗号、分号、左右圆括号、左右方括号、左右花括号的个数
3.a并输出函数最后一句多了个%void f3char a[]int i,c
[5]={0};fori=0;a[i];i++switcha[i]{case c
[0]++;break;case c[l]++;break;casecase c
[2]++;break;casecase c
[3]++;break;casecase c
[4]++;break;fori=0;i5;i++printf%d,c[i];printf\n;用选择排序法按照字符串长度进行升序排序
4.本函数中反复调用求字符串长度,要花费较多时间,可考虑用一个整型数组保存字符串strlen长度以减少对的调用strlenvoid f4char a[][N],unsigned int munsigned int i,j,k,w;fori=1;im;i++{char x[N];w=i-1;k=strlena[i-1];forj=i;jm;j++ifstrlena[j]k{k=strlena[j];w=j;}strcpyx,a[i-1];strcpya[i-1],a[w];strcpya[w],x;}根据下列题目要求编写程序并上机调试和运行
4.4又是斐波纳契数列!因为要逆序显示,所以要在算出最后一项后再开始显示,可以用数组
1.先保存计算结果当然,也可以使用第章学到的递归函数6ttinclude stdio.hvoid main{int fibonacci
[20]={0,1},i;fori=2;isizeoffibonacci/sizeoffibonacci
[0];i++fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];fori=sizeoffibonacci/sizeoffibonacci
[0];i-;printf%d,fibonacci[i];printf\n;长度不超过个字符,大小就最多为
2.5051o#include stdio.hvoid main{char line
[51];int i,count
[10]={0};“请输入一行字符串不超过个字符printf50:\n;允许空格getsline;//fori=0;line[i];i++{int digit=line[i]-O;是十进制数字字符ifdigit=0digit=9//count[digit]++;fori=0;i10;i++printfH%d,count[i];printfCXn;无语看三次不懂?再次无语看十次不懂?还是先看看第章吧
3.3#include stdio.hvoid main{inta[]
[4]={{3,0,4,5},6,2,1,7,{4,1,5,8}};intb[]
[4]={{1,4,0,3},{2,5,L6},0,7,4,4,9,3,6,0}};//乘积矩阵行数等于第一个矩阵的行数,列数等于第二个矩阵的列数int c[sizeofa/sizeofa
[0]][sizeofb
[0]/sizeofb
[0]
[0]];int i,j,k;fori=0;isizeofa/sizeofa
[0];i++forj=0;jsizeofb
[0]/sizeofb
[0]
[0];j++forc[i][j]=0,k=0;ksizeofb/sizeofb
[0];k++c[i][j]+=a[i][k]*b[k][j];fori=0;isizeofa/sizeofa
[0];i++,printf\n forj=0;jsizeofb
[0]/sizeofb
[0]
[0];j++printf”%10cT,c[i][j];}此题题意不明什么叫做“每个同学的总成绩和平均值”?“每个同学的总成绩”应
4.该是指对于每个学生将其各门课程成绩累加起来的数值可是“平均值”呢?是指每一个同学的总成绩按课程门数平均,还是所有同学的总成绩加起来按学生人数平均?另外此程序中M N的第一个参数里%前面必须有空格,后面不能有空格,否则好像会有问题想念scanf1C++里的多么方便!cin,#include stdio.h#define N3#define M2void main{int a[N][M];int i,j,sum;fori=0;iN;i++{print,请输入第%:1位同学所有%d门功课的成绩:,i+1,M;forj=0;jM;j++scanf%d a[i]+j;/printf\n;forsum=0,i=0;iN;i++{该生总成绩int sumi=0;//forj=0;jM;j++printf第%d位同学%d门课程总成绩%d分,平均%
5.2lf分\n i+1,M,sumi,doublesumi/M;各生成绩汇总sum+=sumi;//printf\n所有同学平均总成绩%
5.2lf分\n,floatsum/N;第章指针
51.B2,A
3.C
4.C
5.D
6.A
7.B
8.C
9.B
10.D
11.A
12.C
13.B
14.D
15.B选择题
5.1(用到了中的进行动态分配,表示动态分配一个变量)15C++new newint int写出下列程序运行结果并上机验证
5.2(统计并输出数组中的倍数各有多少
1.a235注意三个语句之间不能用连起来,必须各自分开独立成句因为一个数可能同时是、if else
2、中一个或多个数的倍数,需要分别判断)35ttinclude stdio.h void main{int a
[8]={25,18,36,42,17,54,30,63};int*p=a;int c2,c3,c5;c2=c3=c5=0;whilepa+8{if*p%2==0c2++;if*p%3==0c3++;if*p%5==0c5++;p++;printf%d%d%d\n,c2,c3,c5;输出数组中第项的值、它们的和以及平均值
2.6~3#include stdio.hvoid main{int a
[8]={46,38,72,55,24,63,50,37;int s=0;int*p=a+2;whilepa+6s+=*p++;while-p=a+2pnntf%5d,*p;printf\n;printf,%5d%
5.1lf\n,s,s/
4.0;
3.按照字典顺序查找最大字符串并输出其间每当找到一个更大的字符串a[i]时,都会输出a⑼中最大的字符串〜a[i-1]ttinclude stdio.httinclude string.hvoid main{char*a
[5]={computer,telephone,typewriter,television,fridge};char*p=a
[0];int i;fori=1;i5;i++ifstrcmpa[i],p==1{printf%s,p;p=a[i];}printf\n%s\n,,p;/无语
4.#include stdio.hvoid main{intx=20,y=40,*p;P=x;printf%d,*p;*p=x+10;P=V;printf%d\n,*p;*p=y+20;printf%d%d\n,x,y;计算并逆序输出其中不小于的值
5.i2+l,i=0,1,2,…,8o25#include stdio.h#include stdlib.h#define NN8void main{int i,*p;int*x=mallocsizeofint;int*a=callocNN,sizeofint;*x=25;fori=0;iNN;i++a[i]=i*i+1;//1251017263750p=a+NN-1;do{if*p=*x printf%d,*p-;else break;}whilel;printf\n;freex;freea;指出下列函数功能并上机调试和验证
5.3随机生成和输出个的整数,计算其总和和平均值并输出其中由用户输入L m0〜99m#include stdio.h#include stdlib.h#include time.hvoid main{int i,m,*a,s=0;srandtime0;“从键盘上输入一个整型数组的长度:;printfscanf%d,m;a=callocm sizeofint;zfori=0;im;i++{a[i]=rand%100;s+=a[i];printfH%d,a[i];printf\n总和%d;平均值:%52f\n,s,s*
1.0/m;又是不可思议的事情!我在已有的工程项目中,把原来的程序文件内容全部删除,然后输入
2.下面的代码,居然报错,说宏为重定义也就是说编译时认为在下面的N macroredefinition,VC之前已经在某处定义了宏删掉那一行居然就没警告了,经过试验,发现此时的值为#define N,N10o尽管不知道确切的原因,但是我试着选择了菜单下的菜单项,将所有编译、链接Build Clean生成的文件全部清除,然后重新编译链接,果然就没问题了,特记于此,如有类似情况不妨试一下另外,可看看下面程序中关于的注释Clean calloc#include stdio.httinclude stdlib.httinclude string.h#define N30void main{inti,m;char x[N];char*a[N];“从键盘上输入待处理字符串的个数:;printfscanf%d,m;//尽管结果一样,不过从calloc参数的含义来讲,应该写成callocm,sizeofa⑼a=callocm*N,sizeofchar;printf从键盘上输入%d个字符串:\n,m;不支持包含空格fori=0;im;i++scanf%s,a[i];//“从键盘上输入待查找的一个子串;printfscanf%s,x;fori=0;im;i++ifstrstra[i],x!=NULL printf%s\n”,a[i];第章函数6选择题
6.
11.B
2.A
3.D
4.C
5.A
6.B
7.D
一、显然第小题选项和题干对不上题干中的口应改为2intw[N]charw[][N]
二、第小题中提到了“末尾递归”,这是递归的特例只在函数返回前的最后一步进行递归6调用末尾递归又称“尾递归”如果递归函数中只存在尾递归,则一般来说可以比较容易地改成循环程序,在两次循环之间修改各变量递归函数形参的值即可由于递归函数效率较低,所以只要能改成循环等非递归方式实现而不会使程序变得更难懂的,都应该避免使用递归方式实现写出下列程序运行结果并上机验证
6.2(同名覆盖注意同名变量)
1.b#include stdio.h int c=15;void main{int a=10,b=20;printf%d%d%d\n,a,b,c;int b=a+15;a=b/3;c=2*a+b;printf%d%d%d\n,a,b,c;}printf%d%d%d\n a,b,c;/实参与形参的关系实虚结合、按值传递
2.ttinclude stdio.hint flintx,int y x=x+y;y=x+y;printfx=%3d,y=%3d\nx,y;/returnx+y;}void mainintx=5,y=8;int z=flx,y;printfx=%3d,y=%3d,,x,y;printfz=%3d\n,,z;/指针形参含数组形参的用途高效传递大量数据如下例中函数的形参、通过指针访
3.f2a问甚至修改其指向的对象数据如下例中函数的形参f2sttinclude stdio.h void f2int a[],int n,int*s;void maininta
[5]={2,75,4,9};fint x;f2a,5,x;printf%d\n,,x;/voidf2int a[],int n,int*sint i;*s=0;fori=0;in;i++*s+=a[i];返回值类型为指针的指针函数注意不能返回自动局部变量的地址,因为返回后就超出其作
4.用域和生存期,从而使返回的地址无效寄存器变量本就没有地址可言,自然不存在返回其地址的问题ttinclude stdio.h#include stdlib.h#include string.hchar*f3const char*x,const char*y;void mainchar*a=apple;char b
[10]=pear;char*p;P=f3a,b;printfC%sXn,p;freep;char*f3const char*x,const char*ychar*p=mallocstrlenx+strleny+2;strcpyp,x;strcatp,H;strcatp,y;double AVEdoublex,double y,double zreturnx+y+z/3;运行结果averageValue:
3.000000averageValue:
5.666667程序代码主程序文件代码A.#include stdio.h#include example.hvoid main{int a,b,c;请输入任意三个整数:n;printfscanf%d%d%d,a,b,c;“求和printf%d\n,Suma,b c;z乘积:printf%d\n,Producta,b,c;}头文件代码新建时选择注意勾上B.example.h“File|New|C/C++Header File”“Add toproject…:前面的勾int Sumint,int,int;int Productint,int,int;另一个程序文件的代码:新建时选择注意勾上前C File|New|C++Source File”“Add toproject…:面的勾int Sumint a,int bintc,return a+b+c;int Productint a,int b,int creturn a*b*c;运行结果随输入不同而不同,请自行记录return p;二维数组参数
5.#include stdio.hint f4int a[]
[4],int m,int nint i,j,max=a
[0]
[0];fori=0;im;i++forj=0;jn;j++ifa[i][j]max max=a[i][j];return max;void mainint a
[3]
[4]={{25,38,46,72},{35,20,50,66},{18,74,38,69};intx=f4a,3,4;printfx=%d\n,x;指出下列函数功能并上机调试和验证
6.3计算并返回团
1.int funlint nint i,p=1,s=0;fori=1;i=n;i++{+二p i;s p;return s;插入排序法升序排序类似形考册作业第三大题第小题,只是此处为升序排序,那儿是
2.35降序排序void fun2int*a,int ninti,j,x;fori=1;in;i++{x=a[i];forj=i-1;j=0;j-将改为则为降序排序ifxa[j]a[j+1]=a[j];//xa[j]xa[j]else break;a[j+1]=x;将字符串的内容复制到字符指针所指向的存储空间中并返回
3.b achar*fun3char*a,const char*b while*b*a++=*b++;*a=0;return a;本题与形考册作业第四大题第小题虽然写法有着微小的差别,但功能完全相同,都是
4.34把练习题第小题中求最小公倍数的算法改写为递归形式比起非递归形式,显然难读了
3.28很多,效率也低了调用本函数求和的最小公倍数时,形参的实参应该固定给即应该调用abk2,Multiples,b,2为了保证正确调用,不妨将本函数声明为限制其他程序员在其程序文件中调用,而在本函static,数的程序文件中另外定义一个全局函数供其他程序员使用如下int LeastCommonMultipleint a,int b{return Multiplea,b,2;}int Multipleinta,int b,int kifa=kb=k{ifa%k==0b%k==0return k*Multiplea/k,b/k,k;else returnMultiplea,b,k+1;}else return a*b;问题一第一次调用时返回与的十进制形式各位数字顺序相反的数即,如果为则
5.x x123,函数最终返回以后的各次调用,最终返回结果与之前的调用有关,不能确定321第一次调用时,不断地在递归过程中去掉低位而这被去掉的低位则加到了x Contraryx/10,y的后面下次递归时的较高一位也会被再次加到后面,也就是说较高位会排y=y*io+x%io,xy到低位的后面,从而把的各位数字顺序反了过来x由于为静态变量,所以第二次调用开始时不为的新实参值各位将加在原来的值之后,y0xy如果或者较大还可能由于超过无符号整型数的范围而产生溢出,因此结果值难以预计yx问题二:及返回值类型与参数类型不一致,更容易造成溢出应统一为y unsigned int综上,应修改如下unsigned int Contraryunsigned int xstatic unsigned int y=0;ifx{y=y*10+x%10;return Contraryx/10;}else{unsignedinttemp=y;V=0;return temp;最后,这显然又是一个末尾递归,可以改成非递归形式如下:unsignedintContraryunsigned intxunsigned inty=0;whilex{y=y*10+x%10;x/=10;return y;intContraryunsignedintxstaticinty=0;■fx{y=y*10+x%10;Contra ryx/10;return y;根据下列题目要求编写程序并上机调试和运行
6.
41.int funlinta[],int nifn==0return0;return a[n-1]*a[n-1]+funla,n-1;参见第小题及形考册作业第三大题第小题
2.
4.2121void fun2inta[],int n,int*cl,int*c2for*cl=*c2=0;n a[n]%2*cl++:*c2++;〃*3和*c2括号不能省略!参见第小题函数
3.
3.33floint fun5intm,int n{int r;whilen!=0{r=m%n;m=n;n=r;return m;第章结构与联合7选择题
7.
11.C
2.D
3.A
4.A
5.B
6.D
7.C
8.B
9.A
10.C本大题有如下问题
一、第小题使用了语法在中则可直接使用结构名而在语言中,结构名除非使1C++C++C用定义为类型别名了,否则必须在其前面加关键字形考册作业第一大题第typedef struct,41小题正是考核此点所以本题中结构定义应改为:struct A{inta,b;struct A*c;};
二、第小题前应该有原因同上此外,不知道为什么,在中采用默认设置,经3D*struct,VC98过实际编译的结果是联合成员和的地址偏移为也就是说在成员之后有个字节空闲没b c8,a4用所以实际的结构大小为但是估计此处正确答案应该是2420
三、第小题中“类型为也应改为“类型为5Worker”struct Worker”
四、第小题涉及链表的插入操作执行后,则可以看作形成了以为表头指针的10p-next=f p链表,其表头为所指向的结点,之后是通过指针域链接的原来的链表所以要将新的表头指p针赋值给使指向新的表头结点p f,f写出下列程序运行结果并上机验证
7.
21.#include stdio.h struct AAA{inta
[10];int n;;structAAAx;void mainvoidinti;int b
[6]={20,35,46,18,24,52};x.n=6;将拷贝到开头fori=0;ix.n;i++x.a[i]=b[i];//b x.a增加一个数x.a[x.n]=37;x.n++;//输出fori=0;ix.n;i++printf%d,x.a[i];//printf\n;
2.#include stdio.httinclude stdlib.httinclude string.h structCCC{char*a;int n;;void mainvoidstructCCC x;char*p=PersonalComputer;x.n=strlenp+1;x.a=mallocx.n;strcpyx.a,p;printf%d%s\n,x.n-1,x.a;printf%d%s\n,x.n-1-8,x.a+8;freex.a;指出下列函数功能
7.31统计并返回男性人数男性、雄性、公兽英文为女性、雌性、母兽为.Male,Female intCountstruct Person a[],int ninti,c=0;fori=0;in;i++ifa[i].sex==,m c++;return c;2查找工资最高的人,返回其结构对象地址.口,struct Person*MaxWagesstruct Person a int ninti,k;float x;x=0;fori=0;in;i++ifa[i].payx{x=a[i].pay;k=i;}returna+k;按照下列题目要求编写出相应函数
3.4打印!结构定义都没有,怎么打印?晕死只有采用第页程序中的定
1.1947-1struct Person义了struct Person{char name
[10];int age;float pay;;void PrintNotYoungerThanstructPersona[],intn,int xinti;printfList-All thepersons whoare notyounger than%d\n,x;printf%20s%10s%10s\n Name,Age,Pay;,fori=0;in;i++ifa[i].age=xprintf%20s%10d%
10.2f\na[i].name,a[i].age,a[i].pay;,
2.structPerson*FindPersonByNamestruct Persona[],intn,char*key从后向前找,未找到头且未找到则继续whilen-strcmpa[n].name,key;//return n0如果找到则不会再次自减,所以不会小于NULL:a+n;//n0第章文件8选择题
8.
11.A
2.C
3.D
4.C
5.B
6.D本大题有如下问题
一、第小题中为标准错误输出设备,一般也是指屏幕专门用于输出错误信息,以便1stderr可以与标准输出设备输出正常运算结果的功能相区分输出也使用文本文件输出方式指出下列程序或函数功能并上机验证
8.21即形考册作业第四大题第小题将输入的若干个字符串保存到文本文件.46d:\xxk\xuxkl.txt中,每个字符串一行输入的单个字符串长度必须小于输入字符串结束20,end#include stdio.httinclude stdlib.h#include string.hvoid JAchar*fnameFILE*fout=fopenfname,w;char a
[20];printf“输入若干个字符串,每个字符串长度小于20,字符串end作为结束标志\n“;whilel{scanf%s,a;ifstrcmpa,,,end==0break;fputsa,fout;fputcCXn,fout;fclosefout;void mainchar*p=d:\\xxk\\xuxkl.txt;JAp;2统计并返回文本文件字符数代码与教材不同,请比较.int wr4FILE*fptrint c;fseekfptr,0,SEEK_SET;forc=0;fgetcfptr!=EOF;c++;return c;3将中个学生的资料写入字节文件,然后逐一读出并找出其中成绩最高的输出注意文.a4件指定保存在下,运行程序前请先建立该目录或修改程序中指定的目录d:\xxk ttincludestdio.hstruct Student{char num
[6];char name
[10];int grade;}x,y;struct Studenta
[4]={{100,xxk1,85},{“102”,“wrong”,83},{103,xcong,88},{104,bjuan,73};void mainint max=0;char*p=d:\\xxk\\xuxk
2.birT;FILE*fio=fopenp,wb+H;fwritea,sizeofstruct Student,4,fio;fseekfio,0,SEEK_SET;while!feoffio{freadx,sizeofstruct Student,1,fio;iffeoffio break;ifx.grademax{max=x.grade;y=x;}printf%s%s%d\n”,y.num,y.name,y.grade;fclosefio;按照下列题目要求编写出相应的函数
4.3参见形考册作业第三大题第小题由于数的范围很小,所以用判断代替了
1.16i/j=j求平方根内层循环寻找能够整除的并且限制不大于以避免重复查找内层循环for ij,j i/j结束时,也许是找到了符合条件的也许是已经超过了允许的范围,即了故在其后用j;ji/j if语句判明情况如果是不为则自然是没有找到符合条件的也就是说必为素数;如果i%j0,j,i i%j为则不是素数0,i本程序使用了函数,该函数只是比函数多了一个文件流参数,用于向指定的文本fprintf printf文件输出,其他规定与相同printfttinclude stdio.hvoid maininti,j;FILE*f=fopenCprimes.txt,w;fori=2;i100;i++{forj=2;i/j=ji%j;j++;ifi%j!=0输出到文本文件fprintff,%d,i;//ffclosef;见注释采用这种方法虽然需要定义个元素的整型数组,但能够只调用次函数
2.10020rand就能保证产生的随机数是不重复的如果直接用函数产生以内的随机整数,则为了rand100保证随机数不重复需要定义个元素的整型数组将产生的数保存下来,并且每次都要逐个检20查是否有重复,有重复则要重新生成,算法复杂,效率也较低ttinclude stdio.h#include stdlib.h#include time.hvoid maininti,n,a
[100];FILE*f=fopenrand.bin,wb;fori=0;i100;i++所有的整数a[i]=i;//0~99srandtime0;forn=0;n20;n++{〃在其中随机抽取20个放在前面在中随机抽取int j=rand%100-n+n,x;//a[n]~a
[99]恰好抽到无需交换ifj==n continue;//a[n],选择题
2.1第章基本数据类型与表达式
21.D
2.A
3.B
4.B
5.D
6.C
7.C
8.A
9.C
10.D
11.B
12.C
13.A把下列数学算式或不等式表示成表达式
2.2C
1.
2.0*x*l+x*x/
3.
02.l+expx/l-expx
3.-b+sqrtb*b-
4.0*a*c/2/a
4.l/
3.0*x*log
2.0*x+k
5.powsinx+
3.14159/4,3/3+powcosx-
3.14159/4,
36.powl+expx+1,n/
77.0=xx=
208.a*x-b*y!=c
9.4*x+7*y-2==3*a*b先判断避免除
10.
3.0*x+2!=0fabs
2.0*x*x+l/
3.0*x+2=5/*
3.0*x+20*/
11.age=5511pay=820江苏“!女/*函数详见教材第页*/
12.!strcmpplace,“strcmpsex,“strcmp
12713.a=chch=z||A,=chch=Z⑵为数组元素,详见第章*/
14.s
[2]==Os[l]==x*||s[l]==X/*s[l]s4求出下列逻辑表达式的相反式
2.
31.!x
2.x!=
03.x
104.p==NULL||x==
465.x=0||x=
106.ch!=d ch!=D是对结构成员的间接访问,详见教材第页
7.!p11p-data==x/*p-data
1937.3*/为数组元素,详见第章*/
8.i=na[i]%3!=O/*a[i]4根据下列题目要求编写出相应程序
2.4(题目中仅要求两边之和大于等于第三边是不对的两边之和等于第三边只能连成宜线(根
1.据公式计算面积也为)不能组成三角形边长也不应为负数故应要求两边之和大于第三边,0,且任一边长大于不过目前没有学习第章的语句,程序自身无法控制在遇到不能构成三03if角形的情况时如何处理,需要用户输入时自行掌握)#include stdio.httinclude math.h//将抽到的数换到前面放在下标n处,将a[n]换到后面以便以后还可以抽取x=a[j];a[j]=a[n];a[n]=x;}fwritea,sizeofa
[0],n,f;fclosef;void main{double a,b,c,s;请输入三角形三条边长:;printfscanf%lf%lf%lf,a,b,c;s=a+b+c/2;该三角形面积为:printf%lf\n,sqrts*s-a*s-b*s-c;每年都是上一年的即倍,年后则将是的次方其实只有次方,为什
2.110%,
1.
151.155么一定要用呢八一八?效率多高!不过要注意人数是没有powl.l,
51.1*
1.1*
1.1*
1.1*
1.1零头的,所以要一下之所以用而不是是为了保证完成任务,一个都不能少,ce ceHfloor呵呵本题这样算出来的是人不过更严格的做法就是要每年都一下,否则中间4832ceil某个年份招生人数就有零头了,本题这样算出来的是人只是那样的话就成了4836ceilceilceilceilceil3000*
1.1*
1.1*
1.1*
1.1*
1.1晕吧,哈哈要想不晕,得学好第章的循环语句3#include stdio.httinclude math.hvoid main{printf5年后计划招生%lf人\n“,ceil3000*powl.l,5;算术平均值求和之后除以几何平均值乘积的次方根即次方为了防止数
3.n,n
1.0/n值过大溢出超过整数类型的范围,所以对第一个数就使用了强制类型转换为此外本double题计算乘积的次方根,要求输入的四个整数如果全都不为则应有、或个为正,否则40,024乘积为负,无实数次方根4#include stdio.h#include math.hvoid main{inta,b,c,d;请输入个整数:;printf4scanfH%d%d%d%d,a,b,c,d;print算术平均值:%lf,几何平均值:%lf\n,doublea+b+c+d/4,powdoublea*b*c*d
1.0/4;/唯一要求:和不能是相反数,即不等于拜托,拜托!
4.aba-b#include stdio.httinclude math.hvoid main{double a,b;“请输入和的值:;printf abscanf%lf%lf,a,b;printfx=%lf,y=%lf\n,2*a*sina/3/a+bz2*b*cosb/3/a+b;}上机实验题
1.ttinclude stdio.h#include stdlib.httinclude time.hconst intN=10;voidmain{inti,x,y,z,c=0;srandtime0;fori=1;i=N;i++{x=rand%90+10;//[0+10,89+10]y=rand%90+10;//[0+10,89+10]printf%d+%d=,x,y;scanf%d,z;本题回答正确ifx+y==z c++;//“最后得分:printf%d\n,c*10;
2.与教材不同,使用了、九这是制表符,相当于按Tab键排版由于使用了所以%102f也省略为%.即不限定宽度,只限定小数位数为位注意教材上第一个语句中,误为21£2printf cos”了请尝试将改为、“con”while fordo~while#include stdio.h#include math.hconst doubleRAD=
3.14159/180;voidmain{inti=0;printf”\ti\tsin\tcos\n“;whilei=90{printf\t%d\t%.2lf\t%.2lf\n,i,sini*RAD,cosi*RAD;i+=5;正整数范围大约亿多,故输入的数以位或以下小于亿为宜,切记切记!
3.21910#include stdio.hvoid main{int num,rem;输入一个整数:;printfscanf”%cT,num;do{得到个位的值rem=num%10;///*去掉个位,这样下次的个位就是现在的十位每次如此,即可逐次得到从个位到最高位的各位*/num/=10;//输出现在的个位由于从个位开始逐位输出,所以次序反过来了printf%d,rem;/*循环必须用这样当为时也会循环一次,输出一个do~while,num00开始不为时,当去掉最高位后自然也就是了,结束循环*/num}whilenum0;printf\n;呵呵,语句与教材的不同其中表达式可以省略,这不奇怪;每次循环和都
4.for1ch++dl++执行一次,所以表达式只需要判断这也不奇怪两条合成一句,大多数2ch printf同学也会但是和怎么和合并成表达式原因在于由于是后缀++,所以给ch++dl++printf3printf的值实际上都是和值给了之后才增加所以++实际上仍然是在输出之后dl ch,printf1,printf做的#include stdio.hvoid main{char ch=A,dl=a;for;ch=F;printf%c:%d,%c:%d\n,ch++,ch,dl++,dl;比教材多了一点换行,程序排版好看点注意有整数除法,所以不能为而且输入除法
5.y0,答案的时候要舍去小数部分啊!#include stdio.hvoid main{intx,y,z c=0;,“输入两个整数:;printfscanf%d%d x,y;/printf%d+%d=,x,y;scanf%d,z;ifx+y==z C++;printf%d-%d=,x,y;scanf%d“,z;ifx-y==z C++;printf%d*%d=,x,y;scanf”%cT,z;ifx*y==z C++;printf%d/%d=,x,y;scanf%d,z;ifx/y==z C++;printf%d%%%d=,x,y;scanf%d,z;ifx%y==z C++;printf(\n共5道题,答对%d道题\n,c);)第章流程控制语句3选择题
3.
11.A
2.B
3.C
4.D5*.C
6.B
7.C
8.B
9.A
10.D问题一第小题一般而言,循环体每次执行完之后都会执行表达式然后再计算表达式52,判断是否中止循环,即使在循环体中碰到也不会跳过表达式的执行但是,continue3如果在循环体中执行则会立即终止循环,也就是说〈表达式会被跳过,在这种情况下,break3循环体就被多执行了一次写出下列程序运行结果并上机验证
3.2第一个改用条件表达式,注意最后一个之前的一行,每执行一个赋值语句,相关
1.if printf变量的值就被改变了,变量的新值参与下一个赋值语句中的运算,所以执行了之后,a+=b;b+=a;b和的值不等a#include stdio.hvoid main{inta=2,b=5,c;c=a+b10a*b:3*a+2*b;ifc=20printf”%d,c*c;else ifab printf%d,3*a+b;else printf%d,4*c-5;printfCXn;a+=b;b+=a;c+=a+b;printfa=%d,b=%d,c=%d\n,a,b,c;注意三处乂+=让仅-、除了之后有别的没有
2.26\/731case10break,breakttinclude stdio.hvoid main{intx;forx=5;x12;x+=2{//x:57911switchx-1{case4:printf%d\n,x;//x:5case7:pnntfn%cl\n,2*x+1;//x:5case10:printf%d\n,3*x-1;break;//x:511default:printfdefault\n;//x:79}要求输入的数在第页
3.96ttinclude stdio.h。
个人认证
优秀文档
获得点赞 0