《C语言程序设计》精品试题(附讲解答案)

申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

文档介绍

《C语言程序设计》精品试题(附讲解答案)

《C语言程序设计》精品试题一、单项选择题(答案P12)导读:单项选择题要求从给出的四个备选答案中,选出一个最符合题意的答案。本类习题主要检查对C语言基本概念的掌握情况,读者可根据学习进度选做部分习题。在完成习题的过程中,不但要选出正确的答案,而且要清楚不正确的选项错在何处,以加深对概念的理解。对于掌握不准的问题,应该通过上机实验来检验。【1.1】以下不正确的C语言标识符是____。A)intB)a_1_2C)ab1exeD)_x【1.2】以下是正确的C语言标识符是____。A)#defineB)_123C)%dD)n【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是。A)printB)iamC)PxqD)str_l_3done_halfMy->bookCppoodbstart$itline#powaBc3paiHis.agewhile【1.4】下面各选项组中,均是C语言关键字的组是。A)auto,enum,includeB)switch,typedef,continueC)signed,union,scanfD)if,struct,type【1.5】下列不属于C语言关键字的是。A)defaultB)registerC)enumD)external【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。A)程序文件的开始B)程序文件的最后C)它所调用的函数的前面D)程序文件的任何位置【1.7】下列关于C语言的叙述错误的是____A)大写字母和小写字母的意义相同B)不同类型的变量可以在一个表达式中C)在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型D)同一个运算符号在不同的场合可以有不同的含义140n【1.8】在C语言中,错误的int类型的常数是。A)32768B)0C)037D)0xAF【1.9】执行语句printf("%x",-1);屏幕显示____。A)-1B)1C)-ffffD)ffff【1.10】已知longi=32768;执行语句printf("%d",i);屏幕显示____。A)-1B)-32768C)1D)32768【1.11】已知longi=65539;执行语句printf("%d",i);屏幕显示____。A)65539B)-3C)3D)程序不能执行【1.12】在C语言中,整数-8在内存中的存储形式是。A)1111111111111000B)1000000000001000C)0000000000001000D)1111111111110111【1.13】C语言中字符型(char)数据在内存中的存储形式是____。  A)原码B)补码C)反码D)ASCII码【1.14】将字符g赋给字符变量c,正确的表达式是。A)c=147B)c="147"C)c='147'D)c='0147'【1.15】下列转义字符中错误的一个是____。A)'00'B)'014'C)'x111'D)'2'【1.16】将空格符赋给字符变量c,正确的赋值语句是____。A)c=''B)c=NULLC)c=0D)c=32【1.17】已知:chara='70';则变量a中。A)包含1个字符B)包含2个字符C)包含3个字符D)说明非法【1.18】字符串""EOFn=-61""的长度是____。A)8B)9C)14D)非法字符串【1.19】字符串""的长度是____。A)0B)1C)2D)非法字符串【1.20】已知:chara;intb;floatc;doubled;执行语句"c=a+b+c+d;"后,变量c的数据类型是。A)intB)charC)floatD)double【1.21】温度华氏和摄氏的关系是:C=-(F-32)。已知:floatC,F;由华氏求摄氏的正确的赋值表达式是____。A)C=5/9(F-32)B)C=5*(F-32)/9140nC)C=5/9*(F-32)D)三个表达式都正确【1.22】逗号表达式"(a=3*5,a*4),a+15"的值是____。A)15B)60C)30D)不确定【1.23】如果inta=1,b=2,c=3,d=4;则条件表达式"a5&&++x<10;A)1B)2C)3D)4【1.27】为判断字符变量c的值不是数字也不是字母时,应采用下述表达式____。A)c<=48||c>=57&&c<=65||c>=90&&c<=97||c>=122B)!(c<=48||c>=57&&c<=65||c>=90&&c<=97||c>=122)C)c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122D)!(c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122)【1.28】已知inta[3][2]={3,2,1};则表达式"a[0][0]/a[0][1]/a[0][2]"的值是____。A)0.166667B)1C)0D)错误的表达式【1.29】已知intx=1,y=1,z=1;表达式"x+++y+++z++"的值是____。A)3B)4C)5D)表达式错误【1.30】用十进制表示表达式"12|012"的值是____。A)1B)0C)12D)14【1.31】已知以下程序段:inta=3,b=4;a=a^b;b=b^a;a=a^b;则执行以上语句后a和b的值分别是____。A)a=3,b=4B)a=4,b=3C)a=4,b=4D)a=3,b=3【1.32】在位运算中,操作数每右移一位,其结果相当于____。A)操作数乘以2B)操作数除以2C)操作数除以16D)操作数乘以16140n【1.33】已知chara=222;执行语句a=a&052;后,变量a的值是____。A)222B)10C)244D)254【1.34】已知二进制数a是00101101,如果想通过整型变量b与a做异或运算,使变量a的高4位取反,低4位不变,则二进制数b的值应是____。A)11110000B)00001111C)11111111D)00000000【1.35】已知inta=15,执行语句a=a<<2以后,变量a的值是____。A)20B)40C)60D)80【1.36】已知intx=5,y=5,z=5;执行语句x%=y+z;后,x的值是____。A)0B)1C)5D)6【1.37】使用语句scanf("x=%f,y=%f",&x,&y);输入变量x、y的值(□代表空格),正确的输入是____。A)1.25,2.4B)1.25□2.4C)x=1.25,y=2.4D)x=1.25□y=2.4【1.38】下列循环语句中有语法错误的是____。A)while(x=y)5;B)while(0);C)do2;while(x==b);D)dox++while(x==10);【1.39】已知intx=(1,2,3,4);变量x的值是____。A)1B)2C)3D)4【1.40】表达式sizeof(double)是。A)函数调用B)double型表达式C)int型表达式D)非法表达式【1.41】执行语句printf("2:%d,",printf("1:%d,",scanf("%d",&x)));以后的输出结果是____。A)2:1,1:1,B)1:1,2:1,C)2:4,1:1D)1:1,2:4,【1.42】已知:intx,y;doublez;则以下语句中错误的函数调用是。A)scanf("%d,%lx,%le",&x,&y,&z);B)scanf("%2d*%d%lf",&x,&y,&z);C)scanf("%x%*d%o",&x,&y);D)scanf("%x%o%6.2f",&x,&y,&z);【1.43】与条件表达式"(n)?(c++):(c--)"中的表达式(n)等价的表达式是____。A)(n==0)B)(n==1)C)(n!=0)D)(n!=1)【1.44】已知inti=1,j=0;执行下面语句后j的值是____。while(i)switch(i){case1:i+=1;j++;break;case2:i+=2;j++;break;case3:i+=3;j++;break;default:i--;j++;break;}A)1B)2C)3D)死循环140n【1.45】求取满足式12+22+32+……+n2≤1000的n,正确的语句是____。A)for(i=1,s=0;(s=s+i*i)<=1000;n=i++);B)for(i=1,s=0;(s=s+i*i)<=1000;n=++i);C)for(i=1,s=0;(s=s+i*++i)<=1000;n=i);D)for(i=1,s=0;(s=s+i*i++)<=1000;n=i);【1.46】下面的for语句。for(x=0,y=10;(y>0)&&(x<4);x++,y--);A)是无限循环B)循环次数不定C)循环执行4次D)循环执行3次【1.47】已知inti=1;执行语句while(i++<4);后,变量i的值为____。A)3B)4C)5D)6【1.48】已知intx=12,y=3;执行下述程序后,变量x的值是____。do{x/=y--;}while(x>y);A)1B)2C)3D)程序运行有错误【1.49】已知chara[][20]={"Beijing","shanghai","tianjin","chongqing"};语句printf("%c",a[30]);的输出是____。A)<空格>B)nC)不定D)数组定义有误【1.50】若用数组名作为函数调用时的实参,则实际上传递给形参的是。A)数组首地址B)数组的第一个元素值C)数组中全部元素的值D)数组元素的个数【1.51】对二维数组的正确说明是____。A)inta[][]={1,2,3,4,5,6};B)inta[2][]={1,2,3,4,5,6};C)inta[][3]={1,2,3,4,5,6};D)inta[2,3]={1,2,3,4,5,6};【1.52】对字符数组s赋值,不合法的一个是____。A)chars[]="Beijing";B)chars[20]={"beijing"};C)chars[20];s="Beijing";D)chars[20]={'B','e','i','j','i','n','g'};【1.53】对字符数组str赋初值,str不能作为字符串使用的一个是____。A)charstr[]="shanghai";B)charstr[]={"shanghai"};C)charstr[9]={'s','h','a','n','g','h','a','i'};D)charstr[8]={'s','h','a','n','g','h','a','i'};【1.54】对函数形参的说明有错误的是____。A)inta(floatx[],intn)B)inta(float*x,intn)C)inta(floatx[10],intn)D)inta(floatx,intn)140n【1.55】如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为____。A)静态变量B)动态变量C)外部变量D)内部变量【1.56】在一个C源程序文件中,若要定义一个只允许在该源文件中所有函数使用的变量,则该变量需要使用的存储类别是。A)externB)registerC)autoD)static【1.57】在C语言中,函数的数据类型是指____。A)函数返回值的数据类型B)函数形参的数据类型C)调用该函数时的实参的数据类型D)任意指定的数据类型【1.58】已知如下定义的函数:fun1(a){printf("n%d",a);}则该函数的数据类型是____。A)与参数a的类型相同B)void型C)没有返回值D)无法确定【1.59】定义一个函数实现交换x和y的值,并将结果正确返回。能够实现此功能的是____。A)swapa(intx,inty)B)swapb(int*x,int*y){inttemp;{inttemp;temp=x;x=y;y=temp;temp=x;x=y;y=temp;}}C)swapc(int*x,int*y)D)swapd(int*x,int*y){inttemp;{int*temp;temp=*x;*x=*y;*y=temp;temp=x;x=y;y=temp;}}【1.60】求一个角的正弦函数值的平方。能够实现此功能的函数是____。A)sqofsina(x)floatx;{return(sin(x)*sin(x));}B)doublesqofsinb(x)floatx;{return(sin((double)x)*sin((double)x));}C)doublesqofsinc(x){return(((sin(x)*sin(x));}D)sqofsind(x)floatx;{return(double(sin(x)*sin(x)));140n【1.61】一个函数内有数据类型说明语句如下:doublex,y,z(10);关于此语句的解释,下面说法正确的是____。A)z是一个数组,它有10个元素。B)z是一个函数,小括号内的10是它的实参的值。C)z是一个变量,小括号内的10是它的初值。D)语句中有错误。【1.62】已知函数定义如下:floatfun1(intx,inty){floatz;z=(float)x/y;return(z);}主调函数中有inta=1,b=0;可以正确调用此函数的语句是____。A)printf("%f",fun1(a,b));B)printf("%f",fun1(&a,&b));C)printf("%f",fun1(*a,*b));D)调用时发生错误【1.63】下面函数的功能是____。a(s1,s2)chars1[],s2[];{while(s2++=s1++);}A)字符串比较B)字符串复制C)字符串连接D)字符串反向【1.64】在下列结论中,只有一个是错误的,它是。A)C语言允许函数的递归调用B)C语言中的continue语句,可以通过改变程序的结构而省略C)有些递归程序是不能用非递归算法实现的D)C语言中不允许在函数中再定义函数【1.65】已知:inta,*y=&a;则下列函数调用中错误的是。A)scanf("%d",&a);B)scanf("%d",y);C)printf("%d",a);D)printf("%d",y);【1.66】说明语句"int(*p)();"的含义是。A)p是一个指向一维数组的指针变量B)p是指针变量,指向一个整型数据C)p是一个指向函数的指针,该函数的返回值是一个整型D)以上都不对【1.67】设有说明int(*p)[4];其中的标识符p是。A)4个指向整型变量的指针变量140nB)指向4个整型变量的函数指针C)一个指向具有4个整型元素的一维数组的指针D)具有4个指向整型变量的指针元素的一维指针数组【1.68】已知:chars[10],*p=s,则在下列语句中,错误的语句是。A)p=s+5;B)s=p+s;C)s[2]=p[4];D)*p=s[0];【1.69】已知:chars[100];inti;则引用数组元素的错误的形式是。A)s[i+10]B)*(s+i)C)*(i+s)D)*((s++)+i)【1.70】已知:chars[6],*ps=s;则正确的赋值语句是。 A)s="12345";B)*s="12345";C)ps="12345";D)*ps="12345";【1.71】已知:chara[3][10]={"BeiJing","ShangHai","TianJin"},*pa=a;不能正确显示字符串"ShangHai"的语句是。A)printf("%s",a+1);B)printf("%s",*(a+1));C)printf("%s",*a+1);D)printf("%s",&a[1][0]);【1.72】已知:inta[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};int(*ptr)[3]=a,*p=a[0];则以下能够正确表示数组元素a[1][2]的表达式是。A)*(*(a+1)+2)B)*(*(p+5))C)(*ptr+1)+2D)*((ptr+1)[2])【1.73】已知:inta[]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a;则值为3的表达式是。A)p+=2,*(p++)B)p+=2,*++pC)p+=2,*p++D)p+=2,++*p【1.74】已知:inta[]={1,2,3,4},y,*p=a;则执行语句y=(*++p)--;之后,数组a各元素的值变为______。A)0,1,3,4B)1,1,3,4C)1,2,2,4D)1,2,3,3变量y的值是____。A)1B)2C)3D)4【1.75】已知:inta[]={1,3,5,7},y*p=a;为使变量y的值为3,下列语句正确的是____。A)y=++*p++;B)y=++(*p++);C)y=(++*p)++;D)y=(*++p)++;【1.76】已知:intx[]={1,3,5,7,9,11},*ptr=x;则能够正确引用数组元素的语句是。A)xB)*(ptr--)C)x[6]D)*(--ptr)【1.77】函数的功能是交换变量x和y中的值,且通过正确调用返回交换的结果。能正确执行此功能的函数是。A)funa(int*x,int*y)B)funb(intx,inty){int*p;{intt;p=x;*x=*y;*y=*p;t=x;x=y;y=t;}}C)func(int*x,int*y)D)func(int*x,int*y){*x=*y;*y=*x;{*x=*x+*y;*y=*x-*y;*x=*x-*y;140n}}【1.78】有定义如下:structsk{inta;floatb;}data,*p;如果p=&data;则对于结构变量data的成员a的正确引用是____。A)(*).data.aB)(*p).aC)p->data.aD)p.data.a【1.79】已知:structst{intn;structst*next;};staticstructsta[3]={1,&a[1],3,&a[2],5,&a[0]},*p;如果下述语句的显示是2,则对p的赋值是____。printf("%d",++(p->next->n));A)p=&a[0];B)p=&a[1];C)p=&a[2];D)p=&a[3];【1.80】已知:structperson{charname[10];intage;}class[10]={"LiMing",29,"ZhangHong",21,"WangFang",22};下述表达式中,值为72的一个是____。A)class[0]->age+class[1]->age+class[2]->ageB)class[1].name[5]C)person[1].name[5]D)clase->name[5]【1.81】已知:struct{inti;charc;floata;}test;则sizeof(test)的值是。A)4B)5C)6D)7【1.82】已知:union{inti;charc;floata;140n}test;则sizeof(test)的值是。A)4B)5C)6D)7【1.83】已知:unionu_type{inti;charch;floata;}temp;现在执行"temp.i=266;printf("%d",temp.ch)"的结果是。A)266B)256C)10D)1【1.84】若有以下程序段:structdent{intn;int*m;};inta=1,b=2,c=3;structdents[3]={{101,&a},{102,&b},{103,&c}};structdent*p=s;则以下表达式中值为2的是。A)(p++)->mB)*(p++)->mC)(*p).mD)*(++p)->m【1.85】若有以下说明语句,则对结构变量pup中sex域的正确引用是。structpupil{charname[20];intsex;}pup,*p;p=&pup;A)p.pup.sexB)p->pup.sexC)(*p).pup.sexD)(*p).sex【1.86】以下对结构变量stul中成员age的非法引用是。structstudent{intage;intnum;}stu1,*p;p=&stu1;A)stu1.ageB)student.ageC)p->ageD)(*p).age【1.87】若有以下定义和语句:uniondata{inti;charc;floatf;140n}a;intn;则以下语句正确的是。A)a=5;B)a={2,'a',1.2};C)printf("%dn",a);D)n=a;【1.88】已知:structsk{inta;intage;}date,*p;如果要使指针p指向data中的成员a,正确的赋值语句是____。A)p=(structsk*)&data.a;B)p=(structsk*)data.a;C)p=&data.a;D)*p=data.a;【1.89】已知enumweek{sun,mon,tue,wed,thu,fri,sat}day;则正确的赋值语句是____。A)sun=0;C)san=day;D)sun=mon;D)day=sun;【1.90】已知enumcolor{red,yellow=2,blue,white,black}ren;执行下述语句的输出结果是____。printf("%d",ren=white);A)0B)1C)3D)4【1.91】已知enumname{zhao=1,qian,sun,li}man;执行下述程序段后的输出是____。man=0;switch(man){case0:printf("Peoplen");case1:printf("Mann");case2:printf("Womann");default:printf("Errorn");}A)PeopleB)ManC)WomanD)Error【1.92】下述关于枚举类型名的定义中,正确的是____。A)enema={one,two,three};B)enema{one=9,two=-1,three};C)enema={"one","two","three"};D)enema{"one","two","three"};【1.93】C语言中标准输入文件stdin是指。   A)键盘B)显示器C)鼠标D)硬盘【1.94】要打开一个已存在的非空文件"file"用于修改,选择正确的语句____。A)fp=fopen("file","r");B)fp=fopen("file","a+");C)fp=fopen("file","w");D)fp=fopen('file","r+");140n【1.95】当顺利执行了文件关闭操作时,fclose函数的返回值是。A)-1B)TRUEC)0D)1【1.96】fscanf函数的正确调用形式是。A)fscanf(文件指针,格式字符串,输出列表);B)fscanf(格式字符串,输出列表,文件指针);C)fscanf(格式字符串,文件指针,输出列表);D)fscanf(文件指针,格式字符串,输入列表);【1.97】使用fgetc函数,则打开文件的方式必须是。A)只写B)追加C)读或读/写D)参考答案B和C都正确【1.98】已知宏定义#defineN3#defineY(n)((N+1)*n)执行语句z=2*(N+Y(5+1));后,变量z的值是____。A)42B)48C)52D)出错【1.99】已知宏定义#defineSQ(x)x*x,执行语句printf("%d",10/SQ(3));后的输出结果是____。A)1B)3C)9D)10【1.100】已知宏定义如下:#definePRprintf#defineNL"n"#defineD"%d"#defineD1DNL若程序中的语句是PR(D1,a);经预处理后展开为____。A)printf(%dn,a);B)printf("%dn",a);C)printf("%d""n",a);D)原语句错误【单项选择题参考答案】【1.1】答案:A注释:int是C语言的关键字【1.2】答案:B【1.3】答案:A【1.4】答案:B注释:include是预处理命令;scanf是函数名;type不是C语言的关键字。140n【1.5】答案:D【1.6】答案:D【1.7】答案:A【1.8】答案:A注释:int型表示整数的范围是-32768~32767。【1.9】答案:D注释:整型常量-1在计算机中表示为补码1111111111111111,用十六进制显示这个数时,最左边的1不会被解释为符号位,而是与右边其它位共同转换为十六进制数。【1.10】答案:B注释:长整型数32768在计算机内的表示是1000000000000000,以一般整型进行输出时,此数恰是-32768的补码。【1.11】答案:C注释:长整型数65539在计算机内的表示是00010000000000000011,以一般整型进行输出时,仅将右侧16位二进制数转换为十进制数。【1.12】答案:A注释:C语言中,int型的负数是采用补码表示的。【1.13】答案:D【1.14】答案:C注释:变量c是字符型,可用字符常量为它赋值。字符常量必须用单引号括起来,所以B是错误的;在单引号或双引号内的反斜线''用于表示转义字符,A选项在无引号时使用反斜线是错误的;C选项单引号内出现反斜线表示它与后面的数字组成一个转义字符;单引号只允许括起一个字符,D选项在单引号内出现4个字符,是错误的。【1.15】答案:C【1.16】答案:D注释:空字符和空格符是不同的两个字符,空格符的ASCII码值是32,空字符的ASCII值是0。【1.17】答案:A【1.18】答案:B【1.19】答案:A【1.20】答案:C【1.21】答案:B注释:单纯从C语言语法来说,选项B、C都是正确的,但是选项C中第一个运算的两个对象都是整型常数,其结果也是整型数0,最后的运算结果也就是0了。【1.22】答案:C【1.23】答案:A注释:将条件表达式增加一个括号,此式变为anext是a[0]的地址,引用其成员n再做前增1运算,结果就是2。【1.80】答案:B【1.81】答案:D【1.82】答案:A【1.83】答案:C注释:联合变量temp的成员是占用同一存储单元,它的长度是4个字节。266的二进制表示是100001010,存放在存储单元的低端两个字节,如下图:高字节00000001低字节00001010引用temp.ch进行输出,只取最低的第一个字节。【1.84】答案:D注释:由于结构指针指向了结构数组的0号元素,所以表达式(p++)->m的含义是先取出m(变量a的地址),然后指针p加1。表达式*(p++)->m的含义是先取出m的内容(变量a的值),然后指针p再加1。表达式(*p).m的含义是取出m(变量a的地址)。表达式*(++p)->m的含义是先将指针p加1,然后再取m的内容(变量b的值)。【1.85】答案:D【1.86】答案:B【1.87】答案:C【1.88】答案:A【1.89】答案:D【1.90】答案:D【1.91】答案:A【1.92】答案:B【1.93】答案:A【1.94】答案:D注释:函数fopen中的第二参数是打开模式,"r"模式是只读方式,不能写文件;"a+"模式是读/追加方式,允许从文件中读出数据,但所有写入的数据均自动加在文件的末尾;"w"模式是写方式,允许按照用户的要求将数据写入文件的指定位置,但打开文件后,首先要将文件的内容清空。"r+"模式是读/写方式,不但允许读文件,而且允许按照用户的要求将数据写入文件的指定位置,且在打开文件后,不会将文件的内容清空。本题的要求是"修改"文件的内容,因此只能选择答案D。【1.95】答案:C【1.96】答案:D【1.97】答案:C140n【1.98】答案:B注释:语句z=2*(N+Y(5+1)引用了两个宏定义。C语言是区分字母大小的,第二个宏定义中的N直接用3替换,用5+1替换n,则有z=2*(3+(3+1)*5+1);结果是48。注意对于带参数的宏亦是直接的文本替换,此例中n用5+1去替换,结果是(N+1)*5+1,而不是(N+1)*(5+1)。【1.99】答案:C注释:宏替换后的结果是printf("%d",10/3*3)。【1.100】答案:C二、阅读程序题(答案P35)导读:学会阅读程序对于初学者来说很重要,一方面可以巩固所学的语法知识,另一方面通过阅读别人写好的程序来打开自己的思路,就所谓见多识广。读者通过阅读理解程序,从给出的四个备选参考答案中,选择程序的正确输出。如果选择有误,就要认真分析原因,是概念方面的错误还是对程序逻辑理解不对,从而加深对语法规则的理解,提高程序设计能力。程序设计语言是开发程序的一个工具,学习语言的目的是为了编写程序来解决实际问题,所以特别提倡通过实际上机来检验备选答案,增强动手能力。习题基本上是按照教材的章节来安排的,读者可以根据学习的进度选择部分习题。【2.1】以下程序的输出结果是。main(){floata;a=1/100000000;printf("%g",a);}A)0.00000e+00B)0.0C)1.00000e-07D)0【2.2】下面程序的输出结果是____。#include  main(){intx=10;{intx=20;printf("%d,",x);}printf("%dn",x);}A)10,20B)20,10C)10,10D)20,20【2.3】以下程序的输出结果是____。main(){unsignedintn;inti=-521;n=i;140nprintf("n=%un",n);}A)n=-521B)n=521C)n=65015D)n=102170103【2.4】以下程序的输出结果是。main(){intx=10,y=10;printf("%d%dn",x――,――y);}A)1010B)99C)910D)109【2.5】以下程序的输出结果是____。main(){intn=1;printf("%d%d%dn",n,n++,n--);}A)111B)101C)110D)121【2.6】以下程序的输出结果是____。main(){intx=0x02ff,y=0x0ff00;printf("%dn",(x&y)>>4|0x005f);}A)127B)255C)128D)1【2.7】以下程序的输出结果是____。main(){inta=1;charc='a';floatf=2.0;printf("%dn",(!(a==0),f!=0&&c=='A'));}A)0B)1【2.8】下面程序的输出结果是____。main(){inta=1,i=a+1;do{a++;}while(!~i++>3);printf("%dn",a);}140nA)1B)2C)3D)4【2.9】下面程序的输出结果是____。main(){inta=111;a=a^00;printf("%d,%on",a,a);}A)111,157B)0,0C)20,24D)7,7【2.10】下面程序的输出结果是____。main(){chars[12]="abook";printf("%.4s",s);}A)abook!B)abook!<四个空格》C)aboD)格式描述错误,输出不确定【2.11】下面程序的输出结果是____。main(){inta,b;scanf("%2d%3d",&a,&b);printf("a=%db=%dn",a,b);}A)a=12b=34B)a=123b=45C)a=12b=345D)语句右错误【2.12】以下程序段的输出结果是。inta=10,b=50,c=30;if(a>b)a=b;b=c;c=a;printf("a=%db=%dc=%dn",a,b,c);A)a=10b=50c=10B)a=10b=30c=10C)a=50b=30c=10D)a=50b=30c=50【2.13】以下程序的输出结果是。main(){inta=0,b=1,c=0,d=20;if(a)d=d-10;elseif(!b)if(!c)d=15;140nelsed=25;printf("d=%dn",d);}A)d=10B)d=15C)d=20D)d=25【2.14】下面程序的输出结果为。main(){inta=1,b=0;switch(a){case1:switch(b){case0:printf("**0**");break;case1:printf("**1**");break;}case2:printf("**2**");break;}}A)**0**B)**0****2**C)**0****1****2**D)有语法错误【2.15】以下程序的输出结果是。main(){char*s="12134211";intv1=0,v2=0,v3=0,v4=0,k;for(k=0;s[k];k++)switch(s[k]){case'1':v1++;case'3':v3++;case'2':v2++;default:v4++;}printf("v1=%d,v2=%d,v3=%d,v4=%dn",v1,v2,v3,v4);}A)v1=4,v2=2,v3=1,v4=1B)v1=4,v2=9,v3=3,v4=1C)v1=5,v2=8,v3=6,v4=1D)v1=4,v2=7,v3=5,v4=8【2.16】下面程序的输出是。main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;140n}printf("a=%d,b=%dn",a,b);}A)a=2,b=1B)a=1,b=1C)a=1,b=0D)a=2,b=2【2.17】下面程序的输出是____。main(){intnum=0;while(num<=2){num++;printf("%dn",num);}}A)1B)1C)1D)1222334【2.18】下面程序的输出结果是____。main(){inta=1,b=0;do{switch(a){case1:b=1;break;case2:b=2;break;default:b=0;}b=a+b;}while(!b);printf("a=%d,b=%d",a,b);}A)1,2B)2,1C)1,1D)2,2【2.19】从键盘上输入"446755"时,下面程序的输出是____。#includemain(){intc;while((c=getchar())!='n')switch(c-'2'){case0:case1:putchar(c+4);case2:putchar(c+4);break;140ncase3:putchar(c+3);default:putchar(c+2);break;}printf("n");}A)888988B)668966C)88898787D)66898787【2.20】下面程序的输出结果是____。main(){intk=0;charc='A';do{switch(c++){case'A':k++;break;case'B':k--;case'C':k+=2;break;case'D':k=k%2;contiue;case'E':k=k+10;break;default:k=k/3;}k++;}while(c<'C');printf("k=%dn",k);}A)k=1B)k=2C)k=3D)k=4【2.21】下面程序的输出结果是____。main(){intx,i;for(i=1;i<=100;i++){x=i;if(++x%2==0)if(++x%3==0)if(++x%7==0)printf("%d",x);}}A)3981B)4284C)2668D)2870【2.22】下面程序的输出结果是____。#includemain(){inti,k,a[10],p[3];140nk=5;for(i=0;i<10;i++)a[i]=i;for(i=0;i<3;i++)p[i]=a[i*(i+1)];for(i=0;i<3;i++)k+=p[i]*2;printf("%dn",k);}A)20B)21C)22D)23【2.23】假定从键盘上输入"3.6,2.4<回车>",下面程序的输出是____。#includemain(){floatx,y,z;scanf("%f,%f",&x,&y);z=x/y;while(1){if(fabs(z)>1.0){x=y;y=z;z=x/y;}elsebreak;}printf("%fn",y);}A)1.500000B)1.600000C)2.000000D)2.400000【2.24】下面程序的输出结果是____。main(){inti,j,x=0;for(i=0;i<2;i++){x++;for(j=0;j<-3;j++){if(j%2)continue;x++;}x++;}printf("x=%dn",x);}140nA)x=4B)x=8C)x=6D)x=12【2.25】下面程序的输出结果是____。main(){inti,j,k=10;for(i=0;i<2;i++){k++;{intk=0;for(j=0;j<=3;j++){if(j%2)continue;k++;}}k++;}printf("k=%dn",k);}A)k=4B)k=8C)k=14D)k=18【2.26】下面程序的输出结果是____。#includemain(){intn[3][3],i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)n[i][j]=i+j;for(i=0;i<2;i++)for(j=0;j<2;j++)n[i+1][j+1]+=n[i][j];printf("%dn",n[i][j]);}A)14B)0C)6D)不确定【2.27】下面程序的输出结果是____。#includemain(){inta[4][5]={1,2,4,-4,5,-9,3,6,-3,2,7,8,4};inti,j,n;n=9;i=n/5;j=n-i*5-1;printf("a[%d][%d]=%dn",i,j,a[i][j]);140n}A)6B)-3C)2D)不确定【2.28】下面程序的输出结果是____。intm[3][3]={{1},{2},{3}};intn[3][3]={1,2,3};main(){printf("%dn",m[1][0]+n[0][0]);/*①*/printf("%dn",m[0][1]+n[1][0]);/*②*/}①A)0B)1C)2D)3②A)0B)1C)2D)3【2.29】下面程序的输出结果是____。#includemain(){chars1[50]={"somestring*"},s2[]={"test"};printf("%sn",strcat(s1,s2));}A)somestring*B)testC)somestritestD)somestring*test【2.30】下面程序的输出结果是____。#includef(char*s){char*p=s;while(*p!='')p++;return(p-s);}main(){printf("%dn",f("ABCDEF"));}A)3B)6C)8D)0【2.31】下面程序的输出结果是____。#include#includemain(){charstr[100]="Howdoyoudo";strcpy(str+strlen(str)/2,"esshe");140nprintf("%sn",str);}A)HowdoyoudoB)essheC)HowareyouD)Howdoesshe【2.32】下面程序的输出结果是____。#includefunc(inta,intb){intc;c=a+b;return(c);}main(){intx=6,y=7,z=8,r;r=func((x--,y++,x+y),z--);printf("%dn",r);}A)11B)20C)21D)31【2.33】下面程序的输出结果是____。#includevoidfun(int*s){staticintj=0;do{s[j]+=s[j+1];}while(++j<2);}main(){intk,a[10]={1,2,3,4,5};for(k=1;k<3;k++)fun(a);for(k=0;k<5;k++)printf("%d",a[k]);}A)35756B)23445C)35745D)12345【2.34】下面程序的输出结果是____。#includeintk=1;main(){inti=4;fun(i);printf("n%d,%d",i,k);/*①*/140n}fun(intm){m+=k;k+=m;{chark='B';printf("n%d",k-'A');/*②*/}printf("n%d,%d",m,k);/*③*/}①A)4,1B)5,6C)4,6D)A,B,C参考答案都不对②A)1B)-59C)-64D)A,B,C参考答案都不对③A)5,66B)1,66C)5,6D)A,B,C参考答案都不对【2.35】下面程序的输出结果是____。#includefun(intn,int*s){intf1,f2;if(n==1||n==2)*s=1;else{fun(n-1,&f1);fun(n-2,&f2);*s=f1+f2;}}main(){intx;fun(6,&x);printf("%dn",x);}A)6B)7C)8D)9【2.36】下面程序的输出结果是____。intw=3;main(){intw=10;printf("%dn",fun(5)*w);}fun(intk){if(k==0)return(w);return(fun(k-1)*k);}A)360B)3600C)1080D)1200140n【2.37】下面程序的输出结果是____。#includefuna(inta){intb=0;staticintc=3;a=c++,b++;return(a);}main(){inta=2,i,k;for(i=0;i<2;i++)k=funa(a++);printf("%dn",k);}A)3B)0C)5D)4【2.38】下面程序的输出结果是____。#includevoidnum(){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,%dn",x,y);}A)12,2B)5,25C)1,12D)输出不确定【2.39】下面程序的输出结果是____。main(){inta=2,i;for(i=0;i<3;i++)printf("%4d",f(a));}f(inta){intb=0;140nstaticintc=3;b++;c++;return(a+b+c);}A)777B)71013C)7911D)789【2.40】下面程序的输出结果是____。#includetry(){staticintx=3;x++;return(x);}main(){inti,x;for(i=0;i<=2;i++)x=try();printf("%dn",x);}A)3B)4C)5D)6【2.41】下面程序的输出结果是____。#includemain(){intx=1;   voidf1(),f2();  f1();f2(x);printf("%dn",x);}voidf1(void){intx=3;printf("%d",x);}voidf2(x)intx;{printf("%d",++x);}A)111B)222C)333D)321【2.42】下面程序的输出结果是____。#include#defineSUB(X,Y)(X)*Y140nmain(){inta=3,b=4;printf("%dn",SUB(a++,b++));}A)12B)15C)16D)20【2.43】下面程序的输出结果是____。main(){inta[]={1,2,3,4,5,6};int*p;p=a;printf("%d",*p);printf("%d",*(++p));printf("%d",*++p);printf("%d",*(p--));p+=3;printf("%d%d",*p,*(a+3));}A)123354B)123456C)122345D)123445【2.44】下面程序的输出结果是____。main(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int*p=a;p+=6;printf("%d",*p);/*①*/printf("%d",*(*(a+6)));/*②*/printf("%d",*(a[1]+=2));/*③*/printf("%d",*(&a[0][0]+6));/*④*/}A)7777B)②句语法错误C)③句语法错误D)④句语法错误【2.45】下面程序的输出结果是____。#defineFMT"%Xn"#includemain(){staticinta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};printf(FMT,a[2][2]);/*①*/printf(FMT,*(*(a+1)+1));/*②*/}①A)9B)11C)AD)B②A)6B)7C)8D)前面三个参考答案均是错误的140n【2.46】下面程序的输出结果是____。#includemain(){inta[]={1,2,3,4,5};intx,y,*p;p=&a[0];x=*(p+2);y=*(p+4);printf("%d,%d,%dn",*p,x,y);}A)1,3,5B)1,2,3C)1,2,4D)1,4,5【2.47】下面程序的输出结果是____。voidive(x,n)intx[],n;{intt,*p;p=x+n-1;while(xchar*p="abcdefghijklmnopq";main(){inti=0;while(*p++!='e');printf("%cn",*p);}A)cB)dC)eD)f【2.50】下面程序的输出结果是____。#includef(intx,inty){return(y-x);}main(){inta=5,b=6,c;intf(),(*g)()=f;printf("%dn",(*g)(a,b));}A)1B)2C)3D)前面三个参考答案均是错误的【2.51】下面程序的输出结果是____。#includemain(){inta=1,*p,**pp;pp=&p;p=&a;a++;printf("%d,%d,%dn",a,*p,**pp);}140nA)2,1,1B)2,1,2C)2,2,2D)程序有错误【2.52】下面程序的输出结果是____。main(){char*alpha[7]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX","YZ"};char**p;inti;p=alpha;for(i=0;i<4;i++)printf("%c",*(p[i]));printf("n");}A)AEIMB)BFJNC)ABCDD)DHLP【2.53】下面程序的输出结果是____。#includechar*pp[2][3]={"abc","defgh","ijkl","mnopqr","stuvw","xyz"};main(){printf("%cn",***(pp+1));/*①*/printf("%cn",**pp[0]);/*②*/printf("%cn",(*(*(pp+1)+1))[4]);/*③*/printf("%cn",*(pp[1][2]+2));/*④*/printf("%sn",**(pp+1));/*⑤*/}①A)aB)dC)iD)m②A)aB)dC)iD)m③A)hB)lC)qD)w④A)kB)oC)uD)z⑤A)ijklB)mnopqrC)stuvwD)xyz【2.54】下面程序的输出结果是____。#include"stdio.h"structstr1{charc[5];char*s;};main(){structstr1s1[2]={{"ABCD""EFGH"},{"IJK","LMN"}};structstr2{structstr1sr;intd;}s2={"OPQ","RST",32767};140nstructstr1*p[2];p[0]=&s1[0];p[1]=&s1[1];printf("%s",++p[1]->s);/*①*/printf("%c",s2.sr.c[2]);/*②*/}①A)LMNB)MNC)ND)IJK②A)OB)PC)QD)R【2.55】以下程序的输出结果是____。structst{intx,*y;}*p;ints[]={10,20,30,40};structsta[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};main(){p=a;printf("%dn",++(*(++p)->y));}A)10B)11C)20D)21【2.56】以下程序的输出结果是____。#includemain(){unionEXAMPLE{struct{intx,y;}in;inta,b;}e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf("%d,%dn",e.in.x,e.in.y);}A)2,3B)4,4C)4,8D)8,8【2.57】下面程序的输出结果是____。#includemain(){union{inti[2];140nlongk;charc[4];}r,*s=&r;s->i[0]=0x39;s->i[1]=0x38;printf("%cn",s->c[0]);}A)39B)9C)38D)8【2.58】下面程序的输出是。main(){printf("%dn",EOF);}A)-1B)0C)1D)程序是错误的                     【阅读程序题参考答案】【2.1】参考答案:D注释:程序中除法运算的两个操作数均是整型,运算结果也是整型。【2.2】参考答案:B注释:C语言允许在程序块(分程序)中说明变量。【2.3】参考答案:C注释:变量i中的负号传送给变量n后,因n是无符号数,已不作为负号处理。【2.4】参考答案:D注释:对变量x的――操作是后缀形式,变量x的减1操作要在执行完printf函数之后才进行,所以变量x的值在输出的时候仍然保持原值10。【2.5】参考答案:B注释:C语言在执行printf()时,对函数中的表达式表列的处理顺序是从后向前,即先处理n--,再处理n++,最后处理n,而且每一个表达式作为一个处理单元,也就是说在不同的表达式中自增自减运算是单独考虑的。【2.6】参考答案:A注释:变量x和变量y做按位与,结果为0x0200,右移4位为0x0020,再与0x005f做按位或,最后结果为0x007f。【2.7】参考答案:A注释:逗号表达式的结果是用逗号分开的最后一个表达式的值,此题由于c=='A'的值是0,所以逗号表达式的值为0。【2.8】参考答案:B【2.9】参考答案:A【2.10】参考答案:C注释:在输出格式描述"%m.ns"中,m是输出总长度,n是实际字符的个数,这里m没有给出,则输出总长度就是实际输出字符的个数。【2.11】参考答案:C【2.12】参考答案:B【2.13】参考答案:C【2.14】参考答案:B140n【2.15】参考答案:D【2.16】参考答案:A【2.17】参考答案:C【2.18】参考答案:A【2.19】参考答案:C注释:在switch语句中,case本身仅起到语句标号的作用,不会改变语句的流程,执行break语句才能退出当前的switch语句。【2.20】参考答案:D注释:siwtch语句的表达式中,变量c是后缀的增一运算,第一次执行do-while循环时,执行case'A'后面的语句。                                          【2.21】参考答案:D【2.22】参考答案:B【2.23】参考答案:B注释:fabs()是浮点数绝对值函数。【2.24】参考答案:A【2.25】参考答案:C注释:C语言允许在程序块(分程序)内说明变量,如果在程序块内说明的变量和程序块外的变量同名,在块外说明的变量在块内是不可见的。可将此题和【2.11】进行比较,加深理解。【2.26】参考答案:C【2.27】参考答案:B【2.28】参考答案:①D②A【2.29】参考答案:D【2.30】参考答案:B注释:输出结果为字符串长度。【2.31】参考答案:D注释:字符串拷贝函数strcpy()要求的两个参数都是字符串首地址。本题中第二个参数是字符串常量,接受这个字符串的第一个参量不是直接给出字符数组名,而是进行了地址运算后的结果。由于str字符串的长度是13,除2取整后是6,第一个参数给出的地址是字符数组str的首地址加6,也就是原来字符串中第二个空格的位置,把"esshe"从该处放入,字符串str变为"Howdoesshe"。【2.32】参考答案:C注释:main函数调用func函数时,第一个实参使用的是逗号表达式的值,也就是x+y的结果。由于对变量x、y、z进行的是后缀运算,所以函数func的参数值是13和8。【2.33】参考答案:C【2.34】参考答案:①C②A③C【2.35】参考答案:C【2.36】参考答案:B注释:函数fun进行了递归调用,实际进行的运算是5×4×3×2×1×3×10。主函数内说明的局部变量w屏蔽了外部变量w,所以在主函数中外部变量w是不可见的,在调用printf函数时表达式"fun(5)*w"中w的值是10。【2.37】参考答案:D注释:main函数三次调用了函数funa,在funa函数中的静态变量c仅在第一次调用时进行了初始化,再次调用时不再对静态变量赋初值。【2.38】参考答案:B140n注释:main函数和num函数中都说明了变量a和b,由于它们是内部变量,所以它们分别在说明它们的函数内有效。外部变量x和y在函数num之后被说明,而在num函数中又要引用它们,所以在num函数中用关键字"extern"说明变量x和y是一个外部变量,也就是通知计算机这两个变量在fun函数以外被说明,此处不是定义两个int型变量。【2.39】参考答案:D注释:函数f中的变量c是静态变量,仅在第一次调用函数f时它被初始化为3,第二次调用函数f时c的值是4,第三次调用函数f时c的值是5。【2.40】参考答案:D               【2.41】参考答案:D注释:程序中有三个"x"分别在三个不同的函数中,这三个"x"都是自动变量,所以三个"x"分别局部于三不同的函数,在三个函数中对"x"的操作互不影响。【2.42】参考答案:A【2.43】参考答案:A注释:*(++p)和*++p都是指针变量值前加1,第一次指向a[1],第二次指向a[2];a+3是a[3]的地址。【2.44】参考答案:C注释:②句没有语法错误,但是a+6指向数组之外,因为a是a[0]的地址,a+1是a[1]的地址,a+2是a[2]的地址,显然数组a没有a[6]分量。③句错误,因为a[1]是地址常量,它是a[1][0]的地址,对于地址常量是不可以进行赋值运算的。【2.45】参考答案:①D②A注释:如果FMT定义为"%xn",则输出的16进制数据用小写字母表示。【2.46】参考答案:A注释:语句"p=&a[0]"表示将数组a中元素a[0]的地址赋给指针变量p,则p就是指向数组首元素a[0]的指针变量,"&a[0]"是取数组首元素的地址。对于指向数组首址的指针,p+i(或a+i)是数组元素a[i]的地址,*(p+i)(或*(a+i))就是a[i]的值。【2.47】参考答案:B【2.48】参考答案:D【2.49】参考答案:D【2.50】参考答案:A注释:变量g是指向函数的指针,(*g)(a,b)是调用指针g所指向的函数。【2.51】参考答案:C注释:p是指针,pp是指向指针的指针。【2.52】参考答案:A注释:对于指向数组的指针变量可以做下标运算,p[i]和alpha[i]都是指向字符串的首地址,*p[i]取出字符串的第一个字符。【2.53】参考答案:①D②A③D④D⑤B注释:pp是一个二维指针数组,pp+1指向数组的第二维,*(pp+1)是第二维的起始地址,**(pp+1)是第二维第一个元素的地址,***(pp+1)是第二维第一个元素的内容,所以,①的参考答案应选D。*(pp+1)+1是第二维第二个元素的地址,*(*(pp+1)+1)是第二维第二个元素,(*(*(pp+1)+1))[4]则是第二维第二个元素所指字符串下标为4的元素,即是字符w,故③应当选D。【2.54】参考答案:①B②C【2.55】参考答案:D【2.56】参考答案:C注释:联合体成员的取值是最后一次给成员赋的值。140n【2.57】参考答案:B注释:整型数组i和字符数组c共用存储空间,给i赋值也等于给c赋值,所以s->c[0]=0x39,所以输出9。【2.58】参考答案:A注释:基本概念。EOF是由C语言在头文件stdio.h中定义的,用户可以直接使用。三、程序填空题(答案P65)导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习的效率。【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。#includemain(){inta,b;scanf("%d%d",&a,&b);printf("a=%d,b=%dn",a,b);a=①;b=②;a=③;printf("a=%d,b=%dn",a,b);}【3.2】下面程序的功能是根据近似公式:π2/6≈1/12+1/22+1/32+……+1/n2,求π值。#includedoublepi(longn){doubles=0.0;longi;for(i=1;i<=n;i++)s=s+①;return(②);}140n【3.3】下面的程序的功能是求一维数组中的最小元素。findmin(int*s,intt,int*k){intp;for(p=0,*k=p;pamax)amax=x;if(②)amin=x;scanf("%f",&x);}printf("namax=%fnamin=%fn",amax,amin);}【3.7】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。fun(intx,intb[]){intk=0,r;do{r=x%①;b[k++]=r;x/=②;}while(x);}【3.8】下面程序的功能是输出1到100之间每位数的乘积大于每位数的和的数。例如数字26,数位上数字的乘积12大于数字之和8。main(){intn,k=1,s=0,m;for(n=1;n<=100;n++){k=1;s=0;①;while(②){k*=m%10;s+=m%10;③;}if(k>s)printf("%d",n);}}140n【3.9】下面程序的功能是统计用0至9之间的不同的数字组成的三位数的个数。main(){inti,j,k,count=0;for(i=1;i<=9;i++)for(j=0;j<=9;j++)if(①)continue;elsefor(k=0;k<=9;k++)if(②)count++;printf("%d",count);}【3.10】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。main(){inti,j;for(i=0;①;i++){j=i*10+6;if(②)countinue;printf("%d",j);}}【3.11】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。hcf(intm,intn){intr;if(mmain(){①;inti,j;printf("Input10numberspleasen");for(i=0;②;i++)scanf("%f",&a[i]);printf("n");for(i=2;③;i++)for(j=0;④;j++)if(⑤){x=a[j];⑥;a[j+1]=x;}printf("Thesorted10numbers;n");for(i=0;⑦;i++){if(⑧)printf("n");printf("%ft",a[i]);}printf("n");}【3.13】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。#include"stdio.h"main(){inti,a[20],s,count;s=count=0;for(i=0;i<20;i++)scanf("%d",①);for(i=0;i<20;i++){if(a[i]<0)②;s+=a[i];count++;}printf("s=%dtcount=%dn",s,count);}【3.14】下面程序的功能是删除字符串s中的空格。#includemain()140n{char*s="Beijingligongdaxue";inti,j;for(i=j=0;s[i]!='';i++)if(s[i]!='')①;else②;s[j]='';printf("%s",s);}【3.15】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。#includemain(){chars[80];inti,j;gets(s);for(i=j=0;s[i]!='';i++)if(s[i]!='c')①;s[j]='';puts(s);}【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。#includecharx[]="programming";chary[]="Fortran";main(){inti=0;while(x[i]!=''&&y[i]!='')if(x[i]==y[i])printf("%c",①);elsei++;}【3.17】下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中,字符串a已排好序。#includemain(){chara[20]="cehiknqtw";chars[]="fbla";inti,k,j;for(k=0;s[k]!='';k++){j=0;140nwhile(s[k]>=a[j]&&a[j]!='')j++;for(①)②;a[j]=s[k];}puts(a);}【3.18】下面程序的功能是对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为"abcdefg"和"abceef",则输出为-1。#includemain(){charstr1[100],str2[100],c;inti,s;printf("Enterstring1:");gets(str1);printf("Enterstring2:");gets(str2);i=0;while((str1[i]==str2[i]&&str1[i]!=①))i++;s=②;printf("%dn",s);}【3.19】下面的函数expand在将字符串s复制到字符串t时,将其中的换行符和制表符转换为可见的转义字符表示,即用'n'表示换行符,用't'表示制表符。expand(chars[],chart[]){inti,j;for(i=j=0;s[i]!='';i++)switch(s[i]){case'n':t[①]=②;t[j++]='n';break;case't':t[③]=④;t[j++]='t';break;default:t[⑤]=s[i];break;}t[j]=⑥;}140n【3.20】下面的函数index(chars[],chart[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则送回-1。index(chars[],chart[]){inti,j,k;for(i=0;s[i]!='';i++){for(j=i,k=0;①&&s[j]==t[k];j++,k++);if(②)return(i);}return(-1);}n【3.21】下面程序的功能是计算S=k!。k=0longfun(intn){inti;longs;for(i=1;i①;i++)s*=i;return(②);}main(){intk,n;longs;scanf("%d",&n);s=③;for(k=0;k<=n;k++)s+=④;printf("%ldn",s);}【3.22】下面程序的功能是显示具有n个元素的数组s中的最大元素。#defineN20main(){inti,a[N];for(i=0;is[k])②;return(k);}【3.23】下面程序的功能是由键盘输入n,求满足下述条件的x、y:nx和ny的末3位数字相同,且x≠y,x、y、n均为自然数,并使x+y为最小。#includepow3(intn,intx){inti,last;for(last=1,i=1;i<=x;i++)last=①;return(last);}main(){intx,n,min,flag=1;scanf("%d",&n);for(min=2;flag;min++)for(x=1;xdoublemysqrt(doublea,doublex0){doublex1,y;x1=①;if(fabs(x1-x0)>0.00001)y=mysqrt(②);elsey=x1;return(y);}main(){doublex;printf("Enterx:");scanf("%lf",&x);printf("Thesqrtof%lf=%lfn",x,mysqrt(x,1.0));}140n【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。#includeage(intn){intc;if(n==1)c=10;elsec=①;return(c);}main(){intn=5;printf("age:%dn",②);}【3.26】下面的函数sum(intn)完成计算1~n的累加和。  sum(intn){if(n<=0)printf("dataerrorn");if(n==1)①;else②;}【3.27】下面的函数是一个求阶乘的递归调用函数。facto(intn){if(n==1)①;elsereturn(②);}【3.28】组合问题,由组合的基本性质可知:(1)C(m,n)=C(n-m,n)(2)C(m,n+1)=C(m,n)+C(m-1,n)公式(2)是一个递归公式,一直到满足C(1,n)=n为止。当n<2*m时,可先用公式(1)进行简化,填写程序中的空白,使程序可以正确运行。#include"stdio.h"main(){intm,n;printf("Inputm,n=");scanf("%d%d",&m,&n);printf("Thecombinationnumbeersis%dn",combin(m,n));}combin(intm,intn){intcom;140nif(n<2*m)m=n-m;if(m==0)com=1;elseif(m==1)①;else②;return(com);}【3.29】下列函数是求一个字符串str的长度。intstrlen(char*str){if(①)return(0);elsereturn(②);}【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。#include"stdio.h"main(){intn;printf("Inputn:");scanf("%d",①);r(n);printf("n");}r(intm){printf("%d",②);m=③;if(④)⑤;}                                           【3.31】输入n值,输出高度为n的等边三角形。例如当n=4时的图形如下:****************#includevoidprt(charc,intn){if(n>0){printf("%c",c);①;}}main()140n{inti,n;scanf("%d",&n);for(i=1;i<=n;i++){②;③;printf("n");}}【3.32】下面的函数实现N层嵌套平方根的计算。doubley(doublex,intn){if(n==0)return(0);elsereturn(sqrt(x+(①)));}【3.33】函数revstr(s)将字符串s置逆,如输入的实参s为字符串"abcde",则返回时s为字符串"edcba"。递归程序如下:revstr(char*s){char*p=s,c;while(*p)p++;①;if(s2)invent(①,n-2);else②;}【3.35】从键盘上输入10个整数,程序按降序完成从大到小的排序。#includeintarray[10];sort(int*p,int*q){int*max,*s;if(①)return;max=p;for(s=p+1;s<=q;s++)if(*s>*max)②;swap(③);sort(④);}swap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inti;printf("Enterdata:n");for(i=0;i<10;i++)scanf("%d",&array[i]);sort(⑤);printf("Output:");for(i=0;i<10;i++)printf("%d",array[i]);}【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483存放成"384"。#includevoidconvert(char*a,intn){inti;if((i=n/10)!=0)convert(①,i);*a=②;}140ncharstr[10]="";main(){intnumber;scanf("%d",&number);convert(str,number);puts(str);}【3.37】下面程序的功能是实现数组元素中值的逆转。#includemain(){inti,n=10,a[10]={1,2,3,4,5,6,7,8,9,10};invert(a,n-1);for(i=0;i<10;i++)printf("%4d",a[i]);printf("n");}invert(int*s,intnum){int*t,k;t=s+num;while(①){k=*s;*s=*t;*t=k;②;③;}}【3.38】下面程序通过指向整型的指针将数组a[3][4]的内容按3行×4列的格式输出,请给printf()填入适当的参数,使之通过指针p将数组元素按要求输出。#includeinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p=a;main(){inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",①);}}【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。140n#includemain(){charstr[81],*sptr;inti;for(i=0;i<80;i++){str[i]=getchar();if(str[i]=='n')break;}str[i]=①;sptr=str;while(*sptr)putchar(*sptr②);}【3.40】下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。voidfun(char*w,charx,int*n){inti,p=0;while(x>w[p])①;for(i=*n;i>=p;i--)②;w[p]=x;++*n;}【3.41】下面程序的功能是从键盘上输入两个字符串,对两个字符串分别排序;然后将它们合并,合并后的字符串按ASCII码值从小到大排序,并删去相同的字符。#includestrmerge(a,b,c)/*将已排好序的字符串a、b合并到c*/char*a,*b,*c;{chart,*w;w=c;while(*a!=''①*b!=''){t=②?*a++:*b<*a?*b++:(③);/*将*a、*b的小者存入t*/if(*w④'')*w=t;elseif(t⑤*w)*++w=t;/*将与*w不相同的t存入w*/}while(*a!='')/*以下将a或b中剩下的字符存入w*/if(*a!=*w)*++w=*a++;elsea++;while(*b!='')if(*b!=*w)*++w=*b++;elseb++;*++w=⑥;}140nstrsort(char*s)/*将字符串s中的字符排序*/{inti,j,n;chart,*w;⑦;for(n=0;*w!='';⑧)w++;for(i=0;is[j]){⑨}}main(){chars1[100],s2[100],s3[200];printf("nPleaseInputFirstString:");scanf("%s",s1);printf("nPleaseInputSecondString:");scanf("%s",s2);strsort(s1);strsort(s2);⑩='';strmerge(s1,s2,s3);printf("nResult:%s",s3);}【3.42】已知某数列前两项为2和3,其后继项根据前面最后两项的乘积,按下列规则生成:①若乘积为一位数,则该乘积即为数列的后继项;②若乘积为二位数,则该乘积的十位上的数字和个位上的数字依次作为数列的两个后继项。下面的程序输出该数列的前N项及它们的和,其中,函数sum(n,pa)返回数列的前N项和,并将生成的前N项存入首指针为pa的数组中,程序中规定输入的N值必须大于2,且不超过给定的常数值MAXNUM。  例如:若输入N的值为10,则程序输出如下内容:sum(10)=442361886424#include"stdio.h"#defineMAXNUM100intsum(n,pa)intn,*pa;{intcount,total,temp;*pa=2;①=3;total=5;count=2;while(count++structstuinf{charname[20];/*学生姓名*/intscore;/*学生成绩*/}stu,*p;main(){p=&stu;printf("Entername:");gets(①);printf("Enterscore:");scanf("%d",②);printf("Output:%s,%dn",③,④);}140n【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入0时才结束。#include#include#defineNUM4structstudent{intrank;char*name;floatscore;};①stu[]={3,"liming",89.3,4,"zhanghua",78.2,1,"anli",95.1,2,"wangqi",90.6};main(){charstr[10];inti;do{printf("Enteraname");scanf("%s",str);for(i=0;i=NUM)printf("Notfoundn");}while(strcmp(str,"0")!=0);}【3.45】下面程序的功能是从终端上输入5个人的年龄、性别和姓名,然后输出。#include"stdio.h"structman{charname[20];unsignedage;charsex[7];};main(){structmanperson[5];data_in(person,5);data_out(person,5);}140ndata_in(structman*p,intn){structman*q=①;for(;page,p->sex);②;}}data_out(structman*p,intn){structman*q=__③__;for(;pname,p->age,p->sex);}         【3.46】输入N个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第3个整数为5,第7个整数也为5,则将先输入的整数5排在后输入的整数5的前面。程序如下:#include"stdio.h"#defineN10struct{intno;intnum;}array[N];main(){inti,j,num;for(i=0;i=0&&array[j].num②num;③)array[j+1]=array[j];array[④].num=num;array[⑤].no=i;}for(i=0;imain(){structnode{charinfo;structnode*link;}*top,*p;charc;top=NULL;while((c=getchar())①){p=(structnode*)malloc(sizeof(structnode));p->info=c;p->link=top;top=p;}while(top){②;top=top->link;putchar(p->info);free(p);}}【3.48】下面函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。#defineNULL0structlink{floata;structlink*next;};concatenate(p1,p2)structlist*p1,*p2;{if(p1->next==NULL)p1->next=p2;elseconcatenate(①,p2);}【3.49】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。#includestructnode{chardata;structnode*link;}*head;140nmain(){charch;structnode*p;head=NULL;while((ch=getchar())!='n'){p=(structnode*)malloc(sizeof(structnode));p->data=ch;p->link=①;head=②;}③;while(p!=NULL){printf("%c",p->data);p=p->link;}}【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于0时才停止输入。然后反序输出这些整数。#includestructdata{intx;structdata*link;}*p;input(){intnum;structdata*q;printf("Enterdata:");scanf("%d",&num);if(num<0)①;q=②;q->x=num;q->link=p;p=q;③;}main(){printf("Enterdatauntildata<0:n");p=NULL;input();printf("Output:");while(④){printf("%dn",p->x);140n⑤;}}【3.51】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储存学生的学号和成绩。新产生的结点总是位于链表的尾部。structstudent{longnum;intscore;structstudent*next;};structstudent*creat(){structstudent*head=NULL,*tail;longnum;inta;tail=①malloc(LEN);do{scanf("%ld,%d",&num,&a);if(num!=0){if(head==NULL)head=tail;else②;tail->num=num;tail->score=a;tail->next=(structstudent*)malloc(LEN);}elsetail->next=NULL;}while(num!=0);return(③);}【3.52】下面create函数的功能是建立一个带头结点的单向链表,新产生的结点总是插入在链表的末尾。单向链表的头指针作为函数值返回。#include#defineLENsizeof(structstudent)structstudent{longnum;intscore;structstudent*next;};structstudent*creat(){structstudent*head=NULL,*tail;longnum;inta;tail=(①)malloc(LEN);do140n{scanf("%ld,%d",&num,&a);if(num!=0){if(head==NULL)head=tail;elsetail=tail->next;tail->num=num;tail->score=a;tail->next=(②)malloc(LEN);}elsetail->next=NULL;}while(num!=0);③;}【3.53】下面程序的功能是统计文件中的字符的个数。#includemain(){longnum=0;①*fp;if((fp=fopen("fname.dat","r"))==NULL){printf("Can'topenthefile!");exit(0);}while(②){fgetc(fp);num++;}printf("num=%dn",num);fclose(fp);}【3.54】下面程序的功能是把从键盘输入的文件(用@作为文件结束标志)复制到一个名为second.txt的新文件中。#includeFILE*fp;main(){charch;if((fp=fopen(①))==NULL)exit(0);while((ch=getchar())!='@')fputc(ch,fp);②;}140n【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。#includemain(intargc,char*argv[]){FILE&f1,*f2;if(argc<①){printf("Thecommandlineerror!");exit(0);}f1=fopen(argv[1],"r");f2=fopen(arhv[2],"w");while(②)fputs(fgetc(f1),③);④;⑤;}【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是sm,则执行该程序时输入:"sm+10",可以实现10的累加;输入:"sm-10",可以实现求10的阶乘。#include#includemain(intargc,char*argv[]){intn;voidsum(),mult();void(*funcp)();n=atoi(argv[2]);if(argc!=3||n<=0)dispform();switch(①){case'+':funcp=sum;break;case'-':funcp=mult;break;default:dispform();}②;}voidsum(intm){inti,s=0;for(i=1;i0)n");exit(0);}【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。#includemain(){charstr[100];inti=0;FILE*fp;if((fp=fopen("test.txt",①))==NULL){printf("Can'topenthefile.n");exit(0);}printf("Inputastring:n");gets(str);while(str[i]){if(str[i]>='a'&&str[i]<='z')str[i]=②;fputc(str[i],fp);i++;}fclose(fp);fp=fopen("test.txt",③);fgets(str,strlen(str)+1,fp);printf("%sn",str);fclose(fp);}【3.58】下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为"bi.dat"的新文件中。#includeFILE*fp;main()140n{inti,j;if((fp=fopen(①,"wb"))==NULL)exit(0);for(i=0;i<10;i++){scanf("%d",&j);fwrite(②,sizeof(int),1,③);}fclose(fp);}【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或't'、'n'结束的字符串。#include#includeFILE*cp;charfname[20],buf[100];intnum;structkey{charword[10];intcount;}keyword[]={"if",0,"char",0,"int",0,"else",0,"while",0,"return",0};char*getword(FILE*fp){inti=0;charc;while((c=getc(fp))!=EOF&&(c==''||c=='t'||c=='n'));if(c==EOF)return(NULL);elsebuf[i++]=c;while((c=①&&c!=''&&c!='t'&&c!='n')buf[i++]=c;buf[i]='';return(buf);}lookup(char*p){inti;char*q,*s;for(i=0;imain(){FILE*fp;intflag;charname[30],data[30];if((fp=fopen("try.dat", ① ))==NULL){printf("Openfileerrorn");exit(0);}do{printf("Entername:");gets(name);if(strlen(name)==0)   break;strcat(name,"n"); ② ;flag=1;while(flag&&(fgets(data,30,fp) ③ ))140nif(strcmp(data,name)==0)④;if(flag)fputs(name,fp);elseprintf("tDataentererror!n");}while( ⑤ );fclose(fp);}【程序填空题参考答案】【3.1】答案:①a+b②a-b③a-b【3.2】答案:①1.0/(float)(i*i)②sqrt(6*s)【3.3】答案:①*k=p【3.4】答案:①t=t*i②t=t>0?-1:1【3.5】答案:①d=1②k++③k<=n【3.6】答案:①x>=0②x0③m=m/10【3.9】答案:①i==j②k!=i&&k!=j【3.10】答案:①i<=9②j%3!=0【3.11】答案:①m=n②r!=0③return(n)【3.12】答案:①floata[10],x②i<=9③i<=8④j<=9-i⑤a[j]>a[j+1]⑥a[j]=a[j+1]⑦i<=9⑧i%5==0【3.13】答案:①&a[i]②continue注释:①是基本概念,使用scanf函数输入数组元素的值。当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。【3.14】答案:①s[j++]=s[i]②s[j]=s[i]【3.15】答案:①s[j++]=s[i]【3.16】答案:①x[i++]【3.17】答案:①i=strlen(a);i>=j;i--②a[i+1]=a[i]【3.18】答案:①''②str1[i]-str2[i]【3.19】答案:①j++②'\'③j++④'\'⑤j++⑥''【3.20】答案:①t[k]!=''②t[k]==''【3.21】答案:①<=n②s③0④fun(k)【3.22】答案:①a[fmax(a,N)]②k=p【3.23】答案:①last*n%1000②x!=min-x③flag=0【3.24】答案:①(x0+a/x0)/2②a,x1注释:根据迭代公式,①处应当是计算迭代值x1=(x0+a/x0)/2。按照求平方根的要求,当迭代的精度不能满足"(fabs(x1-x0)>0.00001)"时,则要继续迭代,因此②处应当填写"a,x1"。程序中调用了求绝对值的库函数fabs()。【3.25】答案:①2+age(n-1)②age(5)注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式:140nage(n)=10(n=1)age(n)=2+age(n-1)(n>1)对照程序和递归公式可以看出:n的含义是第n位学生。很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。在①处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。【3.26】答案:①return(1)②return(sum(n-1)+n)注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。  将问题"求1~n的累加和"的公式写成递归定义,可以是如下形式;     sum(n)=1当n=1时sum(n)=sun(n-1)+n当n>1时根据此递归定义,可以很容易完成程序。【3.27】答案:①return(1)②n*facto(n-1)注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式;     n!=1当n=1时n!=n*(n-1)当n>1时根据此递归定义,可以很容易完成程序。【3.28】答案:①com=n②com=combin(n-1,m-1)+combin(n-1,m)注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句"if(n<2*m)m=n-m;"完成了题目中叙述的"用公式(1)进行简化"的工作。【3.29】答案:①*str==''②1+strlen(str+1)注释:求串长算法的关键是确定串结束标记''的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符如果当前字符(*str)==串结束标记''则串长=0否则串长=1+除第一个字符之外的剩余字符串的串长因此,在①的位置上应当填写"*str==''",以判断当前字符(*str)是否是串结束标记''。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写"1+strlen(str+1)"。【3.30】答案:①&n②m%10③m/10④m>0⑤r(m)【3.31】答案:①prt(c,n-1)②prt('',n-i)③prt('*',i)注释:函数prt的功能是输出n个字符c。【3.32】答案:①y(x,n-1)注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。     y(x,n)=x当n=0时y(x,n)=sqrt(x+y(x,n-1))当n>0时【3.33】答案:①p--②*p=''③*p=c④p--⑤*s++注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p所指向的字符串尾的字符('')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行"c=*s",将首字符存入临时变量;然后执行"*s=*p",将尾字符存入串首;执行"revstr(s+1)"是递归处理串的中间部分,这时,在②处应当填入"*p=''",即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写"*p=c"。140n【3.34】答案:①str+1②return①改为n-2【3.35】答案:①p>=q②max=s③p,max④p+1,q⑤&array[0],&array[9]注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句"for(s=p+1;s<=q;s++)"中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填"p>=q"、⑤处应填"&array[0],&array[9]"。由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填"max=s"。当调用函数swap交换两个变量值的时候,要求实参是变量的地址,因此,③处应填"p,max"将最大值存入指针p所指的单元。由于问题的要求是"从大到小"排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填"p+1,q"。【3.36】答案:①a+1②n%10+'0'【3.37】答案:①s=MAXNUM+1⑥num+n【3.43】答案:①stu.name②&stu.score③p->name④p->score注释:这是结构中的最基本概念。【3.44】答案:①structstudent②strcmp(stu[i].name,str)==0③break注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcutstudent。②处为if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写:strcmp(stu[i].name,str)==0。③处应当将控制退出内层的for循环,只能选择break语句。【3.45】答案:①p+n②gets(p->name)③p+n注释:本程序是通过函数完成对于结构数组的输入和输出操作。函数data_in和data_out十分相似,都是通过结构指针p和结构指针q来操作结构数组的元素。由于指针q在两个函数中的作用相同,所以①和③填写的内容也应该是相同的;由for语句中的循环终止条件"pname)。【3.46】答案:①j=i-1②>③j--④j+1⑤j+1注释:程序的基本思想是:对于输入的第i个整数num,从数组array中已有的元素中倒序开始查找。若数组array中的第j个元素的值大于num,则将数组中的元素j向后移动一个位置;否则,就应将num插入到当前位置作为元素j。因此,程序的基本设计思想就是插入排序。140n程序中内层的for循环完成查找插入位置的工作,因此答案①、②和③有密切的关系,要统一考虑。同样,程序中的答案④和⑤也有密切的关系,要统一考虑。【3.47】答案:①!='n'②p=top【3.48】答案:①p1->next【3.49】答案:①head②p③p=head注释:程序在从键盘接受字符的同时就在建立起链表,所建立的链表本身就已经是反序排列的,因此在反序输出字符串的时候实际只需沿着链表的第一个结点开始,顺序操作即可。【3.50】答案:①return②(structdata*)malloc(sizeof(structdata))③input()④p!=NULL⑤p=p->next【3.51】答案:①(structstudent*)②tail=tail->next③head注释:①malloc函数的作用是在内存开辟指定字节数的存储空间,并将此存储空间的地址返回赋给尾指针tail,但是此地址为void型,应将其强制转换为所要求的结构指针类型。②新开辟的结点的内存地址存于tail所指向的已建立的链表的尾结点的结构成员next,新结点连入链表以后,尾指针tail应指向新的结点。【3.52】答案:①(structstudent*)②(structlist*)③return(head)【3.53】答案:①FILE②!feof(fp)注释:FILE是文件结构类型名。feof()是测试文件结束标志的函数。【3.54】答案:①"second.txt"②fclose(fp)【3.55】答案:①3②!feof(f1)或feof(f1)==0③f2④fclose(f2)⑤fclose(f1)注释:程序中使用了带参数的main函数,其中整型参数argc为命令行中字符串的个数,此程序运行时输入的字符串有可运行程序名、文件1和文件2,故argc不应小于3。字符串指针argv[0]指向可运行程序名、字符串指针argv[1]指向输入文件名、字符串指针argv[2]指向输出文件名,由上所述②处给出循环条件是输入文件是否结束,③处需要填出输出文件名。最后两处是关闭两个文件,原则上关闭文件没有顺序要求,但习惯上是后打开的文件先关闭。【3.56】答案:①*argv[1]②(*funcp)(n)③s+=i注释:程序执行时输入的命令及参数的个数(操作系统规定用空格表示字符串的分隔)由系统赋给主函数的形数argc,输入的命令和参数以字符串的格式保存,字符串的首地址分别赋给指针数组argv的各个元素,其中argv[1]是'+'或'-',分别表示累加或阶乘。程序根据argv[1]所指向的字符串的内容给指向函数的指针变量funcp赋值。②处要求的语句是根据指向函数的指针变量的内容对相应的函数实现调用,所以选择A或B是错误的;据funcp是被调函数的地址,*funcp实现了对函数的调用,根运算符的结合性,(*funcp)表示取funcp的目标,而*funcp(n)则funcp先和(n)结合,funcp就被解释为函数名,显然是错误的。【3.57】答案:①"w"②-32③"r"【3.58】答案:①"bi.dat"②&j③fp【3.59】答案:①fgetc(fp))!=EOF②&keyword[i].word[0]③s++;q++;④*s==*q⑤(word=getword(cp))!=NULL【3.60】答案:①"a+"②rewind(fp)③!=NULL④flag=0⑤ferror(fp)==0140n四、编写程序题及参考答案(答案P87)导读:虽然题目基本按照教材章节顺序排列的,但是把同类题目尽量排在一起,便于读者学习掌握编程方法和思路,提高自己的编程能力。【4.1】已知银行整存整取存款不同期限的月息利率分别为:0.315%期限一年0.330%期限二年月息利率=0.345%期限三年0.375%期限五年0.420%期限八年要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。【4.2】输入年份year和月month,求该月有多少天。判断是否为闰年,可用如下C语言表达式:year%4==0&&year%100!=0||year%400==0。若表达式成立(即表达式值为1),则year为闰年;否则,表达式不成立(即值为0),year为平年。【4.3】编写一个简单计算器程序,输入格式为:data1opdata2。其中data1和data2是参加运算的两个数,op为运算符,它的取值只能是+、-、*、/。【4.4】输入n值,输出如图所示矩形。【4.5】输入n值,输出如图所示平行四边形。【4.6】输入n值,输出如图所示高为n的等腰三角形。140n【4.7】输入n值,输出如图所示高为n的等腰三角形。【4.8】输入n值,输出如图所示高和上底均为n的等腰梯形。【4.9】输入n值,输出如图所示高和上底均为n的等腰空心梯形。【4.10】输入n值,输出如图所示边长为n的空心正六边型。【4.11】输入n值,输出如图所示图形。140n【4.12】输入n值,输出如图所示图形。【4.13】输入n值,输出如图所示图形。【4.14】输入n值,输出如图所示图形。【4.15】输入n值,输出如图所示图形。【4.16】输入n值,输出如图所示图形。(例为n=6时)140n【4.17】编写程序,输出如图所示sin(x)函数0到2π的图形。【4.18】编写程序,在屏幕上输出一个由*号围成的空心圆。【4.19】编写程序,在屏幕上绘制如图余弦曲线和直线。若屏幕的横向为x轴,纵向为y轴,在屏幕上显示0~360度的cos(x)曲线与直线x=f(y)=45*(y-1)+31的迭加图形。其中cos图形用"*"表示,f(y)用"+"表示,在两个图形的交点处则用f(y)图形的符号。140n 【4.20】编写程序,输出如图所示高度为n的图形。 【4.21】编写程序,输出如图所示高度为n的图形。 【4.22】输入n值,输出如图所示图形。140n 【4.23】输入n值,输出如图所示的n×n(n<10)阶螺旋方阵。12345161718196152425207142322218131211109图4.19n=5时的螺旋方阵【4.24】输入n值,输出如图所示回型方阵。【4.25】输出如图所示的数字金字塔140n【4.26】输入n值,输出如图所示图形。【4.27】输入顶行字符和图形的高,输出如图所示图形。【4.28】输入首字符和高后,输出如图所示回型方阵。AAAAAABBBA140nABCBAABBBAAAAAA图4.24首字符为'A'、高为5的方阵【4.29】输入中心字符和高后,输出如图所示回型方阵。XXXXXXYYYXXYZYXXYYYYXXXXX图4.25中心字符为'Z'、高为5的方阵【4.30】编写程序,输出如图所示上三角形式的乘法九九表。【4.31】编写程序,输出如图所示下三角乘法九九表。140n【4.32】编写程序,输入三角型的三条边长,求其面积。注意:对于不合理的边长输入要输出数据错误的提示信息。【4.33】编写程序求出555555的约数中最大的三位数是多少。【4.34】编写程序计算下列算式的值:直到某一项A<=0.000001时为止。输出最后C的值。【4.35】从键盘输入任意的字符,按下列规则进行分类计数。    第一类'0','1','2','3','4','5','6','7','8','9'    第二类'+','-','*','/','%','='    第三类其它字符当输入字符''时先计数,然后停止接收输入,打印计数的结果。【4.36】对从键盘上输入的行、单词和字符进行计数。我们将单词的定义进行化简,认为单词是不包含空格、制表符(t)及换行符的字符序列。例如:"a+b+c",认为是1个单词,它由5个字符组成。又如:"xy140nabc",为2个单词,6个字符。一般用[CTRL+D]作为文件结束标记,其字符码值为-1,当输入[CTRL+D]时表示文件输入结束,停止计数。【4.37】编写程序计算当x=0.5时下述级数和的近似值,使其误差小于某一指定的值epsilon(例如:epsilon=0.000001): 【4.38】编写程序计算下式的值: 【4.39】编写程序计算下列序列的值:要求最后一项小于0.001时、或者当N=20时尚未达到精度要求,则停止计算。【4.40】已知求正弦sin(x)的近似值的多项式公式为:140n编写程序,要求输入x和ε,按上述公式计算sin(x)的近似值,要求计算的误差小于给定的ε。【4.41】从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。【4.42】输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。【4.43】编写程序,读入一个整数N;若N为非负数,则计算N到2×N之间的整数和;若N为一个负数,则求2×N到N之间的整数和。分别利用for和while写出两个程序。【4.44】求解爱因斯坦数学题。有一条长阶梯,若每步跨2阶,则最后剩余1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶,若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶?【4.45】一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。【4.46】编写程序,用二分法求一元二次方程2x3-4x2+3x-6=0在(10,10)区间的根。【4.47】中国古代科学家祖冲之采用正多边形逼近的割圆法求出了π的值。请编写一程序,采用割圆法求出π的值,要求精确到小数点之后的第十位。【4.48】A、B、C、D、E五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三竿,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E依次醒来,也按同样的方法拿鱼。编写程序求出他们合伙至少捕了多少条鱼。【4.49】一辆卡车违犯交通规则,撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。140n【4.50】若一个口袋中放有12个球,其中有3个红的,3个白的和6个黑的,每次从中任取8个球,编写程序求出共有多少种不同的颜色搭配。【4.51】100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。【4.52】编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。【4.53】显示200以内的完全平方数和它们的个数。(完全平方数:A2+B2=C2,求A、B、C)【4.54】设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),求N的值。【4.55】将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。【4.56】编写程序求解下式中各字母所代表的数字。PEAR-ARA───────PEA【4.57】一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。【4.58】请验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和。【4.59】如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。如407=43+03+73就是一个阿姆斯特朗数。编写程序求1000以内的所有阿姆斯特朗数。【4.60】任意输入一个偶数,请将它分解为两个素数之和。140n【4.61】如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。【4.62】猜数游戏。由计算机"想"一个数请人猜,如果人猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数,以此可以反映出猜数者"猜"的水平。【4.63】编写程序求出1000!后有多少个零。【4.64】求矩阵A[2*3]的转置矩阵B[3*2]。设矩阵A为:┏123┓┏14┓A=┃┃B=┃25┃┗456┛┗36┛【4.65】十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖?【4.66】输入5×5的数组,编写程序实现:(1)求出对角线上各元素的和;(2)求出对角线上行、列下标均为偶数的各元素的积;(3)找出对角线上其值最大的元素和它在数组中的位置。【4.67】编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。【4.68】编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。【4.69】编写程序,输出1000以内的所有完数及其因子。所谓完数是指一个整数的值等于它的因子之和,例如6的因子是1、2、3,而6=1+2+3,故6是一个完数。140n【4.70】对数组A中的N(0<N<100=个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6)则输出为: (3,1,2,5,1,3,4)【4.71】现将不超过2000的所有素数从小到大排成第一行,第二行上的每个数都等于它"右肩"上的素数与"左肩"上的素数之差。请编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假如存在的话,又有几种这样的情况?第一行:2357111317.....197919871993   第二行:122424.....86【4.72】将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不许有重复数字,也不许同其它组的三个数字重复,要求将每组中的三位数组成一个完全平方数。【4.73】一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。【4.74】使用数组精确计算M/N(01)请编写递归程序实现。【4.88】编写函数,采用递归方法实现将输入的字符串按反序输出。【4.89】编写函数,采用递归方法在屏幕上显示如下杨辉三角形:               1  11  121  1331  14641  15101051  …… …… …… …… ……【4.90】编写函数,采用递归方法将任一整数转换为二进制形式。【4.91】设有字母a、b、c,请编程用递归的方法产生由这些字母组成的,且长度为n的所有可能的字符串。例如,输入n=2,则输出:aa ab ac babbbccacbcc【4.92】将一个数的数码倒过来所得到的新数,叫作原数的反序数,如果一个数等于它的反序数,则称它为对称数。编写程序,采用递归算法求不超过1993的最大的二进制的对称数。140n【4.93】从1到n(n<1000)个自然数中选出r个数进行组合,并按指定的格式输出组合的结果。例如:n=5,r=3时,共有10种组合,运行程序,要按下面的格式输出:           123             4             5            34             5            45           234             5            45           345请用递归算法实现。【4.94】从键盘输入十个整数,用合并排序法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。【4.95】编写程序,读入一个以符号"."结束的长度小于20字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:读入句子:MADAMI'MADAM.它是回文,所以输出:YES读入句子:ABCDBA).它不是回文,所以输出:NO【4.96】编写程序,其中包括一个函数,此函数的功能是:对一个长度为N的字符串从其第K个字符起,删去M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。例如输入字符串"Wearepoorstudents.",利用此函数进行删除"poor"的处理,输出处理后的字符串是"Wearestudents."。【4.97】编写函数,通过指针将一个字符串反向。【4.98】编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2。【4.99】编写程序将输入的两行字符串连接后,将串中全部空格移到串首后输出。【4.100】编写程序,输入字符串,分别统计字符串中所包含的各个不同的字符及其各自字符的数量。如:输入字符串:abcedabcdcd则输出:a=2b=2c=3d=3e=1。140n【4.101】利用结构:structcomplx{intreal;intim;};编写求两个复数之积的函数cmult,并利用该函数求下列复数之积:⑴(3+4i)×(5+6i)⑵(10+20i)×(30+40i【4.102】编写成绩排序程序。按学生的序号输入学生的成绩,按照分数由高到低的顺序输出学生的名次、该名次的分数、相同名次的人数和学号;同名次的学号输出在同一行中,一行最多输出10个学号。【4.103】编写程序,实现输入的时间屏幕显示一秒后的时间。显示格式为HH:MM:SS。程序需要处理以下三种特殊情况:⑴若秒数加1后为60,则秒数恢复到0,分钟数增加1;⑵若分钟数加1后为60,则分钟数恢复到0,小时数增加1;⑶若小时数加1后为24,则小时数恢复到0。【4.104】编写程序,从键盘输入3个学生的数据,将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。【4.105】编写程序,从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。【4.106】编写程序,读入磁盘上C语言源程序文件"test8.c",删去程序中的注释后显示。140n【编写程序题参考答案】【4.1】参考答案:#includemain(){intyear;floatmoney,rate,total;/*money:本金rate:月利率total:本利合计*/printf("Inputmoneyandyear=?");scanf("%f%d",&money,&year);/*输入本金和存款年限*/if(year==1)rate=0.00315;/*根据年限确定利率*/elseif(year==2)rate=0.00330;elseif(year==3)rate=0.00345;elseif(year==5)rate=0.00375;elseif(year==8)rate=0.00420;elserate=0.0;total=money+money*rate*12*year;/*计算到期的本利合计*/printf("Total=%.2fn",total);}【4.2】参考答案:#includemain(){intyear,month,days;printf("Enteryearandmonth:");scanf("%d%d",&year,&month);switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;/*处理"大"月*/case4:case6:case9:case11:days=30;break;/*处理"小"月*/case2:if(year%4==0&&year%100!=0||year%400==0)days=29;/*处理闰年平月*/elsedays=28;/*处理不是闰年平月*/break;default:printf("Inputerror!n");/*月份错误*/days=0;}if(days!=0)printf("%d,%dis%ddaysn",year,month,days);}【4.3】参考答案:#includemain(){floatdata1,data2;/*定义两个操作数变量*/charop;/*操作符*/printf("Enteryourexpression:");scanf("%f%c%f",&data1,&op,&data2);/*输入表达式*/140nswitch(op)/*根据操作符分别进行处理*/{case'+':/*处理加法*/printf("%.2f+%.2f=%.2fn",data1,data2,data1+data2);break;case'-':/*处理减法*/printf("%.2f-%.2f=%.2fn",data1,data2,data1-data2);break;case'*':/*处理乘法*/printf("%.2f*%.2f=%.2fn",data1,data2,data1*data2);break;case'/':/*处理除法*/if(data2==0)/*若除数为0*/printf("Divisionbyzero.n");elseprintf("%.2f/%.2f=%.2fn",data1,data2,data1/data2);break;default:/*输入了其它运算符*/printf("Unknownoperater.n");}}【4.4】分析:打印此图形用两重循环实现。图形要重复n行,故采用循环结构实现循环n次,循环体内部打印一行'*'号,把上述思路表示为:for(i=1;i<=n;i++)打印一行'*'号;每行有n个'*'号,再采用循环结构实现n次循环,循环内部用格式输出语句打印一个'*'号,即:for(j=1;j<=n;j++)printf("*");按照上述思路,实现打印矩形。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("*");printf("n");}}【4.5】分析:此图形和上题的区别在于在每一行先要打印空格,然后再打印n个'*'号,在上题第一层循环体内打印'*'号的循环前面增加一个循环打印空格。每行空格的个数是逐行减少的,由于第一层循环的控制变量i是逐行增1,所以用一个固定值的数减去i就可实现对空格个数的控制,在此题中固定值可使用变量n。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);140nfor(i=1;i<=n;i++){for(j=1;j<=n-i;j++)printf("");for(j=1;j<=n;j++)printf("*");printf("n");}}【4.6】分析:此题和上题的区别在于每行'*'的数量逐行减少,可以使用上题控制空格个数的思路来控制'*'号的个数,请注意每行'*'的个数都是奇数。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("n");}}【4.7】分析:此题图形是第3题图形的垂直反转,在编程上我们可以变换一个思路。对于图形中的第i行(1≤i≤n),共需要输出2n-i个字符,其中前面的i-1个字符为空格,后面的字符为'*'号。按照这一思路可以编写出如下程序。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)/*重复输出图形的n行*/{for(j=1;j<=2*n-i;j++)/*重复输出图形一行中的每个字符*/if(j<=i-1)printf("");/*输出前面的空格*/elseprintf("*");/*输出后面的*号*/printf("n");}}【4.8】分析:此题和第3题的区别仅是每行的'*'个数增加n-1个。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)140n{for(j=1;j<=n-i;j++)printf("");for(j=1;j<=2*i-1+(n-1);j++)printf("*");printf("n");}}【4.9】分析:对于空心图形,我们可以在上题的基础上,对于打印'*'号的循环进行修改,仅在循环开始值(j=1)和循环结束值(j=2*(i-1)+n)时打印'*'号,其它位置都打印空格。另一种思路是将每行打印的空格和'*'的两个循环合为一体考虑,在判断出需要打印'*'的两个位置及第一行和最后一行相应位置外,其余位置都打印空格。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=2*n+i-3;j++)if(j==n-i+1||j>n-i+1&&(i==1||i==n))printf("*");elseprintf("");printf("*n");}}【4.10】分析:此图形可以理解为两个空心梯形反向连接而成,因此可以利用上题的思路进行输出。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)/*输出图形的上半部分(含中心行)*/{for(j=1;j<=2*n-i-1;j++)if(j==i)printf("*");elseprintf("");printf("*n");}for(i=1;in-i+1&&i==1)printf("*");elseprintf("");printf("*n");}for(i=1;ii+1&&i==n-1)printf("*");elseprintf("");printf("*n");}}【4.12】参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(j==n-i+1||i==1||i==n)printf("*");elseprintf("");printf("n");}}【4.13】参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)/*输出图形的上半部分(含中心行)*/{for(j=1;j<=n-i;j++)if(j==1||j==n-i+1)printf("*");elseprintf("");printf("n");}for(i=1;in-i)printf("*");elseprintf("");printf("n");}for(i=1;ii)printf("*");elseprintf("");printf("n");}}【4.16】参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n+i-2;j++)if(j==n-i+1)printf("*");elseprintf("");printf("*n");}140n}【4.17】分析:首先对图形进行设计,坐标的X轴和Y轴分别对应屏幕的列和行,一个正弦函数的周期为0~360度,我们把一个步长定义为10度,打印时每换一行等于函数的自变量增加10度;屏幕的列宽为80,函数值为0对应屏幕的第40列,sin(x)的值在-1~1,变换成列数为以0为中心的-30~30,对应屏幕上第10~70列。设计程序时,控制换行的自变量i乘以10得到正弦函数的X值,调用库函数sin()求出函数值再乘以30输出的列宽,因为我们以屏幕的第40列为0点,故再加上40得到应在屏幕上显示的点。参考答案:#definePAI3.14159#includemain(){doublex;inty,i,yy;for(i=1;i<80;i++)/*打印图形的第一行*/if(i==40)printf("*");/*i控制打印的列位置*/elseprintf("-");printf("n");for(x=10.0;x<=360.0;x+=10.)/*从10度到360度*/{y=40+30*sin(x*PAI/180.0);/*计算对应的列*/yy=40>y?40:y;/*下一行要打印的字符总数*/for(i=1;i<=yy;i++)/*控制输出图形中的一行*/{if(i==y)printf("*");/*i控制打印的列位置*/elseif(i==40)printf("|");/*打印中心的竖线*/elseprintf("");}printf("n");}}【4.18】分析:首先设计屏幕图形,如果预计圆形在屏幕上打印20行,所以定义圆的直径就是20,半径为10,圆的方程是X2×Y2=R2,因为图形不是从中心开始打印而是从边沿开始,所以Y从10变化到-10,根据方程求出X,对求得的X值再根据屏幕行宽进行必要的调整得到应打印的屏幕位置。参考答案:#includemain(){doubley;intx,m;for(y=10;y>=-10;y--)/*圆的半径为10*/{m=2.5*sqrt(100-y*y);/*计算行y对应的列坐标m*/for(x=1;x<30-m;x++)printf("");/*输出圆左侧的空白*/printf("*");/*输出圆的左侧*/for(;x<30+m;x++)printf("");/*输出圆的空心部分*/printf("*n");/*输出圆的右侧*/}140n}【4.19】参考答案:#include#includemain(){doubley;intx,m,n,yy;for(yy=0;yy<=20;yy++){y=0.1*yy;m=acos(1-y)*10;n=45*(y-1)+31;for(x=0;x<=62;x++)if(x==m&&x==n)printf("+");elseif(x==n)printf("+");elseif(x==m||x==62-m)printf("*");elseprintf("");printf("n");}}【4.20】分析:编程的关键为两点,一是使用控制输出的行和列,这方面的内容在前面已经叙述,另一点是输出的数字和所在行、列关系。此题第一行输出的数字恰好是列数,从第二行起每行的数字均比上一行增n。参考答案:main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%4d",(i-1)*n+j);printf("n");}}           【4.21】分析:此题的关键是找到输出数字和行、列数的关系。审查图形中每行中数字的关系发现,右边数字和前面数字之差逐次增1;同列数字依然是这样的关系,编程的关键转换为找到每一行左方的第一个数字,然后利用行和列的循环变量进行运算就可得到每个位置的数字。用ai,j此表示第i行第j列的数字,则a11=1;由第i行第一列的数字推出第i+1行第一列的数字是ai+1,1=ai,1+i;同样由第j列推出第j+1列的数字是ai,j+1=ai,j+i+j。另外只有当j=i且j<=n-i+1;下区:j<=i且j>=n-i+1;左区:ji且j>n-i+1。140n现在问题是,如果知道一行在不同区域开始第一个位置的数字,然后该区后续的数字就可利用前面分析的规律得到。对于右区开始各行第一个数字最易求出,为4*(n-1)-i+1。后续一个和同行前一个数字之差是4*[n-1-(j-1)*2]+1,其中方括号内是每边的数字个数。对角线上的数字是分区点,对角线上相临数字仍然相差一圈数字个数,读者自行分析得到计算公式。右区开始的第一个数字可以从上区结束时的数字按规律求出。下述程序用变量s保存分区对角线上的数字。参考答案一:main(){inti,j,k,n,s,m,t;printf("Pleaseentern:");scanf("%d",&n);for(i=1;i<=n;i++){s=(i<=(n+1)/2)?1:3*(n-(n-i)*2-1)+1;m=(i<=(n+1)/2)?i:n-i+1;/*m-1是外层圈数*/for(k=1;k=n-i+1&&j<=i)/*下区*/t=s-(j-(n-i))+1;if(j>=i&&j<=n-i+1)/*上区*/t=s+j-i;if(j>i&&j>n-i+1)/*右区*/t-=4*(n-2*(n-j+1))+1;if(j#defineMIN(x,y)(x>y)?(y):(x)fun(inta11,inti,intj,intn){intmin,a22;if(i==j&&i<=1)return(a11);elseif(i==j&&i<=(n+1)/2)return(fun(a11,i-1,i-1,n)+4*(n-2*i+3));elseif(i==1&&j!=1)return(a11+j-1);elseif(i!=1&&j==n)return(a11+n+i-2);elseif(i!=1&&j==1)return(a11+4*n-3-i);elseif(i==n&&j!=1)return(a11+3*n-2-j);else{if(i>=(n+1)/2&&j>=(n+1)/2)min=MIN(n-i+1,n-j+1);elseif(i<(n+1)/2&&j>=(n+1)/2)min=MIN(i,n-j+1);elseif(i>=(n+1)/2&&j<(n+1)/2)min=MIN(n-i+1,j);elsemin=MIN(i,j);a22=fun(a11,min,min,n);return(fun(a22,i-min+1,j-min+1,n-2*(min-1)));}}main(){inta11=1,i,j,n;printf("Entern=");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%4d",fun(a11,i,j,n));printf("n");}}【4.24】分析:此题的关键还是要找到输出数字aij和行列数i、j的关系。为此将图形分为四个区域如下图:3333332223321233222333333(此图n为5)在左上区域,即i<=(n+1)/2、j<=(n+1)/2时,输出数字为(n+1)/2-i+1和(n+1)/2-j+1中的大者,记为max{(n+1)/2-i+1,(n+1)/2-j+1};在右上区,即i<=(n+1)/2、j>(n+1)/2时,140n输出数字为max{(n+1)/2-i+1,j-n/2};在左下区,即i>(n+1)/2、j<=(n+1)/2时,输出数字为max{i-n/2,(n+1)/2-j+1};在右下区,即i>(n+1)/2、j>(n+1)/2时,输出数字为max{i-n/2,j-n/2}。参考答案:#definemax(x,y)((x)>(y)?(x):(y))main(){inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(i<=(n+1)/2)if(j<=(n+1)/2)printf("%4d",max((n+1)/2-i+1,(n+1)/2-j+1));elseprintf("%4d",max((n+1)/2-i+1,j-n/2));elseif(j<=(n+1)/2)printf("%4d",max(i-n/2,(n+1)/2-j+1));elseprintf("%4d",max(i-n/2,j-n/2));printf("n");}}【4.25】分析:前面我们已经见到过上下对称的图形,这是一个左右对称的图形,垂直中心线上的数字恰好是行号,在每行位于图形垂直中心线左方的数字是逐渐增加的,而右方是逐渐减小的。j==i是分区的标志,左方输出数字就是列数j,而右方的数字从i开始逐步减小1。参考答案:main(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9-i;j++)printf("");for(j=1;j<=i;j++)printf("%2d",j);for(j=i-1;j>=1;j--)printf("%2d",j);printf("n");}}【4.26】分析:这类输出字符的图形和输出数字的图形考虑是近似的,因为字符的ASCII码就是一个整数。在字符码值的变化过程中,应该注意应该判断码值是否超出字符的范围,进行必要的处理,为了保持程序的简洁,本题没有考虑这个问题,在下题里对这个问题进行了处理。参考答案:main(){charc='Z';inti,j,n;printf("nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)140n{for(j=1;j<=n+i-2;j++)if(j==n-i+1)printf("%c",c--);elseprintf("");printf("%cn",c--);}for(i=1;i'Z'&&c<'a'||c>'z');for(i=1;i<=n;i++){for(j=1;j<=n+i-2;j++)if(j==n-i+1)printf("%c",c);elseprintf("");printf("%cn",c++);c=c<'a'?(c>'Z'?'A':c):(c>'z'?'a':c);}c-=2;c=c<'Z'?(c<'A'?'Z':c):(c<'a'?'z':c);for(i=1;i(y)?(x):(y))140nmain(){charc;inti,j,n;do{printf("nPleaseEntern,char:");scanf("%d,%c",&n,&c);}while(c<'A'||c>'Z'&&c<'a'||c>'z');for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(i<=(n+1)/2)if(j<=(n+1)/2)printf("%c",c-max((n+1)/2-i+1,(n+1)/2-j+1)+(n+1)/2);elseprintf("%c",c-max((n+1)/2-i+1,j-n/2)+(n+1)/2);elseif(j<=(n+1)/2)printf("%c",c-max(i-n/2,(n+1)/2-j+1)+(n+1)/2);elseprintf("%c",c-max(i-n/2,j-n/2)+(n+1)/2);printf("n");}}【4.29】参考答案:#definemax(x,y)((x)>(y)?(x):(y))main(){charc;inti,j,n;do{printf("nPleaseEntern,char:");scanf("%d,%c",&n,&c);}while(c<'A'||c>'Z'&&c<'a'||c>'z');for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(i<=(n+1)/2)if(j<=(n+1)/2)printf("%c",c-max((n+1)/2-i+1,(n+1)/2-j+1)+1);elseprintf("%c",c-max((n+1)/2-i+1,j-n/2)+1);elseif(j<=(n+1)/2)printf("%c",c-max(i-n/2,(n+1)/2-j+1)+1);elseprintf("%c",c-max(i-n/2,j-n/2)+1);printf("n");}140n}【4.30】参考答案:#includemain(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf("n--------------------------------------n");for(i=1;i<10;i++){for(j=1;j<10;j++)if(jmain(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf("n--------------------------------------n");for(i=1;i<10;i++){for(j=1;j<10;j++)if(j<10-i)printf("");elseprintf("%4d",(10-i)*j);printf("n");}}【4.32】参考答案:#include"math.h"main(){intflag=0;floata,b,c,s;do{printf("Pleaseenterabc:");scanf("%f%f%f",&a,&b,&c);if(a>b+c||b>a+c||c>a+b)flag=1;}while(flag);s=(a+b+c)/2;printf("S=%f",s=sqrt((s-a)*(s-b)*(s-c)));}【4.33】参考答案:140n#includemain(){intj;longn;/*使用长整型变量,以免超出整数的表示范围*/printf("Pleaseinputnumber:");scanf("%ld",&n);for(j=999;j>=100;j--)/*可能取值范围在999到100之间,j从大到小*/if(n%j==0)/*若能够整除j,则j是约数,输出结果*/{printf("Themaxfactorwith3digitsin%ldis:%d.n",n,j);break;/*控制退出循环*/}}【4.34】参考答案:#defineE0.000001main(){floatx,y=1,s=0;printf("Pleaseenterx=");scanf("%f",&x);while(1/y>E){s=s+1/y;y=y*x;}printf("S=%fn",s);}【4.35】参考答案:#includemain(){intclass1,class2,class3;charch;class1=class2=class3=0;/*初始化分类计数器*/do{ch=getch();switch(ch){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':class1++;break;/*对分类1计数*/case'+':case'-':case'*':case'/':case'%':case'=':class2++;break;/*对分类2计数*/default:class3++;break;/*对分类3计数*/}}while(ch!='\');/*字符''在C程序中要使用转义符'\'*/printf("class1=%d,class2=%d,class3=%dn",class1,class2,class3);}【4.36】分析:程序的关键是怎样判断一个单词。由单词的定义已知它是用空格、制表符或换行符分隔开的,两个字符之间没有空格、制表符或换行符,则认为是一个单词中的两个字符。140n参考答案:#defineEOF-1#defineYES1#defineNO0#includemain()/*对输入的行、字符和单词进行计数统计*/{intc,nl,nc,nw,inword;inword=NO;/*inword=NO已处理的最后一个字符是空格、t或n*//*inword=YES已处理的最后一个字符不是空格、t或n*/nl=nc=nw=0;/*行、字符、字计数器置0*/while((c=getchar())!=EOF){++nc;/*进行字符计数*/if(c=='n')++nl;/*进行行计数*/if(c=='t'||c=='n'||c=='')inword=NO;/*如果读入的字符是空格、t或n,则置inword为NO*/else/*读入的字符不是空格、t或n*/if(inword==NO)/*如果前一个字符是空格、t或n*/{inword=YES;/*则读入的字符为一个单词的第一个字符*/++nw;/*置inword为YES,进行单词计数*/}}printf("Lines=%dnWords=%dnChars=%dn",nl,nw,nc);/*输出结果*/}【4.37】参考答案:#defineE0.000001#include"math.h"main(){inti,k=1;floatx,y,t=1,s,r=1;printf("Pleaseenterx=");scanf("%f",&x);for(s=x,y=x,i=2;fabs(r)>E;i++){t=t*(i-1);y=y*x*x;k=k*(-1);r=k*y/t/(2*i-1);s=s+r;}printf("S=%fn",s);}【4.38】参考答案:main(){inti;floats=0;140nfor(i=1;i<=100;i++)s=s+i;for(i=1;i<=50;i++)s=s+i*i;for(i=1;i<=10;i++)s=s+1.0/i;printf("Result=%fn",s);}【4.39】参考答案:main(){inti;floats=1;for(i=1;i<=20&&1.0/i/(i+1)>0.001;i++)s=s+1.0/i/(i+1);printf("Result=%fi=%dn",s,i);}【4.40】参考答案:#includemain(){floatx,eps,s,y=0,y0,t;intn,j;printf("Enterx&eps:");scanf("%f%f",&x,&eps);n=t=j=1;s=x;do{y0=y;if(n%2==0)y=y-s/t;elsey=y+s/t;s*=x*x;/*求x的乘方*/t*=(j+1)*(j+2);/*求n!*/j+=2;n++;}while(fabs(y0-y)>eps);/*控制误差*/printf("sin(%f)=%fn",x,sin(x));/*输出标准sin(x)的值*/printf("%d,sin(%f)=%fn",n,x,y);/*输出计算的近似值*/}                                         【4.41】参考答案:main(){inti,j,num,a[10];for(i=0;i<10;i++){printf("EnterNo.%d:",i+1);scanf("%d",&num);for(j=i-1;j>=0&&a[j]>num;j--)140na[j+1]=a[j];a[j+1]=num;}for(i=0;i<10;i++)printf("No.%d=%dn",i+1,a[i]);}【4.42】参考答案:main(){intn;printf("Pleaseentern:");scanf("%d",&n);while(n>0){printf("%d",n%10);n=n/10;}}【4.43】参考答案:main(){inti,n;longs1=0,s2=0;printf("PleaseenterN:");scanf("%d",&n);if(n>=0)for(i=n;i<=2*n;i++)s1=s1+i;elsefor(i=n;i>=2*n;i--)s1=s1+i;i=n;if(i>=0)while(i<=2*n)s2=s2+i++;elsewhile(i>=2*n)s2=s2+i--;printf("Result1=%ldresult2=%ldn",s1,s2);}【4.44】分析:据题意,阶梯数满足下面一组同余式:x≡1(mod2)x≡2(mod3)x≡4(mod5)x≡5(mod6)x≡0(mod7)参考答案:#include140nmain(){inti=1;/*i为所设的阶梯数*/while(!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0)))++i;/*满足一组同余式的判别*/printf("Staris_number=%dn",i);}【4.45】参考答案:main(){inti,n,a;for(i=0;;i++){if(i%8==1){n=i/8;if(n%8==1){n=n/8;if(n%8==7)a=n/8;}}if(i%17==4){n=i/17;if(n%17==15)n=n/17;}if(2*a==n){printf("result=%dn",i);break;}}}【4.46】分析:二分法的基本原理是,若函数有实根,则函数的曲线应当在根这一点上与x轴有一个交点,在根附近的左右区间内,函数值的符号应当相反。利用这一原理,逐步缩小区间的范围,保持在区间的两个端点处的函数值符号相反,就可以逐步逼近函数的根。参考答案:#include"stdio.h"#include"math.h"main(){floatx0,x1,x2,fx0,fx1,fx2;do{printf("Enterx1,x2:");scanf("%f,%f",&x1,&x2);fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;/*求出x1点的函数值fx1*/fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;/*求出x2点的函数值fx2*/}while(fx1*fx2>0);/*保证在指定的范围内有根,即fx的符号相反*/do{x0=(x1+x2)/2;/*取x1和x2的中点*/fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;/*求出中点的函数值fx0*/if((fx0*fx1)<0)/*若fx0和fx1符号相反*/140n{x2=x0;/*则用x0点替代x2点*/fx2=fx0;}else{x1=x0;/*否则用x0点替代x1点*/fx1=fx0;}}while(fabs((double)fx0)>=1e-5);/*判断x0点的函数与x轴的距离*/printf("x=%6.2fn",x0);}【4.47】分析:做圆的内接4边形,从圆心和4边形顶点连接形成4个三角形,可以求出每个三角形的面积(r2/2)现在我们知道三角形的面积和两个边长(均为半径a=r、b=r),可以用公式:S=s(s-a)(s-b)(s-c)求出第三边c。我们将内接4边形换为内接8边形,原来的三角形被一分为二,故c/2就是每个三角形的高,面积又是可以求出的。再将三角形一分为二,……。当三角形的面积求出时,内接多边形的面积就可求出。参考答案:main(){intn=4;doubler=10,s,cr,c,p;s=r*r/2;do{cr=n*s;p=16*r*r*r*r-64*s*s;c=(4*r*r-sqrt(p))/2;c=sqrt(c);s=c*r/4;n=2*n;}while(n*s-cr>1.0e-10);printf("PAI=%lfn",cr/r/r);}【4.48】分析:根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条后剩下的鱼正好分为五份,然后拿走自己的一份,余下其它四份。假定鱼的总数为x,则x可以按照题目的要求进行五次分配:x-1后可被5整除,余下的鱼为4×(x-1)÷5。若x满足上述要求,则x就是题目的解。参考答案:main(){intn,i,x,flag=1;/*flag:控制标记*/for(n=6;flag;n++)/*采用试探的方法,令试探值n逐步加大*/{for(x=n,i=1;flag&&i<=5;i++)/*判断是否可按要*/if((x-1)%5==0)x=4*(x-1)/5;/*求进行5次分配*/elseflag=0;/*若不能分配则置标记flag=0退出分配过程*/if(flag)break;/*若分配过程正常,找到结果,退出试探的过程*/elseflag=1;/*否则继续试探下一个数*/}printf("Totalnumberoffishcatched=%dn",n);/*输出结果*/140n}【4.49】分析:按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。参考答案:#include"math.h"main(){inti,j,k,c;for(i=1;i<=9;i++)/*i:车号前二位的取值*/for(j=0;j<=9;j++)/*j:车号后二位的取值*/if(i!=j)/*判断两位数字是否相异*/{k=i*1000+i*100+j*10+j;/*计算出可能的整数*/for(c=31;c*c>5:%4d2:%2d1:%2dn",++count,f5,f2,f1);}}【4.53】分析:此题采用穷举法。参考答案:main(){longinti,j,k,count=0;for(i=1;i*i<=200;i++)for(j=1;j*j<=200;j++)for(k=1;k*k<=200;k++)if(i*i==(j*j+k*k)){printf("nA^2==B^2+C^2:%4ld%4ld%4ld",i,j,k);count++;}printf("ncount=%ld",count);}【4.54】分析:此题采用穷举法。可设整数N的千、百、十、个位为i、j、k、m,其取值均为0~9,则满足关系式:(i*103+j*102+10k+m)*9=(m*103+k*102+10j+i)的i、j、k、m即构成N。参考答案:#includemain(){inti;for(i=1002;i<1111;i++)/*穷举四位数可能的值*/if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)printf("Thenumbersatisfiedstatesconditionis:%dn",i);/*判断反序数是否是原整数的9倍若是则输出*/}【4.55】分析:此题采用穷举法。参考答案:main(){inti,j,n,k,a[16]={0};for(i=1;i<=1993;i++){n=i;k=0;while(n>0)/*将十进制数转变为二进制数*/{a[k++]=n%2;n=n/2;}for(j=0;j=k){printf("%d:",i);140nfor(j=0;jmain(){intp,e,a,r;for(p=1;p<=9;p++)/*从1到9穷举字母p的全部可能取值*/for(e=0;e<=9;e++)/*从0到9穷举字母e的全部可能取值*/if(p!=e)for(a=1;a<=9;a++)/*从0到9穷举字母a的全部可能取值*/if(a!=p&&a!=e)for(r=0;r<=9;r++)/*从0到9穷举字母r*/if(r!=p&&r!=e&&r!=a/*四个字母互不相同*/&&p*1000+e*100+a*10+r-(a*100+r*10+a)==p*100+e*10+a){printf("PEAR%d%d%d%dn",p,e,a,r);printf("-ARA-%d%d%dn",a,r,a);printf("-----------------n");printf("PEA%d%d%dn",p,e,a);}}【4.57】参考答案:main(){inti,n,k,a[3],b[3];for(i=248;i<=343;i++){for(n=i,k=0;n>0;n/=7)a[k++]=n%7;for(n=i,k=0;n>0;n/=9)b[k++]=n%9;if(k==3)for(n=0;n=j)/*j是素数*/{m=i-j;for(k=2;k=m)/*m也是素数,输出结果*/{printf("%4d=%4d+%4dn",i,j,m);error=0;break;}}}if(error)printf("%4derror!");}}【4.59】分析:可采用穷举法,依次取1000以内的各数(设为i),将i的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。参考答案:#includemain(){inti,t,k,a[4]={0};printf("TherearefollowingArmstrongnumbersmallerthan1000:n");for(i=2;i<1000;i++)/*穷举要判定的数i的取值范围1~1000*/{for(t=0,k=1000;k>=10;t++)/*截取整数i的各位(从高位向低位)*/{a[t]=(i%k)/(k/10); /*分别赋给a[0]~a[3]*/k/=10;}if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]+a[3]*a[3]*a[3]==i)printf("%d",i);/*判断i是否为阿姆斯特朗数,*//*若满足条件,则输出*/}}【4.60】参考答案:main(){intj,k,n,m;printf("Pleaseentern:");scanf("%d",&n);140nfor(j=2;j=j)/*j是素数*/{m=n-j;for(k=2;k=m)/*m也是素数,输出结果*/{printf("%4d=%4d+%4dn",n,j,m);break;}}}}                                           【4.61】分析:按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。计算数a的各因子的算法:用a依次对i(i=1~a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则结束对a的因子的计算。参考答案:#include#includemain(){inta,i,m,n;printf("Friendly-numberspairsamllerthan3000:n");for(a=1;a<3000;a++)/*穷举3000以内的全部整数*/{for(m=0,i=1;i<=a/2;i++)/*计算数a的各因子,各因子之和存于m*/if(!(a%i))m+=i;/*计算m的各因子,各因子之和存于n*/for(n=0,i=1;i<=m/2;i++)if(!(m%i))n+=i;if(n==a&&a#includemain()/*猜数程序*/{intmagic;/*计算机"想"的数*/intguess;/*人猜的数*/intcounter;magic=rand();/*通过调用随机函数任意"想"一个数*/guess=magic-1;/*初始化变量guess的值*/counter=0;/*计数器清零*/140nwhile(magic!=guess){printf("guessthemagicnumber:");scanf("%d",&guess);     /*人输入所猜的数*/counter++;if(guess>magic)printf("****Wrong****toohightn");elseif(guessa[j][j])j=i;}printf("SUN=%dnACCOM=%dna[%d]=%dn",s1,s2,j,a[j][j]);}【4.67】参考答案:#include"stdio.h"main(){inti,n=0,a[4]={0};printf("Pleaseenteradigit:");for(i=0;i<4&&(a[i]=getchar())!='n';i++);for(i=0;i<4;i++)if(a[i]>=48&&a[i]<=57)a[i]=a[i]-48;140nelseif(a[i]>=65&&a[i]<=69)a[i]=a[i]-55;elseif(a[i]>=97&&a[i]<=102)a[i]=a[i]-87;elseprintf("inputError!");for(i=0;i<4;i++)n=n*16+a[i];printf("%d",n);}【4.68】参考答案:main(){inti,n,k=16,a[16]={0};printf("Pleaseenteradigit:");scanf("%d",&n);while(n>0)/*将十进制数转变为二进制数*/{a[--k]=n%2;n=n/2;}for(i=0;i<16;i++)printf("%2d",a[i]);}【4.69】参考答案:#includemain(){inti,j,m,s,k,a[100];for(i=1;i<=100;i++)/*寻找1000以内的完数*/{m=i;s=0;k=0;while(m>0)/*寻找i的因子*/{for(j=1;j=m)break;}if(s!=0&&i==s+m){a[k++]=m;for(j=0;jmain(){inti,j,k=0,m=2,s,r=0,a[500];printf("%4d",m);for(i=3;i<=2000;i++){for(j=2;j<=i-1;j++)if(i%j==0)break;if(j==i){printf("%4d",i);a[k++]=i-m;m=i;}}for(i=0;i=1898)break;}if(s==1898)140nr++;}printf("nresult=%dn",r);}【4.72】分析:本问题的思路很多,我们介绍一种简单快速的算法。首先求出三位数中不包含0且是某个整数平方的三位数,这样的三位数是不多的。然后将满足条件的三位数进行组合,使得所选出的三个三位数的九个数字没有重复。程序中可以将寻找满足条件三位数的过程和对该三位数进行数字分解的过程结合起来。参考答案:#includemain(){inta[20],num[20][3],b[10];/*a:存放满足条件的三位数*//*num:满足条件的三位数分解后得到的数字,b:临时工作*/inti,j,k,m,n,t,flag;printf("The3squareswith3differentdigitseachare:n");for(j=0,i=11;i<=31;i++)/*求出是平方数的三位数*/if(i%10!=0)/*若不是10的倍数,则分解三位数*/{k=i*i;/*分解该三位数中的每一个数字*/num[j+1][0]=k/100;/*百位*/num[j+1][1]=k/10%10;/*十位*/num[j+1][2]=k%10;/*个位*/if(!(num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]||num[j+1][1]==num[j+1][2]))/*若分解的三位数字均不相等*/a[++j]=k;/*j:计数器,统计已找到的满足要求的三位数*/}for(i=1;i<=j-2;++i)/*从满足条件的三位数中选出三个进行组合*/{b[1]=num[i][0];/*取第i个数的三位数字*/b[2]=num[i][1];b[3]=num[i][2];for(t=i+1;t<=j-1;++t){b[4]=num[t][0];/*取第t个数的三位数字*/b[5]=num[t][1];b[6]=num[t][2];for(flag=0,m=1;!flag&&m<=3;m++)/*flag:出现数字重复的标记*/for(n=4;!flag&&n<=6;n++)/*判断前两个数的数字是否有重复*/if(b[m]==b[n])flag=1;/*flag=1:数字有重复*/if(!flag)for(k=t+1;k<=j;++k){b[7]=num[k][0];/*取第k个数的三位数字*/b[8]=num[k][1];b[9]=num[k][2];/*判断前两个数的数字是否与第三个数的数字重复*/for(flag=0,m=1;!flag&&m<=6;m++)for(n=7;!flag&&n<=9;n++)140nif(b[m]==b[n])flag=1;if(!flag)/*若均不重复则打印结果*/printf("%d,%d,%dn",a[i],a[t],a[k]);}}}}【4.73】参考答案:main(){inti,n,k,a[3],b[3];for(i=248;i<=343;i++){for(n=i,k=0;n>0;n/=7)a[k++]=n%7;for(n=i,k=0;n>0;n/=9)b[k++]=n%9;if(k==3)for(n=0;nintpos[101],div[101];main(){intm,n,i,j;printf("Pleaseinputm/n(<0i){m=a+t;n=b+i;j=a;k=b;z=i;}else{m=b+i;n=a+t;j=b;k=a;z=t;}while(m!=j){(*(--n-1))+=(*(--m)+*n)/10;*m=(*m+*n)%10;if(n==k+1&&*k!=1)break;if(n==k+1&&*k){n+=19;*(n-1)=1;}if(n>k+z&&*(n-1)!=1)break;}while(*(j++)!=-38)printf("%d",*(j-1));printf("n");}【4.76】参考答案:#include"stdio.h"inta[20],b[20];main(){intt=0,*m,*n,*k,*j,z,i=0;printf("Inputnumber1:");do{a[++t]=getchar()-'0';}while(a[t]!=-38);printf("Inputnumber2:");do140n{b[++i]=getchar()-'0';}while(b[i]!=-38);if(t>i){m=a+t;n=b+i;j=a;k=b;z=i;}else{m=b+i;n=a+t;j=b;k=a;z=t;}while(m!=j){(*(--n-1))+=(*(--m)+*n)/10;*m=(*m+*n)%10;if(n==k+1&&*k!=1)break;if(n==k+1&&*k){n+=19;*(n-1)=1;}if(n>k+z&&*(n-1)!=1)break;}while(*(j++)!=-38)printf("%d",*(j-1));printf("n");}【4.77】参考答案:#include"stdio.h"inta[20],b[20],c[40];main(){intt=0,*m,*n,*k,f,e=0,*j,i=0;printf("Inputnumber1:");do{a[++t]=getchar()-'0';}while(a[t]!=-38);printf("Inputnumber2:");do{b[++i]=getchar()-'0';}while(b[i]!=-38);j=c;for(m=a+t-1;m>=a+1;m--,e++){j=c+e;for(n=b+i-1;n>=b+1;n--){f=*j+*m**n;*(j++)=f%10;*j+=f/10;}}while(j>=c)printf("%d",*(j--));printf("n");}140n【4.78】这是一个使用数组解决较复杂问题的典型题目。棋盘如左图所示,图中箭头表示一个棋子从[1、1]点跳到[2、3]点。为了下面叙述的方便,将I、J表示棋子起跳点的行、列号,X、Y表示落子点的行、列号。首先我们讨论如何从起跳点坐标求出可能的落子点的坐标。从某点起跳,棋子最多可能有八个落子点,例如从I=3、J=5点起跳,八个可能的落子点的坐标是[4、5]、[5、4]、[5、2]、[4、1]、[2、1]、[1、2]、[1、4]、[2、5]。将起落点的行列坐标分开考虑,则由起点的行坐标分别与下列八个数相加,就可得到可能的八个落子点的行坐标:1、2、2、1、-1、-2、-2、-1,将这八个数存入数组b,即:b[]={1,2,2,1,-1,-2,-2,-1},落子点的行坐标X和起跳点行坐标有如下关系:X=b[k]+I1≤k≤8如果由上式计算得到的落子点X的坐标值小于0或大于8,则表示落在了棋盘之外,应予舍弃。同理得到起落点之间的列坐标关系数组是:d[]={2,1,-1,-2,-2,-1,1,2}。我们再讨论落子点的度数问题。对于棋盘中的某一点来说,周围最多有8个方向的棋子在这个点落子,把可能的落子数称为度数,棋盘上各点的度数如下图所示。根据题意,一个点只能落子一次,所以落过子的点的度数应记为0,可跳向度数为0点的度数相应要减1。根据上述数组,从一个起跳点出发,可能求出数个可以落子点的坐标,跳棋时到底确定落在这些点中的哪一个呢?我们确定一个原则是落在度数最少的点。如果可能落子点中有两个点的度数一样且都为是度数最少时,取后求出的点为落子点。因此,如果改变数组b、d中数的存放顺序,遇到两个度数最少点的先后顺序就要改变,整个跳棋路径就可改变。2344443234666643468888644688886446888864468888643466664323444432在下面的程序中,将起落子行列关系的两个一维数组合并为一个二维数组,为了提高程序的可读性,不使用下标为0的数组元素。参考程序:intbase[9][3]={0,0,0,/*从起跳点求落脚点的基础系数数组*/0,1,2,0,2,1,0,2,-1,0,1,-2,0,-1,-2,0,-2,-1,0,-2,1,0,-1,2};main(){inta[9][9],object[9][9];inti,j,k,p,x,y,m,n,cont;intmin,rm1,rm2,rm0=1;140nfor(cont=1;cont>0;){for(i=0;i<=8;i++)/*保存个点度数的数组清零*/for(j=0;j<=8;j++)a[i][j]=0;rm1=base[1][1];/*改变基础数组元素排列顺序*/rm2=base[1][2];base[1][1]=base[rm0][1];base[1][2]=base[rm0][2];base[rm0][1]=rm1;base[rm0][2]=rm2;for(i=1;i<=8;i++){for(j=1;j<=8;j++)/*计算各点度数存入数组a*/{for(p=1;p<=8;p++){x=i+base[p][1];y=j+base[p][2];if(x>=1&&x<=8&&y>=1&&y<=8)a[x][y]++;}printf("%d",a[i][j]);/*输出度数表*/}printf("n");}printf("PleaseInputstartposition:line,colume=?n");scanf("%d,%d",&i,&j);/*输入起跳点坐标*/for(k=1;k<=63;k++)/*求棋盘上63个落步点*/{object[i][j]=k;/*跳步路径存入数组object*/min=10;for(p=1;p<=8;p++)/*求从当前起跳点出发的8个可能落点*/{x=i+base[p][1];y=j+base[p][2];if(x>=1&&x<=8&&y>=1&&y<=8)/*求出的可能落点在棋盘内*/if(a[x][y]!=0)/*此点没有落过棋子*/{a[x][y]--;/*由于[i、j]点落过棋子,此点度数减1*/if(min>a[x][y])/*判断当前可能点度数是否最小*/{min=a[x][y];/*保存可能最小度数点的度数*/m=x;/*保存可能最小度数点的坐标*/n=y;}}}a[i][j]=0;/*落过棋子的[i、j]点度数为零*/i=m;/*已求出的最小度数点为下次搜寻的起跳点*/j=n;}object[i][j]=64;140nfor(i=1;i<=8;++i)/*输出跳步结果路径*/{for(j=1;j<=8;j++)if(j==8)printf("%2d",object[i][j]);elseprintf("%2d",object[i][j]);printf("n");if(i!=8)printf("n");/*每行输出8个数据*/}rm0%=8;/*放在基础数组第一位的元素循环变化*/rm0++;/*基础数组下一元素放在第一位*/printf("continue?(1or0)");scanf("%d",&cont);}}【4.79】分析:采用试探法求解。如图所示,用I、J表示行、列坐标。开始棋盘为空,对于第1个皇后先占用第一行即I=1,先试探它占用第一列J=1位置,则它所在的行、列和斜线方向都不可在放其它皇后了,用线将它们划掉。第2个皇后不能放在J=1、2的位置,试J=3。第2个皇后占用[2、3]后,它的行列和斜线方向也不可再放其它皇后。第3个皇后不能放在J=1、2、3、4的位置,试J=5。第4个皇后可以试位置[4、2],第5个皇后试位置[5、4]。第6个皇后已经没有可放的位置(棋盘上所有格子都已占满),说明前面所放位置不对。退回到前一个皇后5,释放它原来占用的位置[5、4],改试空位置[5、8]。然后再前进到第6个皇后,此时仍无位置可放,退回到第5个皇后,它已没有其它位置可选择。进一步退回到第4个皇后释放位置[4、2]改试位置[4、7],再前进到第5个皇后进行试探,如此继续,直到所有8个皇后都选择一个合适的位置,即可打印一个方案。然后从第8个皇后开始,改试其它空位置,若没有可改选的空位置,则退回到第7个皇后改试其它位置,若也没有空位置可改,继续退,直到有另外的空位置可选的皇后。将它原来占用的位置释放,改占其它新位置,然后前进到下一个皇后进行试探,直到所有8个皇后都找到合适位置,又求出一个解,打印输出新方案。按此方法可得到92个方案。参考答案:#defineNUM8inta[NUM+1];main(){intnumber,i,k,flag,nonfinish=1,count=0;i=1;a[1]=1;while(nonfinish){while(nonfinish&&i<=NUM){for(flag=1,k=1;flag&&k1&&a[i]==NUM)a[i]=1;140nelseif(i==1&&a[i]==NUM)nonfinish=0;elsea[i]++;}elseif(a[i]==NUM)a[i]=1;elsea[i]++;}elseif(++i<=NUM)if(a[i-1]==NUM)a[i]=1;elsea[i]=a[i-1]+1;}if(nonfinish){printf("n%2d:",++count);for(k=1;k<=NUM;k++)printf("%d",a[k]);if(a[NUM-1]=0&&x<2)retuen(2.5-x);elseif(x>=2&&x<4)return(2-1.5*(x-3)*(x-3));elseif(x>=4&&x<6)return(x/2.0-1.5);}main(){floatx;printf("Pleaseenterx:");scanf("%f",&x);if(x>=0&&x<6)printf("f(x)=%fn",findy(x));elseprintf("xisout!n");}【4.81】注释:此程序采用模拟手工方式,对分数进行通分后比较分子的大小。参考答案:main(){inti,j,k,l,m,n;printf("InputtwoFENSHU:n");scanf("%d/%d,%d/%d",&i,&j,&k,&l);/*输入两个分数*/m=zxgb(j,l)/j*i;/*求出第一个分数通分后的分子*/140nn=zxgb(j,l)/l*k;/*求出第二个分数通分后的分子*/if(m>n)printf("%d/%d>%d/%dn",i,j,k,l);/*比较分子的大小*/elseif(m==n)printf("%d/%d=%d/%dn",i,j,k,l);/*输出比较的结果*/elseprintf("%d/%d<%d/%dn",i,j,k,l);}zxgb(a,b)inta,b;{longintc;intd;if(a=10;t++){a[t]=(i%k)/(k/10);k/=10;}if(f(a[0])+f(a[1])+f(a[2])==i)printf("%d",i);}}f(m)intm;{inti=0,t=1;while(++i<=m)t*=i;return(t);}【4.83】分析:任取两个平方三位数n和n1,将n从高向低分解为a、b、c,将n1从高到低分解为x、y、z。判断ax、by、cz是否均为完全平方数。参考答案:main(){voidf();inti,t,a[3],b[3];printf("Thepossibleperfectsquarescombinationsare:n");for(i=11;i<=31;i++)/*穷举平方三位数的取值范围*/for(t=11;t<=31;t++){f(i*i,a);/*分解平方三位数的各位,每位数字分别存入数组中*/140nf(t*t,b);if(sqrt(a[0]*10+b[0])==(int)sqrt(a[0]*10+b[0])&&sqrt(a[1]*10+b[1])==(int)sqrt(a[1]*10+b[1])&&sqrt(a[2]*10+b[2])==(int)sqrt(a[2]*10+b[2]))/*若三个新的数均是完全平方数*/printf("%dand%dn",i*i,t*t);/*则输出*/}}voidf(n,s)/*分解三位数n的各位数字,将各个数字*/intn,*s;/*从高到低依次存入指针s所指向的数组中*/{intk;for(k=1000;k>=10;s++){*s=(n%k)/(k/10);k/=10;}}【4.84】参考答案:main(){inti,j,l,n,m,k,a[20][20];printf("Pleaseentern,m=");scanf("%d,%d",&n,&m);for(i=0;ia[i][k])k=j;/*找出该行最大值*/for(l=0;l=n)/*没有比a[i][k]小的数,循环变量l就超过最大值*/printf("Point:a[%d][%d]==%d",i,k,a[i][k]);}}【4.85】分析:按题目的要求进行分析,数字1一定是放在第一行第一列的格中,数字6一定是放在第二行第三列的格中。在实现时可用一个一维数组表示,前三个元素表示第一行,后三个元素表示第二行。先根据原题初始化数组,再根据题目中填写数字的要求进行试探。参考答案:#include140nintcount;/*计数器*/main(){staticinta[]={1,2,3,4,5,6};/*初始化数组*/printf("Thepossibletablesatisfiedaboveconditionsare:n");for(a[1]=a[0]+1;a[1]<=5;++a[1])/*a[1]必须大于a[0]*/for(a[2]=a[1]+1;a[2]<=5;++a[2])/*a[2]必须大于a[1]*/for(a[3]=a[0]+1;a[3]<=5;++a[3])/*第二行的a[3]必须大于a[0]*/for(a[4]=a[1]>a[3]?a[1]+1:a[3]+1;a[4]<=5;++a[4])/*第二行的a[4]必须大于左侧a[3]和上边a[1]*/if(jud1(a))print(a);/*如果满足题意,打印结果*/}jud1(s)/*判断数组中的数字是否有重复的*/ints[];{inti,l;for(l=1;l<4;l++)for(i=l+1;i<5;++i)if(s[l]==s[i])return(0);/*若数组中的数字有重复的,返回0*/return(1);   /*若数组中的数字没有重复的,返回1*/}print(u)intu[];{intk;printf("nNo.:%d",++count);for(k=0;k<6;k++)if(k%3==0)/*输出数组的前三个元素作为第一行*/printf("n%d",u[k]);else/*输出数组的后三个元素作为第二行*/printf("%d",u[k]);}【4.86】参考答案:#include"string.h"strcmbn(a,b,c)/*数组合并函数:将数组a、b合并到*/chara[],b[],c[];{chartmp;inti,j,k,m,n;m=strlen(a);n=strlen(b);for(i=0;ib[j])c[k++]=b[j++];/*将a[i]、b[j]中的小者存入c[k]*/else{c[k++]=a[i++];if(a[i-1]==b[j])j++;/*如果a、b当前元素相等,删掉一个*/}while(i=2)  当J=1或J=N+1时:其值为1当J!=1且J!=N+1时:其值为第N-1行的第J-1个值与第N-1行第J个值之和。将这些特点提炼成数学公式可表示为:c(x,y)=1x=1或x=N+1c(x,y)=c(x-1,y-1)+c(x-1,y)其它140n下面给出的程序就是根据以上递归的数学表达式编制的。参考答案:#includemain(){inti,j,n=13;printf("N=");while(n>12)scanf("%d",&n);/*最大输入值不能大于12*/for(i=0;i<=n;i++)/*控制输出N行*/{for(j=0;j<12-i;j++)printf("");/*控制输出第i行前面的空格*/for(j=1;j0){a[k]=n%2;turn(n/2,a,k-1);}elsereturn;}main(){inti,n,a[16]={0};printf("nPleaseentern:");scanf("%d",&n);turn(n,a,15);for(i=0;i<16;i++)printf("%d",a[i]);}                  140n                                                                                                        【4.91】分析:分析题目,我们可以将题目进行抽象:在有放回的前提下,求全部从m个不同的元素中任取n个元素的排列。根据题目的含义,我们可以用整数0~m-1表示这m个不同的元素,将要生成的n个元素分为两部分:第一个元素和其它n-1个元素。如果n=1,即要从m个元素中任取1种,这样有m种不同得取法,我们可以直接使用循环完成。若n>1,则可以知道,第一个元素一定有m种不同的取法,可以针对第一个元素m种不同取法种的1种,对后面的n-1个元素进行同样的(递归)操作即可产生一种新的不同的排列。具体算法描述如下:fun(指向第一个元素的指针,从m个元素中,取n个元素){for(i=0;i1)fun(指向下一个元素的指针,从m中,取n-1个)else完成一种排列}}根据以上算法分析可以得出程序。参考答案:#includeinta[10];fun(int*p,intm,intn)/*从m个元素中取n个存入数组p中*/{inti;/*用数0~m-1表示m个不同的元素*/for(i=0;i1)fun(p+1,m,n-1);elseprint(p);}}print(int*p){int*q;for(q=a;q<=p;q++)/*输出结果,将整数转换为字母a起始的序列*/printf("%c",'a'+*q);printf("t");}main(){intm,n;printf("nEntermn:");scanf("%d%d",&m,&n);fun(a,m,n);}【4.92】参考答案:smmt(chars[])/*指针s指向字符串的第一个字符*/{char*p;p=s;while(*p!='')p++;140np--;/*指针p指向字符串的最后一个字符*/if(p==s)return(1);/*两个指针指向同一个字符表示字符串对称*/else{if(*s!=*p)return(0);/*两个指针指向字符不等表示字符串不对称*/else{*p='';smmt(s+1);/*取掉首尾比较过的字符继续比较*/}}}【4.93】参考答案:#includeintn,r,flag;/*flag:标志,=0:表示要另起一行*/main(){ints;printf("EnterN,R:");scanf("%d%d",&n,&r);printf("combinations:n");flag=1;combination(1,r);}combination(s,j)ints,j;/*从s开始选j个元素*/{inti,k;for(i=s;i<=n-j+1;i++){if(flag)for(k=0;k1)combination(i+1,j-1);else{putchar('n');flag=1;}}}【4.94】分析:此题给出的参考答案使用了指针和函数递归的概念。读者在学习完指针的概念后再研究此题。放于此处主要是便于和其它排序方法比较。合并排序法排序的步骤是:第一次将数组中相邻的2个数两两排序,第二遍4个4个地排序,第三遍8个8个地排序......。程序中的合并排序函数(mergesort)采用了递归调用。例如有一组数是:4,3,1,81,45,8,0,4,-9,26,7,4,2,9,1,-1采用合并排序法的过程如下:未排序时4318145804-92674291-1第一遍后3418184504-9264729-11第二遍后1348104845-94726-1129第三遍后0134484581-9-11247926第四遍后-9-101123444789264581140n参考答案:#defineN16#include"stdio.h"merge(a,b,c,m)/*数组合并函数:将长度为m的*/inta[],b[],c[],m;/*数组a、b合并到c*/{inti=0,j=0,k=0;while(ib[j])c[k++]=b[j++];/*将a[i]、*b[j]中的小*/elsec[k++]=a[i++];/*者存入c[k]*/while(i2)/*递归调用结束条件*/{mergesort(w,n/2);/*将数组w一分为二,递归调*/mergesort(w+n/2,n/2);/*用mergesort*/merge(w,w+n/2,ra,n/2);/*将排序后的两数组重新合并*/for(i=0;i*(w+1)){t=*w;*w=*(w+1);*(w+1)=t;}}elseprintf("Error:sizeofarrayisnotapowerof2/n");}main(){inti;staticintkey[N]={4,3,1,81,45,8,0,4,-9,26,7,4,2,9,1,-1};mergesort(key,N);for(i=0;i=q)printf("YESn");}【4.96】参考答案:strcut(s,m,k)chars[];intm,k;{char*p;inti;p=s+m;/*指针p指向要被删除的字符*/while((*p=*(p+k))!='')/*p+k指向要前移的字符*/p++;}【4.97】参考答案:strchg(s)char*s;{charc,*p;p=s;while(*p!='')p++;p--;while(s=p)*(q+1)=*q--;*++q=*s2++;p++;140n}}【4.99】参考答案:strcnb(s1,s2)chars1[],s2[];{char*p;inti=1;p=s1;while(*p!='')p++;while((*p++=*s2++)!='');/*将s2接于s1后面*/p=s1;while(*p!='')/*扫描整个字符串*/{if(*p=='')/*当前字符是空格进行移位*/{while(*(p+i)=='')i++;/*寻找当前字符后面的第一个非空格*/if(*(p+i)!=''){*p=*(p+i);/*将非空格移于当前字符处*/*(p+i)='';/*被移字符处换为空格*/}elsebreak;/*寻找非空格时到字符串尾,移位过程结束*/}p++;}}【4.100】参考答案:#include"stdio.h"structstrnum{inti;charch;}main(){charc;inti=0,k=0;structstrnums[100]={0,NULL};while((c=getchar())!='n'){for(i=0;s[i].i!=0;i++){if(c==s[i].ch){s[i].i++;break;}}if(s[i].i==0){s[k].ch=c;s[k++].i=1;}}140ni=0;while(s[i].i>0){printf("%c=%d",s[i].ch,s[i].i);i++;}}                                           【4.101】分析:程序中函数cmult的形式参数是结构类型,函数cmult的返回值也是结构类型。在运行时,实参za和zb为两个结构变量,实参与形参结合时,将实参结构的值传递给形参结构,在函数计算完毕之后,结果存在结构变量w中,main函数中将cmult返回的结构变量w的值存入到结构变量z中。这样通过函数间结构变量的传递和函数返回结构型的计算结果完成了两个复数相乘的操作。参考答案:#include"stdio.h"structcomplx{intreal;/*real为复数的实部*/intim;/*im为复数的虚部*/};main(){staticstructcomplxza={3,4}/*说明结构静态变量并初始化*/staticstructcomplxzb={5,6};structcomplxx,y,z;structcomplxcmult();/*说明函数cmult的返回值类型是结构complx型*/voidcpr();z=cmult(za,zb);/*以结构变量调用cmult函数,返回值赋给结构变量z*/cpr(za,zb,z);/*以结构变量调用cpr函数,输出计算结果*/x.real=10;x.im=20;y.real=30;y.im=40;/*下一组数据*/z=cmult(x,y);cpr(x,y,z);}structcomplxcmult(za,zb)/*计算复数za×zb,函数的返回值为结构类型*/structcomplxza,zb;/*形式参数为结构类型*/{structcomplxw;w.real=za.real*zb.real-za.im*zb.im;w.im=za.real*zb.im+za.im*zb.real;return(w);/*返回计算结果,返回值的类型为结构*/}voidcpr(za,zb,z)/*输出复数za×zb=z*/structcomplxza,zb,z;/*形式参数为结构类型*/{printf("(%d+%di)*(%d+%di)=",za.real,za.im,zb.real,zb.im);printf("(%d+%di)n",z.real,z.im);}【4.102】参考答案一:#include"stdio.h"140nstructstudent{intn;intmk;};main(){inti,j,k,count=0,no;structstudentstu[100],*s[100],*p;printf("nPleaseentermark(ifmark<0isend)n");for(i=0;i<100;i++){printf("No.%04d==",i+1);scanf("%d",&stu[i].mk);s[i]=&stu[i];stu[i].n=i+1;if(stu[i].mk<=0)break;for(j=0;jmkmk){p=s[j];s[j]=s[k];s[k]=p;}}for(no=1,count=1,j=0;jmk>s[j+1]->mk){printf("nNo.%3d==%4d%4d:",no,s[j]->mk,count);for(k=j-count+1;k<=j;k++){printf("%03d",s[k]->n);if((k-(j-count))%10==0&&k!=j)printf("n");}count=1;no++;}elsecount++;}}参考答案二:#include"stdio.h"#defineN5structstudent{intnumber;intscore;intrank;intno;}stu[N];main(){inti,j,k,count,rank,score;140nstructstudenttemp;for(i=1;i<=N;i++){printf("EnterN.o%d=",i);scanf("%d%d",&temp.number,&temp.score);for(j=i-1;j>0;j--)if(stu[j-1].score#defineSIZE3structstudent/*定义结构*/{longnum;charname[10];intage;charaddress[10];}stu[SIZE],out;voidfsave(){FILE*fp;inti;if((fp=fopen("student","wb"))==NULL)/*以二进制写方式打开文件*/{printf("Cannotopenfile.n");/*打开文件的出错处理*/exit(1);/*出错后返回,停止运行*/}for(i=0;imain(){FILE*fp;charstr[100],filename[15];inti;if((fp=fopen("test","w"))==NULL){printf("Cannotopenthefile.n");exit(0);}printf("Inputastring:");gets(str);/*读入一行字符串*/for(i=0;str[i]&&i<100;i++)/*处理该行中的每一个字符*/{if(str[i]>='a'&&str[i]<='z')/*若是小写字母*/str[i]-='a'-'A';/*将小写字母转换为大写字母*/fputc(str[i],fp);/*将转换后的字符写入文件*/}fclose(fp);/*关闭文件*/fp=fopen("test","r");/*以读方式打开文本文件*/fgets(str,100,fp);/*从文件中读入一行字符串*/printf("%sn",str);fclose(fp);}【4.106】参考答案:#include"stdio.h"FILE*fp;main(){intc,d;if((fp=fopen("d:\tc\test8.c","r"))==NULL)exit(0);while((c=fgetc(fp))!=EOF)if(c=='/')/*如果是字符注释的起始字符'/'*/if((d=fgetc(fp))=='*')/*则判断下一个字符是否为'*'*/140nin_comment();/*调用函数处理(删除)注释*/else/*否则原样输出读入的两个字符*/{putchar(c);putchar(d);}elseif(c=='''||c=='"')/*判断是否是字符'或"*/echo_quote(c);/*调用函数处理字符'或"包含的字符*/elseputchar(c);}in_comment(){intc,d;c=fgetc(fp);d=fgetc(fp);while(c!='*'||d!='/'){/*连续的两个字符不是*和/则继续处理注释*/c=d;d=fgetc(fp);}}echo_quote(c)intc;/*c中存放的是定界符'或"*/{intd;putchar(c);while((d=fgetc(fp))!=c)/*读入下一个字符判断是否是定界符c*/{putchar(c);/*当不是定界符c时继续循环*/if(d=='\')/*若出现转义字符*/putchar(fgetc(fp));/*则下一个字符不论是何均原样输出*/}putchar(d);}                                                         140
查看更多

相关文章

您可能关注的文档