C语言程序设计(第五版)谭浩强 第七章习题答案

 第7章 用函数实现模块化程序设计

目录

1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。

2.求方程​编辑的根,用3个函数分别求当:​编辑大于0、等于0和小于0时的根并输出结果。从主函数输人a, b, c的值。

3.写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。

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

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

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

7.写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

8.写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输入1990,应输出“1990”。

9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。

10.写一个函数,输入一行字符,将此字符串中最长的单词输出。

11.写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。

12.用牛顿迭代法求根。方程为​编辑,系数a, b, c, d的值依次为1, 2, 3, 4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。

13.用递归方法求n阶勒让德多项式的值,递归公式为

14.输入10个学生5门课的成绩,分别用函数实现下列功能:

15.写几个函数:

16.写一个函数,输入一个十六进制数,输出相应的十进制数。

17.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串"483"。n的位数不确定,可以是任意位数的整数。

18.给出年、月、日,计算该日是该年的第几天。

1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include <stdio.h>

int gongyue(int a, int b) {
	int t;
	
	if(a < b) {
		t = a;
		a = b;
		b = t;
	}
	
	while(b) {
		t = a % b;
		a = b;
		b = t;
	}
	
	return a;
}

int gongbei(int a, int b) {
	int t = gongyue(a, b);
	return (a * b) / t;
}

int main() {
	int a, b;
	printf("请输入a和b的值(a,b):");
	scanf("%d,%d", &a, &b);
	printf("\n最大公约数:%d\n", gongyue(a, b));
	printf("\n最小公倍数:%d\n", gongbei(a, b));
}

2.求方程的根,用3个函数分别求当:大于0、等于0和小于0时的根并输出结果。从主函数输人a, b, c的值。
#include <stdio.h>
#include <math.h>

void f1(int a, int b, int c) {
	double res1, res2;
	res1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
	res2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
	printf("\nres1 = %lf, res2 = %lf\n", res1, res2);
}

int f2(int a, int b, int c) {
	double res;
	res = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
	printf("\nres = %lf\n", res);
}

int main() {
	int a, b, c, t;
	printf("请输入a, b, c的值(a,b,c):");
	scanf("%d,%d,%d", &a, &b, &c);
	t = b * b - 4 * a * c;
	if(t > 0) {
		printf("\n△ = %d > 0\n", t);
		f1(a, b, c);
	} else if(t == 0) {
		printf("\n△ = %d = 0\n", t);
		f2(a, b, c);
	} else {
		printf("\n△ = %d < 0\n", t);
		printf("无实数根\n");
	}
	return 0;
}

3.写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。
#include <stdio.h>

int isprime(int a) {
	int i;
	for(i = 2; i <= a / 2; i++) {
		if(a % i == 0)	return 0;
	}
	if(i > a / 2)	return 1;
	return 0;
}

int main() {
	int x, flag;
	printf("请输入一个整数:");
	scanf("%d", &x);
	flag = isprime(x);
	if(flag == 1)	printf("%d是素数\n", x);
	else	printf("%d不是素数\n", x);
	return 0;
}

4.写一个函数,使给定的一个3×3的二维整型数组转置,即行列互换。
#include <stdio.h>

#define M 3

void reverse(int a[][M]) {
	int i, j, t;
	for(i = 0; i < M; i++) {
		for(j = 0; j <= i; j++) {
			t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}
	}
}

