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=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 , 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 num1、num2、num3、num4、num5 输出: ( 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+num4−num5,不需考虑 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 于四川成都