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] != '\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 / 4 2021/12/4 2021/12/4 于四川成都

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值