C语言程序设计第五版 谭浩强 期末复习

第四章

4.4

有3个整数a, b, c,由键盘输入,输出其中最大的数。

#include <stdio.h>
void compare(int a, int b, int c, int* x, int* y);
void swap(int* n, int* m);
int main()
{
	int a, b, c;
	int x = 0, y = 0;
	printf("please input three numbers!\n");
	while (scanf("%d %d %d", &a, &b, &c) == 3) {
		compare(a, b, c, &x, &y);
		printf("the larger is %d, the lesser is %d\n", x, y);
		printf("please input three numbers!\n");
	}

	return 0;
}
void compare(int a, int b, int c, int* x, int* y)
{
	if (a < b) swap(&a, &b);
	if (a < c) swap(&a, &c);
	if (b < c) swap(&b, &c);
	*x = a;
	*y = c;
}
void swap(int* n, int* m) {
	int tmp = *n;
	*n = *m;
	*m = tmp;
}

在这里插入图片描述

4.6

有一个函数,编写程序,输入x的值,输出y相应的值。
在这里插入图片描述

#include <stdio.h>
int main()
{
	double x, y;
	printf("please input a number to analysis.\n");
	while (scanf("%lf", &x) == 1) {
		if (x < 1) y = x;
		else if (x >= 1 && x < 10) y = 2 * x - 1;
		else y = 3 * x - 11;
		printf("x对应的Y值为%.2lf\n", y);
		printf("please input a number to analysis.\n");
	}
}

在这里插入图片描述

4.8

给出一百分制成绩,要求输出成绩等 级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,8089分为’B’,7079分为’C’ ,60~69分为’D’ ,60分以下为’E’。

#include <stdio.h>
int main()
{
	int score;

	printf("please input your score and enter # to finish!\n");
	while (scanf("%d", &score) == 1) {
		if (score >= 0 && score <= 100) {
			if (score >= 90) printf("A\n");
			else if (score >= 80 && score < 90) printf("B\n");
			else if (score >= 70 && score < 80) printf("C\n");
			else if (score >= 60 && score < 70) printf("D\n");
			else printf("E\n");
			printf("please input your score and enter # to finish!\n");
		}
		else {
			printf("please try again!\n");
			return 0;
		}
	}

	return 0;
}

在这里插入图片描述

4.9

给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。

#include <stdio.h>
int digits(int a);
void EveryNum(int b, int c);
int main()
{
	int n, m;
	printf("请输入一个不多于五位数的正数\n");
	scanf("%d", &n);
	if (n >= 0 && n < 10000) {
		printf("这个数字有%d位\n",m = digits(n));
		EveryNum(n, m);
	}
	else printf("请重新输入!\n");

	return 0;
}
int digits(int a) {
	if (a >= 1 && a < 10) return 1;
	else if (a >= 10 && a < 100) return 2;
	else if (a >= 100 && a < 1000) return 3;
	else return 4;
}
void EveryNum(int b, int c) {
	int d, e, f, g;
	printf("千位的数字为:%d\n",d = b / 1000);
	printf("百位的数字为:%d\n",e = (b / 100) % 10);
	printf("十位的数字为:%d\n", f = (b / 10) % 10);
	printf("个位的数字为: %d\n",g = b % 10);
	if (c == 1) printf("%d", g);
	else if (c == 2) printf("%d%d", g, f);
	else if (c == 3) printf("%d%d%d", g, f, e);
	else printf("%d%d%d%d", g, f, e, d);
}

在这里插入图片描述

第五章

5.3

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

#include <stdio.h>
int FindLesser(int x, int y);
int main()
{
	int n, m;
	printf("请输入两个正整数!\n");
	scanf("%d %d", &n, &m);
	int a = FindLesser(n, m);
	if (n >= 0 && m >= 0) {
		for (int i = a; i <= n * m; i++) {
			if (i % n == 0 && i % m == 0) {
				printf("这两个数的最小公倍数为:%d\n", i);
				break;
			}
		}
		for (int i = a; i >= 1; i--) {
			if (n % i == 0 && m % i == 0) {
				printf("这两个数的最大公约数为:%d\n", i);
				break;
			}
		}
	}
	return 0;
}
int FindLesser(int x, int y) {
	if (x < y) return x;
	else return y;
}

在这里插入图片描述

5.4

输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

在这里插入代码片#include <stdio.h>
int main()
{
	char ch;
	int a = 0, b = 0, c = 0, d = 0;
	printf("请输入一行字符!\n");
	ch = getchar();
	while (ch != '\n') {
		if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') a++;
		else if (ch >= '0' && ch <= '9') b++;
		else if (ch == ' ') c++;
		else d++;
		ch = getchar();
	}
	printf("这串字符中英文字母的个数为:%d, \n", a);
	printf("数字的个数为:%d\n", b);
	printf("空格的个数为:%d\n", c);
	printf("其他字符的个数为:%d\n", d);

	return 0;
}

在这里插入图片描述

5.6

在这里插入图片描述

