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

第6章 利用数组处理批量数据

目录

1.用筛选法求100之内的素数。

2.用选择法对10个整数排序。

3.求一个3×3的整型矩阵对角线元素之和。

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

5.将一个数组中的值按逆序重新存放。例如,原来顺序为8, 6, 5, 4, 1。要求改为1, 4, 5, 6, 8。

6.输出以下的杨辉三角形(要求输出10行)。

7.输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

8.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。

10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

11.输出以下图案:

12.有一行电文,已按下面规律译成密码:

13.编一程序,将两个字符串连接起来,不要用strcat函数。

14.编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ascii码的差值。例如,"a”与"c"相比,由于"a"<"c",应输出负数,同时由于"a"与"c"的ascii码差值为2,因此应输出“-2”。同理:"and"和"aid"比较,根据第2个字符比较结果,"n"比"i"大5,因此应输出“5”。<>

15.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,'\0'也要复制过去。'\0'后面的字符不复制。

1.用筛选法求100之内的素数。
#include <stdio.h>

int main() {
	int a[100] = {0}, i, j;
	
	for(i = 0; i < 100; i++)	a[i] = i + 1;
	
	for(i = 2; i < 100; i++) {
		
		for(j = 2; j < a[i]; j++) {
			if(a[i] % j == 0)	break;
		}
		
		if(j >= a[i]) {
			printf("%4d", a[i]);
		}
	}
	
	return 0;
}

2.用选择法对10个整数排序。
#include <stdio.h>

int main() {
	int a[10] = {6, 4, 9, 0, 5, 1, 7, 2, 8, 3}, i, j, min, t;
	
	for(i = 0; i < 10; i++) {
		min = i;
		for(j = i + 1; j < 10; j++) {
			if(a[min] > a[j])	min = j;
		}
		t = a[i];
		a[i] = a[min];
		a[min] = t;
	}
	
	for(i = 0; i < 10; i++) {
		printf("%3d", a[i]);
	}
	
	return 0;
}

3.求一个3×3的整型矩阵对角线元素之和。
#include <stdio.h>

int main() {
	int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, i, sum = 0;
	
	for(i = 0; i < 3; i++) {
		sum += a[i][i];
	}
	
	printf("sum = %d", sum);
	
	return 0;
}

4.有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插人数组中。
#include <stdio.h>

int main() {
	int a[11] = {2, 6, 11, 14, 19, 20, 25, 31, 38, 40}, num, i, j;
	
	printf("请输入要插入的数:");
	scanf("%d", &num);
	
	for(i = 0; i < 10; i++) {
		if(a[i] > num) {
			j = i;
			break;
		}
	}
	
	for(i = 10; i > j; i--) {
		a[i] = a[i - 1];
	}
	a[j] = num;
	
	for(i = 0; i < 11; i++) {
		printf("%3d", a[i]);
	}
	
	return 0;
}

5.将一个数组中的值按逆序重新存放。例如,原来顺序为8, 6, 5, 4, 1。要求改为1, 4, 5, 6, 8。
#include <stdio.h>
#define N 5

int main() {
	int a[N] = {8, 6, 5, 4, 1}, i, t;
	
	for(i = 0; i < N / 2; i++) {
		t = a[i];
		a[i] = a[N - i - 1];
		a[N - i - 1] = t;
	}
	
	for(i = 0; i < N; i++) {
		printf("%3d", a[i]);
	}
	
	return 0;
}

6.输出以下的杨辉三角形(要求输出10行)。

#include <stdio.h>
#define N 10

