C语言程序设计(第二版) 主编:余贞侠 何钰娟 (课后习题 代码题答案)

ps.由于没有官方答案,博主将自己写的代码分享出来,若有错误之处请多多谅解,转载注明出处!

版权声明:本文为CSDN博主「RanLZ」的原创文章,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/RangeLZ/article/details/121644174

第二章

15.编程实现:从键盘输入一个华氏温度 FFF,要求输出摄氏温度 CCC,计算公式为 C=5(F−32)/9C=5(F-32)/9C=5(F−32)/9.

#include <stdio.h>
int main(){double F, C;scanf("%lf", &F);C = 5 * (F - 32) / 9;printf("%.3lf ℉ == %.3lf ℃", F, C); return 0;
}

16.从键盘输入 x,v,zx,v,zx,v,z 的值,编写程序输出以下表达式的值: x+zx+zx+z % 333∗(int)(x+y)*(int)(x+y)∗(int)(x+y) % 2/42/42/4

#include <stdio.h>
int main(){double x, y;int z;scanf("%lf %lf %d", &x, &y, &z);printf("%g", x + z % 3 * (int)(x + y) % 2 / 4);return 0;
}

第三章

(1)从键盘读入矩形的长和宽的值,编程计算矩形的周长和面积,并将结果显示到屏幕上。

#include <stdio.h>
int main(){double l, w;scanf("%lf%lf", &l, &w);printf("c = %lg, s = %lg", (l + w) * 2, l * w);return 0;
}

(2)从键盘读入一个英文大写字母,将其转换成小写字母,并且将转换前后的字母及其 ASCIIASCIIASCII 码都显示到屏幕上。

#include <stdio.h>
int main(){char c;scanf("%c", &c);printf("%c(ASCII:%d) -> %c(ASCII:%d)", c, c, c -'A' + 'a', c -'A' + 'a');return 0;
}

(3)编写一程序实现以下功能:从键盘读入5个数num1、num2、num3、num4、num5num1、num2、num3、num4、num5num1、num2、num3、num4、num5 输出: (numl÷num2的商)×num3+num4−num5(numl÷num2的商)×num3+num4-num5(numl÷num2的商)×num3+num4−num5,不需考虑 num2num2num2 为 000 和计算结果溢出的情况。要求输出的结果中,整数部分宽度为6(不足6时以0补足)、小数部分宽度为8。编程可用素材:printf(“请输入5个数:”),printf(“\n计算结果为:”)。

#include <stdio.h>
int main(){double num1, num2, num3, num4, num5;scanf("%lf%lf%lf%lf%lf", &num1, &num2, &num3, &num4, &num5);double res = (num1 / num2) * num3 + num4 -num5;printf("%015.8lf", res);return 0;
}

(4)编写一程序实现以下功能:从键盘读入4个数据(依次为1个整数、2个字符、1个实数),然后按示例格式倒序输出这4个数据。编程可用素材:printf(“请输入4个数据(依次为1整数、2字符、1实数):”),printf(“\n这4个数据倒序为:”)。
例如:输入123 a b 254.67输出:4-254.673-b 2-a 1-123

#include <stdio.h>
int main(){int a;char b, c;double d;scanf("%d %c %c %lf", &a, &b, &c, &d);printf("4-%lg 3-%c 2-%c 1-%d", d, c, b, a);return 0;
}

(5)编写一程序实现以下功能:从键盘输入一日期,年月日之间以“-”分隔,并以同样的形式但以“/”作为分隔符。编程可用素材:printf( “\n please input a date:”),printf("\n the date is: ")。

#include <stdio.h>
int main(){int y, m, d;printf("\n Please input a date:");scanf("%d-%d-%d", &y, &m, &d);printf("\n the date is: %d / %d / %d", y, m, d);return 0;
}

(6)编写一程序实现以下功能;从键盘上输入一个3位整数,逆序输出这个3位数并且计算各个位上的数字之和。

