C语言程序设计及实验指导练习及习题参考答案(8--10)
更新时间:2024-01-01 16:53:01 阅读量: 教育文库 文档下载
C语言程序设计及实验指导练习及习题参考答案(8—10章)
8
练习参考答案 1、练习
8-1. 如果有定义:int m, n = 5, *p = &m; 与m = n 等价的语句是 B 。 A.m = *p; B. *p = *&n; C. m = &n; D. m = **p;
8-2. 设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1, float op2, float *psum, float *pdiff),其中op1 和op2 是输入的两个数,*psum 和*pdiff 是计算得出的和与差。 解答:
#include
float op1, op2, sum, diff;
void sum_diff(float op1, float op2, float *psum, float *pdiff); printf(“input op1 and op2: “); scanf(“%f%f”, &op1, &op2); sum_diff(op1, op2, &sum, &diff);
printf(“%f+%f=%f; %f-%f=%f \\n”,op1,op2,sum,op1,op2,diff); return 0; }
void sum_diff(float op1, float op2, float *psum, float *pdiff) {
*psum = op1 + op2; *pdiff = op1 – op2; }
8-3. 两个相同类型的指针变量能不能相加?为什么? 解答:
不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地 址相加并不能保证结果为一个有效的地址值,因而在C 语言中指针变量相加是非法的。 8-4. 根据表8.2 所示,这组数据的冒泡排序其实循环到第6 遍(即n-2)时就已经排好序了, 说明有时候并不一定需要n-1 次循环。请思考如何改进冒泡排序算法并编程实现(提示:当 发现一遍循环后没有数据发生交换,说明已经排好序了)。
解答:设置一个标志变量flag,进入一轮循环前设置为0,在循环中有发生数据交换就改写 flag 值为1。当该轮循环结束后检查flag 值,如果变为1 说明发生了数据交换,还没有排好 序,如果为0 说明没有发生交换,已经排好序。 #include
void bubble (int a[ ], int n); int main(void) {
int n, a[8]; int i;
printf(\scanf(\
printf(\for (i=0; i printf(\for (i=0; i printf(\return 0; } void bubble (int a[ ], int n) /* n 是数组a 中待排序元素的数量 */ { int i, j, t, flag; for( i = 1; i < n; i++ ) { /* 外部循环 */ flag=0; for (j = 0; j < n-i; j++ ) /* 内部循环 */ if (a[j] > a[j+1]) { /* 比较两个元素的大小 */ t=a[j]; a[j]=a[j+1]; a[j+1]=t; /* 如果前一个元素大,则交换 */ flag=1; /* 发生交换,flag 置为1 */ } if (flag==0) /* 如果一轮循环没有发生数据交换,排序结束*/ break; } } 8-5. 重做例8-9,要求使用选择排序算法。 解答: #include void bubble (int a[ ], int n); int main(void) { int n, a[8]; int i; printf(\scanf(\ printf(\for (i=0; i scanf(\bubble(a,n); printf(\ for (i=0; i printf(\return 0; } void bubble (int a[ ], int n) /* n 是数组a 中待排序元素的数量 */ { int i, j, t, index; for( i = 0; i < n-1; i++ ) { /* 外部循环 */ index=i; for (j = i+1; j < n; j++ ) /* 内部循环 */ if (a[j] < a[index]) index = j; t=a[i]; a[i]=a[index]; a[index]=t; } } 8-6. 在使用scanf()函数时,输入参数列表需要使用取地址操作符&,但当参数为字符数组 名时并没有使用,为什么?如果在字符数组名前加上取地址操作符&,会发生什么? 解答: 因为字符数组名的值是一个特殊的固定地址,可以看作是常量指针,因此不需要再使用 取地址符来获取该数组的地址。 如果在字符数组名str 前加上取地址操作符&,那么对其取地址&str 可以看做是这个数 组的第一个元素的地址,由于数组地址和数组第一个元素的地址相同,所以&str 表示地址值和str 表示的地址值是相等的。对scanf()的变长参数列表的话,编译器只负责参数传递,怎么解释后边的几个地址的含义, 是由前边的字符串确定的。所以使用scanf(“%s”,str)和 scanf(“%s”,&str)都能通过编译且正常执行。 8-7. C 语言不允许用赋值表达式直接对数组赋值,为什么? 解答: 数组名可以看作是常量指针,因为不可以对一个常量进行赋值,所以不允许用赋值表达式直接对数组进行赋值。 8-8. 输入一个字符串,把该字符串的前3 个字母移到最后,输出变换后的字符串。比如输入“abcdef”,输出为“defabc”。 解答: # include char line [MAXLINE], str[4]; int i; printf (\gets(line); if (strlen(line)<3) { printf(\字符串长度小于3,不符合要求!\\n\exit(1); } for (i=0;i<3;i++) str[i]=line[i]; str[i]='\\0'; for(i=3; line[i]!='\\0';i++) line[i-3]=line[i]; line[i-3]= '\\0'; strcat(line,str); printf (\return 0; } **8-9. 使用动态内存分配的方法实现例8-9 的冒泡排序。 解答: #include void bubble (int a[ ], int n); int main(void) { int n, *p; int i; printf(\scanf(\ /*为数组p 动态分配n 个整数类型大小的空间 */ if ((p=(int *)calloc(n, sizeof(int))) == NULL) { printf(\exit(1); } printf(\for (i=0; i scanf(\bubble(p,n); printf(\for (i=0; i printf(\free(p); return 0; } void bubble (int a[ ], int n) /* n 是数组a 中待排序元素的数量 */ { int i, j, t; for( i = 1; i < n; i++ ) /* 外部循环 */ for (j = 0; j < n-i; j++ ) /* 内部循环 */ if (a[j] > a[j+1]) /* 比较两个元素的大小 */ { t=a[j]; a[j]=a[j+1]; a[j+1]=t; /* 如果前一个元素大,则交换 */ } } 2 习题参考答案 一、选择题 1.下列语句定义x 为指向int 类型变量a 的指针,其中哪一个是正确的 B 。 A.int a, *x = a; B.int a, *x = &a; C.int *x = &a,a; D.int a, x = a; 2.以下选项中,对基本类型相同的指针变量不能进行运算的运算符是 A 。 A.+ B.- C.= D.== 3.若有以下说明,且0<=i<10,则对数组元素的错误引用是 C 。 int a[] = {0,1,2,3,4,5,6,7,8,9}, *p = a,i; A.*(a+i) B.a[p-a+i] C.p+i D.*(&a[i]) 4.下列程序的输出结果是 B 。 int main(void) { int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3; printf(“%d”, *++p); return 0; } A.3 B.4 C.a[4]的地址 D.非法 5.对于下列程序,正确的是 A 。 void f(int *p) { *p = 5; } int main(void) { int a, *p; a = 10; p = &a; f(p); printf(“%d”, (*p)++); return 0; } A.5 B.6 C.10 D.11 二、填空题 1. 下列函数在一维数组a 中将x 插入到下标为i(i>=0)的元素前。如果i>=元素的个数,则x 插入到末尾。原有的元素个数存放在指针n 所指向的变量中,插入后元素个数加1。请填 #include int year, month, day; }; int day_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; int main(void) { struct date today; int year, i, lp, count=0; scanf(“%d%d%d”,&today.year, &today.month, &today.day); /*输入日期*/ /*计算相差天数*/ for(year=1990; year lp= year%4==0&& year0!=0|| year@0==0; for(i=1; i<13; i++) count+=day_tab[lp][i]; } lp= today.year%4==0&& today.year0!=0|| today.year@0==0; for(i=1; i /*求除5 后的余数,再将余数对照“三天打鱼,两天晒网”,得出最后结论 */ count=count%5; if(count>=1&&count<=3) printf(“这一天是打鱼\\n”); else printf(“这一天是晒网\\n”); return 0; } 3.利用结构变量求解两个复数之积: (3+4i) × (5+6i)。 提示:求解(a1+a2i)×(b1+b2i),乘积的实部为:a1×b1 - a2×b2,虚部为:a1×b2 + a2×b1。 解答: #include struct complex cmult(struct complex , struct complex); void main() { struct complex a={3,4}, b={5,6}, c; c=cmult(a, b); printf(“(%d+%di)×(%d+%di) =%d+%di\\n”, a.real, a.im, b.real, b.im, c.real, c.im); } struct complex cmult(struct complex a , struct complex b) { struct complex w; w.real=a.real*b.real – a.im*b.im; w.im=a.real*b.im + a.im*b.real; return w; } 4.编写程序,从键盘输入10 本书的名称和定价并存入结构数组中,从中查找定价最高和最 低的书的名称和定价,并输出。 解答: #include { char name[10]; float price; }; int main() { int i,maxl,minl; struct book test[NUMBER]; printf(“Input 10 book?s name and price\\n”); for(i=0; i scanf(“%s%f”, test[i].name, &test[i].price); maxl=minl=0; for(i=1; i { if(test[maxl].price printf(“Max Price: %f, %s\\n”, test[maxl].price, test[maxl].name); printf(“Min Price: %f, %s\\n”, test[minl].price, test[minl].name); return 0; } 5.建立一个通讯录结构,包括姓名、生日、电话号码以及住址。编写程序,输入n(n≤10) 个联系人信息,按照年龄从大到小依次显示他们的信息。 解答: #include char name[10]; /* 姓名 */ int birthday; /* 生日 */ char phone[15]; /* 电话号码 */ char address[50]; /* 住址 */ }; void sort(struct friends_list s[], int n) /*按生日日期从小到大排序*/ { int i, j; struct friends_list temp; for(i=1; i if(s[j].birthday > s[j+1].birthday) {temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; } } int main(void) { int i, n; struct friends_list friends[10]; scanf(“%d”, &n); for(i=0; i scanf(\friends[i].address); /*按年龄从大到小排序*/ sort(friends, n); for(i=0;i printf(\friends[i].address); return 0; } 6.输入10 个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。每个学生的记 录包括学号、姓名、成绩和等级,要求定义和调用函数set_grade()根据学生成绩设置其等 级,并统计不及格人数,等级设置:85-100 为A,70-84 为B,60-69 为C,0-59 为D。 解答: /* 设置学生成绩等级并统计不及格人数(结构指针作为函数参数) */ #include char name[20]; int score; char grade; }; int set_grade(struct student *p); int main(void) { struct student stu[N], *ptr; int i, count; ptr = stu; printf(\for(i = 0; i < N; i++){ printf(\提示输入第i 个同学的信息 */ scanf(\} count = set_grade(ptr); printf(\printf(\for(i = 0; i < N; i++) printf(\return 0; } int set_grade(struct student *p) { int i, n = 0; for(i = 0; i < N; i++, p++){ if(p->score >= 85) p->grade = 'A'; else if(p->score >= 70) p->grade = 'B'; else if(p->score >= 60) p->grade = 'C'; else{ p->grade = 'D'; n++; } } return n; } 7.在本章例题的基础上编写一个学生信息综合管理程序,要求能够实现对学生信息的新建、 输出、修改、查询、按平均成绩排序等功能。 解答: 例9-1 中的函数new_student()、search_student()、output_student()分别实现了学生信息的 新建、查询和输出; 例9-3 实现了按学生平均成绩排序,将其排序功能程序封装在自定义函数sort(struct student students[ ], int n)中; 例9-3 中的函数update_score()实现了学生成绩修改; 将这5 个函数放在一个程序文件中,主函数在例9-1 的基础上修改如下: #include struct student{ /*学生信息结构类型定义*/ int num; /* 学号 */ char name[10]; /* 姓名 */ int computer, english, math; /* 三门课程成绩 */ double average; /* 个人平均成绩 */ }; int Count = 0; /* 全局变量,记录当前学生总数 */ int main(void) { int choice, num, course, score; struct student students[MaxSize]; /* 定义学生信息结构数组 */ do{ /* 用户操作界面 */ printf(\scanf(\switch(choice){ case 1: new_student(students); break; case 2: printf(“Please input the student?s number:”); scanf(“%d”, &num); search_student(students, num); break; case 3: output_student(students); break; case 4: sort(students, Count); break; case 5: printf(\scanf(“%d”, &num); printf(\scanf(“%d”, &course); printf(\scanf(“%d”, &score); update_score(students, Count, num, course, score); break; case 0: break; } } while(choice != 0); printf(\return 0; } 3 实验指导教材参考答案 一、调试示例 改正下列程序中的错误。输入一个正整数n(3≤n≤10),再输入n 个职员的信息(表 9.1),要求输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。(源程 序error09_1.c) 表9.1 工资表 姓 名 基本工资 浮动工资 支出 zh ao 240.00 400.00 75.00 qi an
正在阅读:
C语言程序设计及实验指导练习及习题参考答案(8--10)01-01
电机学试卷B2011-2012(2) -10-18
诗词表现手法之动静结合08-26
爬山的感觉真好作文700字07-02
可爱的小雪球作文600字07-13
实验七Excel工作表的编辑与格式化04-27
2021年央视感动中国感人事迹观后感05-14
2017年四川师范大学文学院644艺术概论考研导师圈点必考题汇编09-06
怎样把鸡蛋装进啤酒瓶作文500字07-01
二十年后回故乡作文结尾06-26
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 习题
- 程序设计
- 练习
- 答案
- 语言
- 指导
- 参考
- 实验
- 10
- 2019-2020年高考数学二轮复习第1部分重点强化专题专题4立体几何专题限时集训10立体几何中的向量方法理(I)
- K12九年级英语全册 Unit 7 Lesson 42 Peace at Last教案(新版)冀教版
- 七年级地理上册第一章第二节地球的运动第1课时学案新版新人教版
- Gold nanocluster-based fluorescence biosensor for targeted imaging in cancer cells and ratiometr - 图文
- 《正确使用标点符号》(课件+教案+试题)-2.doc
- 针对黑客渗透思维制定Web服务安全防护策略
- 三年级地方课《环境保护教育》教案资料
- 卖身契
- 九年级思想品德全册知识点问题责任与角色同在
- 钢结构焊缝超声波探伤检验程序 中英文(T8mm)
- 财务会计专业学生优秀事迹简介
- 高考新课标高考物理选择题专项训练20套 - 图文
- 《区域经济方法与模型》课程教学大纲 - 图文
- 非谓语动词作宾补,定语,状语的区别以及练习题(含答案)
- 2014-2019年中国汽油机行业市场调研及战略规划投资预测报告
- 组织行为学综述
- 利用WPF建立自适应窗口大小布局的WinForm窗口
- 教学设计方案模板石先平
- 岗位职责
- 建筑物理实验报告