int main() {
	int a[N][N] = {0}, i, j;
	
	for(i = 0; i < N; i++) {
		a[i][0] = 1;
		a[i][i] = 1;
		for(j = 1; j < i; j++) {
			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
		}
	}
	
	for(i = 0; i < N; i++) {
		for(j = 0; j <= i; j++) {
			printf("%6d", a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

7.输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

 要求输出1~n^{2}的自然数构成的魔方阵。

#include <stdio.h>
#define N 10

int main() {
	int a[N][N] = {0}, n, i = 0, j, k = 1;
	
	printf("请输入n的值(1~9的奇数):");
	scanf("%d", &n);
	while(n < 1 || n > 9 || n % 2 == 0) {
		printf("\n输入有误,请重新输入(1~9的奇数):");
		scanf("%d", &n);
	}
	
	j = n / 2;
	a[i][j] = k;
	
	while(k <= n * n) {
		i--;
		j++;
		k++;
		
		if(i < 0 && j >= n) {
			i += 2;
			j--;
		} else if(i < 0) {
			i = n - 1;
		} else if(j >= n) {
			j = 0;
		}
		
		if(a[i][j] == 0) {	
			a[i][j] = k;
		} else {
			i += 2;
			j--;
			a[i][j] = k;
		}
	}
	
	for(i = 0; i < n; i++) {
		for(j = 0; j < n; j++) {
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

8.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
#include <stdio.h>
#define M 4
#define N 5

int main() {
	int a[M][N] = {1, 2, 3, 4, 5, 2, 4, 6, 8, 10, 3, 6, 9, 12, 15, 4, 8, 12, 16, 20}, i, j, k, max, min, flag = 0;
	
	for(i = 0; i < M; i++) {
		max = a[i][0];
		for(j = 0; j < N; j++) {
			if(max < a[i][j]){
				max = a[i][j];
				k = j;
			}
		}
		min = max;
		for(j = 0; j < M; j++) {
			if(min > a[j][k])	min = a[j][k];
		}
		if(max == min) {
			flag = 1;
			break;
		}
	}
	
	if(flag == 1) {
		printf("%3d\n", max);
	} else {
		printf("无鞍点\n");
	}
	
	return 0;
}

9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
#include <stdio.h>
#define N 15

int main() {
	int a[N] = {99, 91, 87, 80, 76, 71, 64, 58, 52, 47, 46, 38, 31, 22, 16}, l = 0, r = N - 1, mid, num, flag = 0;
	
	printf("请输入要查找的值:");
	scanf("%d", &num);
	
	while(l <= r) {
		mid = (l + r) / 2;
		if(a[mid] == num) {
			flag = 1;
			printf("a[%d] = %d\n", mid, num);
			break;
		} else if(a[mid] > num) {
			l = mid + 1;
		} else {
			r = mid - 1;
		}
	}
	
	if(flag == 0) {
		printf("无此数\n");
	}
	
	return 0;
}

10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
#include <stdio.h>
#include <string.h>
#define M 3
#define N 80

int main() {
	char a[M][N] = {"", "", ""};
	int i, j, b[15] = {0};
	
	printf("请输入3个字符串:\n");
	for(i = 0; i < 3; i++) {
		gets(a[i]);
	}
	
	for(i = 0; i < M; i++) {
		for(j = 0; j < strlen(a[i]); j++) {
			if(a[i][j] >= 'A' && a[i][j] <= 'Z') b[i]++;
			else if(a[i][j] >= 'a' && a[i][j] <= 'z') b[i + 3]++;
			else if(a[i][j] >= '0' && a[i][j] <= '9') b[i + 6]++;
			else if(a[i][j] == ' ')	b[i + 9]++;
			else b[i + 12]++;
		}
	}
	
	for(i = 0; i < M; i++) {
		printf("\n字符串%d:%s\n", i + 1, a[i]);
		printf("大写字母\t小写字母\t数字\t\t空格\t\t其他\n", a[i]);
		for(j = 0; j < 15; j += 3) {
			printf("%4d\t\t", b[j + i]);
		}
		printf("\n\n");
	}
	
	return 0;
}

11.输出以下图案:

#include <stdio.h>
#define N 5

int main() {
	char a[N] = {'*', '*', '*', '*', '*'};
	int i, j;
	
	for(i = 0; i < N; i++) {
		for(j = 0; j < i; j++) {
			printf("  ");
		}
		for(j = 0; j < N; j++) {
			printf("%2c", a[i]);
		}
		printf("\n");
	}
	
	return 0;
}

12.有一行电文,已按下面规律译成密码:

 即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。

#include <stdio.h>
#include <string.h>
#define N 80

int main() {
	char a[N];
	int i;
	
	printf("请输入要加密的字符串:\n");
	gets(a);
	
	for(i = 0; i < strlen(a); i++) {
		if(a[i] >= 'a' && a[i] <= 'z') {
			a[i] = 'z' - (a[i] - 'a');
		}
		if(a[i] >= 'A' && a[i] <= 'Z') {
			a[i] = 'Z' - (a[i] - 'A');
		}
	}
	
	printf("加密后:");
	puts(a);
	
	return 0;
}

13.编一程序,将两个字符串连接起来,不要用strcat函数。
#include <stdio.h>
#include <string.h>
#define N 80

int main() {
	char a[N], b[N];
	int i, j = 0;
	
	printf("请输入字符串a:\n");
	gets(a);
	printf("请输入字符串b:\n");
	gets(b);
	
	for(i = strlen(a); b[j] != '\0'; i++) {
		a[i] = b[j++];
	}
	a[i] = '\0';
	
	printf("\n合并后:");
	puts(a);
	
	return 0;
}

14.编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,"A”与"C"相比,由于"A"<"C",应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出“-2”。同理:"And"和"Aid"比较,根据第2个字符比较结果,"n"比"i"大5,因此应输出“5”。
#include <stdio.h>
#include <string.h>
#define N 80

int main() {
	char s1[N], s2[N];
	int i, res = 0;
	
	printf("请输入字符串s1:\n");
	gets(s1);
	printf("请输入字符串s2:\n");
	gets(s2);
	
	for(i = 0; s1[i] != '\0' && s2[i] != '\0'; i++) {
		if(s1[i] == s2[i])	continue;
		else if(s1[i] > s2[i]) {
			res = s1[i] - s2[i];
			break;
		} else {
			res = -(s2[i] - s1[i]);
			break;
		}
	}
	
	if(s1[i] != '\0')	res = s1[i] - s2[i];
	else if(s2[i] != '\0')	res = -(s2[i] - s1[i]);
	
	printf("\nres = %d", res);
	
	return 0;
}

15.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,'\0'也要复制过去。'\0'后面的字符不复制。
#include <stdio.h>
#include <string.h>
#define N 80

int main() {
	char s1[N], s2[N];
	int i, j = 1;
	
	printf("请输入字符串s1:\n");
	gets(s1);
	printf("请输入字符串s2:\n");
	gets(s2);
	
	for(i = 0; s2[j - 1] != '\0'; i++) {
		s1[i] = s2[j - 1];
		j++;
	}
	
	printf("\n复制后:");
	puts(s1);
	
	return 0;
}

### 关于谭浩强《C语言程序设计习题库与练习资源 对于希望深入学习并实践谭浩强所著《C语言程序设计》一书中的知识点,存在多种途径获取配套的习题库和练习资源。 #### 官方教材附带资料 官方出版物通常会提供一定量的基础练习题目以及解答指南。例如,在第五版中第九章后的习题涵盖了函数定义、调用等方面的知识点[^1]。这些基础性的训练有助于巩固课堂上学到的概念和技术要点。 #### 在线编程平台 互联网上有许多专注于算法和数据结构挑战的网站,它们也包含了大量基于C语言的问题集。虽然不是专门为某本书籍定制的内容,但是这些问题往往能够很好地补充课本理论部分的学习不足之处。比如LeetCode, Codeforces等国际知名在线评测系统都支持使用C/C++提交解决方案,并且拥有活跃社区可以交流心得体验。 #### 开放课程与视频教程 一些高校或教育机构可能会公开发布其计算机科学入门级课程的相关材料,其中不乏以C作为教学语言的情况。通过观看这类多媒体形式的教学影片,不仅可以获得更直观的理解方式,还能接触到更多实际应用场景下的编码技巧。Coursera、edX这样的大型开放式网络课程平台上就有不少优质的选项可供选择。 #### 社区论坛与博客文章 像Stack Overflow这样的技术问答型社交站点聚集了大量的开发者群体,当遇到具体问题时可以在上面搜索既有的讨论帖或是发起新的话题请求帮助;而个人博主们分享的经验总结同样具有很高的参考价值,如特定章节重点解析或者常见错误规避方法等等。上述链接提到的一个博客就提供了第八章的部分习题答案详解。 ```cpp // 示例:简单的字符处理程序展示如何利用字符串操作来增强理解力 #include <stdio.h> void f1(); char a[10] = {'\0'}; int main(){ scanf("%s", a); for(int i=0; a[i]!='\0'; ++i){ putchar(a[i]); f1(); } } void f1(){putchar(' ');} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值