#include <stdio.h>
int main(){int x, res = 0;scanf("%3d", &x);do{printf("%d", x % 10);res += x % 10;// 两行等价于// res +=  printf("%d", x % 10);}while(x /= 10);printf("\nres = %d", res);return 0;
}

(7)已知直角三角形的两条直角边,求第三条边。

#include <stdio.h>
#include <math.h>
int main(){double a, b, c;scanf("%lf%lf", &a, &b);c = sqrt(a * a + b * b);printf("%lg", c);return 0;
}

(8)分别用getchar()和scanf()函数读入2个不同的字符,用 putchar()和printf()函数将这两个字符输出,比较这几个函数对字符操作的不同。

#include <stdio.h>
int main(){char a, b;a = getchar();scanf("%c", &b);putchar(a);printf("%c", b);return 0;
}

(9)计算如下图所示的圆环的面积。小圆和大圆的半径从键盘读入,输出要有文字说明,精确到小数点后3位,请编程实现。

#include <stdio.h>
int main(){double a, b, res;scanf("%lf%lf", &a, &b);if(a < b){res = a;a = b;b = res;}res = 3.141 * a * a - 3.141 * b * b;printf("%.3lf", res);return 0;
}

第四章

1、从键盘输入4个整数,输出其中的最大数和次大数。

#include <stdio.h>
void quicksort(int q[], int l, int r){if(l >= r) return;int x = q[(l + r) / 2], i = l - 1, j = r + 1;while(i < j){do i++; while(q[i] < x);do j--; while(q[j] > x);if(i < j){int temp = q[i];q[i] = q[j], q[j] = temp;}}quicksort(q, l, j);quicksort(q, j+ 1, r);
}
int main(){int q[4];scanf("%d%d%d%d",  &q[0], &q[1], &q[2], &q[3]);quicksort(q, 0, 3);printf("最大 = %d, 次大 = %d", q[3], q[2]); return 0;
}

2.有一个函数:
Y = x ( x<1)
Y = 3x+5, (1<=x<30)
Y = 7x-3 (x>=30)
编写程序输入x的值,计算并输出y的值。

#include <stdio.h>
int main(){double x, y;scanf("%lf", &x);if(x < 1) y = x;else if(x < 30) y = 3 * x + 5;else y = 7 * x -3;printf("%lg", y);return 0;
}

3.从键盘输入一个整数,如果是正数,输出该数自身;如果是负数,输出它的绝对值。

#include <stdio.h>
int main(){int a;scanf("%d", &a);if(a < 0) a = -a;printf("%d", a);return 0;
}

4、从键盘输入a,b,c三个数,判断能否构成三角形。若能构成三角形,计算并输出三角形的面积。

#include <stdio.h>
#include <math.h>
int main(){int a, b, c;double p, s;scanf("%d%d%d", &a, &b, &c); if(a + b < c || a + c < b || b + c < a){printf("No");return 0;}p = (a + b + c) / 2.0;s = sqrt(p * (p - a) * (p - b) * (p - c));printf("yes, S = %lg", s);    return 0;
}

5.从键盘输入一个字符,如果是小写字母,则转换为其对应的大写字母;如果是大写字母,则原样输出:如果是教字,则输出其十进制ASCII值;如果是其他字符,则统一输出@。

#include <stdio.h>
int main(){char c;scanf("%c", &c);if(c >= 'A' && c <= 'Z') printf("%c", c);else if(c >= 'a' && c <= 'z') printf("%c", c - 'a' + 'A');else if(c >= '0' && c <= '9') printf("%d", c);else printf("@");return 0;
}

6.身体质量指数(BMI)是常用的衡量人体肥胖程度和是否健康的重要标准。BMI判断标准如下:

BMI 分类
小于18.5 体重过低
18.5(含)~24.0 正常范围
24.0(含)~28.0 超重
大于等于28.0 肥胖
BMI的计算公式:体重(kg)/身高(m)的平方。编程实现从键盘输入一个人的体重和身高,计算并输入其所在分类。
#include <stdio.h>
int main(){double w, h, BMI;scanf("%lf%lf", &w, &h);BMI = ( w / (h * h));if(BMI < 18.5) printf("体重过低");else if(BMI < 24.0) printf("正常范围");else if(BMI < 28.0) printf("超重");else printf("肥胖");return 0;
}

7.从键盘输入4个整数,要求按从大到小的顺序输出。

#include <stdio.h>
void quicksort(int q[], int l, int r){if(l >= r) return;int x = q[(l + r) >> 1], i = l - 1, j = r + 1;while(i < j){do i++; while(q[i] < x);do j--; while(q[j] > x);if(i < j){int temp = q[i];q[i] = q[j], q[j] = temp;}}quicksort(q, l, j);quicksort(q, j+ 1, r);
}
int main(){int q[4], i = 4;while(i--) scanf("%d", &q[3 - i]);quicksort(q, 0, 3);for(i = 0; i < 4; i++) printf("%d ", q[i]);return 0;
}

第五章

1.计算并输出l!+2!+…+n!(其中n<16)。

#include <stdio.h>
int main(){int n, i, res = 0, temp = 1;scanf("%d", &n);for(i = 1; i <= n; i++){temp *= i;res += temp;}printf("%d", res);return 0;
}

2.输出1000以内的所有完数。“完数”是指一个数的因子之和等于自身3.输入两个正整数m和n,计算并输出其最大公约数。

#include <stdio.h>
#include <math.h>
int main(){int n, i, j;for(i = 2; i <= 1000; i++){n = 1;for(j = 2; j <= (int)sqrt(i); j++)if(i % j == 0) n += j + i / j;if(n == i) printf("%d ", i);}return 0;
}

3.输入两个正整数m和n,计算并输出其最大公约数。

#include <stdio.h>
int main(){int m, n, i;scanf("%d%d", &m, &n);for(i = m < n ? m : n; i >=1; i--)if(m % i == 0 && n % i == 0) break;printf("最大公约数是:%d", i);return 0;
}

4.一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求它在第8次落地时共经过多少米,第8次反弹多高。

#include <stdio.h>
int main(){double h = 100;int i = 8;while(i--) h /= 2;printf("%lg", h);return 0;
}

5.输入一行字符,分别统计其中英文字母、数字和其他字符的个数。

#include <stdio.h>
int main(){int fNum = 0, eNum = 0, oNum = 0, i;char ch[100];scanf("%s", ch);for(i = 0; ch[i] != '\0'; i++){if(ch[i] >= '0' && ch[i] <= '9') fNum++;else if(ch[i] >= 'a' && ch[i] <= 'z') eNum++;else if(ch[i] >= 'A' && ch[i] <= 'Z') eNum++;else oNum++;}printf("数字有:%d 个,英文有:%d 个, 其他字符有:%d 个", fNum, eNum, oNum);return 0;
}

6.从键盘输入任意个整数,以-888结束(不计入),计算并输出其中的最大数和最小数。

#include <stdio.h>
int main(){int num[100], i = 0, max = -9999999, min = 99999999;do{scanf("%d", &num[i]);if(num[i] == -888) break;max = max > num[i] ? max : num[i];min = min < num[i] ? min : num[i]; }while(++i);printf("Max = %d, Min = %d", max, min);return 0;
}

7.要将100元钱换成1元、5元和10元的零钱,每种零钱的张数大于0,且为5(的倍数,编程输出所有可能的换法。

#include <stdio.h>
int main(){int oNum, fNum, tNum, count = 0;for(oNum = 5; oNum <= 100; oNum += 5)for(fNum = 5; fNum <= 20; fNum += 5)for(tNum = 5; tNum <= 10; tNum += 5)if(oNum + fNum * 5 + tNum * 10 == 100)printf("1块钱 %d 张,5块钱 %d 张,10块钱 %d 张\n", oNum, fNum, tNum);return 0;
}

8.百钱百鸡问题。用100钱买100只鸡,公鸡一只五钱,母鸡一只三钱,小鸡三只一钱,编程输出所有可能的买法(要求每种鸡至少要买1只)。

#include <stdio.h>
int main(){int bNum, gNum, cNum;for(bNum = 1; bNum <= 20; bNum++)for(gNum = 1; gNum <= 33; gNum++)for(cNum = 1; cNum <= 300; cNum++)if(bNum + gNum + cNum == 100 && bNum * 5 +  gNum * 3 + cNum / 3.0 == 100.0)printf("公鸡 %d 只,母鸡 %d 只,小鸡 %d 只\n", bNum, gNum, cNum);return 0;
}

第六章

1.计算面积:输入rl,r2,求出圆形垫片的面积。

#include <stdio.h>
#include <math.h>
const double PI = 3.1415926;
double fun(double r1, double r2){return fabs(PI * (r1 * r1 - r2 * r2));
}
int main(){double r1, r2, res;scanf("%lf%lf", &r1, &r2);res = fun(r1, r2);printf("%lg", res);return 0;
}

2.找到10000以内所有完数,其中判断完数的功能用函数实现。

#include <stdio.h>
#include <math.h>
int wan(int i){int n = 1, j;for(j = 2; j <= (int)sqrt(i); j++)if(i % j == 0) n += j + i / j;return n == i && i != 1;
}
int main(){int i;for(i = 1; i <= 10000; i++)if(wan(i)) printf("%d ", i);return 0;
}

3,输入两个正整数m和n,求其最大公约数和最小公倍数。

#include <stdio.h>
int gcd(int a, int b) {int i;for(i = a < b ? a : b; i >= 0; i--)if(a % i == 0 && b % i == 0)return i;return 0;
}int lcm(int a, int b) {int i = a > b ? a : b;do{if(i % a == 0 && i % b == 0) return i;}while(++i);return 0;
}int main(){int a, b;scanf("%d%d", &a, &b);printf("gcd = %d, lcm = %d", gcd(a, b), lcm(a, b));return 0;
}

4.一个5位数,判断它是不是回文数。例如,12321是回文数,个位与万位相同,十位与千位相同。

#include <stdio.h>
int hws(char num[8]){int i, j;for(i = 0, j = 4 ; i <= j; i++, j--)if(num[i] != num[j]) return 0;return 1;
}
int main(){char num[8];gets(num);if(hws(num)) printf("Yes");else printf("No");return 0;
}

5.从键盘输入任意一个正整数,输出该数的逆序数。

#include <stdio.h>
void fun(int n){if(!n) return;printf("%d", n % 10);fun(n / 10);return;
}
int main(){int n;scanf("%d", &n);fun(n);return 0;
}

第七章

1、输入m个浮点教、然后按升序进行排序并输出。

#include <stdio.h>
void quicksort(float q[], int l, int r){if(l >= r) return;float x = q[(l + r) / 2];int i = l - 1, j = r + 1;while(i < j){do i++; while(q[i] < x);do j--; while(q[j] > x);if(i < j){float temp = q[i];q[i] = q[j], q[j] = temp;}}quicksort(q, l, j);quicksort(q, j + 1, r);
} int main(){int m, i;float q[100];scanf("%d", &m);for(i = 0; i < m; i++) scanf("%f", &q[i]);quicksort(q, 0, m - 1);for(i = 0; i < m; i++) printf("%g ", q[i]);return 0;
}

2、输入10个整数,找出与平均值最接近的数并输出。

#include <stdio.h>
#include <math.h>
int main(){int i, num[11], sum = 0, minIndex = 0;float avg, min = 999999, fa;for(i = 0; i < 10; i++){scanf("%d", &num[i]);sum += num[i];}avg = sum / 10.0;for(i = 0; i < 10; i++){fa = fabs(num[i] - avg);if(fa < min){minIndex = i;min = fa;}}printf("平均值是%g, 离平均值最近的是%d", avg, num[minIndex]);return 0;
}

3、 找出二维数组中的最大值和最小值,并给出对应下标值。

#include <stdio.h>
int main(){int m, n, num[10][10], i, j, minIndex_x = 0, maxIndex_x = 0, minIndex_y = 0, maxIndex_y = 0;scanf("%d%d", &m, &n);for(i = 0; i < m; i++)for(j = 0; j < n; j++)scanf("%d", &num[i][j]);for(i = 0; i < m; i++){for(j = 0; j < n; j++){if(num[i][j] > num[maxIndex_x][maxIndex_y]){maxIndex_x = i;maxIndex_y = j;}if(num[i][j] < num[minIndex_x][minIndex_y]){minIndex_x = i;minIndex_y = j;}}}printf("最大值为%d,x为%d,y为%d\n", num[maxIndex_x][maxIndex_y], maxIndex_x, maxIndex_y);printf("最小值为%d,x为%d,y为%d\n", num[minIndex_x][minIndex_y], minIndex_x, minIndex_y);return 0;
}

4、输入—个m行n列的矩阵,输出各行与各列的元素之和。

#include <stdio.h>
int main(){int m, n, num[10][10], i, j, sum = 0;scanf("%d%d", &m, &n);for(i = 0; i < m; i++)for(j = 0; j < n; j++)scanf("%d", &num[i][j]);printf("\n***输出的矩阵如下:\n\n");for(i = 0; i < m; i++){sum = 0;for(j = 0; j < n; j++){printf("%d ", num[i][j]);sum += num[i][j];}printf("本行和为:%d\n", sum);}return 0;
}

5.输入3个字符串,找出其中最大的字符串。

#include <stdio.h>
#include <string.h>
int main(){char ch[4][10];int index = 0, i;for(i = 0; i < 3; i++) gets(ch[i]);for(i = 0; i < 3; i++){if(strcmp(ch[i], ch[index]) > 0) index = i;} puts(ch[index]);return 0;
}

6.自编写字符串复制函数(功能与strcpy完全一样)。

#include <stdio.h>
void strcpy(char a[], char b[]){int i;for(i = 0; a[i] != '\0'; i++) b[i] = a[i];b[i] = '\0';
}
int main(){char ch[] = "C语言程序设计!", ch1[25];strcpy(ch, ch1);puts(ch1);return 0;
}

7.编程将一个输入的 ASCII 数字串转换成对应的整数(数字串对应的数的范围不超过32位整数的值的苑围)。

#include <stdio.h>
long long int fun(char num[]){long long int i, res = 0;for(i = 0; num[i] != '\0'; i++) res = res * 10 + num[i] - '0';return res;
}
int main(){char a[100];gets(a);printf("%lld", fun(a));return 0;
}

第八章

本章习题要求用指针进行处理。

1.从键盘输入两个整型数a,b,交换并输出a,b数值。

#include <stdio.h>
void fun(int *a, int *b){int temp = *a;*a = *b;*b = temp;
}
int main(){int a, b;scanf("%d%d", &a, &b);fun ( &a, &b);printf("%d %d", a, b);return 0;
}

2.有一个包含有10个整型数的数组,分别诵讨两个子函数找出其中最大数及最小数并输出。

#include <stdio.h>
int findMax(int *a){int i, max = 0x8fffffff;for(i = 0; i < 10; i++) max = max > a[i] ? max : a[i] ;return max;
}
int findMin(int *a){int i, min = 0x7fffffff;for(i = 0; i < 10; i++) min = min < a[i] ? min : a[i] ;return min;
}
int main(){int a[10] = {34, 123, -90, 3, 0, -546, 31454, 6574654, -3234, 1};printf("%d %d", findMax(a), findMin(a));return 0;
}

3.有一个5*5的矩阵,通过子函数找出每行的最大教并输出,以及整个矩阵中的最大数并输出。

#include <stdio.h>
void findMax(int a[5][5]){int i, j, maxAll = 0x8fffffff, max = 0x8fffffff;for(i = 0; i < 5; i++){max = 0x8fffffff;for(j = 0; j < 5; j++){max = max > a[i][j] ? max : a[i][j];}printf("%d行最大值为%d\n", i, max);maxAll = maxAll > max ? maxAll : max;}printf("矩阵最大值为%d\n", maxAll);return;
}
int main(){int a[5][5] = {{2, 0, 1, 5, 2},{3, 1, 5, 4, 67},{-312, 534, 12, 6},{3445, 12, 65, 3},{123, 2, 123, 4, 2}};findMax(a);return 0;
}

4.有一个包含任意字符的字符数组,将数组中非字母字符删除。

#include <stdio.h>
void del(char *ch, int delIndex){int i;for(i = delIndex; ch[i] != '\0'; i++) ch[i] = ch[i + 1];return;
}
int check(char ch){return  ch >= 'A' && ch <= 'Z' || ch > 'a' && ch <= 'z';
}
int main(){char ch[100];int i;gets(ch);for(i = 0; ch[i] != '\0'; i++){if(check(ch[i]) != 1){del(ch, i);i--;}}puts(ch);return 0;
}

5.实现将一个字符串拷贝到另一个字符串,函数原型为char * strcopy(char * s1, char*s2)。

#include <stdio.h>
char *strcopy(char *s1, char *s2){int i;char *res = s1;for(i = 0; s2[i] != '\0'; i++) s1[i] = s2[i];s1[i] = '\0';return res;
}
int main(){char ch1[25];;strcopy(ch1, "C语言程序设计!");puts(ch1);return 0;
}

6.从键盘输入五个字符串,利用指针数组对字符串进行升序排列。

#include <stdio.h>
#include <string.h>
int main(){char ch[5][100] = {"fasdfweads", "fsvfefdrfg", "asfdwerf", "cvfey", "treyhrth"};char *p[5] = {ch[0], ch[1], ch[2], ch[3], ch[4]}, *t;int n, m, i;for(n = 0; n < 5; n++){for(m = n + 1; m < 5; m++){if(strcmp(p[n], p[m]) > 0){t = p[n];p[n] = p[m];p[m] = t;}}}for(i = 0; i < 5; i++) puts(p[i]);return 0;
}

第九章

1.定义一个结构体变重,包括年、月、日数据。计算该日在本年中是第几天,注意闫年问题。

#include <stdio.h>int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};struct date{int year;int month;int day;
}date1;int leapYear(int year){if(year % 100 != 0) return year % 4 == 0;else return year % 400 == 0;
}int day(struct date da){int i, days = 0;for(i = 1; i < da.month; i++) days += a[i];days += da.day;if(da.month > 2 && leapYear(da.year)) days++;return days;
}int main(){scanf("%d%d%d", &date1.year, &date1.month, &date1.day);printf("%d", day(date1));return 0;
}

2.做一个针对10个学生的简易成绩管理系统。学生信息包括学号、姓名、年龄、三门课成绩。功能包括统计不及格的名单并显示,对平时成绩进行从高到低排序。

#include <stdio.h>struct student{int id;char name[20];int age;float score[3];
}stu[10];int stu_num = 0; // 记录已存储的学生个数void Menu()
{printf("\n\t*********C语言成绩管理系统*********\n\n");printf("\t\t 1 录入数据\n\n");printf("\t\t 2 统计不及格的名单\n\n");printf("\t\t 3 平时成绩排序\n\n");printf("\t\t 0 退出\n\n");printf("\n\t************************************\n\n");
}void add(){for(stu_num = 0; stu_num < 10; stu_num++){printf("输入第%d个学生信息\n", stu_num + 1);scanf("%d\n%s\n%d\n%f\n%f\n%f", &stu[stu_num].id, stu[stu_num].name, &stu[stu_num].age, &stu[stu_num].score[0], &stu[stu_num].score[1], &stu[stu_num].score[2]);}return;
}void fail(){int i, j;for(i = 0; i < stu_num; i++){for(j = 0; j < 3; j++){if(stu[i].score[j] < 60){printf("%s(学号:%d)不及格\n", stu[i].name, stu[i].id);break;}}}return;
}void swap(struct student s1, struct student s2){struct student temp;temp = s1;s1 = s2;s2 = temp;
}void sort(){int i, j;float sco1, sco2; struct student temp;for(i = 0; i  < stu_num; i++){for(j = i + 1; j < stu_num; j++){sco1 = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];sco2 = stu[j].score[0] + stu[j].score[1] + stu[j].score[2];if(sco1 < sco2){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}
}void printStu(){int i;for (i = 0; i < stu_num; i++) printf("学号:%d 姓名:%s 年龄:%d 成绩1:%g 成绩2:%g 成绩3:%g\n", stu[i].id, stu[i].name, stu[i].age, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
}int main(){int a; Menu();while(1){printf("\n\n\t请做出您的选择:\n");scanf("%d", &a);switch(a){case 1:add(); break;case 2:printf("不合格名单如下:\n");fail();break;case 3:sort();printf("排序后的结果\n");printStu();break;case 0:return 0;default:printf("输入错误!!!!!!!!!!!");break;}}return 0;
}

3.有10个学生的信息,包括学号、姓名、年龄,组成结构体数组。将该数组的10个学生数据读出形成链表。

#include <stdio.h>
const int N = 10;struct student{int id;char name[20];int age;struct student *next;
}stu[10];void add(){int stu_num;for(stu_num = 0; stu_num < N; stu_num++){printf("输入第%d个学生信息\n", stu_num + 1);scanf("%d\n%s\n%d", &stu[stu_num].id, stu[stu_num].name, &stu[stu_num].age);if(stu_num != 9) stu[stu_num].next = &stu[stu_num + 1];else stu[stu_num].next = NULL;}return;
}void printStu(struct student *head){int i;struct student *p = head;for (i = 0; i < N; i++){printf("学号:%d 姓名:%s 年龄:%d\n", p -> id, p -> name, p -> age);p = p -> next;}
}int main(){int i;struct student *head = &stu[0];add();printStu(head);return 0;
}

4.给定一个链表,每个链表中的结点包括学号、成绩。在其中查找某个学号的学生结点,将其成绩替换成指定的新成绩。

#include <stdio.h>
#include <stdlib.h>typedef struct student{int id;float score;struct student *next;
}Stu;Stu *head = NULL, *tail = NULL;void createLink(){Stu *s = (Stu *)malloc(sizeof(Stu));head = s;tail = s;s->next = NULL;
}
void insert(){Stu *node = (Stu *)malloc(sizeof(Stu));printf("请输入信息:\n"); scanf("%d%f", &(node->id), &(node->score));node->next = NULL;tail->next = node;tail = node;
}void printStu(Stu *head){int i;Stu *p = head->next;while(p != NULL){printf("学号:%d 成绩:%g\n", p -> id, p -> score);p = p -> next;}
}int main(){int n = 3;createLink();while(n--) insert();printStu(head);return 0;
}

5,给定两个链表,每个链表中的结点包括学号、成绩。求两个链表的交集。要求两个链表的交集

#include <stdio.h>
#include <stdlib.h>typedef struct student{int id;float score;struct student *next;
}Stu;void createLink(Stu **head, Stu **tail){Stu *s = (Stu *)malloc(sizeof(Stu));*head = s;*tail = s;s->next = NULL;
}
void insert(Stu **tail){Stu *node = (Stu *)malloc(sizeof(Stu));printf("请输入信息:\n"); scanf("%d%f", &(node->id), &(node->score));node->next = NULL; (*tail)->next = node; *tail = node;
}void printStu(Stu *head, Stu *head2){int i;Stu *p = head->next, *p2 = head2->next;while(p != NULL){p2 = head2->next;while(p2 != NULL){if(p2->id == p->id)printf("学号:%d\n", p -> id);p2 = p2 -> next;}p = p -> next;}
}int main(){int n = 3, m = 3;Stu *head = NULL, *tail = NULL;Stu *head2 = NULL, *tail2 = NULL;createLink(&head, &tail);createLink(&head2, &tail2);printf("输入第一个链表\n");while(n--) insert(&tail);printf("输入第二个链表\n");while(m--) insert(&tail2);printStu(head, head2);return 0;
}

