C语言课后习题答案(最终)_第1页
C语言课后习题答案(最终)_第2页
C语言课后习题答案(最终)_第3页
C语言课后习题答案(最终)_第4页
C语言课后习题答案(最终)_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第0章习题1.将下列十进制数分别转化为二进制数、八进制数和十六进制数:(1)128(2)511(3)1024(4)65535(5)1048575答:(1)10000000、200、80(2)111111111、777、1FF(3)10000000000、2000、400(4)111111*********1、177777、FFFF(5)111111*********11111、3777777、FFFFF2.将下列二进制数转化为十进制数和十六进制数:(1)1100110101B答:(2)101101.1011B(1)821、335(2)45.6875、2D.B3.写出下列数的原码、反码、补码:15、-20、-27/32答:(1)00001111、00000000、00001111(2)10010100、11101011、11101100(3)1.1101100、1.0010011、1.00101004.16位无符号定点整数的数值表示范围为多少?8位补码的表示范围是多少?16位补码的表示范围是多少?答:0~65535、-128~127、-32768~327675.1968年Dijkstra提出结构化程序设计的思想的原因是什么?简要回答结构化程序设计的经典定义。答:结构化程序设计概念的提出主要是源于程序结构的层次性与模块化使得构造出来的软件具有良好的可理解性和可维护性,随着软件规模的扩大与复杂性的提高,程序的可维护性成为程序设计者们关注的重要问题之一。如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。6.C程序在内存中存储在哪儿?计算机的内存空间是如何分区的?分区存放不同类型的数据的目的是什么?答:C语言程序属于应用程序,程序代码本身存放在应用程序区,程序运行时处理的数据存放在应用程序数据区。计算机的内存空间主要分为3个区:系统程序区、应用程序区和数据区,其中数据区又分为系统程序数据区和应用程序数据区两类。系统程序区主要存放操作系统程序,计算机开机启动时,主要从该区取出程序分析执行;应用程序区主要存放应用程序设计者编制的应用程序;数据区则作为上述两类程序运行时的变量和中间结果的存放空间。程序运行时所需要的不同存储属性的变量将分别分配在这几个数据区和寄存器区。寄存器区在CPU内部,而不在存储器中,所以C语言寄存器型变量的运算速度最快,但是在CPU内部,寄存器非常有限,一般只有几个到几十个,所以C程序的寄存器型变量实际只有几个。7.简要回答冯.诺依曼计算机的基本原理。答:计算机硬件系统的核心是由中央处理器(CPU)和可执行的主存组成的计算引擎。这里,主存存储程序(可执行的机器指令序列)和数据,是可以直接寻址单元的线性序列。除主存外,计算机系统还有辅存即辅助存储器,用来保存当前没有载入主存的、部分或临时载入的程序和数据(例如硬盘)。同时,计算机系统还需要从外界获取数据或者将处理后的数据通知外界,这就需要另外一个组件即一组通信设备(例如显示器、键盘等),使用它们可以在用户和计算机之间以及计算机和计算机之间进行数据和命令交换。8.规范化编程的作用是什么?规范化编程主要包括哪几方面的内容?根据你的认识说一说什么样的程序才是具有规范化编码风格的程序。答:规范化编程的作用就是使代码容易阅读,无论是对程序员本人,还是对其他人。风格良好的代码更容易阅读和理解,其中的错误也更少。规范化编程主要包括以下几方面的内容:(1)命名的问题(2)源程序的书写问题(3)算法设计的问题(4)程序注释第1章习题1.C语言的主要特点有哪些?答:一种语言之所以能存在和发展,并具有生命力,总是有其不同于其他语言的特点。C语言的主要特点如下。(1)语言简洁、紧凑,使用方便、灵活。(2)运算符丰富。(3)数据结构类型丰富,具有现代化的各种数据结构。(4)具有结构化的控制语句。(5)语法限制不太严格,程序设计自由度大。(6)C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。(7)一般仍习惯将C语言称为高级语言,因为C程序也要通过编译、连接才能得到可执行的目标程序,这是和其他高级语言相同的。2.简要叙述C语言程序的构成,并说明一个C程序要正确地运行,必须要有什么函数,该函数在程序中的地位如何?答:C语言是一种结构化程序设计语言,具体地说,C语言是一种函数模块式结构的程序设计语言,所有的C程序都是由一个或多个函数构成的。一个C程序可由一个主函数和若干个其它函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。这些函数是由编译系统提供的标准函数或用户自己定义的函数,其中有一个特别的函数“main”我们称之为主函数。一个C程序要正确地运行,都必须有且只能有一个主函数,主函数是程序运行的入口,C程序从主函数开始执行,并最终从主函数结束。3.开发一个C程序的一般过程是什么?答:开发一个C程序,通常包括以下几个步骤:(1)编辑C语言源程序(2)编译和链接(3)执行C程序。当我们用任一编辑软件(编辑器)编写好C源程序后,就以文本文件的形式保存在计算机的磁盘上,该文本文件即为C的源程序文件。当我们想运行一个C程序时,首先要进行程序编译和程序链接,从而生成机器代码即可执行文件。生成可执行文件后,就可以在操作系统控制下运行。4.指出下面哪些是C语言的关键字?A.charB.abcC.printfD.IntE.floatF.defineG.includeH.PI答:AE5.下列说法正确的是()。A.在书写C语言源程序时,每个语句以逗号结束B.注释时,“/”和“*”号间可以有空格C.无论注释内容的多少,在对程序编译时都被忽略D.C程序每行只能写一个语句答:C6.C语言源程序文件的后缀是(),经过编译和链接后生成了可执行文件,该文件的后缀是()。A..objB..exeC..cD..doc答:CB思考题参照例题,编写一个C程序,输出以下信息:***********************************************************WelcomeJiLin!WelcomeChangChun!***********************************************************答:#include<stdio.h>intmain(){printf(”******************************************\n”);printf(”WelcomeJiLin!WelcomeChangChun!\n”);printf(”******************************************\n”);return0;}第2章习题1.指出下面哪些是合法的标识符?A.1_xB.intC.ABCD.i_10E.sum.aF.%abcG._stuH.abcd答:CDG2.C语言的数据类型有哪些?答:C语言规定的数据类型较多,通常我们可以将其分为五大类:简单类型、构造类型、指针类型、枚举类型和空类型,其中简单类型包括整型、实型和字符型,构造类型包括数组、结构体和共用体。C语言的数据类型分类如图所示。3.下面是一段程序:#defineN10intmain(){intiSum;sum=(20+30)/N;printf("sum=%d\n",iSum);printf("resultis5\n");return0;}在这段程序中,常量有哪些?答:2030N4.下面哪些写法是正确的,而且是常量?A.12B.-.345C.1.23e4D.'OPQ'E.E10F.0678G.0xabcdefH."\n\\\'\123"答:ABCGH5.下面哪个表达式的值为5?A.19/4C.(float)19/4答:B.19.0/4D.(int)(19.0/4+0.5)D6.指出下面的表达式中,哪些是错误的?(1)a+b=5(2)56=a11(3)i=i++(4)12(5)a=5,b=6,c=7答:(1)(2)7.计算下列表达式的值。已知int型变量a=5,b=6,c=7,char型变量ch=’0’,float型变量f=2.1。(1)(a-b*2)/3(2)3.2*(a+b+c)(3)ch+a+f(4)a+b%3*(int)(b+c)%3/6答:(1)-2(2)57.60000(3)55.10000(4)58.写出下面表达式运算后x的值。设x定义为整型变量,其初值为10。(1)x+=10(2)x-=10(3)x*=5+10(4)x/=x+x(5)x+=x-=x*=x(6)x+=x-=x*x答:(1)20(2)0(3)150(4)0(5)0(6)-1809.设int型变量a=3,b=4,c=5,则表达式((a+b)>c)&&(b==c)&&a||b+c&&b+c的值是()。A.0答:BB.1C.2D.310.如果int型变量i=1,j=2,k=3,l=4,则条件表达式i<j?i:k<l?k:l的值是()。A.1答:AB.2C.3D.411.字符常量与字符串常量有什么区别?答:用一对单引号括起来的单个字符称为字符常量。字符常量有两种:一般字符常量和特殊字符常量。例如:’a’就是一个字符常量。用一对双引号括起来的字符序列称为字符串常量。例如”ChangChun”就是一个字符串常量。两者的区别:(1)定界符不同,字符常量用单引号,字符串常量用双引号。(2)一般来说,字符常量仅能表示单个字符,字符串常量可以表示多个字符。(3)转义字符是字符常量而不是字符串常量。12.C语言为什么要规定对所有用到的变量要“先定义,后使用”?这样做有什么好处?答:C语言变量遵循“先定义,后使用”的原则,即变量在使用前,都要求先对其数据类型进行定义。因为在变量定义时,系统会对变量分配固定的内存,然后按照变量名对其进行访问。这样做有如下好处:(1)便于系统对内存空间的管理与使用(2)通过事先分配内存空间提高程序的运行效率。13.简述转义字符的用途并举实例加以说明。答:通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,其主要用法有以下三个方面:(1)表示字符常量的单撇号(’)、用于表示字符串常量的双撇号(”)和反斜杠(\);(2)用反斜杠(\)后面跟某些特定字符表示不可打印的控制字符和特定功能的字符;(3)用反斜杠(\)后面跟一个八进制或十六进制数表示任意字符,其中八进制或十六进制数表示要表示字符的对应ASCII码值。例如:’\n’表示换行操作,’\\’表示要输出一个反斜杠“\”。14.在C语言中如何表示逻辑值“真”和“假”?如何判断一个运算量的“真”和“假”?答:在C语言中用整型值0和1表示逻辑值“真”和“假”,其中逻辑值“真”用1表示,逻辑值“假”用0表示。判断一个运算量的“真”和“假”的方法是:非0为真,0为假。15.写出完成下列要求的C语言的合法表达式。(1)已知半径r,计算球的体积V;(2)已知3条边长度a、b、c,计算三角形面积S;(3)已知上底a、下底b和高h,计算梯形面积S。答:(1)V=(3/4)*3.14*r*r*r(2)l=(a+b+c)/2,S=sqrt((l-a)*(l-b)*(l-c))(3)S=(a+b)*h/2思考题若变量f已说明为float类型,i为int类型,则下面哪些表达式(或语句)能够实现将f中的数值保留小数点后两位,第三位进行四舍五入的运算?A.f=(f*100+0.5)/100.0;B.i=f*100+0.5,f=i/100.0;C.f=(int)(f*100+0.5)/100.0;D.f=(f/100+0.5)*100.0;答:BC第3章习题1.输入一个字符,判别它是否是大写字母,如果是,将它转换成小写字母,如果不是,不转换,然后输出最后得到的字符。答:#include<stdio.h>intmain(){charc;printf("Pleaseinputacharacter:");scanf("%c",&c);if(c>='A'&&c<='Z')c=c+32;printf("%c\n",c);return0;}2.C语言允许if-else嵌套使用,规定else总是和()配对。A.其之前最近的ifB.第一个ifC.缩进位置相同的ifD.其之前最近的且尚未配对的if答:D3.编程求1+3+5+…101的和。答:#include<stdio.h>intmain(){inti,s=0;for(i=1;i<=101;i=i+2)s=s+i;printf("Theresultis%d",s);return0;}4.输出下面的图形。*********答:#include<stdio.h>intmain(){inti,j,k;for(i=0;i<=2;i++){for(j=2;j>=i;j--){printf("");}for(k=0;k<=2*i;k++){printf("*");}printf("\n");}return0;}5.题目:输出9*9口诀。程序分析:分行与列考虑,共9行9列,i控制行,j控制列。答:#include<stdio.h>intmain(){inti,j,iResult;printf("\n");for(i=1;i<10;i++){for(j=1;j<=i;j++){iResult=i*j;printf("%d*%d=%-3d",j,i,iResult);}printf("\n");}return0;}6.C语言中while与do-while语句的主要区别是()。A.do-while的循环体至少无条件执行一次B.do-while允许从外部跳到循环体内C.while的循环体至少无条件执行一次D.while的循环控制条件比do-while的严格答:A7.若i,j均为整型变量,则以下循环()。for(i=0,j=2;j=1;i++,j--)printf(”%5d,%d\n”,i,j);A.循环体只执行一次B.循环体执行二次D.循环条件不合法C.是无限循环答:C8.以下程序的输出结果是()。#include<stdio.h>intmain(){intj;for(j=4;j>=2;j--){switch(j){case0:printf(”%4s”,”ABC”);case1:printf(”%4s”,”DEF”);case2:printf(”%4s”,”GHI”);break;case3:printf(”%4s”,”JKL”);default:printf(”%4s”,”MNO”);}}return0;}答:MNOJKLMNOGHI9.for语句的格式及其执行过程是什么?答:for语句的格式如下:for(表达式1;表达式2;表达式3)语句该语句的执行过程是:①首先计算表达式1的值。②再计算表达式2的值,若值为真(T),则执行循环体一次;若为假,则跳出循环。③然后计算表达式3的值。④转回第二步继续执行程序。⑤循环结束,执行for下面的程序。10.break和continue的区别是什么?答:(1)continue语句只是结束本次循环,而不是终止整个循环的执行。(2)break语句则是结束整个循环过程,不再判断执行循环的条件。思考题:1.100元钱买一百只鸡,公鸡5元,母鸡3元,小鸡三个1元,试编写一个C程序,给出该问题的解决方案。答:#include<stdio.h>intmain(){intcocks=0,hens,chicken;while(cocks<=19){hens=0;while(hens<=33){chicken=100-cocks-hens;if(5*cocks+3*hens+chicken/3==100)printf(”%d,%d,%d\n”,cocks,hens,chicken);hens++;}cocks++;}return0;}2.密码程序。通过键盘输入一行字符以@结束。要求:a->bb->c…….z-a和A->bB->cZ->a,其它字符不变。答:#include<stdio.h>intmain(){charc;printf("Pleaseinputthepassword:");while((c=getchar())!='@'){if(c>='a'&&c<'z')c=c+1;if(c>='A'&&c<'Z')c=c+33;if(c=='z'||c=='Z')c='a';printf("%c",c);}return0;}第4章习题1.对于数组的描述错误的是()。A.必须先定义,后使用B.数组元素引用时下标从0开始C.数组中的所有元素必须是同一种数据类型D.定义时数组的长度可以用一个已经赋值的变量表示答:D2.定义数组时,表示数组长度的不应该是()。A.整型常量B.符号常量C.整型变量D.整型常量表达式答:C3.设有定义shortx[5]={4,6,8};,则数组占有的内存字节数是()。A.10B.6C.5D.3答:A4.以下程序运行后,输出结果是()。#include<stdio.h>intmain(){inty=10,i=0,j,a[5];do{a[i]=y%3;i++;y=y/2;}while(y>=1);for(j=i-1;j>=0;j--){printf(”%d”,a[j]);printf(””);}return0;}答:12215.将一个二维矩阵行和列元素互换,存到另一个二维数组中并显示输出。答:#include<stdio.h>intmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf("arraya:\n");for(i=0;i<2;i++){for(j=0;j<3;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}return0;}6.从键盘输入一个3×3矩的整型矩阵,并求出对角线元素之和。答:#include<stdio.h>intmain(){inta[3][3],i,j,s=0;for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++)for(j=0;j<3;j++){if(i==j)s=s+a[i][j];elseif(i==2-j)s=s+a[i][j];}printf("%d",s);return0;}7.将一个一维数组(含10个整型数组元素)中的值按逆序重新存放。答:#include<stdio.h>intmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti,t;for(i=0;i<5;i++){t=a[i];a[i]=a[9-i];a[9-i]=t;}for(i=0;i<10;i++)printf("%d",a[i]);return0;}8.打印出以下的杨辉三角形(要求打印出10行)。11112113311464115101051……答:#include<stdio.h>intmain(){inta[10][10],i,j;for(i=0;i<10;i++){a[i][i]=1;a[i][0]=1;}for(i=2;i<10;i++)for(j=1;j<i;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=0;i<10;i++){for(j=0;j<i+1;j++)printf("%6d",a[i][j]);printf("\n");}return0;}9.若已定义:charch[5]={’e’,’f’,’\0’,’g’,’\0’};则printf(”%s”,c);的输出是()。A.’e’’f’B.efC.efgD.ef\0g答:B10.以下程序运行后,输出结果是()。#include<stdio.h>intmain(){charch[7]={”83ek47”};inti,s=1;for(i=0;ch[i]>=’0’&&ch[i]<=’9’;i++)s=10*s+ch[i]-’0’;printf(”%d\t”,s);return0;}答:1818311.从键盘输入一个字符串,将小写字母全部转换成大写字母。(不使用系统函数)答:#include<stdio.h>intmain(){charstr[80];inti=0;printf("Pleaseinputastring:\n");gets(str);while(str[i]!='\0'){if(str[i]>='a'&&str[i]<='z')str[i]=str[i]-32;i++;}printf("%s\n",str);}12.为了判断两个字符串s1和s2是否相等,应当使用()。A.if(s1==s2)B.if(s1=s2)C.if(strcmp(s1,s2))D.if(strcmp(s1,s2)==0)答:D13.思考题:字符串模糊查询程序提示用户输入名字,在已有字符串数据中进行查找,如果有相等的就输出。否则输出“找不到相关信息!”。答:#include<stdio.h>intstrchk(chars1[],chars2[]);intmain(){intn,i,f=0;chars1[10][10]={"William","Sean","Brian","Tom","John","Jone","Brown","White","Alice","Peter"};chars2[10];printf("Pleaseinputyourname:");scanf("%s",&s2);for(i=0;i<10;i++){n=strchk(s1[i],s2);if(n==0){printf("%s\n",s1[i]);f=1;}}if(f==0)printf("Cannotfindthemessage!\n");}intstrchk(chars1[],chars2[]){inti;charc1,c2;for(i=0;;i++){c1=s1[i];c2=s2[i];if(c1>='A'&&c1<='Z')c1=c1-'A'+'a';if(c2>='A'&&c2<='Z')c2=c2-'A'+'a';if(c1!=c2||c1=='\0'||c2=='\0')break;}if(c1=='\0'||c2=='\0')return0;elseif(c1>c2)return1;elsereturn-1;}第5章习题1.在下列关于C函数定义的叙述中,正确的是()A.函数可以嵌套定义,但不可以嵌套调用B.函数不可以嵌套定义,但可以嵌套调用C.函数不可以嵌套定义,也不可以嵌套调用D.函数可以嵌套定义,也可以嵌套调用答:B2.在C语言程序中,若对函数类型未加显示说明,则函数的隐含类型为()A.voidB.doubleC.charD.int答:D3.下列程序的输出结果是()fun(inta,intb,intc){c=a*b;}intmain(){intc;fun(2,3,c);printf(“%d\n”,c);return0;}A.0B.1C.6D.无法确定答:D4.以下程序运行后,输出结果是inta=3;voidfun(){staticinta=0;a+=2;printf(“%d”,a);}intmain(){inti;for(i=1;i<4;i++){fun();}printf(”\n”);return0;}答:2465.指出下列函数定义中的错误:doublesum(doublex,y);{return(x*x+y*y);}答:函数的第二个参数应改为:doubley6.问一个人的年龄多大,问第五个人他说比第四个人大2岁。问第四个人,他说比第三个人大2岁。问第三个人,他说比第二个人大2岁。问第二个人,他说比第一个人大2岁。问第一个人,他说是10岁。用递归调用实现。答:voidage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}intmain(){printf("%d",age(5));return0;}7.编写一个函数,将两个字符串连接。答:char*strcat(char*cTarget,constchar*cSource){char*cOriginal=cTarget;while(*cTarget)cTarget++;//Findtheendofthestringwhile(*cTarget++=*cSource++);return(cOriginal);}8.编写函数intfullNumber(intvalue),其功能是如果参数是完数则返回该数。所谓完数,即指该数等于其所有真因子(不包括其本身)之和,例如,6的因子有1、2、3,且6=1+2+3,故6为完数。答:intfullNumber(intiValue){inti=1;iSum=0;do{if(value%i==0)iSum=iSum+i;i++}while(i<=iValue)if(iSum==iValue)returniValue;elsereturn-1;}9.编写一函数,由实参传入一个字符串。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数,在主函数中输入字符串以及输出上述结果。答:stat(charcArticle[240]){inti;intiUpper=0,iLower=0,num=0,iSpace=0,iOther=0;for(i=0;i<240;i++){if(cArticle[i]==’’)iSpace++;elseif(cArticle[i]>='A'&&cArticle[i]<='Z')iUpper++;elseif(cArticle[i]>='a'&&cArticle[i]<='z')iLower++;elseif(cArticle[i]>='0'&&cArticle[i]<='9')num++;elseiOther++;}printf("\nThereare%dupperletter%dlowerletter%dnumber%dother%dspaceinthisarticle",iUpper,iLower,num,iOther,iSpace);}main(){charcArticle[240];scanf("%s",cArticle);stat(cArticle);}10.给出年、月、日,计算该日是该年的第几天。答:intmain(){intday,month,year,sum,leap;printf(”\npleaseinputyear,month,day\n”);scanf(”%d,%d,%d”,&year,&month,&day);switch(month){case1:sum=0;break;case2:sum=31;break;case3:sum=59;break;case4:sum=90;break;case5:sum=120;break;case6:sum=151;break;case7:sum=181;break;case8:sum=212;break;case9:sum=243;break;case10:sum=273;break;case11:sum=304;break;case12:sum=334;break;default:printf(”dataerror”);break;}sum=sum+day;if(year%400==0||(year%4==0&&year%100!=0))leap=1;elseleap=0;if(leap==1&&month>2)sum++;printf(”Itisthe%dthday.”,sum);}思考题1.编写一个递归函数voidpalin(intn),其功能为将给定的n个字符逆序输出。例如,通过n输入字符abc,输出cba。答:#include<stdio.h>intmain(){inti=5;voidpalin(intn);printf("\40:");palin(i);printf("\n");}voidpalin(intn){charcNext;if(n<=1){cNext=getchar();printf("\n\0:");putchar(cNext);}else{cNext=getchar();palin(n-1);putchar(cNext);}}2.用C程序实现简单计算器。要求分别用子函数实现+、-、*、/的功能,且根据您的输入自动调用相应的子函数。答:floatadd(floatx,floaty){return(x+y);}floatsub(floatx,floaty){return(x-y);}floatmul(floatx,floaty){return(x*y);}floatdiv(floatx,floaty){return(x/y);}intmain(){floatx,y,fResult;charc;scanf("%f%c%f",&x,&c,&y);if(c=='+')fResult=add(x,y);elseif(c=='-')fResult=sub(x,y);elseif(c=='*')fResult=mul(x,y);elseif(y==0)fResult=-1;elsefResult=div(x,y);if(fResult==-1)printf("thesecondNumberis0;pleaseinputagain!");elseprintf("%7.2f%c%7.2f=%f\n",x,c,y,fResult);return0;}第6章习题1.若已定义inta=8,*p=&a;则下列说法中不正确的是()。A.*p=a=8B.p=&aC.*&a=*pD.*&a=&*a答:D2.若变量已正确定义并且指针p已经指向变量x,则&*p相当于()。A.x答:CB.*pC.pD.*&p3.若已定义inta[8]={2,4,6,8,10,12,14,16};*p=a;则数组第2个元素”4”不可以表示为()。A.a[1]答:CB.p[1]C.*p+1D.*(p+1)4.指向一个包含3个整型元素的一维数组的指针变量的定义形式为()。A.int(*p)[]B.int*p[]C.int(*p[])D.int(*p)[3]答:D5.请任意输入10个整数,使用冒泡法排序方式将它们按从大到小的顺序输出。答:#defineN10#include<stdio.h>intmain(){inti,j;inta[N],iTemp,*p;p=a;printf(”\nInput%dnumbers:\n”,N);for(i=0;i<N;i++)scanf(”%d”,p+i);for(i=0;i<N-1;i++)for(j=0;j<N-i;j++)if(*(p+j)<*(p+j+1)){iTemp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=iTemp;}printf(”thesortednumbersare:\n”);for(i=0;i<N;i++)printf(”%5d”,*(p+i));return0;}6.有一个二维数组a[3][4],其第3行第4列元素a[2][3]的正确表示方法为()。A.&a[2][3]B.a[2]+3C.*(a+2)+3D.*(a[2]+3)答:D7.以下语句或语句组中,正确的操作是()。A.chars[4]=”abcde”;C.char*s;s=”abcde”;答:B.char*s;gets(s);D.chars[5];scanf(”%s”,&s);B和C8.阅读下列程序,写出程序运行的结果。chars[]=”ABC”;intmain(){char*p;for(p=s;p<s+4;p++)printf(”%c%s”,*p,p);return0;}答:AABCBBCCC9.利用指针完成两个字符串的比较函数strcompare(),模拟完成系统函数strcmp()的功能。答:intstrcompare(s1,s2){inti,j;for(i=0;s1[i]||s2[i]);i++)if(s1[i]!=s2[i]&&s1[i]>s2[i])return1;elseif(s1[i]!=s2[i]&&s1[i]<s2[i])return-1;elsereturn0;}10.设计一个反转字符串的函数reverse:voidreverse(char*s);它能将字符串的字符顺序反向重新排列。答:voidreverse(char*s)/*使用中间变量*/{intlen;inti;len=strlen(s)-1;charcTemp;for(i=0;i<len-i;i++){cTemp=s[i];s[i]=s[len-i];s[len-i]=cTemp;}ch[len+1]=0;}11.阅读下列程序,写出程序运行的结果。intmain(){inta[12]={1,3,5,7,9,11,13,15,17,19,21,23},*p[4],i;for(i=0;i<4;i++)p[i]=&a[i*3];printf(”%d\n”,p[1][2]);return0;}答:1112.使用指针数组编写一个通用的英文月份名显示函数voiddisplay(intmonth)。答:#include<stdio.h>#include<string.h>intmain(){char*p,str[12][6]={”Jan”,”Feb”,”March”,”Apr”,”May”,”June”,”July”,”Aug”,”Sep”,”Oct”,”Nov”,”Dec”};intmonth;scanf(”%d”,&month);p=str[month-1];if(month<=12&&month>0)printf(”TheMonthis:%s\n”,p);elseprintf(”Error!\n”);}13.请利用指针数组设计一个菜单管理程序,当输入字符串“save”、“open”、“quit”时,分别调用其处理函数,完成不同的工作。各处理函数的具体工作可以自行设定,比如可以仅仅显示出不同操作的提示等。答:#include<stdio.h>intmain(){char*p[3]={”save”,”open”,”quit”};char*s;inti;printf(”inputastring:\n”);gets(s);for(i=0;i<3;i++)if(strcmp(s,p[i])==0)f(i);return0;}f(intn){switch(n){case0:printf(”thisissavefunction!\n”);break;case1:printf(”thisisopenfunction!\n”);break;case2:printf(”thisisquitfunction!\n”);break;}}14.程序中对fun()函数有如下说明:void*fun();此说明的含义是()。A.fun()函数无返回值B.fun()函数的返回值可以是任意的数据类型C.fun()函数的返回值是无值型的指针类型D.指针fun()指向一个函数,该函数无返回值答:C15.若有以下定义,int**pp,*p,a=10,b=20;则下列程序段的输出结果是()。pp=&p;p=&a;p=&b;printf(”%d,%d\n”,*p,**pp);A.10,20B.10,10C.20,10D.20,20答:D16.编写一个程序,通过指向指针的指针输出5个字符串。答:#include<stdio.h>intmain(){inti,n=5;char*cName[]={”Pascal”,”BASIC”,”C”,”FORTRAN”,”Computerdesign”};char**p=cName;for(i=0;i<n;i++)printf(”%s\n”,*(p+i));return0;}思考题有30个人围成一圈,顺序排号。从第一个人开始报数(从1到4报数),凡是报到4的人退出圈子,最后留下的是原来的第几号。答:#include<stdio.h>intmain(){inti,k,m,n,num[30],*p;printf(”\nInputnumber:\n”);scanf(”%d”,&n);p=num;for(i=0;i<n;i++)*(p+i)=i+1;i=0;k=0;m=0;while(m<n-1){if(*(p+i)!=0)k++;if(k==4){*(p+i)=0;k=0;m++;}i++;if(i==n)i=0;}while(*p==0)p++;printf(”%disnumber%d.\n”,n,*p);return0;}第7章习题1.设有以下说明语句,structex{intx;floaty;charz;}example;则下面的叙述中不正确的是()。A.struct结构体类型的关键字C.x,y,z都是结构体成员名答:B.example是结构体类型名D.structex是结构体类型B2.下面正确的叙述是()A.结构体一经定义,系统就给它分配了所需的内存单元。B.结构体变量和共用体变量所占内存长度是各成员所占内存长度之和。C.可以对结构类型和结构类型变量赋值、存取和运算。D.定义共用体变量后,不能引用共用体变量、只能引用共用体变量中的成员。答:D3.结构体类型变量在程序执行期间()。A.所有成员驻存在内存中B.只有一个成员驻留在内存中C.部分成员驻留在内存中D.没有成员驻留在内存中答:A4.判断下面的有关结构体的定义或引用,正确的请在后边括弧中用T表示,错误的用F表示。structstudent{intno;intscore;}student1;A.student.score=99;()B.student1.score=99;()C.structLiMing;LiMing.score=99;()D.structstudentLiMing;LiMing.score=99;()E.studentLiMing;LiMing.score=99;()答:FTFTF5.若有以下说明和定义typedefintINTEGER;INTEGERp,*q;以下叙述正确的是()A.p是int型变量B.p是基类型为int的指针变量C.q是基类型为int的指针变量D.程序中可用INTEGER代替int类型名答:ACD6.对于下列定义的枚举型enumcolor1{yellow,green,blue=7,red,brown};则枚举常量yellow和red的值分别是()A.3,8答:CB.1,8C.0,8D.0,37.试分析下列源程序的功能,写出其运行结果。#include<stdio.h>#definePerson_1structperson_1structperson_1{charname[31];intage;charaddress[101];};typedefstructperson_2{charname[31];intage;charaddress[101];}Person_2;voidmain(){Person_1a={”zhao”,31,”eaststreet49”};Person_1b=a;Person_2c={”Qian”,25,”weststreet31”};Person_2d=c;printf(”%s,%d,%s\n”,,b.age,b.address);printf(”%s,%d,%s\n”,,d.age,d.address);}答:zhao,31,eaststreet49Qian,25,weststreet318.定义一个日期结构变量重新实现第五章第十题。答:#include<stdio.h>struct{intyear;intmonth;intday;}date;intmain(){inti,days=0;intday_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};printf("\n\nInputyear,month,day:");scanf("%d,%d,%d",&date.year,&date.month,&date.day);for(i=0;i<date.month;i++)days+=day_tab[i];days+=date.day;if((date.month>=3)&&((date.year%4==0&&date.year%100!=0)||date.year%400==0))days+=1;printf("\n%d/%disthe%dthin%d.",date.month,date.day,days,date.year);return(0);}9.建立一个职工情况统计表,它应包括职工的工作证号、姓名、年龄、工资等项内容。最后输出:(1)该单位职工的平均年龄,平均工资;(2)各年龄段职工人数的分布情况;答:#include<stdio.h>structemployee{longnum;/*工作证号*/charname[20];intage;intiSalary;};voidinput(structemployeeemployee1[],intn){inti,j;chartemp[30];for(i=0;i<n;i++){printf("\ninputtheinformationoftheemployee!(num,name,age,iSalary)\n");scanf("%ld%s%d%d",&employee1[i].num,employee1[i].name,&employee1[i].age,&employee1[i].iSalary);}}voidaverage(structemployeeemployee1[],intn){inti,iAvage=0,iAavsalary=0;for(i=0;i<n;i++){iAvage=iAvage+employee1[i].age;iAavsalary=iAavsalary+employee1[i].salary;}iAvage=iAvage/n;iAavsalary=iAavsalary/n;printf("Theaverageageis:%d\n",iAvage);printf("Theaveragesalaryis:%d\n",iAavsalary);}voidagenum(structemployeeemployee1[],intn){inti,a1=0,a2=0,a3=0,a4=0,a5=0;for(i=0;i<n;i++){if(employee1[i].age<20)a1++;elseif(employee1[i].age>=20&&employee1[i].age<30)a2++;elseif(employee1[i].age>=30&&employee1[i].age<40)a3++;elseif(employee1[i].age>=40&&employee1[i].age<50)a4++;elseif(employee1[i].age>=50&&employee1[i].age<=60)a5++;}printf("<20:%d\n",a1);printf("20-30:%d\n",a2);printf("30-40:%d\n",a3);printf("40-50:%d\n",a4);printf("50-60:%d\n",a5);}intmain(){intm;structemployeeemployee1[20];printf("Pleaseinputthetotalnumberoftheemployees:\n");scanf("%d",&m);input(employee1,m);average(employee1,m);agenum(employee1,m);}10.已有a,b两个链表,每个链表中的结点包括学号,成绩.要求把2个链表合并.答:#include<stdio.h>#defineLENsizeof(structstudent)typedefstructstudent{longnum;floatfScore;structstudent*next;}stu,*sp;spcreat();spinsert(spa,spb);voidprint(sphead);intmain(){spahead,bhead,abh;inta,b,sum;printf("lista:\n");ahead=creat();printf("listb:\n");bhead=creat();abh=insert(ahead,bhead);print(abh);system("pause");return0;}spcreat(){sphead=NULL,p1,p2;longnum=0;floatfScore=0;intinput=0;while(1){input=scanf("%ld,%f",&num,&fScore);if(input!=2||num==0)break;p1=(sp)malloc(LEN);p1->num=num;p1->fScore=fScore;p1->next=NULL;if(head==NULL)head=p1;elsep2->next=p1;p2=p1;}return(head);}spinsert(spah,spbh){sppa=ah,pb=bh,abh=NULL,pab;if(ah==NULL)returnbh;if(bh==NULL)returnah;while(pa!=NULL&&pb!=NULL){if(abh==NULL)if(pa->num<pb->num){pab=abh=pa;pa=pa->next;}else{pab=abh=pb;pb=pb->next;}elseif(pa->num<pb->num){pab->next=pa;pab=pa;pa=pa->next;}else{pab->next=pb;pab=pb;pb=pb->next;}}if(pa==NULL)pab->next=pb;elsepab->next=pa;return(ah);}voidprint(sphead){spp;intsum;for(sum=0,p=head;p!=NULL;p=p->next,sum++);printf("Thereare%drecords:\n",sum);p=head;while(p!=NULL){printf("%ld%6.2f\n",p->num,p->fScore);p=p->next;}}11.建立一个链表,每个结点包括学号、姓名和年龄。输入一个学号,如果链表中的结点所包含的学号等于此学号,则将此结点删去。答:#include<malloc.h>#defineNULL0#defineLENsizeof(structstudent)structstudent{intnum;charname[20];intage;structstudent*next;};intn;structstudent*creat(void){structstudent*head,*p1,*p2;n=0;p1=p2=(structstudent*)malloc(LEN);scanf("%d,%s,%d",&p1->num,p1->name,&p1->age);head=NULL;while(p1->num!=0){n=n+1;if(n==1)head=p1;elsep2->next=p1;p2=p1;p1=(structstudent*)malloc(LEN);scanf("%d,%s,%d",&p1->num,p1->name,&p1->age);}p2->next=NULL;return(head);}structstudent*del(structstudent*head,intnum){structstudent*p1,*p2;if(head==NULL){printf("\nlistnull!\n");gotoend;}for(p1=head;p1->next!=NULL;p1=p1->next){p2=p1;if(num==p1->num){if(p1==head)head=p1->next;elsep2->next=p1->next;printf("delete:%d\n",num);n=n-1;}elsep2=p1;}end:/*return(head);*/}intmain(){structstudent*head;intnum;printf("inputrecords:\n");head=creat();printf("inputthedeletednum:");scanf("%d",&num);head=del(head,num);}思考题用结构类型编写一个程序,完成生命游戏的功能:在一个由方格组成的矩形阵列上,每个方格可包含一个机体。每个方格和8个方格相邻,我们用occ(k)表示与方格k相邻的包含机体的方格数。各机体生死的规则是:如果2≤occ(k)≤3,那么在方格k中的机体继续活下去;否则该机体死亡。如果occ(k)=3,那么在方格k中诞生一个新机体。写一个程序,读入初始机体配置,按规则计算一系列生成过程,并打印出每一时间的配置情况。为处理方便,不考虑矩形阵列最外围方格中机体的生死问题,但它们对临近方格中机体的生成起作用。答:/*lifegame.c*/#include<stdio.h>#include"graphics.h"#include<time.h>#include<stdlib.h>#defineMAX60#defineSIZE5voidinitG();voidcloseG();voidlive(intcol,introw);voiddeath(intcol,introw);voidinitG(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"d:\\tc");cleardevice();}voidcloseG(){cleardevice();settextstyle(1,0,5);setcolor(BLUE);outtextxy(80,50,"ProgrammeDesiged:Y.Z.X");outtextxy(80,160,"MAIL:***************");outtextxy(200,330,"2006.5");getch();closegraph();}voidlive(intcol,introw){setcolor(WHITE);setfillstyle(SOLID_FILL,WHITE);bar(SIZE*(col+1)+1,SIZE*(row+1)+1,SIZE*(col+2)-1,SIZE*(row+2)-1);}voiddeath(intcol,introw){setcolor(BLACK);setfillstyle(SOLID_FILL,BLACK);bar(SIZE*(col+1)+1,SIZE*(row+1)+1,SIZE*(col+2)-1,SIZE*(row+2)-1);}voidtable(){inti;setcolor(RED);for(i=0;i<=MAX;i++){line(SIZE*(i+1),SIZE,SIZE*(i+1),SIZE*(MAX+1));line(SIZE,SIZE*(i+1),SIZE*(MAX+1),SIZE*(i+1));}}voidgame(){intnrow,ncol,i,resData[MAX][MAX],ori[MAX][MAX];intcount;charstr[20];/*iflifeislivecolorisbalck*//*initthelife*/table();for(nrow=0;nrow!=MAX;nrow++)for(ncol=0;ncol!=MAX;ncol++){ori[nrow][ncol]=1;resData[nrow][ncol]=1;}for(i=0;i<=100;i++){count=0;for(nrow=1;nrow!=MAX;nrow++)for(ncol=1;ncol!=MAX;ncol++){if(resData[nrow][ncol]==1)live(nrow,ncol);if(resData[nrow][ncol]==0)death(nrow,ncol);count+=resData[nrow][ncol];}table();delay(5000);for(nrow=1;nrow<MAX;nrow++)for(ncol=1;ncol<MAX;ncol++)switch((ori[nrow-1][ncol-1]+ori[nrow-1][ncol]+ori[nrow-1][ncol+1]+ori[nrow][ncol-1]+ori[nrow][ncol+1]+ori[nrow+1][ncol-1]+ori[nrow+1][ncol]+ori[nrow+1][ncol+1])){case3:resData[nrow][ncol]=1;break;case2:resData[nrow][ncol]=ori[nrow][ncol];break;default:resData[nrow][ncol]=0;}/*endswitch*/for(nrow=1;nrow!=MAX;nrow++)for(ncol=1;ncol!=MAX;ncol++)ori[nrow][ncol]=resData[nrow][ncol];sprintf(str,"%d",count);setcolor(RED);rectangle(450,30,getmaxx(),200);settextstyle(1,0,4);outtextxy(455,40,"LIFEGAME");outtextxy(455,100,"LIVE:");setfillstyle(SOLID_FILL,BLACK);bar(550,100,getmaxx()-5,140);outtextxy(550,100,str);}/*endtimefor*/}voidmain(){clrscr();initG();game();getch();closeG();}第8章习题1.判断下列说法的正误:1)位运算的操作数只能是整型或字符型的数据。2)位运算的操作数只能是实型数据。3)位运算中,除按位取反运算外,其余5个位运算符均可与赋值运算符一起构成复合赋值运算符。4)位运算符不能与赋值运算符组成复合赋值运算符。5)位段成员的类型必须指定为unsigned或int类型。6)位段成员的类型必须指定为float类型。7)一个位段必须存储在同一存储单元中,不能跨两个存储单元。8)位段的长度不能大于存储单元的长度。9)在数值表达式中引用位段时,系统自动将位段转换为整型数。10)在程序中,只能用%u格式字符,以整数形式输出位段成员的数值。答:对错对错对错对对对对错2.写出实现下列功能的表达式(操作数x为int型数据):1)取x的低字节,高字节置0。2)保留x的第3位,其余各位置0。3)将x的高8位均置为1,其余各位不变。4)将x的最低位翻转,其余各位不变。答:(1)x&(0000000011111111)(2)x&(0010000000000000)(3)x|(111111100000000)(4)x^(0000000000000001)3.按位与的作用是什么?答:按位与可以很方便的将某个存储单元的数据全部清零,或保留某些指定位而其它位置零。4.C语言提供位运算的作用是什么?其优势体现在哪里?答:位运算可以完成汇编语言的某些功能,如置位,位清零,移位等,既节省了存储空间同时也提高了程序的效率。5.计算8<<1、8<<4、21>>1、21>>4等的值,并说明在不溢出的情况下,x<<n、x>>n分别是多少。答:8<<1、8<<4、21>>1、21>>48<<1=(00001000)<<1=000100000=168<<4=(00001000)<<4=10000000=12821>>1=(00010101)>>1=00001010=1021>>4=(00010101)>>4=00000001=1在不溢出的情况下,x<<n=x×2n,x>>n=x÷2n分别是多少。6.编写函数用来实现左右循环移位。函数名为move,调用方法为move(value,n)其中,value为要循环位移的数,n为位移的位数。如n<0,表示为左移;n>0为右移。如n=4,表示要右移4位;n=-3,为要左移3位。答:#include<stdio.h>voidbinary(unsignedintnumber){inti,bit;unsignedintk=0x8000;printf(“%04x(16)\t”,number);for(i=0;i<16;i++){bit=(k&number)?1:0;printf(“%d”,bit);if(i==7)printf(“--”);k>>=1;}printf(“(2)\n”);}unsignedmoveright(unsignedintnumber,intn){unsignedinta,b;b=number>>n;a=number<<(16-n);number=a||b;return(number);}unsignedmoveleft(unsignedintnumber,intn){unsignedinta,b;b=number<<0;a=number>>n;number=a||b;return(number);}intmain(){unsignedintnumber;intn=0;printf(”\nInputaoriginalnumbertomove”);scanf(”%d”,&number);do{printf(”\nInputnumbertomove([-15,-1]or[1,15]):”);scanf(”%d”,&n);}while(n<-15||n>15);printf(”\nTheoriginalnumberis:\n”);binary(number);if(n>0){number=moverignt(number,n);printf(”\nTheresultis:\t%6d(10)\t”,number);binary(number);}else{n=-n;number=moveleft(number,n);printf(”\nTheresultis:\t%6d(10)\t”,number);binary(number);}}思考题编程实现某客户购买的商品(如:电视,数码相机,沙发,吊灯),其中输入客户ID和购买商品(1:购买该商品,0:未购买该商品),存储客户购买的商品使用位段类型。答:#include<stdio.h>structchoice{unsignednum;struct{unsignedtv:1;unsignedcam:1;unsigne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论