




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础教程(c语言版)课后答案程序设计基础教程(c语言版)课后答案程序设计基础教程(c语言版)课后答案资料仅供参考文件编号:2022年4月程序设计基础教程(c语言版)课后答案版本号:A修改号:1页次:1.0审核:批准:发布日期:z习题解答目录习题解答............................................................................................................3选择题....................................................................................................3填空题....................................................................................................3编程题....................................................................................................4习题解答............................................................................................................5选择题....................................................................................................5填空题....................................................................................................7编程题....................................................................................................8习题解答...........................................................................................................11选择题...................................................................................................11填空题..................................................................................................12编程题..................................................................................................12习题解答..........................................................................................................15选择题..................................................................................................15填空题..................................................................................................17编程题..................................................................................................18习题解答..........................................................................................................29选择题..................................................................................................29填空题..................................................................................................31编程题..................................................................................................33习题解答..........................................................................................................37选择题..................................................................................................37填空题..................................................................................................41编程题..................................................................................................43习题解答..........................................................................................................67选择题..................................................................................................67填空题..................................................................................................68编程题..................................................................................................682习题解答选择题1、B【分析】在一个C程序中必须有且只能有一个main函数,而且main函数可以在任何地方出现.2、C【分析】C语言中合法以的标识符组成为:字母,数字,下划线,且数字不能打头,亦不能为关键字。A中,-sub不合法。B中4d不合法。D中void为关键字。3、【分析】4、C【分析】转义字符中,第一个\”输出“,第二\\输出\,第三个\b退格,把前一个\去掉了,第四个\’输出’,第五个\t跳格,第六个\”输出”,第七个\n输出换行。5、C【分析】本题将10进制17,分别按8、16进制输出。8的进制21=2*8+1*1=17(10,16制11=1*16+1*1=17(10)填空题1、主【分析】一个C源程序中至少包括一个主函数,其他函数没有限制。2、双引号。【分析】两种写法都是允许的,使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找.使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。3、261,b1【分析】将10进制的177,按8进制和16进制两种形式输出。4、a=3b=7x=y=c1=Ac2=a【分析】scanf函数中,格式说明符以外的原样输入。5、printf函数中,格式说明符以外的原样输出。%控制输出结果中共m位,小数3占n位。【分析】编程题1.#include""voidmain(){floatqianmi,yingli;#include""voidmain(){charx;printf("请输出一个小写小母\n");scanf("%c",&x);printf("输出字母的大写型式为:%c",x+32);}3、#include<>voidmain(){floatc,f;printf("请输入一个摄氏温度:");scanf("%f",&c);f=32*c+5*c;4printf("华氏温度为:%\n",f);}4.#include<>voidmain(){inta=3,b=4,c=5;floatx=,y=,z=;doubleu=51274,n=128765;printf("a=%-3d,b=%-3d,c=%d\n",a,b,c);printf("x=%,y=%,z=%\n",x,y,z);printf("x+y=%,y+z=%,x+z=%\n",x+y,y+z,x+z);printf("u=%.0lfn=%.0lf\n",u,n);printf("c1='a'or97\nc2='b'or98\n");}习题解答选择题1、C.【分析】C语言的运算符按运算对象的个数可以分为单目、双目和三目运算符和多目运算符。2、C.【分析】%运算符要求参加运算的数必须是整数3、A.【分析】B.赋值运算的作用是用将常量赋给变量,而不能给表达形式所以a*3=2不对。C.%运算符要求参加运算的数必须是整数,而x是float类型所以x%(-3)不对。D.y=float(i),由于i是int类型,向float类型转换是自由转的,不需要强制转。4、A.【分析】因为k=7,x=12;x%=k,则x=12%7,此时x=5,而k%=5,即k=7%5此时K=2,所以(x%=k)-(k%=5)就等价于5-2=3。同理,x%=(k%=5)的值为0;x%=(k-k%5)的值为2;x%=k-k%5的值也为25、A.5【分析】首先通过n*100+将原数扩大100,并通过+判断是否进位。之后/100进行舍去小数点后第三位的运算。6、B.【分析】分析根据优先级别,先计算小括号里,y与3相等成立所以表达式的值为1,再将1赋给x,而x的值就是表达式的值为1.7、A.【分析】略8、D.【分析】“a大于等于10”、“a小于等于0”两者分别为关系运算,一个“或”字又表明为逻辑或运算,所以D对。9、B.【分析】在逻辑表达式求解中,并不是所有的逻辑运算符都被执行,对&&运算符来说,只有前一个表达式不等于0时,才继续进行右边的运算。由于a>b为0,所以左边的表达式为0,所以右边的++n将不被计算,所以n的值不变仍为2。10、B【分析】241的二进制形式为,15的二进制形式为00011111,进行按位&运算后为00010001;a的二进制形式为01100001,z的二进制形式为01111010,进行按位|运算后为0。00010001与0都为非0元素,所以再进行&&时结果一定为1。11、A【分析】b>>2表示向右移动两位,相当于除以两个2结果为8/2=4;同理,b>>1相当于除一个2,结果为6,4/6为0。12、B【分析】3的二进制数为00000011。10的二进制为00001010,a<<2的结果为00001100,b==1的值为0,所以00001100与0按位或之后结果为00001100。即10进进制的12。13、D.【分析】就运算符的优先级别而言,单目>双目,算术运算>关系运算>逻辑运算。14、B【分析】19的二制数为00010011,23的二进制数为00010100,两者进行按位与后结果为00010000十进制16,即为16进制的13。15、C【分析】0x39的二进制形式为00111001,0xf的二进制形式为00001111,两者进行异或运算,异或结算的规则,参加运算的两个二进制位同号,则结果为假,异号则为真。结果为:00110110即为16进制的36。16、A6【分析】进行按位或运算,要a的低8位为1,则要求b的低8位全为1,高8位要求不变,则要求高8位全为0,即b应该为:00000000,即为8进制的0377。17、A【分析】由题得1>2不成立,所以x>y++x:++y表达式的值为++y,则此时Y的值为3,而++x没有被执行,所以x的仍值为1,而Z的值与表达式的值相同所以选A。18、C【分析】赋值运算符的作和是将一个表达式或一个变量,常量赋给另一个变量,赋值号的左边只能是变量,不能是常量,所以A、B、D不对。19、B【分析】逗号运算符是级别最纸的运算符,逗号表达式也是值是所有表达式中最右边的值。即a+b的值,由题从左向右算起,b++后b为6,则a+b为8.20、D【分析】在不同种数据类型进行计算时的转换规则是:数据类型低的全部转换成运算过程中级别最高的。在int、long、unsigned和char四个类型中,long的类型级别最高,所以结果的类型为long.填空题1.【分析】“/”要求两操作数如果一个为实数结果都为实数,如果都为整数结果也为整数,所以a/=,a/4=2.所以原式=*10=。2.5,32【分析】x++表示将x的值拿来用,然后再++;而y*=x++等价于y=y*x,即y=8*4=32,此计算结束之后x的值才增加1,变为5。3.-40【分析】赋值运算符的结合方向是从右向左的,所以先计算a*a=25,所以a+=a-=a*a等价于a+=(a-=25),而此时a仍为5.接下来计算a-=25得a=2-25=-20;则a+=(a-=25)等价于a+=-20,所以a=a-20=-20-20=-40。4.16【分析】x+=--x%--y等价于x+=(--x)%(--y),--放在变量的前面时,要先对变量进行变化,然后再用,所以原式即为x+=14%3,而14%3=2,即x+=2,而此时x=14,所以x=x+2=16。5.x>1&&x<10||x<0&&x!=-1【分析】略6.07【分析】根据运算符的优先级别,算术运算>关系运算>逻辑运算可知,要先算a+b=7,接下来计算7>c即7>5成立为1,然后计算b==c,而4==5不成立,所以值为0,即最终表达式等价于1&&0,所以结果为0.7.0【分析】略,同第6题。8.-17【分析】条件运算符优先级别高于赋值运算符,所以先算(a<b)a:b的值,由于13<25成立,所以(a<b)a:b的值为a的值,并将a的值赋给y,此时,原式等价于(13<-17)y:c,而13<-17不成立,所以表达式的值为C的值,即为-17。9.18,3,3【分析】对逗号表达式的值,即为从左向右最后一个表达式的值,本题中表达式的值即为6*a的值即18。10.【分析】算术运算符中同一级别的运算符按从左向右的顺序进行,所以先算a%43=8,再计算8*(int)(x+y)=8*9=72,再计算72%3=0,再计算0/5=0.最后计算与X相加,所以最终结果为。编程题1.编写一个程序,要求输入圆的半径r,计算并输出该圆的周长和面积。#definePI#include""voidmain(){floatr,S=0,L=0;printf("inputr:\n");scanf("%f",&r);S=PI*r*r;假设美元与人民币的汇率是1美元兑换元人民币,欧元与人民币的汇率是1欧元兑换元人民币,编程实现输入人民币的钱数,输出能兑换的美元及欧元金额。#include""voidmain(){floatrenminbi,meiyuan,ouyuan;8printf("inputrenminbi:\n");scanf("%f",&renminbi);meiyuan=renminbi*;编写一个程序,从键盘上输入3个字符后,按各字符的ASCII码从小到大顺序输出这些字符。编程实现输入一个无符号整数(unsigned类型),分别输出它的低四位和高四位。#include<>(待查)main(){unsignedu=0xffff;h=u>>8;根据当前银行的利率表,编程实现从键盘输入存款金额money,存期year和年利率rate,计算银行存款的本息sum(保留1位小数)。#include<>intmain(){intyear;floatmoney,rate,sum;printf("请输出金额,利率,存款时间\n");scanf("%f,%f,%d",&money,&rate,&year);sum=money*year*rate;printf("存款的本息sum=%.1f\n",sum);10}习题解答选择题1.D【分析】在此要注意,else总是于之前面最近的且没有用过的if进行配对,所以在本题中,else与第二个if配对,且整体做为第一个if语句的语句体。又因,10>20不成立,所以第一个if根本不被执行,所以m的值没有任何变化。2.A【分析】else总是于之前面最近的且没有用过的if进行配对,所以在本题中,if(a>b)t=s+t;elseif(a==b)t=5;elset=2*s;相当于t=s+t;(a>b)t=5(a=b);t=2*s(a<b);3.C【分析】while(E)的含义是当E为真。为真即为不等于0,而A、B、D都是表示非零。4.D【分析】i=0,++i后,i为1,i%2=1,所以执行j+=i;即j=1,i=1小于5所以还执行++i,此时i为2,则i%2等于0,跳出本次判断。同理当i等于4,6时同样跳出判断,而当i为3,5时,都要执行j+=i。5.A【分析】while(1)进行判断时,条件永远成立,所以执行循环体。输出一个“*”后,i++,i变为1,又1<3成立,所以结束循环。6.D【分析】当i=1时,执行s+=i后s=1;执行循环体中i++后,i为2,而后还要执行一次for结构中的i++,则i为小于6成立,则再执行s+=i;i++;则s为4,i为4,而后还要执行一次for结构中的i++,则i为5,同样5小于6成立,则再执行s+=i;i++;则s为9,i为6,而后还要执行一次for结构中的i++,则i为7,且7小于6已不再成立。所以最后输出977.B【分析】在for(语句1;语句2;语句3)结构中,语句1为初值,语句2为循环体执行的条件,语句3为变量自增语句。本题中i为2,i==0不成立,所以循环体不被执行。8.D11【分析】a=1,a<8成立,所以执行循环体b+=a;a+=2;后,a=3,b=3,再执行for结构中的a++,则a=4,b=3.以后同理。9.B【分析】当a=1时b=1,执行循环体,b>=20不成立,b%3==1成立,则执行b+=3;continue;则b=4,然后跳出本次行循环,则此时a=2,b=4.以后同理进行判断。10.A【分析】对于双重循环,外层循环变化一次,内层变化一个循环。本题。当i=1时,j可以为3、2、1,同理当当i=2时,j可以为3、2、1;当i=3时,j可以为3、2、1;而语句if(i*j>3)break;则表时,如果i*j>3时结束整个for循环。条件不成立时再执行m*=i*j;填空题1.hn*2【分析】sn为第n次落地时共经过的米数,hn为第n次反弹的高度n>=2,hn*2才为第n次经过的距离。2.n!=0j++【分析】由输出语句可知,定义的变量i,j分别用于存放正数和负数的个数。所以只要输入的数不是0,则进行判断。3.0k/10count++【分析】count作为累计的和所以初值一定为0;而while循环的作用是将指定的数k的各各位上的字数字取出来。k%10负责实现取出K的个位。则前两位则需通过k/10来实现。if(t==10)成立即是需要的数字,则总数需要自增。所以count++.4.50(i*【分析】本题的累加问题中,累加50次,即i<=50,两个相除时如果都为整数则结果一定为整数,为此,需要将分母转化成FLOAT类型。所以填(i*。5.2*i-1printf("\n");i【分析】略编程题1.编写一个程序,计算并输出下列分段函数值:26,356010,2,3153,2,3,10xxxxyxxxxxxxxxxx⎧+−<=≠⎪=−+≤<≠≠⎨⎪−−=−==≥⎩12其中,x从键盘输入。#include""intmain(){floatx,y;printf("输入X");scanf("%f",&x);printf("\n");if(x<0&&x!=-3){y=x*x+2*x-6;}elseif(0<=x&&x<10&&x!=2&&x!=3){y=x*x-5*x+6;}elsey=x*x-x-15;printf("y=%f",y);}2.编写一个程序,从键盘输入年和月,计算并输出该年的该月份共有多少天。算法分析:要考虑大月有31天,小月有30天,闰年的二月有29天以及非闰年的二月有28天这几种情况。源程序:#include<>intmain(){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;/*如果是闰年*/13elsedays=28;/*不是闰年*/break;default:printf("Inputerror!\n");/*月份输入错误*/days=0;}if(days!=0)printf("%d,%dis%ddays\n",year,month,days);return0;}3.编写一个程序,计算并输出下列级数之和:1...2!3!!xxxexn=+++++其中n与x从键盘输入。#include""#include""main(){inti,n;doubles=,s1=,x;scanf("%d,%f",&n,&x);for(i=1;i<=n;i++){s1=s1*i;/*各项中的阶乘*/s=s+pow(x,i)/s1;/*按公式求出*/}printf("s=%f",s);}4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。#include""main(){charc;inti=0,j=0,k=0,l=0;while((c=getchar())!='\n'){if(c>=65&&c<=90||c>=97&&c<=122)i++;编写一个程序,解决猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个;到第10天早上想再吃时,只剩一个桃子了。问猴子第一天共摘了多少桃子14#include""main(){inti=1,sum=0;for(;i<=10;i++)sum=2*sum+1;printf("sum=%dn",sum);}习题解答选择题1.D【分析】定义一维数组的语法格式为“类型标识符数组名[整型常量表达式];”,其中“整型常量表达式”是用来说明数组元素的个数,可以是整型常量、整型常量表达式或符号常量,但不能包含变量。选项A用圆括号定义数组a,是错误的;而选项B和C中,用变量n来说明数组a长度,是错误的。2.C【分析】一维数组的初始化的语法格式为“类型标识符数组名[整型常量表达式]={常量1,常量2,...常量n};”,所赋初值放在赋值号后的一对花括号中。选项A把初值放在一对圆括号内,是错误的;选项B花括号中没有初值,而且语句没有“;”,是错误的;选项D中初值没有用花括号括起来,是错误的。3.B【分析】选项A定义数组art有5个元素,而花括号中只提供2个初值,分别赋值给art[0]和art[1],其余元素自动赋值为0;选项B通过花括号的初值确定数组art有2个元素;选项C和D定义的数组art是等价的,表示含有5个元素,其值分别为“89、-23、0、0、0”。4.A【分析】C语言中,二维数组排列的顺序是“按行存放”的,即先存放第0行的元素,再存放第1行的元素,以此类推。5.B【分析】C语言中,二维数组是“按行存放”的,元素a[i][j]前面存放了i行,共i*m个元素,在第i行的第j列前面有j个元素,因此元素a[i][j]前的元素个数为i*m+j。6.D【分析】选项A定义了a是一个1行4列的二维数组,但初值{1,2,3,4,5}却是1行5列,是错误的;选项B在初始化语句中省略了第二维的长度,是错误的;选项C定义了b是一个2行3列的二维数组,但初值{{1},{1,2},{1,2,3}}却是3行,是错误的;选项D省略了第一维的长度,第二维长度为3,因此选项D等价于“doubley[1][3]={0};”。7.D【分析】字符串"ABCDEFGH"占9个字节,其中字符串结束标志'\0'多占用了1个字节。选项A、B和C都只定义了8个元素的字符数组,是错误的。158.D【分析】语句“chara[]="ABCDEF";”定义了一个字符数组,并字符个数确定数组的长度,而"ABCDEF"使以字符'\0'为结束标志的一个字符序列,共7个字符,因此数组a长度为7;而语句“charb[]={'A','B','C','D','E','F'};”则定义了长度为6的字符数组,因此a数组比b数组长度长。9.B【分析】格式说明符“%.4s”可以用来输出字符串中前4个字符,因此选项B正确。10.B【分析】字符串输入函数gets(),其语法格式为“gets(字符数组名)”,选项A包含2个字符数组名,是错误的;选项D中gets函数的参数是字符串,也是不正确的;scanf函数使用%s格式说明符进行字符串输入,其输入项为数组名,选项C在数组名a和b前加“&”符号,是错误的。11.D【分析】strcmp(s1,s2)将字符串s1和s2自左向右按字符的ASCII码值逐对进行比较,直到出现不同的字符或遇到'\0'为止,如果s1等于s2,则strcmp(s1,s2)等于0;如果s1大于s2,则strcmp(s1,s2)大于0;如果s1小于s2,则strcmp(s1,s2)小于0。12.C【分析】字符串复制函数strcpy(str1,str2)将字符串str2同串结束标志'\0'复制到字符串str1中,函数返回str1的指针。字符串连接函数strcat(str1,str3)将字符串str3连接到字符串str1之后。因此本题答案为选项C。13.A【分析】结构体变量占内存的大小是该结构体各成员所需内存量的总和。14.D【分析】程序中定义了一个结构体数组cnum[2],包含2个元素,并将初值{1,3,2,7}依次赋值给cnum[0].x、cnum[0].y、cnum[1].x和cnum[1].y。因此,表达式“cnum[0].y/cnum[0].x*cnum[1].x”的值为6。15.C【分析】将初值{"John",17,"Paul",19,"Mary",18,"adam",16}分别赋值给c[0].name、c[0].age、c[1].name、c[1].age、c[2].name、c[2].age、c[3].name、c[3].age,因此选项C能够打印出Mary。16.C【分析】程序中定义了一个共用体类型的变量u1,共用体各成员共同使用4字节内存空间,初值=’A’,所以=65,输出是以%c格式符输出的,因此本题答案为选项C。17.D【分析】变量a是一个结构体类型,所占内存的大小是该结构体各成员所需内存量的总和。整型变量c占4字节内存,共用体类型变量k占内存的大小是该共用体中最大的一个成员j所占用的内存量,为4字节,因此本题答案为选项D。18.A【分析】变量u是一个共用体类型变量,共用体类型变量u占内存的大小是该共用体中最大的一个成员c所占用的内存量共4个字节,共用体的所有成员公用一个存储空间,同一时间只能存储一个成员,并且所引用的是最后一次存入成员的值。因此本题答案为4,34,12。1619.B【分析】选项A定义枚举类型不能使用“=”,是错误的;选项C定义枚举类型时,花括号中的一些名字是程序设计者自己指定的,命名规则与标识符相同。无固定含义,只是一个符号。选项C中以数字作为标识符是错误的,选项D有双引号是错误的,因此本题答案为选项B。20.B【分析】选项A的正确定义语句为typedefchar*STRING[255];选项C的正确定义语句为typedefcharSTRING;选项D的正确定义语句为typedefchar*STRING;因此本题答案为选项B。填空题1.04【分析】二维数组x[3][5]由3行5列组成,行列下标都从0开始,即元素从x[0][0]开始到x[2][4],因此最小行下标为0,最大列下标为4。2.a[k]!=y【分析】while循环用于访问a数组中的每个元素,从最后一个元素到第一个,直到一个等于y的元素被找到为止,如果查找成功,输出下标值k,否则继续查找,直到数组元素全部查找一遍。因此while循环的条件为a[k]!=y。3.&a[i]i%4==0printf("\n");【分析】scanf语句要求给数组a中的每个元素赋初值,因此为&a[i];程序要求以每行4个数据的形式输出a数组,在for循环语句中加入条件判断语句,如果一行输出4个元素(i%4==0)则打印输出一个回车换行符printf("\n")。4.j=2j>=0【分析】前一个嵌套的for循环输出数组a主对角线上的元素之和。后一个嵌套的for循环输出数组a次对角线上的元素之和。次对角线上的元素满足的特点是行下标和列下标的和为2,内层for循环第三条语句为j--,所以j的初值为2,条件为j>=0。5.s[len]!='\0'【分析】本程序是输出字符数组s中存放的字符串的长度,从s[0]开始,向后搜索,每搜索一个元素,len增1,直到遇到字符串结束标志‘\0’为止。重复过程结束。这时,len中所保存的就是s中有效字符的个数。6.str[0]s【分析】strcpy(s,str[0])函数是将字符串str[0]复制到字符数组s中,先假设字符串str[0]中存放的是三个字符串中最小的,strcmp()函数是将两个字符串比较,总把最小的字符串放到s中。最后输出s。177.12【分析】结构体变量占内存的大小是该结构体各成员所需内存量的总和。结构体类型structdate中共定义三个成员都为int类型,共占12个字节。8.【分析】嵌套结构体类型定义变量,采用逐级访问的方式对变量赋值。式中的圆点“.”称为成员运算符。9.48【分析】共用体类型的所有成员公用一个存储空间,同一时间只能存储一个成员,并且所引用的是最后一次存入成员的值。则10.16【分析】枚举类型变量的值是一些整数,从花括号的第一个名字开始,系统自动赋予从0开始的值。Red=0,yellow=1;若在定义类型时对枚举常量进行了初始化,则按照初始化的值计算,blue=4,green=5,white=6。编程题1.编写一个程序,计算Fibonacci数列的前15个数,并将其存储到一维数组fib中,然后输出结果。Fibonacci数列的定义为:11011>==⎪⎩⎪⎨⎧+=nnnFFF【问题分析】【程序代码】#include<>intmain(){intfib[15]={1,1};inti;for(i=2;i<15;i++)fib[i]=fib[i-1]+fib[i-2];for(i=0;i<15;i++)printf("%5d",fib[i]);printf("\n");return0;}2.有一个已经排好序的数组,编写一个程序,实现输入一个数,并按原来排序次序将该数插入到数组中。【程序代码】18#include<>intmain(){constintN=10;随机生成50个1~200之间的整数,并存入数组a中,然后输出这些整数;同时找出数组a中的所有素数,存入数组b,并按每行5个元素的格式由大到小输出这些素数。【程序代码】#include<>#include<>#include<>#include<>intmain(){inta[50],b[25]={0};intnum=0,flag;inti,j,t;编写一个程序,实现在一个5行6列的矩阵中查找指定数据,并输出该数据及其在矩阵中的位置。【程序代码】#include<>intmain(){inta[5][6]={{23,56,78,90,12,45},{13,14,16,17,18,19},{32,35,36,38,39,31},{41,43,45,46,48,49},{51,52,53,55,57,58}};inti,j,c,r;intd;编写一个程序,用二维数组来实现输出如下形式的杨辉三角形(要求输出前6行)。11112113311464115101051【程序代码】#include<>intmain(){inta[6][6],i,j;for(i=0;i<6;i++){a[i][i]=1;输入一个3×4的实数矩阵a和一个4×2的实数矩阵b,编写一个程序,计算两矩阵的积c=a×b。c中各元素保留2位小数,第3位小数四舍五入。【程序代码】#include<>intmain(){21floata[3][4],b[4][2],c[3][2];inti,j,k;printf("输入矩阵a:\n");for(i=0;i<3;i++)for(j=0;j<4;j++)scanf("%f",&a[i][j]);printf("输入矩阵b:\n");for(i=0;i<4;i++)for(j=0;j<2;j++)scanf("%f",&a[i][j]);输入一个5行5列的矩阵,编写一个程序,计算并显示输出该矩阵最外圈元素的合计值。【程序代码】#include<>intmain(){inta[5][5];inti,j,sum=0;printf("输入矩阵a:\n");for(i=0;i<5;i++)for(j=0;j<5;j++)scanf("%d",&a[i][j]);for(i=0;i<5;i++)22for(j=0;j<5;j++)if((i==0)||(i==4)||(j==0)||(j==4))sum=sum+a[i][j];printf("矩阵最外圈元素的合计值为%d",sum);return0;}8.输入一个字符串,编写一个程序,统计其中有多少个单词,单词之间用空格分隔。【程序代码】#include<>intmain(){charstr[100];inti,num=0,word=0;charc;gets(str);输入一个字符串,编写一个程序,将该字符串中的所有大写字母转换成相应的小写字母,所有小写字母转换成相应的大写字母。【程序代码】#include<>intmain(){charstr[100];inti=0;printf("Enterthestring:\n");gets(str);while(str[i]!='\0'){if((str[i]>='A')&&(str[i]<='Z')){str[i]=str[i]+32;i++;}elseif((str[i]>='a')&&(str[i]<='z')){str[i]=str[i]-32;i++;}23elsei++;}printf("Outputthestring:\n");puts(str);return0;}10.输入两个字符串str与substr,编写一个程序,删除主字符串str中的所有子字符串substr。【程序代码】#include<>#include<>intmain(){charstr[100],substr[100];chart[100]={'\0'},s[100]={'\0'};inti=0,j,k=0,len;printf("请输入主字符串:\n");gets(str);printf("请输入子字符串:\n");gets(substr);len=strlen(substr);编写一个程序,输入N个学生的学号、姓名和成绩,每个学生有三门课程的考试成绩,查询总分高于240和任意一科不及格的学生,并输出查询结果。【程序代码】#include<>constintN=3;structstudentum,stu[j].name);for(i=0;i<3;i++)scanf("%d",&stu[j].score[i]);}core[i];if(stu[j].score[i]<60)flag=1;}if((sum>=240)||(flag==1))printf("%d%s\n",stu[j].num,stu[j].name);}return0;}12.采用结构体类型编写一个程序,实现输入三个学生的学号以及数学、语文、英语成绩,然后计算每位学生的总成绩以及平均成绩并按总分由大到小输出成绩表。【程序代码】#include<>structstudentum);for(i=0;i<3;i++)scanf("%d",&stu[j].score[i]);}otal=0;for(i=0;i<3;i++)stu[j].total=stu[j].total+stu[j].score[i];stu[j].avg=(float)(stu[j].total/;}core>stu[k].score)k=j;,stu[i].total,stu[i].avg);return0;}13.采用共用体类型编写一个程序,实现零件清单的数据的输入和输出。零件数据包含零件编号、零件名称、本厂生产、零件来源等字段,若零件是本厂生产的,则“零件来源”用车间代码(整型)表示;若零件不是本厂生产的,则“零件来源”用来源单位(字符数组)填写。【程序代码】#include<>constintN=2;intmain(){struct{charnum[10];charname[15];26charcreate;union{intno;charaddr[20];}from;}sp[N];inti;printf("请输入零件清单:\n");for(i=0;i<N;i++){scanf("%s%s",sp[i].num,sp[i].name);getchar();reate);if(sp[i].create=='y'||sp[i].create=='Y')scanf("%d",&sp[i].;elsescanf("%s",sp[i].;}printf("%10s%10s%10s%10s\n","零件编号","零件名称","本厂生产","零件来源");for(i=0;i<N;i++){printf("%10s%10s%5c",sp[i].num,sp[i].name,sp[i].create);if(sp[i].create=='y'||sp[i].create=='Y')printf("%15d\n",sp[i].;elseprintf("%15s\n",sp[i].;}return0;}14.盒子中有红、黄、蓝、白、黑5种颜色的球若干个,每次从盒子中先后取出3个球,得到3个不同颜色的球的可能取法,输出每种排列情况。【程序代码】#include<>intmain(){enumColor{red,yellow,blue,white,black};enumColori,j,k,pri;intn,loop;n=0;for(i=red;i<=black;i=enumColor(i+1))for(j=red;j<=black;j=enumColor(j+1))if(i!=j){for(k=red;k<=black;k=enumColor(k+1))27if((k!=i)&&(k!=j)){n++;printf("%4d",n);for(loop=1;loop<=3;loop++){switch(loop){case1:pri=i;break;case2:pri=j;break;case3:pri=k;break;default:break;}switch(pri){casered:printf("%10s","red");break;caseyellow:printf("%10s","yellow");break;caseblue:printf("%10s","blue");break;casewhite:printf("%10s","white");break;caseblack:printf("%10s","black");break;}}printf("\n");}}printf("total:%5d\n",n);return0;}15.编写一个程序,声明一个颜色的枚举类型,根据键盘输入的非负整数值,显示输出颜色的英文名称。【程序代码】#include<>intmain(){enumColor{red,yellow,blue,white,black};enumColorcolor;intc;scanf("%d",&c);switch(c){【分析】C源程序是由函数组成的。C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言。由于采用了函数模块式的结构,C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。2.B【分析】在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。函数还可以自己调用自己,称为递归调用。3.C【分析】有参函数定义的一般形式为“类型标识符函数名(类型形参,类型形参…){函数体}”。很显然,A、B和D错误。4.B【分析】函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。如函数值为整型,在函数定义时可以省去类型说明。5.B【分析】函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。296.B【分析】在C语言中,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误。根据题中main()函数中函数调用语句“fun(x,a)”可知,函数fun的实参有两个,依次为“float类型和int类型”,所以函数fun的首部也应包含两个形参,并且类型和顺序应与实参一致。7.C【分析】函数f有两个参数(e1,e2)和(e3,e4,e5),每个参数都是一个逗号表达式。8.D【分析】函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换,所以D的说法不正确。A、B和C选项的说法正确,并且,在函数中允许有多个return语句,但每次调用只能有一个return语句被执行,因此只能返回一个函数值。9.D【分析】C语言中,形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送,所以形参只能是变量。10.D【分析】C语言中,可以用以下3种方式调用函数:函数语句:函数调用的一般形式加上分号即构成函数语句。函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。11.D【分析】main()函数中,函数调用语句“r=func(func(x,y),z);”的调用过程是,先调用函数“func(x,y)”即将“x”和“y”的值传给函数func的形参,计算“x+y”结果为“7”,然后将结果“7”作为函数“func(func(x,y),z)”的实参,再调用函数“func”,计算“7+z”结果为“15”,最后将返回值“15”赋给变量“r”。12.C【分析】题中语句“intx,y;”定义了两个外部变量“x”和“y”,即全局变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。外部变量“x”和“y”不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。在定义点之前的函数“num()”想引用外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。该程序从“main()”函数开始执行,改变了外部变量“x”和“y”的值,接下来调用函数“num()”,将外部变量“x”和“y”的值重新赋值为“5”和“25”,最后返回“main()”函数,输出结果。13.A30【分析】根据题意,π值的应该为小数形式,所以正确答案应该从“A”和“B”中选,结合题中给出的计算π值的公式,s应为“s=s+(i*i)”,显示A答案正确。14.B【分析】语句“while(s[i]!='\0')i++;”的执行过程是,先判断字符串“S”是否结束,如果不结束,则“i++”,即取下一个字符继续判断,所以当遇到字符串结束标志后,变量i不再执行“i++”操作,此时i的值即为字符串的长度,所以应返回i的值。15.B【分析】局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。主函数main中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。所以在main函数体内定义的变量也是局部变量,因此B的说法不正确。16.A【分析】在复合语句中也可定义变量,其作用域只在复合语句范围内。17.A【分析】在复合语句中也可定义变量,其作用域只在复合语句范围内。18.A【分析】函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。自动变量用关键字auto作存储类别的声明。关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。19.A【分析】在C语言源程序中凡是以“#”开头的均为预处理命令。20.A【分析】对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。本题中宏“Y(n)”的形参为“n”,宏定义为“((N+1)*n)”,所以调用宏“Y(5+1)”时,“n”由“5+1”代换,最终结果为:Z=2*(3+((3+1)*5+1))=48。通常在宏定义中,字符串内的形参通常要用括号括起来以避免出错。填空题1.全局局部【分析】全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。形参变量是属于被调函数的局部变量。2.定义调用31【分析】在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。函数还可以自己调用自己,称为递归调用。3.函数值的类型【分析】函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。4.从变量定义处开始到本程序文件的末尾【分析】外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。5.14【分析】函数fun的功能是将两个参数的值相加求和,再把结果返回给主调函数。main函数在调用函数fun时,将“x+4”和“x”作为实参传递给对应形参,所以计算后结果为“x+4+x=5+4+5=14”。6.maxis55【分析】函数max的功能是求包含了n个元素的数组的最大值,并将结果返回给主调函数。main函数定义并初始化了一个包含了8个元素的数组,并将数组名与数组中元素的个数作为max函数的实参传递给对应的形参,所以求出的最大值是55.7.sum(i)sum(n-1)+n【分析】main()函数使用变量“i”接收用户输入的数值,并将“i”作为sum函数的实参,调用sum函数计算“1到i的和”。函数sum(intn)的功能是使用形参“n”接收实参“i”传递过来的值,求1到n的和,当n=1时,sum=1;当n=2时,sum=1+2可以写成sum=sum(1)+2;当n=3时,sum=1+2+3可以写成sum=sum(2)+3;所以sum=1+2+3+…+n可以写成sum(n-1)+n。8.(3,2)(6,5)(9,8)(12,11)【分析】main函数使用“for”语句,循环调用“fun()”函数共4次。“fun()”函数中,变量“a”为局部静态变量,因为在定义时没有赋初值,所以编译时自动赋初值0,并且“a”值在函数调用结束后不消失仍保留上次计算后的值。在“fun()”函数中,“printf("(%d,%d)\n",a+=3,a+b);”语句在执行时,调用printf函数时要输出两个表达式的值(a+=3和a+b分别是两个表达式),大多数系统中,对函数参数的求值顺序是自右而左,所以是先求第2个表达式“a+b”的值,然后求第1个表达式“a+=3”的值。当i=1时,a=0,b=2,输出结果为先计算“a+b”的值为2,再计算“a+=3”的值为“a=a+3”即a的值为3;当i=2时,a=3(此时a值为上一次的计算结果),b=2,输出结果为先计算“a+b”的值为5,再计算“a+=3”的值为“a=a+3”即a的值为6;32当i=3和i=4时依次类推。9.7【分析】根据宏定义,形参为N。宏调用f(2+3)中实参为2+3,是一个表达式,在宏展开时,用2+3代换N,得2*2+3=7,这与函数的调用是不同的,函数调用时要把实参表达式的值求出来再赋予形参。而宏代换中对实参表达式不作计算直接地照原样代换。10.50,25【分析】本题为不带参数的宏定义,一共定义了3个宏,在执行“printf("%d,%d\n",2*MN,MN/2);”语句时,利用宏代换自右而左输出两个表达式“2*MN”和“MN/2”的值。MN/2=N*M/2=M*3+4*M/2=5*3+4*5/2=25,2*MN=2*N*M=2*M*3+4*5=2*5*3+4*5=50。编程题1.编写一个函数,求两个整数的最大公约数。【问题分析】求两个整数的最大公约数可使用辗转相除法。其方法是:以小数除大数,如果能整除,那么小数就是所求的最大公约数。否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数。依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数。设两个整数为u和v,则求最大公约数的算法见图所示。【程序代码】#include""hcf(intu,intv){inta,b,t,r;Tu>vF变换u、v,使用大者为被除数a=u(除数),b=v(被除数)r=b对a求余,若r不为0使除数变为被除数:b=a,余数为除数:a=r返回除数a的值。图33if(u>v){t=u;u=v;v=t;}a=u;b=v;while((r=b%a)!=0){b=a;a=r;}return(a);}main(){intu,v,h,l;scanf("%d,%d",&u,&v);h=hcf(u,v);printf("",h);}2.编写一个计算n次勒让德多项式的递归程序。n次定义为:110/))()1()()12((1)(>==⎪⎩⎪⎨⎧−−−=nnnnxpnxxpnxxp【程序代码】#include""main(){intx,n;floatp(int,int);printf("\n输入整数n,x:");scanf("%d,%d",&n,&x);printf("N=%d,X=%d.\n",n,x);printf("P%d(%d)=%\n",n,x,p(n,x));}floatp(inttn,inttx){if(tn==0)return(1);elseif(tn==1)return(tx);elsereturn(((2*tn-1)*tx*p((tn-1),tx)-(tn-1)*p((tn-2),tx))/tn);34}3.设有两个整型数组a和b,试统计这两个数组中对应元素相等与不相等的个数。【程序代码】#include<>#include<>voidfun(intp[],intq[]){intm=0,n=0,i;for(i=0;i<10;i++){if(p[i]==q[i])m++;elsen++;}printf("两个数组中对应元素相同的个数:%d个,\n不相同的个数:%d个.\n",m,n);}main(){inta[10],b[10],i;printf("请向数据组a输入10个数:");for(i=0;i<10;i++)scanf("%d,",&a[i]);printf("数据组a:");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n请向数据组b输入10个数:");for(i=0;i<10;i++)scanf("%d,",&b[i]);printf("数据组b:");for(i=0;i<10;i++)printf("%d",b[i]);printf("\n");fun(a,b);35}4.回文是从前向后和从后向前读起来都一样的句子。写一个函数,判断一个字符串是否为回文,注意处理字符串中有中文也有西文的情况。【程序代码】#include<>#include<>intfun(char*str){inti,n=0,fg=1;char*p=str;while(*p){n++;p++;}for(i=0;i<n/2;i++)if(str[i]==str[n-1-i]);else{fg=0;break;}returnfg;}voidmain()/*主函数*/{charstr[80];intc;printf("inputstr:\n");gets(str);c=fun(str);if(c==1)printf("huiwen:YES!");elseprintf("huiwen:NO!");getchar();}5.三角形的面积为))()((csbsassarea−−−=,其中)++×=,a、b、c为三角形的三边。定义两个带参的宏,分别用来求s和area。然后在程序用宏来求三角形的周长和面积。【程序代码】#include""#include""#defineS(a,b,c)((a+b+c)/2)#defineAREA(a,b,c)(sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)))36main(){floata,b,c;printf("请输入三角形的三条边:");scanf("%f,%f,%f",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a)printf("其面积为:%.\n",AREA(a,b,c));elseprintf("不能构成三角形!\n");}习题解答选择题1.D【分析】用&操作符可以获取变量的地址,指针变量用于存放地址。2.D【分析】scanf的一般形式为:scanf(格式控制字符串,地址1,地址2,…)。printf的一般形式为:printf(格式控制字符串,输出项1,输出项2,…)。格式控制字符串中有格式说明也有普通字符。printf的输出项n是需要输出的一些数据,可以是表达式。scanf的地址n是变量的地址。3.D【分析】指针变量初始化的值是该指针类型的地址值。int*p=&a;是定义语句,*是指针定义符,C为p分配一指针空间,并用a的地址值初始化,*p=a是执行语句,是间接引用指针变量p。*操作符在指针上的两种用途要分开:定义或声明时,建立一指针;执行时,间接引用一指针。4.A【分析】NULL是空指针值,它不指向任何地方,NULL是个不确定值。字符串的结束符是‘\0’,文件的结束符EOF。5.C37【分析】指针在使用前要进行初始化。指针忘了赋值比整形变量忘了赋值危险得多。C选项中,没有赋初始值的指针p是一个随机地址,然后把从键盘读的一个字符赋到内存中的随机位置,严重者可能造成计算机死机或进入死循环。6.C【分析】new用来从堆上分配对象或对象数组,delete用来从堆上释放对象或对象数组。7.B【分析】字符指针s指向字符数组str1的起始地址,字符指针t指向字符数组str2的起始地址,通过移动指针(即s++,t++)可以对数组元素进行遍历。字符指针的间接引用(即*s和*t)是输出单个字符。8.C【分析】数组名就是数组的第一个元素的地址。访问第i个元素可以有以下形式:a[i],*(a+i),p[i],*(p+i)访问第i个元素地址可以有以下形式:&a[i],a+i,p+i,&p[i]9.D【分析】s[i]表示字符数组s的第i个字符,&s[i]表示字符数组s的第i个字符的地址,即&s[i]是字符指针,输出字符指针就是输出字符串。10.D【分析】strcpy的声明原形为:char*strcpy(char*dest,constchar*src);答案D不符合参数类型11.D【分析】通过第三条语句p=&a[1],浮点型指针p指向数组a的第二个元素即a[1],通过for循环,计算数组中从第二个元素开始连续三个元素的和。12.B【分析】通过第二条语句char*chp=&b[3]使字符指针chp指向数组b的第四个元素即b[3],语句while(chp>&b[0])为字符指针chp的地址值与数组b的首地址值比较。13.B【分析】语句while(*p!='\0')p++;执行后,字符指针p指向字符串“Morning”的最后38一个字符‘\0’,字符指针s仍然指向字符串“Morning”的首字符‘M’,两个字符指针型变量值加减后结果为7。14.D【分析】对字符数组进行输出时,遇到‘\0’就结束。15.B【分析】字符串常量总是以‘\0’结束,字符串"abcde"在内存中的表示为连续的6个内存单元,所以A选项错误。指针在使用前要进行初始化,C选项和D选项没有对指针变量s初始化,结果会将字符串"abcde"存入内存中的随机位置,产生严重错误。16.A【分析】语句strcpy(s,sp)把sp所指字符串"HELLO"复制到字符数组s中,s的值为"HELLO",s[5]=‘\0’,s[6]~s[9]的内容不确定。接着执行语句s[6]='!',虽然s[6]的值被改为了'!',但s[5]仍然是‘\0’,字符指针的输出结束符是‘\0’,所以答案A正确。17.A【分析】字符指针s指向字符串常量"0123214"的首地址。通过移动指针s对字符串常量"0123214"进行遍历。有关switch语句需要注意以下几点:·switch后面括号中的表达式只能是整数、字符型或枚举表达式。·当表达式的值与某一个case后面的常量表达式值相等时,就执行此case后面的语句,若所有case中的常量表达式值没有与表达式匹配,就执行default后面的语句。·case语句起标号作用。·因为case语句起语句标号的作用,所以case与default并不改变控制流程。18.A【分析】变量p为整形指针变量,指向二维数组a的第一个元素(a[0][0])位置,我们可以通过移动指针来对数组元素进行操作。移动指针是对指针本身进行加减运算,并不是对指针的间接引用。指针的间接引用是用来获得指针指向的变量内容的。所以本题应先移动指针然后获得指针的内容,只有A答案的表达正确。19.D【分析】C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,a+i代表第i行的首地址,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西省晋城市公费师范生合同8篇
- 与安全有关的试题及答案
- 北京化工大学博后合同书3篇
- 信鸽教练与寄养棚的合同5篇
- 采购业务处理制度设计规范
- T/ZJSEE 0020-202320 kV架空绝缘配电线路设计规范
- 简单版农村承包土地合同4篇
- 辅导班学生安全协议书5篇
- 2025贵州理工学院辅导员考试试题及答案
- 新生儿沐浴操作标准流程
- 2025届福建省漳州市高三第三次教学质量检测生物试卷(解析版)
- 2025年茶叶加工工职业技能竞赛参考试题库500题(含答案)
- 2025甘肃陕煤集团韩城煤矿招聘250人笔试参考题库附带答案详解
- 2025年社区工作的理论与实务考试题及答案
- 《设计课件:构建高效数据集教程》
- 2025江苏中考:历史高频考点
- 普通测量学试题及答案
- 国家开放大学2025年《创业基础》形考任务3答案
- SL631水利水电工程单元工程施工质量验收标准第1部分:土石方工程
- 广东省2024年中考数学试卷【附真题答案】
- 监控立杆基础国家标准
评论
0/150
提交评论