6.给定两个链表a与b,每个链表中的结点包括学号、成绩。要求从a链表中删除与b链表有相同学号的结点。

#include <stdio.h>
#include <stdlib.h>typedef struct student{int id;float score;struct student *next;
}Stu;void createLink(Stu **head, Stu **tail){Stu *s = (Stu *)malloc(sizeof(Stu));*head = s;*tail = s;s->next = NULL;
}
void insert(Stu **tail){Stu *node = (Stu *)malloc(sizeof(Stu));printf("请输入信息:\n"); scanf("%d%f", &(node->id), &(node->score));node->next = NULL; (*tail)->next = node; *tail = node;
}void delStu(Stu *head, Stu *head2){int i, flag = 0;Stu *p = head, *p2 = head2, *t;while(p->next != NULL){p2 = head2, flag = 0;while(p2->next != NULL){if(p2->next->id == p->next->id){t = p->next;p->next = p->next->next;free(t);flag = 1;break;}p2 = p2 -> next;}if(flag == 0) p = p -> next;}
}void printStu(Stu *head){int i;Stu *p = head->next;while(p != NULL){printf("学号:%d 成绩:%g\n", p -> id, p -> score);p = p -> next;}
}int main(){int n = 3, m = 3;Stu *head = NULL, *tail = NULL;Stu *head2 = NULL, *tail2 = NULL;createLink(&head, &tail);createLink(&head2, &tail2);printf("输入第一个链表\n");while(n--) insert(&tail);printf("输入第二个链表\n");while(m--) insert(&tail2);delStu(head, head2);printStu(head);return 0;
}

