首页 > 编程语言 >谭浩强C程序设计课后习题(第6章)

谭浩强C程序设计课后习题(第6章)

时间:2025-01-21 12:27:52浏览次数:3  
标签:++ s2 s1 int 谭浩强 课后 printf 习题 include

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;
}

标签:++,s2,s1,int,谭浩强,课后,printf,习题,include
From: https://blog.csdn.net/qq_75021272/article/details/145204194

相关文章

  • Python毕业设计 django培训机构教辅课后作业系统
    文章目录具体实现截图项目技术介绍设计思路核心代码部分展示运行指导论文写作思路django项目示例源码/演示视频获取方式具体实现截图起点树艺术培训机构系统是为满足当代艺术教育需求而设计的综合性管理平台,该系统主要功能包括学员管理、教师管理、培训课程管理、学......
  • bfs练习题-PTA喊山
    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为......
  • 信号与系统(郑君里)第一章-绪论 1-2 课后习题解答
    题目详情(1-2分别判断下列各函数式属于何种信号,即是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?其中各式中n为正整数)答案解析:(1)连续信号模拟信号(2)离散信号抽样信号(3)离散信号数字信号 该函数只取±1,所以为数字信号(4)离散信号抽样信号 该函数随着n的......
  • 信号与系统(郑君里)第一章-绪论 1-3 课后习题解答
    题目详情(分别求下列各周期信号的周期T。)答案解析:tips:本道题考察的是信号的周期性第(1)小题注意连续的找周期找出最小公倍数就可以了,不一定是要整数;第(2)小题注意指数是带有“j”的,如果没有“j”那就不是周期信号了;第(3)小题遇到平方形式第一时间想到用二倍角公式,可以使得形式......
  • JavaWeb课后笔记及体会分享(每日一更)
           从今天开始学习JavaWeb,在接下来的时间里我将学习JavaSE,MySQL,Web前端,JavaEE,SSM三大框架,SpainBoot,SpringCloud,以及一些常见面试题的练习。1.IDEA常用快捷键  Shift两次:包含各种文件、方法的搜索Ctrl+Shift+F:根据输入内容查找整个项目或指定目录内文件......
  • JS事件高级(练习题)
    1.div跟随鼠标移动(键盘事件和鼠标事件)<!--<script>//键盘事件window.onload=function(){varbox1=document.querySelector(".box1");//为document绑定一个按键按下的事件document.onkeydown=function(event){......
  • 【C语言分支和循环练习题】
    分支和循环练习1.打印1-100之间的所有素数2.随机数的生成:生成100-200之间的随机数1.打印1-100之间的所有素数#include<stdio.h>#include<math.h>intmain(){ inti=0; for(i=101;i<=200;i+=2) { intflag=1;//假设i是素数 intj=0; for(......
  • 信号与系统(郑君里)第一章-绪论 1-1 课后习题解答
    题目详情(1-1分别判断题图1-1所示各波形是连续时间信号还是离散时间信号,若是离散时间信号是否为数字信号?)答案解析:(a)连续信号模拟信号(b)连续信号量化信号(c)离散信号数字信号(d)离散信号抽样信号(非数字信号)(e)离散信号数字信号(f)离散信号数字信号tips:本道题目考察了连续/......
  • 双指针习题:Binary Deque
    14.BinaryDeque题面翻译BinaryDeque-洛谷|计算机科学教育新生态(luogu.com.cn)有多组数据。每组数据给出\(n\)个数,每个数为\(0\)或\(1\)。你可以选择从两边删数,求至少删几个数才可以使剩下的数总和为\(s\)。如果不能达到\(s\),则输出\(-1\)。题目描述Sla......
  • C语言初阶习题(2分支语句和循环语句-for)【10】杨辉三角
    1.题目描述——在屏幕上打印杨辉三角。2.思路第一步先尝试打印下三角第二步,分析他们之间的关系3.代码实现#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ intn=0; scanf("%d",&n); intarr[100][100]={0}; inti=0; in......