




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
全国计算机等级考试二级教程C语言程序设计习题分析与解答(五)第十三章 编译预处理和动态存储分配习题分析与解答一、 选择题13.1 【参考答案】 A)13.2 【参考答案】 C)13.3 【参考答案】 B)13.4 【参考答案】 C)13.5 【参考答案】 D)13.6 【参考答案】 D)13.7 【参考答案】 D)二、 填空题13.8 【参考答案】 ar=9 ar=9 ar=1113.9 【参考答案】 1int* 2s 3*b三、 编程题13.10【分析与解答】 (1) 此命令行如下: #define MYALPHA(a) (a)=A&(a)=a&(a)=z)(2) 可用以下程序段来验证,此处s中存放了字符串,num中统计大、小写字母的个数: for(i=0;istrlen(s);i+)if(MYALPHA(si) num+;13.11 【分析与解答】 (1) 可如下定义SWAP: #define SWAP(t,x,y) t w; w=x; x=y; y=w; (2) 若有以下程序段: double a=99.99,b=11.11; SWAP(double,a,b);则SWAP(double,a,b)展开后有: double w; w=a; a=b; b=w; ;此处w是一个局部变量,它的作为域仅在复合语句内部,与程序中任何与其同名的变量无关。 (3) 请读者自编程序,调用以上带参的宏,对各种类型数据进行交换。参数t对应的应当是类型名。13.12 【分析与解答】 (1) 请编写一个swap函数,用于对两个整型变量中的值进行对调。 (2) 定义3个基类型为int的指针变量p1、p2和p3。 (3) 3次调用malloc函数,分别使p1、p2和p3指向三个动态分配的存储单元。程序准备把最小数放在p1所指动态存储单元中,把最大数放在p3所指动态存储单元中。 (4) 调用scanf函数给p1、p2和p3所指的3个动态分配存储单元赋值。 (5) 以下语句输出p1、p2和p3所指的动态存储单元中的值: printf(KG-*3n*KG-*3p1=%d p2=%d p3=%dKG-*3nKG-*3n,*KG-*3p1,*KG-*3p2,*KG-*3p3); (6) 如果p2所指的动态存储单元中的值小于p1所指的动态存储单元中的值,则调用swap函数把这两个存储单元中的值进行交换,使大数放入p2所指的动态存储单元中,小数放入p1所指动态存储单元中: if( *KG-*3p2next 2 mp-data(或p-datanum或(*(ps+i).num等形式引用主函数st数组元素中的成员,因为在函数中,形参ps是一个指针变量。 (4) 在readrec函数中,可以在一个for循环中输入结构体数组每个元素中的数据: for(i=0;iN;iKG-*3+KG-*3+) 在循环体中,可用gets(psi.num);gets();输入学生的学号和姓名。可用一个内嵌的for循环输入每个学生的四项成绩并同时累加成绩并求平均分: for(j=0;j4;jKG-*3+KG-*3+) scanf(%d,&psi.sj);psi.ave+KG-*3=psi.sj/4.0; 在scanf语句中,输入项是指针(ps+i)所指成员sj数组元素的地址,因此输入项也可以写成:psi.s+j。另外要注意,在进入此for循环前,应当给psi.ave赋0值。注意:在执行scanf语句读入成绩时,最后必定要按一个ENTER键,以便结束输入,但此回车符并没有被当作成绩读入,而是留在输入缓冲区内;若下一个输入项是数值数据时,并不会影响输入,而在此处,下一次又将去调用gets函数来给num输入一个字符串,于是,回车符被自动当作字符串的结束符读入,num中被赋“空”串,程序接着要求输入name。因此在退出以上控制变量为j的for循环后,需要有一个getchar()语句,以便“读入”一个字符,不使回车符留在输入缓冲区内。这虽是一个细节,但它能使输入正确进行。 (5) writerec函数的首部可以写成: void writerec(struct stud *KG-*3ps) (6) 在writerec函数中,可以在一个for循环中输出结构体数组每个元素中的数据: for(i=0;inum,(*(ps+i).name);当然输出项也可以写成:psi.num、。和在readrec函数中一样,用一个内嵌的for循环输出四项成绩,最后输出psi.ave。 (7) 在readrec函数中请添加输入提示,以便正确输入;在writerec函数中请添加有关的输出文字,使输出内容更清晰。 (8) 请自己编写主函数,写出定义语句和调用语句。 (9) 总结:本题的算法十分简单,仅是输入和输出,但要求能够掌握结构体数组在函数之间的数据传递,要求对结构体变量中成员能正确引用。在调试程序时,为了便于输入,可把define行改为: #define N 2这样只需输入两组数据,也同样可以对程序的正确性进行验证。14.13 【分析与解答】 (1) 本题所要求编写的函数可参考本章习题14.10。 (2) 为了能对链表进行操作,必须建立链表,建立链表的函数可参考本章习题14.11。输出链表可参考教材第四章例14.7。 (3) 本题第二个函数要求返回的是最大值所在结点的地址,若此函数名为maxadd,函数首部可以如下: struct node * maxadd(struct node *head)此处,struct node是链表结点的类型。函数的基本算法和习题14.10基本相同,只是需要另定义一个基类型为struct node的指针,假定此指针名为pmax,则每次当把最大值放入m时,同时也把此结点的地址放入pmax中,最后返回pmax即可。基本的程序段如下: p=head-next;m=p-data; pmax=p;for(p=p-next; p; p=p-next) if(mdata) m=p-data; pmax=p; (4) 在主函数中也需要定义一个基类型为struct node的指针,若定义该指针名为:maxnode,则应当把函数maxadd的返回值赋给它:maxnode=maxadd(head);,此处head指向链表的头结点。可用:printf(%dKG-*3n,maxnode-data);输出maxnode所指结点中的数据域,以验证maxnode是否指向链表中的最大值所在的结点。 (5) 总结:函数的类型可以是指向结构体的指针类型,也可以是结构体类型。读者也可编写一个函数,把最大值所在的结点放在一个结构体变量中作为函数值返回。第十五章 位运算习题分析与解答一、 选择题15.1 【参考答案】 D)15.2 【参考答案】 A)15.3 【参考答案】 B)15.4 【参考答案】 A)二、 填空题15.5 【参考答案】 11110000;15.6 【参考答案】 a=a&0;15.7 【参考答案】 a=a07777;15.8 【参考答案】 a=a|0177400;15.9 【参考答案】 a=0125002;15.10 【参考答案】 ch=ch32;第十六章 文件习题分析与解答一、 选择题16.1 【参考答案】 B)16.2 【参考答案】 C)二、 填空题16.3 【参考答案】 1 3 2 !feof(f1) 3 f2 4 fclose(f1)5 fclose(f2)16.4 【参考答案】 1 fopen(fname,w) 2 ch16.5 【参考答案】 1 r 2 (!feof(fp) 3 fgetc(fp)16.6 【参考答案】 AAAABBBBCCCC三、 编程题16.7 【分析与解答】 (1) 因为指定为10个字符串,并假定每个字符串不会超过20个字符,为方便起见,在程序的前面定义以下命令行:#define N 10#define M 22(2) 假定字符串输出到名为myfile.dat的文件中;程序中字符串放在名为s的字符数组中。(3) 按照题义程序应有以下步骤: 首先为“写”而打开文件: fp=fopen(myfile.dat,w); 从终端输入字符串,输入一个字符串,就立即把它输出到文件中,因为有N个字符串,因此需要放在循环中来完成: for(i=1;iKG-*3=N;iKG-*3+KG-*3+) printf(Enter a string: );gets(s);fputs(s,fp);fputc(KG-*3n,fp);函数fputs(s,fp)把刚从终端读入的字符串s输出到fp所指的文件中。请注意函数fputs(s,fp)的输出特点:在输出时它将只输出字符串中的字符而不输出字符串的结束标志到文件中,因此在文件中,连续输出的字符串之间将头尾相接,在文件中储存了一个接一个的字符,分不清哪是哪个字符串,其结果就使得不再可能从其中读入各个字符串了。为了分清各个字符串,因此在每输出一个字符串时,就接着输出一个KG-*3n符,以区分各字符串,在此由fputc(KG-*3n,fp);来完成。 关闭因“写”而打开的文件: fclose(fp); 为“读”而打开文件: fp=fopen(myfile.dat,r); 从文件中输入字符串并把刚读入的字符串输出到终端屏幕: fgets(s,M-1,fp);while(!feof(fp) c=sstrlen(s)-1;if(c=KG-*3n) sstrlen(s)-1=0;puts(s); fgets(s,M-1,fp);fgets(s,M-1,fp)从fp所指文件中输入M-1个字符串放入s的地址中;如果在未读满M-1个字符之前读到了一个换行符,则结束本次操作,系统在字符串最后自动加入0。注意,如果未读满M-1个字符,这时已把换行符读入,并作为字符串最后一个字符(在0之前)。在此,先判断sstrlen(s)-1是否为KG-*3n,若是,则用语句:sstrlen(s)-1=0;来消除此换行符,把字符串结束标志前移了一个位置,strlen(s)求出字符串的长度,strlen(s)-1是最后一个字符的下标。然后用puts(s);进行输出。fgets(s,M-1,fp);作为循环体内最后的语句,当读到文件的结束标志时,函数feof(fp)的值为1,循环立即结束。 关闭文件: (4) 请读者自己完成其他相关的语句和定义。 (5) 总结:在用fgets和fputs函数进行输入和输出时,请注意它们的特点,以便使字符串的输入和输出正确进行。16.8【分析与解答】 (1) 按题意程序需要两次把数据输出到文件中,第一次是把从键盘输入的数据输出到文件中,第二次是把修改过的数据再次输出到文件中。为此编写一个函数来完成此项任务,以避免重复编码。同理,程序需要两次从文件中输入数据,因此也用一个函数来完成此任务。另外程序需要两次把从文件输入的数据输出到屏幕上,因此也用一个函数来完成。 (2) 因为指定为10个双精度数,为方便起见,在程序的前面定义以下命令行: #define N 10 (3) 为了便于操作,无论是输入的数据还是输出的数据,程序都把它们放在一个数组中。 (4) 若程序把输出的数据放在mybin.dat文件中,在函数binput中把数据输出到mybin.dat文件,binput函数的首部应是: binput(double *a)形参a是一个基类型为double的指针,它接受存放数据的实参数组的首地址。函数中需要包含以下步骤: 打开输出文件: fp=fopen(mybin.dat,wb);fp是文件指针,mybin.dat是输出文件名,wb规定此次是为“写”而打开一个二进制文件。 输出数据到二进制文件中: for(i=0;iN;iKG-*3+KG-*3+)fwrite(a+i,sizeof(double),1,fp);fwrite是用于二进制输出的函数。第一个参数:a+i在内存中输出数据的首地址,第二个参数:sizeof(double)是每个输出数据的字节数,第三个参数:1是每执行一次fwrite时输出数据的个数,第四个参数:fp是指向输出文件的文件指针。语句:fwrite(a+i,sizeof(double),1,fp);的含义是:每执行一次,从a+i地址开始取sizeof(double)个字节放入fp所指的文件中。在此,for循环将把a0到a9中的数据(每个数据都是double类型)输出到fp所指的文件中。 输出结束,关闭文件: fclose(fp); (5) 程序若用名为binread的函数输入文件中的数据,binread函数的首部应是: binread(double *a)形参指针a指向主函数中存放数据的数组首地址。函数中需要包含以下步骤: 打开输入文件: fp=fopen(mybin.dat,rb);fp是文件指针,mybin.dat是输入文件名,rb规定此次是为“读”而打开一个二进制文件。 从二进制文件中输入数据: fread(a,sizeof(double),N,fp);此语句的含义是:从fp所指文件中输入N个sizeof(double)字节的数据,放入a所指地址开始的存储区中。因此,此语句一次就从文件中读入N个双精度数,并把它们放入了a所指的数组中。 输入结束,关闭文件: fclose(fp); (6) 程序若用名为pri的函数把数组中的数据输出到屏幕上,pri函数的首部应是: pri(double *a)此函数十分简单,请读者自己编写。 (7) 主函数中只需按本题的要求调用所需函数即可: main() double s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业科技公司员工保密合同
- 简易手机抵押合同范本5篇
- 购销合同轮胎3篇
- 安全施工现场培训课件
- 瓶子里的小昆虫课件
- 理财培训课件
- 电力工程采购方案(3篇)
- 安全文明施工培训感想
- 贵港港平南港区长岐塘作业区罗洪码头提档升级工程环评报告
- 环卫作业管理知识培训课件
- 2025年中国电信招聘考试行政职业能力测试预测题集
- 静脉治疗知识培训课件
- 学风建设科研诚信宣教课件
- 江西省宜春市2025年上半年事业单位公开遴选试题含答案分析
- 2025繁轩科技发展(天津)有限公司公开招聘工作人员35人备考题库及答案解析
- 2025年度水电项目工程结算与审计服务协议
- 德育副校长在新学期德育工作部署会讲话范文
- (2025年标准)学生玩耍纠纷协议书
- 南昌二中初一数学试卷
- 2025-2026秋季学年第一学期学生国旗下演讲稿(20周):第五周 76载荣光里我们茁壮成长-喜迎国庆
- 2025金融消费权益保护知识竞赛题库(+答案)
评论
0/150
提交评论