7.给定两个链表,每个链表中的结点包括学号、成绩,并均为学号升序排列。求两个链表的并集,并集的结果仍按学号升序排列。

#include <stdio.h>
#include <stdlib.h>typedef struct student{int id;float score;struct student *next;
}Stu;void createLink(Stu **head, Stu **tail){Stu *s = (Stu *)malloc(sizeof(Stu));*head = s;*tail = s;s->next = NULL;
}
void insert(Stu **tail){Stu *node = (Stu *)malloc(sizeof(Stu));printf("请输入信息:\n"); scanf("%d%f", &(node->id), &(node->score));node->next = NULL; (*tail)->next = node; *tail = node;
}void insert2(Stu **tail, Stu *p){Stu *node = (Stu *)malloc(sizeof(Stu));node->id = p->id;node->score = p->score;node->next = NULL; (*tail)->next = node; *tail = node;
}void findUnion(Stu *head, Stu *head2, Stu **tail3){Stu *p = head->next, *p2 = head2->next;while(p != NULL && p2 != NULL){if(p->id > p2->id) p2 = p2->next;else if(p->id < p2->id) p = p->next;else{insert2(tail3, p);p = p->next;p2 = p2->next;}}
}void printStu(Stu *head){int i;Stu *p = head->next;while(p != NULL){printf("学号:%d 成绩:%g\n", p -> id, p -> score);p = p -> next;}
}int main(){int n = 3, m = 3;Stu *head = NULL, *tail = NULL;Stu *head2 = NULL, *tail2 = NULL;Stu *head3 = NULL, *tail3 = NULL;createLink(&head, &tail);createLink(&head2, &tail2);createLink(&head3, &tail3);printf("输入第一个链表\n");while(n--) insert(&tail);printf("输入第二个链表\n");while(m--) insert(&tail2);findUnion(head, head2, &tail3);printStu(head3);return 0;
}