#include <stdio.h>
int main()
{
	double total_sum = 0;
	for (int i = 1; i <= 20; i++) {
		double sum = 1;
		for (int j = i; j > 0; j--) sum *= j;
		total_sum += sum;
	}
	printf("二十的阶乘为:%lf", total_sum);

	return 0;
}

在这里插入图片描述

5.8(水仙花数)

输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1*+5*+3。

#include <stdio.h>
int main()
{
	for (int n = 100; n >= 100 && n < 1000; n++) {
		int a = n % 10;
		int b = (n / 10) % 10;
		int c = n / 100;
		if (n == a * a * a + b * b * b + c * c * c) {
			printf("%d", n);
			putchar(' ');
		}
	}

	return 0;
}

在这里插入图片描述

第六章

6.1

用筛选法求100之内的素数

#include <stdio.h>
int main()
{
	printf("100以内的素数有:\n");
	for (int i = 2; i <= 100; i++) {
		for (int j = 2; j <= i; j++) {
			if (i == j) printf("%d\n", i);
			if (i % j == 0) break;
		}
	}

	return 0;
}

在这里插入图片描述

6.3

求一个3 X 3的整形矩阵对角线元素之和

#include <stdio.h>
int LeftDiagonal(int array[][3]);
int RightDiagonal(int array[][3]);
int main()
{
	int num[3][3] = {
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}
	};
	printf("矩阵对角线元素之和为: %d", LeftDiagonal(num) + RightDiagonal(num));
	
	return 0;
}
int LeftDiagonal(int array[][3])
{
	int sum1 = 0;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (i == j)
				sum1 += array[i][j];
		}
	}
	return sum1;
}
int RightDiagonal(int array[][3])
{
	int sum2 = 0;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (i + j == 2 && i != j)
				sum2 += array[i][j];
		}
	}
	return sum2;
}

在这里插入图片描述

6.4

有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中

#include <stdio.h>
int main()
{
	int n, i;
	int num[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	printf("请输入你想插入的数据\n");
	scanf("%d", &n);
	for (i = 9; i >= 0; i--) {
		num[i + 1] = num[i];
		if (n >= num[i]) 
			break;
	}
	num[i + 1] = n;
	for (int a = 0; a <= 10; a++) printf("%d ", num[a]);

	return 0;
}

在这里插入图片描述

6.6

输出一下的杨慧三角(要求输出10行)

1   
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5  10  10   5   1
……

杨辉三角最本质的特征是:

它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。

#include <stdio.h>
int main()
{
	int num[10][10];
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j <= i; j++) {
			if (j == 0) num[i][j] = 1;
			else if (i == j) num[i][j] = 1;
			else num[i][j] = num[i - 1][j - 1] + num[i - 1][j];
		}
	}
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j <= i; j++) 
			printf("%d ", num[i][j]);
		putchar('\n');
	}
}

在这里插入图片描述

第七章

7.2 (求解一元二次方程)

#include <stdio.h>
#include <math.h>   // 提供sqrt()函数的头文件
int main()
{
	float a, b, c;
	printf("请分别输入一元二次方程的二次项系数,一次项系数和常数项系数。\n");
	scanf("%f %f %f", &a, &b, &c);
	float m = b * b - 4 * a * c;
	if (a == 0) {
		printf("please try again!\n");
		return 0;
	}
	else {
		if (m < 0) {
			printf("此方程无根!\n");
			return 0;
		}
		else if (m == 0) {
			float root = (-b + sqrt(m)) / 2 * a;
			printf("该方程的一个根为:\n", root);
		}
		else {
			float root1 = (-b + sqrt(m)) / 2 * a;
			float root2 = (-b - sqrt(m)) / 2 * a;
			printf("该方程的两个根分别为:x1 = %.2f, x2 = %.2f", root1, root2);
		}
	}

	return 0;
}

在这里插入图片描述

7.4

写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。

#include <stdio.h>
void ReverseNum(int array[][3]);
void PrintfNum(int array[][3]);
int main()
{
	int num[3][3] = {
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}
	};
	printf("转置前:\n");
	PrintfNum(num);
	ReverseNum(num);
	printf("转置后:\n");
	PrintfNum(num);
}
void ReverseNum(int array[][3])
{
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j <= i; j++) {
			int tmp = array[i][j];
			array[i][j] = array[j][i];
			array[j][i] = tmp;
		}
	}
}
void PrintfNum(int array[][3])
{
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d ", array[i][j]);
		}
		putchar('\n');
	}
}

在这里插入图片描述

7.6

写一个函数,将两个字符串连接。

#include <stdio.h>
#include <string.h>
void ConnectStr(char string1[],char string2[],char string[]);
int main()
{
	char str1[50] = {0}, str2[50] = {0}, str[100] = {0};
	printf("please input string1:\n");
	scanf("%s", str1);
	printf("please input string2:\n");
	scanf("%s", str2);
	ConnectStr(str1, str2, str);
	printf("the string is:\n");
	printf("%s\n", str);

	return 0;
}
void ConnectStr(char string1[], char string2[], char string[])
{
	int i, j;
	strcpy(string, string1);
	for (i = 0; i < 50; i++) {
		if (string[i] == '\0')  break;
	}
	for (j = 0; j < 50; j++) 
		string[i + j] = string2[j];
	string[i + j + 1] = '\0';
}