int main() {
	int a[M][M] = {1, 2, 3, 4, 5, 6, 7 , 8, 9}, i, j;
	
	printf("\nbefore:\n");
	for(i = 0; i < M; i++) {
		for(j = 0; j < M; j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	
	reverse(a);
	
	printf("\nafter:\n");
	for(i = 0; i < M; i++) {
		for(j = 0; j < M; j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
#include <stdio.h>
#include <string.h>

#define M 80

void reverse(char a[M], int n) {
	int i, t;
	for(i = 0; i < n / 2; i++) {
		t = a[i];
		a[i] = a[n - i - 1];
		a[n - i - 1] = t;
	}
}

int main() {
	char a[M];
	int n;
	printf("请输入一个字符串:");
	scanf("%s", a);
	n = strlen(a);
	
	printf("\n反序前:%s\n", a);
	
	reverse(a, n);
	
	printf("\n反序后:%s\n", a);
	
	return 0;
}

6.写一个函数,将两个字符串连接。
#include <stdio.h>
#include <string.h>

#define M 80

void contact(char a[M], char b[M], char res[M * 2]) {
	int i, j;
	for(i = 0; a[i] != '\0'; i++) {
		res[i] = a[i];
	}
	
	for(j = 0; b[j] != '\0'; j++) {
		res[i++] = b[j];
	}
	res[i] = '\0';
}

int main() {
	char a[M], b[M], res[M * 2];
	int n;
	printf("请输入第一个字符串:");
	scanf("%s", a);
	
	printf("请输入第二个字符串:");
	scanf("%s", b);
	
	contact(a, b, res);
	
	printf("\n连接后:%s\n", res);
	
	return 0;
}

7.写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
#include <stdio.h>
#include <string.h>

#define M 80

void fun(char a[M], char res[M]) {
	int i, j = 0;
	for(i = 0; a[i] != '\0'; i++) {
		if(a[i] == 'a' || a[i] == 'A' || a[i] == 'e' || a[i] == 'E' || a[i] == 'i' || 
		a[i] == 'I' || a[i] == 'o' || a[i] == 'O' || a[i] == 'u' || a[i] == 'U') {
			res[j++] = a[i];
		}
	}
	res[j] = '\0';
}

int main() {
	char a[M], res[M];
	int n;
	printf("请输入一个字符串:");
	scanf("%s", a);
	
	fun(a, res);
	
	printf("\n所有元音字母:%s", res);
	
	return 0;
}

8.写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输入1990,应输出“1990”。
#include <stdio.h>

#define M 8

void fun(char a[M], int num) {
	int i = 0, n = num, t;
	while(n > 0) {
		a[i] = n % 10 + '0';
		n = n / 10;
		a[i + 1] = ' ';
		i += 2;
	}
	a[i - 1] = '\0';
}

int main() {
	char a[M];
	int num, i;
	printf("\n请输入一个4位数字:");
	scanf("%d", &num);
	while(num < 1000 || num > 9999) {
		printf("\n输入有误,请重新输入:");
		scanf("%d", &num);
	}
	
	fun(a, num);
	
	for(i = M - 1; i >= 0; i--) {
		printf("%c", a[i]);
	}
	
	return 0;
}

9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
#include <stdio.h>

#define M 80

int letter = 0, number = 0, space = 0, other = 0;

void fun(char a[M]) {
	int i;
	for(i = 0; a[i] != '\0'; i++) {
		if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))	letter++;
		else if(a[i] >= '0' && a[i] <= '9')	number++;
		else if(a[i] == ' ')	space++;
		else	other++;
	}
}

int main() {
	char a[M];
	printf("\n请输入一个字符串:");
	gets(a);
	
	fun(a);
	
	printf("\n%s\n字母:%d,数字:%d,空格:%d,其他字符:%d\n", a, letter, number, space, other);
	
	return 0;
}

10.写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include <stdio.h>

#define M 80

void fun(char a[M], char b[M]) {
	int i, j, count = 0, max = 0;
	for(i = 0; a[i] != '\0'; i++) {
		if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')){
			count++;
		}
		if((a[i] == ' ' && a[i + 1] != ' ') || (a[i] != ' ' && a[i + 1] == '\0')) {
			if(max < count) {
				max = count;
				j = i - max;
			}
			count = 0;
		}
	}
	for(i = 0; i < max; i++)	b[i] = a[j++];
	b[i]= '\0';
}

int main() {
	char a[M], b[M];
	printf("\n请输入一个字符串:");
	gets(a);
	
	fun(a, b);
	
	printf("\n%s\n", b);
	
	return 0;
}

11.写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。
#include <stdio.h>
#include <string.h>

#define M 80

void fun(char a[M]) {
	int i, j;
	char t;
	for(i = 0; a[i] != '\0'; i++) {
		for(j = 0; j < strlen(a) - i; j++) {
			if(a[j] > a[j + 1]) {
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
		}
	}
}

int main() {
	char a[M];
	printf("\n请输入一个字符串:");
	gets(a);
	
	fun(a);
	
	printf("\nafter: %s\n", a);
	
	return 0;
}

12.用牛顿迭代法求根。方程为,系数a, b, c, d的值依次为1, 2, 3, 4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
#include <stdio.h>
#include <math.h>

double fun(int a, int b, int c, int d) {
	double x0 = 1.0, x1 = 0.0, f1, f2;
	
	while(fabs(x1 - x0) >= 1e-6) {
		x0 = x1;
		f1 = a * pow(x0, 3) + b * pow(x0, 2) + c * x0 + d;
		f2 = 3 * a * pow(x0, 2) + 2 * b * x0 + c;
		x1 = x0 - f1 / f2;
	}
	
	return x1;
}

int main() {
	int a, b, c, d;
	double x;
	printf("\n请输入a, b, c, d的值:");
	scanf("%d%d%d%d", &a, &b, &c, &d);
	
	x = fun(a, b, c, d);
	
	printf("%.7lf", x);
	
	return 0;
}

13.用递归方法求n阶勒让德多项式的值,递归公式为

#include <stdio.h>
#include <math.h>

float p(int n, float x) {
	float res;
	
	if(n == 0) return 1;
	if(n == 1) return x;
	
	if(n > 1) {
		res = ((2 * n - 1) * x * p(n - 1, x) - (n - 1) * p(n - 2, x)) / n;
	}
	return res;
}

int main() {
	int n;
	float x;
	printf("input x,n: ");
	scanf("%f%d", &x, &n); 
	printf("%f\n", p(n, x));
	return 0;
}

14.输入10个学生5门课的成绩,分别用函数实现下列功能:

①计算每个学生的平均分;

②计算每门课的平均分;

③找出所有50个分数中最高的分数所对应的学生和课程;

④计算平均分方差:

其中,为某一学生的平均分。

#include <stdio.h>
#include <math.h>

#define M 10
#define N 5

void f1(int a[M][N]) {
	int i, j;
	float average[M], sum;
	
	for(i = 0; i < M; i++) {
		sum = 0.0;
		for(j = 0; j < N; j++) {
			sum += a[i][j];
		}
		average[i] = sum / N;
	}
	
	printf("\n\n每个学生的平均分\n");
	for(i = 0; i < M; i++) {
		printf("--学生%d:%.2f\n", i + 1, average[i]);
	}
}

void f2(int a[M][N]) {
	int i, j;
	float average[M], sum;
	
	for(j = 0; j < N; j++) {
		sum = 0.0;
		for(i = 0; i < M; i++) {
			sum += a[i][j];
		}
		average[j] = sum / M;
	}
	
	printf("\n\n每门课程的平均分\n");
	for(i = 0; i < N; i++) {
		printf("--课程%d:%.2f\n", i + 1, average[i]);
	}
}

void f3(int a[M][N]) {
	int i, j, max = a[0][0], m, n;
	
	for(i = 0; i < M; i++) {
		for(j = 0; j < N; j++) {
			if(max < a[i][j]) {
				max = a[i][j];
				m = i + 1;
				n = j + 1;
			}
		}
	}
	
	printf("\n\n--最高分:%d\t学生%d\t课程%d\n", max, m, n);
}

void f4(int a[M][N]) {
	int i, j, average[M];
	float s, sum = 0.0, sumx = 0.0, res;
	
	for(i = 0; i < M; i++) {
		s = 0.0;
		for(j = 0; j < N; j++) {
			s += a[i][j];
		}
		average[i] = s / N;
		sum += average[i];
		sumx += average[i] * average[i];
	}
	
	res = sumx / M - pow(sum / M, 2);
	
	printf("\n\n--平均分方差:%.2f\n", res);
}

int main() {
//	int a[M][N] = {87,88,92,67,78,88,86,87,98,90,76,75,65,65,78,67,87,60,90,67,77,78,85,64,56,76,89,94,65,76,78,75,64,67,77,77,76,56,87,85,84,67,78,76,89,86,75,64,69,90}, i, j;
	int a[M][N], i, j;
	
	printf("请分别输入10名学生的5门课成绩\n\n");
	for(i = 0; i < M; i++) {
		printf("--学生%d\n", i + 1);
		for(j = 0; j < N; j++) {
			printf("课程%d:", j + 1);
			scanf("%d", &a[i][j]);
		}
		printf("\n");
	}
	
	f1(a);
	f2(a);
	f3(a);
	f4(a);
	
	return 0;
}

15.写几个函数:

①输入10个职工的姓名和职工号;

②按职工号由小到大顺序排序,姓名顺序也随之调整;

③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

#include <stdio.h>
#include <string.h>

#define M 10
#define N 80

void f1(char name[M][N], int id[M]) {
	int i;
	
	printf("请分别输入10名职工的姓名和职工号\n\n");
	for(i = 0; i < M; i++) {
		printf("--职工%d\n", i + 1);
		printf("姓名:");
		scanf("%s", name[i]);
		printf("职工号:");
		scanf("%d", &id[i]);
		printf("\n");
	}
}

void f2(char name[M][N], int id[M]) {
	int i, j, t1;
	char t2[N];
	
	for(i = 0; i < M - 1; i++) {
		for(j = 0; j < M - i - 1; j++) {
			if(id[j] > id[j + 1]) {
				t1 = id[j];
				id[j] = id[j + 1];
				id[j + 1] = t1;
				
				strcpy(t2, name[j]);
				strcpy(name[j], name[j + 1]);
				strcpy(name[j + 1], t2);
			}
		}
	}
}

void f3(char name[M][N], int id[M], int keyword) {
	int l = 0, r = M - 1, mid;
	
	while(l <= r) {
		mid = (l + r) / 2;
		if(id[mid] == keyword) {
			printf("\n职工号%d对应的姓名为%s\n", keyword, name[mid]);
			return;
		} else if(id[mid] < keyword) {
			l = mid + 1;
		} else {
			r = mid - 1;
		}
		
	}
	printf("\n未找到职工号为%d的姓名\n", keyword);
}

int main() {
	char name[M][N] = {"Li","Zhang","Yang","Qian","Sun","Jiang","Zhao","Shen","Wang","Han"};
	int id[M]={3,1,27,7,8,12,6,23,2,26}, i, keyword;
	
//	f1(name, id);
	
	printf("\n\n-----------职工信息-----------\n");
	for(i = 0; i < M; i++) {
		printf("职工%d\t姓名:%s\t职工号:%d\n", i + 1, name[i], id[i]);
	}
	
	f2(name, id);
	
	printf("\n\n-------排序后的职工信息-------\n");
	for(i = 0; i < M; i++) {
		printf("职工%d\t姓名:%s\t职工号:%d\n", i + 1, name[i], id[i]);
	}
	
	printf("\n请输入要查找的职工号:");
	scanf("%d", &keyword);
	f3(name, id, keyword);
	
	return 0;
}

16.写一个函数,输入一个十六进制数,输出相应的十进制数。
#include <stdio.h>

#define M 80

int fun(char a[M]) {
	int i, res = 0;
	
	while(a[i] != '\0') {
		if(a[i] >= '0' && a[i] <= '9') {
			res = res * 16 + a[i] - '0';
		}
		if(a[i] >= 'a' && a[i] <= 'f') {
			res = res * 16 + a[i] - 'a' + 10;
		}
		if(a[i] >= 'A' && a[i] <= 'F') {
			res = res * 16 + a[i] - 'A' + 10;
		}
		i++;
	}
	
	return res; 
}

int main() {
	char a[M];
	int i = 0, res;
	
	printf("\n请输入一个十六进制数:");
	gets(a);
	
	while(a[i] != '\0') {
		if(!(a[i] >= '0' && a[i] <= '9' || a[i] >= 'a' && a[i] <= 'f' || a[i] >= 'A' && a[i] <= 'F')) {
			i = 0;
			printf("\n输入有误,请重新输入:");
			gets(a);
			continue;
		}
		i++;
	}
	
	res = fun(a);
	printf("\n( %s )16 ----→ ( %d )10\n", a, res);
	
	return 0;
}

17.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串"483"。n的位数不确定,可以是任意位数的整数。
#include <stdio.h>
#include <string.h>

#define M 80

int fun(long n, char a[M]) {
	long num = n;
	int i = 0, j = 0, flag = 0;
	char t;
	
	while(num) {
		if(num < 0) {
			a[i++] = '-';
			num = -num;
			flag = 1;
		}
		a[i++] = num % 10 + '0';
		num /= 10;
	}
	a[i] = '\0';
	
	return flag;
}

int main() {
	long n;
	char a[M];
	int flag = 0, i;
	
	printf("\n请输入一个整数:");
	scanf("%ld", &n);
	
	flag = fun(n, a);
	
	printf("\n");
	if(flag == 1) {
		printf("-");
	}
	
	for(i = strlen(a); i >= flag; i--) {
		printf("%c", a[i]);
	}
	
	return 0;
}

18.给出年、月、日,计算该日是该年的第几天。
#include <stdio.h>

int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int fun(int y, int m, int d) {
	int i, flag = 0, res = 0;
	
	if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))	flag = 1;
	
	for(i = 1; i < m; i++) {
		res += month[i];
	}
	
	res += d;
	
	if(flag == 1 && m > 2)	res++;
	
	return res;
}

int main() {
	int y, m, d, flag = 0, res;
	
	printf("\n请输入年月日:");
	scanf("%d%d%d", &y, &m, &d);
	while(1) {
		if(m < 1 || m > 12 || d < 1)	flag = 1;
		if(m == 2 && d > 29)	flag = 1;
		if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30)	flag = 1;
		else if(d > 31)	flag = 1;
		if(flag == 1) {
			printf("\n输入有误,请重新输入年月日:");
			scanf("%d%d%d", &y, &m, &d);
			flag = 0;
			continue;
		}
		break;
	}
	
	res = fun(y, m, d);
	
	printf("\n%d/%d/%d ----→ 第%d天\n", y, m, d, res);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值