8.10人围成一圈,并从1到10依次分配编号。从编号为1的人开始依次报数1,2,3,报3的人退出,余下的人继续从1开始依次报数,到3退圈。当最后一人留在圈时求其原来的编号。

#include <stdio.h>
int main(){int man[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, temp[11];int i, j, top = 10, t, n = 0;for(t = 1; t <= top; t++) printf("%d ", man[t]);putchar('\n'); for(i = 1, j = 0; top > 1; i++){t = (i - j) % (top + 1);if(i % 3 != 0) temp[++n] = man[t];if((i - j) == top){top = n;j = i;for(t = 1; t <= top; t++) man[t] = temp[t];for(t = 1; t <= top; t++) printf("%d ", man[t]);putchar('\n'); n = 0;}}return 0;
}

第十章

2.用 Windows的记事本编辑一个文本文件,编写程序读取该文件中的数据,并在屏幕上显示。

#include <stdio.h>
#include <stdlib.h>
int main(){FILE *fp;char ch;fp = fopen("2.txt", "rb");if(fp == NULL){printf("打开失败\n");exit(0);}ch = fgetc(fp);while(ch != EOF){putchar(ch);ch = fgetc(fp);}          putchar('\n');        fclose(fp);  return 0;
}

3.编写程序,将一个文本文件的内容复制到另一个文本文件中,文本文件的名字从键盘输入。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){FILE *fp, *fp2;char ch, name[20];scanf("%s", name);strcat(name, ".txt");fp = fopen("2.txt", "r");fp2 = fopen(name, "w+");if(fp == NULL || fp2 == NULL){printf("打开失败\n");exit(0);}ch = fgetc(fp);while(ch != EOF){if(fputc(ch, fp2) == EOF){printf("拷贝失败\n");exit(0);}ch = fgetc(fp);}         fclose(fp);        fclose(fp2);printf("拷贝完成");return 0;
}