在这里插入图片描述

7.8

写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。

#include <stdio.h>
void HandleStr(char arr[]);
int main()
{
	char str[5];
	printf("please input four digits to deal with.\n");
	scanf("%s", str);
	printf("The processed string is:\n");
	HandleStr(str);

	return 0;
}
void HandleStr(char arr[])
{
	for (int i = 0; arr[i] != '\0'; i++) {
		printf("%c", arr[i]);
		printf(" ");
	}
}

在这里插入图片描述

第八章

8.1

输入3个整数,要求按由小到大的顺序输出

#include <stdio.h>
void compare(int a, int b, int c);
void swap(int* m, int* n);
int main()
{
	int x, y, z;
	printf("please input three numbers to compare!\n");
	scanf("%d %d %d", &x, &y, &z);
	compare(x, y, z);

	return 0;
}
void compare(int a, int b, int c)
{
	if (a > b) swap(&a, &b);
	if (a > c) swap(&a, &c);
	if (b > c) swap(&b, &c);
	printf("%d %d %d", a, b, c);
}
void swap(int* m, int* n)
{
	int tmp = *m; 
	*m = *n;
	*n = tmp;
}

在这里插入图片描述

8.6

写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

#include <stdio.h>
int LengthStr(char str[]);
int main()
{
	char s[20];
	printf("please input a string to calculate length!\n");
	scanf("%s", s);
	printf("length of this string is %d", LengthStr(s));

	return 0;
}
int LengthStr(char str[])
{
	int i;
	for (i = 0; str[i] != '\0'; i++);
	return i;
}

在这里插入图片描述

8.7

有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

#include <stdio.h>
void mystrcpy(char arr[]);
int main()
{
	char str1[30];
	printf("please input a string to analysis.\n");
	scanf("%s", str1);
	mystrcpy(str1);
	printf("the processed string is %s", str1);

	return 0;
}
void mystrcpy(char arr[])
{
	int i;
	char str2[30];
	printf("please input another string to copy.\n");
	scanf("%s", str2);
	for (i = 0; str2[i] != '\0'; i++)
		arr[i + 3] = str2[i];      //从第四个位置开始复制
	arr[i + 3] = '\0';
}

在这里插入图片描述

第九章

9.3

编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输人这些记录,用print函数输出这些记录

#include <stdio.h>
struct student {
	int num;
	char name[10];
	int score[3];
}stu[5];
void MyPrintf(struct student stu[]);
int main()
{
	for (int i = 0; i < 5; i++) {
		printf("请分别输入该学生的学号,姓名,三科成绩!\n");
		scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1],
			&stu[i].score[2]);
	}
	MyPrintf(stu);

	return 0;
}
void MyPrintf(struct student stu[])
{
	for (int j = 0; j < 5; j++) {
		printf("%d %s %d %d %d", stu[j].num, stu[j].name, stu[j].score[0], stu[j].score[1], stu[j].score[2]);
		printf("\n");
	}
}

在这里插入图片描述

排序

插入排序法

#include <stdio.h>
int main()
{
	int num[10] = {1, 4, 7, 2, 5, 3, 8, 6, 9, 0};
	for (int i = 1; i < 10; i++) {  //每一轮要插入的数是num[i]
		int n = num[i];
		int j = i;
		while (n < num[j - 1] && j >= 1) {    
			num[j] = num[j - 1];
			j--;
		}
		num[j] = n;
	}
	for (int i = 0; i < 10; i++)
		printf("%d ", num[i]);

	return 0;
}

在这里插入图片描述

选择排序法

#include <stdio.h>
#define SIZE 10
int main()
{
	int num[SIZE] = { 1, 4, 7, 2, 11, 3, 8, 6, 9, 10 };
	for (int i = 0; i < SIZE - 1; i++) {
		int min = i;
		for (int j = i + 1; j < SIZE; j++) {
			if (num[min] > num[j])
				min = j;
		}
		int tmp = num[i];
		num[i] = num[min];
		num[min] = tmp;
	}
	for (int i = 0; i < 10; i++)
		printf("%d ", num[i]);

	return 0;
}

在这里插入图片描述

冒泡排序

#include <stdio.h>
int main()
{
	int num[10] = { 1, -4, 7, 2, 11, 3, 8, -6, 9, 0 };
	for (int i = 0; i < 9; i++) {
		for (int j = i + 1; j < 10; j++) {
			if (num[i] > num[j]) {
				int tmp = num[j];
				num[j] = num[i];
				num[i] = tmp;
			}
		}
	}
	for (int i = 0; i < 10; i++)
		printf("%d ", num[i]);

	return 0;
}

在这里插入图片描述

  • 35
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值