我是靠谱客的博主 称心人生,最近开发中收集的这篇文章主要介绍C语言程序设计(第二版) 主编:余贞侠 何钰娟 课后习题 代码题答案第二章第三章第四章第五章第六章第七章第八章第九章第十章,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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

在这里插入图片描述

第二章

15.编程实现:从键盘输入一个华氏温度 F F F,要求输出摄氏温度 C C C,计算公式为 C = 5 ( F − 32 ) / 9 C=5(F-32)/9 C=5F32)/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 , z x,v,z x,v,z 的值,编写程序输出以下表达式的值: x + z x+z x+z % 3 3 3 ∗ ( i n t ) ( x + y ) *(int)(x+y) (int)(x+y) % 2 / 4 2/4 2/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)从键盘读入一个英文大写字母,将其转换成小写字母,并且将转换前后的字母及其 A S C I I ASCII ASCII 码都显示到屏幕上。

#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个数 n u m 1 、 n u m 2 、 n u m 3 、 n u m 4 、 n u m 5 num1、num2、num3、num4、num5 num1num2num3num4num5 输出: ( n u m l ÷ n u m 2 的 商 ) × n u m 3 + n u m 4 − n u m 5 (numl÷num2的商)×num3+num4-num5 (numl÷num2)×num3+num4num5,不需考虑 n u m 2 num2 num2 0 0 0 和计算结果溢出的情况。要求输出的结果中,整数部分宽度为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] != ''; 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为%dn", num[maxIndex_x][maxIndex_y], maxIndex_x, maxIndex_y);
	printf("最小值为%d,x为%d,y为%dn", 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***输出的矩阵如下:nn");
	for(i = 0; i < m; i++){
		sum = 0;
		for(j = 0; j < n; j++){
			printf("%d ", num[i][j]);
			sum += num[i][j];
		}
		printf("本行和为:%dn", 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] != ''; i++) b[i] = a[i];
	b[i] = '';
}
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] != ''; 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行最大值为%dn", i, max);
		maxAll = maxAll > max ? maxAll : max;
	}
	printf("矩阵最大值为%dn", 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] != ''; 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] != ''; 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] != ''; i++) s1[i] = s2[i];
	s1[i] = '';
	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("nt*********C语言成绩管理系统*********nn");
	printf("tt 1 录入数据nn");
	printf("tt 2 统计不及格的名单nn");
	printf("tt 3 平时成绩排序nn");
	printf("tt 0 退出nn");
	printf("nt************************************nn");
}

void add(){
	for(stu_num = 0; stu_num < 10; stu_num++){
		printf("输入第%d个学生信息n", stu_num + 1);
		scanf("%dn%sn%dn%fn%fn%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:%gn", 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("nnt请做出您的选择: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("%dn%sn%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 年龄:%dn", 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 成绩:%gn", 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("学号:%dn", 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 成绩:%gn", 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 成绩:%gn", 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 %gn", 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 %fn", 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 %fn", 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 %fn", com[i].name, com[i].price, com[i].count, com[i].money);
	}
	fclose(fp);
	return 0;
} 

【完】

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

最后

以上就是称心人生为你收集整理的C语言程序设计(第二版) 主编:余贞侠 何钰娟 课后习题 代码题答案第二章第三章第四章第五章第六章第七章第八章第九章第十章的全部内容,希望文章能够帮你解决C语言程序设计(第二版) 主编:余贞侠 何钰娟 课后习题 代码题答案第二章第三章第四章第五章第六章第七章第八章第九章第十章所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部