4.输入5个学生信息(包括学生的姓名、年龄、数学成绩、英语成绩、语文成绩),将学生信息存入名为“student. txt”的文本文件中(每个学生占1行,各数据之间用空格分隔,写文件采用fprintf()函数)。

#include <stdio.h>
#include <stdlib.h>
int main(){FILE *fp;char name[20];int age, i;float m, e, c;fp = fopen("4.txt", "a+"); for(i = 0; i < 5; i++){scanf("%s %d %f %f %f", name, &age, &m, &e, &c);fprintf(fp, "%s %d %g %g %g\n", name, age, m, e, c);}fclose(fp);return 0;
}

5.将第4题文件中的数据读出并求出平均成绩,按平均成绩从高到低显示学生信息(读文件采fscanf()函数)。

#include <stdio.h>
#include <stdlib.h>
struct Student{char name[20];int age;float score[3];float ave;
}stu[5];
void sort(){int i, j;struct Student temp;for(i = 0; i < 5; i++){for(j = i + 1; j < 5; j++){if(stu[i].ave < stu[j].ave){temp = stu[i];stu[i] = stu[j];stu[j] = temp;}}}
}
int main(){FILE *fp = fopen("4.txt", "r");int i, j = 0;do{i = fscanf(fp, "%s %d %f %f %f", stu[j].name, &stu[j].age, &stu[j].score[0], &stu[j].score[1], &stu[j].score[2]);stu[j].ave = (stu[j].score[0] + stu[j].score[1] + stu[j].score[2]) / 3;j++;}while(i == 5);sort();for(i = 0; i < 5; i++){printf("%s %f\n", stu[i].name, stu[i].ave);}fclose(fp);return 0;
}

6.定义一个结构体类型,其成员变量分别用来描述商品的名称、单价、数量、金额。输入n个商品的信息,并将其保存到二进制文件中。

#include <stdio.h>
#include <stdlib.h>
struct commodity{char name[20];float price;int count;float money;
}com;
int main(){int n, i;FILE *fp = fopen("6.txt", "ab+");scanf("%d", &n);for(i = 0; i < n; i++){scanf("%s %f %d %f", com.name, &com.price, &com.count, &com.money);fprintf(fp, "%s %g %d %f\n", com.name, com.price, com.count, com.money);}fclose(fp);return 0;
}

7.将第6题的商品信息文件读出并显示,要求在显示数据时,首先按金额从高到世排序,若金额相同,再按产品单价从高到低排序。

#include <stdio.h>
#include <stdlib.h>
struct commodity{char name[20];float price;int count;float money;
}com[100];
void sort(int n){int i, j;struct commodity temp;for(i = 0; i < n; i++){for(j = i + 1; j < n; j++){if(com[i].money < com[j].money || (com[i].money == com[j].money && com[i].price < com[j].price)){temp = com[i];com[i] = com[j];com[j] = temp;}}}
}
int main(){FILE *fp = fopen("6.txt", "rb");int i, j = 0;do{i = fscanf(fp, "%s %f %d %f", com[j].name, &com[j].price, &com[j].count, &com[j].money);j++;}while(i == 4);sort(--j);for(i = 0; i < j; i++){printf("%s %f %d %f\n", com[i].name, com[i].price, com[i].count, com[i].money);}fclose(fp);return 0;
}

【完】

2021/12/42021/12/42021/12/4 于四川成都

C语言程序设计(第二版) 主编:余贞侠 何钰娟 课后习题 代码题答案相关推荐

  1. c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第9章 文件程序设计.pdf...

    C语言程序设计 第9章 文件程序设计 <C语言程序设计>(第2版) 中国铁道出版社张磊编著 C语言程序设计(第2版)张磊编著中国铁道出版社 第9章 文件程序设计 9.1 文件概述 9. ...

  2. c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第1章 程序设计概述.pdf...

    C语言程序设计 第1章 程序设计概述 C语言程序设计教程 第2版 中国铁道出版社 张磊 编著 C语言程序设计(第2版)张磊编著中国铁道出版社 第1章 程序设计概述 1.1 程序设计语言 1.2 算 ...

  3. c语言程序设计第二版课后答案 机械工业出版社,C语言程序设计 第2版

    图书简介 本书的写作融入了作者多年的教学经验,充分考虑到初学者的能力.认知水平.知识结构等因素,遵照循序渐进.由浅入深的原则,较系统地介绍了C语言程序设计知识.内容涵盖算法及算法设计.数据描述与基本操 ...

  4. java语言程序设计第二版 张思民_java语言程序设计(张思民编著)习题答案.doc

    java语言程序设计(张思民编著)习题答案.doc 1第1章JAVA概述[1]为什么说JAVA的运行与计算机硬件平台无关解答JAVA编译器能够产生一种与计算机体系结构无关的字节指令BYTECODE,只 ...

  5. java语言程序设计第二版课后答案吴倩_Java语言程序设计

    内容概要 <java语言程序设计:面向对象的设计思想与实践>围绕面向对象的设计思想展开主题,详细讲解了java语言基础语法.面向对象的三大特征.图形用户界面的编程方法.多线程编程.java ...

  6. 概率论与数理统计(第二版) 吴传生 编 高等教育出版社 大学课后习题答案

    概率论与数理统计(第二版) 吴传生 编 高等教育出版社 第1章:随机事件的概率 第2章:一维随机变量及其分布 第3章:多维随机变量及其分布 第4章:随机变量的数字特征 第5章:大数定律和中心极限定律 ...

  7. 《Python语言程序设计》王恺 机械工业出版社 第四章课后习题答案

    第四章 面向对象 4.5 课后习题 (1)类和对象的关系即数据类型与变量的关系,类规定了可以用于存储什么数据,而对象用于实际存储数据,每个对象可存储不同的数据 (2)类中包含属性和方法.属性对应一个类 ...

  8. c语言程序设计第二版第五章课后答案甘勇,郑州工程技术学院副院长甘勇来校讲学和指导工作...

    12月12日,郑州工程技术学院副院长甘勇一行莅临我校讲学和指导工作.黄河交通学院评建办公室主任汤迪操.教务处处长贾宗璞,智能工程学院领导班子.主任及骨干教师参加了本次会议,会议由智能工程学院党总支书记 ...

  9. C语言程序设计第二版 甘勇, 李烨 , 卢冰

    C 语言是一种通用的.面向过程式的计算机程序设计语言.1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言. C 语言是一种广泛使用的计算机语言,它与 J ...

最新文章

  1. 设置WebStorm像VSCode一样每行代码结尾自动格式化加入“;”分号(JavaScript、TypeScript格式化)
  2. android打不开链接,安卓的webView的loadUrl打不开,太长的url超链接,求解
  3. 封装的人人网客户端调用接口
  4. Delphi 中的字符串函数(5) - SysUtils 中的 Ansi 字符串函数
  5. OpenCV图像处理——iOS端人脸检测
  6. 12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,
  7. [蓝桥杯][2019年第十届真题]外卖店优先级(模拟)
  8. java不大于6位_末尾带4的完全平方数的数量并且打印输出_Java计算一个数加上100是完全平方数,加上168还是完全平方数...
  9. MATLAB基础学习笔记02:掌握MATLAB运算
  10. fastjson android 版本,fastjson 1.1.58.android 发布,Bug 修复版本
  11. Windows学习总结(9)——Windows系统常用的网络控制指令
  12. mac 上iterm终端显示中文为乱码解决方案
  13. dubbo负载均衡代码分析2(一致性hash策略)
  14. vue-style,vue-style-scoped
  15. 解决安装Xcode后无法在终端执行gcc的问题
  16. 阶段3 2.Spring_06.Spring的新注解_8 spring整合junit完成
  17. 一封信:同学聚会后的追忆
  18. 用四叉树加速碰撞检测
  19. it行业se是_计算机行业SSE、SE、BSE、PE、PL各自是什么职位意思?
  20. php开启sockets模块,独立编译php的sockets模块

热门文章

  1. Centos7开放3306端口
  2. 求平行四边形的面积。
  3. 深度解读:小红书热搜词底层逻辑,助力小红书笔记上热门
  4. [翻译] 第一章 是时候进行远程工作了 (Remote)
  5. java中包中建包怎么创建,Java集成开发环境 – IDEA中建包时如何把包分开
  6. 单招自我介绍计算机范文,自主单招自我介绍范文
  7. 西游之路——python全栈——报障系统之后台管理
  8. 分享 | 运营必备11大数据分析模型,建议收藏
  9. (ubuntu)linux和mac安装Miracl密码库
  10. BGP-边际网关路由协议简记