谭浩强第六章课后习题

在这里插入图片描述

筛选法求素数

点这里

选择法对10个整数排序

点这里

3*3的整形矩阵对角线元素之和

int main() {
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int sum = 0;
	int i = 0;
	int j = 0;
	//一条对角线
	for (i; i < 3; i++,j++) {
		sum += arr[i][j];
	}
	for (i = 0, j = 2; i <3; j--, i++) {
		sum += arr[i][j];
	}
	printf("%d ", sum);
}

插入一个数按原来规律排序int main() {

	//int arr[11] = { 9,8,7,6,5,4,3,2,1,0 };//要插入的数组
	int arr[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int num = 0;//准备插的数
	int flag = 0;//跳出循环
	int tmp = 0;
	int i = 0;
	scanf("%d", &num);
	if (arr[0] > arr[1])
	{
		for (i = 0; i < 11; i++) {
			if (arr[i] < num) {
				int j = 11 - 2;
				for (j; j >= i; j--) {
					arr[j + 1] = arr[j];
				}
				arr[i] = num;
				flag = 1;
			}
			else if (i == 10) {
				arr[i] = num;
			}
			if (flag == 1)
				break;

		}
	}
	else
	{
		for (i = 0; i < 11; i++) {
			if (arr[i] > num) {
				int j = 11 - 2;
				for (j; j >= i; j--) {
					arr[j + 1] = arr[j];
				}
				arr[i] = num;
				flag = 1;

			}
			else if (i == 10) {
				arr[i] = num;
			}
			if (flag == 1)
				break;
		}
		for (i = 0; i < 11; i++) {
			printf("%d  ", arr[i]);
		}
	}

}

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

int main() {
	int arr[5] = { 8,6,5,4,1 };
	int tmp = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int right = sz - 1;
	int left = 0;
	int i = 0;
	while (left <= right) {
		tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}

	for (i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
}
}

杨辉三角

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

1
11
121
1331
14641
...
int main() {
	int arr[10][10] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++) {
		for (j = 0; j <= i; j++) {
			if (i == j || j == 0) {
				arr[i][j] = 1;
			}
			else {
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
			}
			printf("%-3d", arr[i][j]);

	}
		printf("\n");
	}
	}

魔方阵

输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均
相等。例如,三阶魔方阵为要求输出1~n的自然数构成的魔方阵。
8 1 6
3 5 7
4 9 2
魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n2−1个数依次按下列规则存放
魔方阵计算规律(行,列以1开始):

1.将"1"放在第一行,中间一列;
2.从2开始至N*N各数按如下规律: 每一个数存放的行比上一个数的行减1;每一个数存放的列比上一个数的列加1;
3.当一个数行为1,下一个数行为N;
4.当一个数列数为N,下一个数列数为1,行数减1;
5.若按上述规则确定的位置有数字,或上一个数位第1行第N列,
下一个数字位置为上一个数的正下方(即行数减1,列数不变);

int main() {
	int arr[15][15] = { 0 };
	int row = 0;//记录行
	int col = 0;//记录列
	int pre_row = 0;//前一个数的行
	int pre_col = 0;//前一个数的列
	int k = 0;
	int n = 3;
	while (1) {
		printf("请输入您所需的阶数(1-15以内奇数):>");
		scanf("%d", &n);
		if (n % 2 != 0)
			break;
	}
	col = n/ 2;
	arr[0][col] = 1;
	for (k = 2; k <= n * n; k++) {
		row--; col++;
		if (row < 0)
			row = n - 1;
		if (col > n - 1)
			col = 0;
		if (arr[row][col] != 0) {
			row = pre_row + 1;
			col = pre_col;
	  }
		arr[row][col] = k;
		pre_row = row;
		pre_col = col;
	}


	for (row = 0; row < n; row++) {
		for (col = 0; col < n; col++) {
			printf("%-4d", arr[row][col]);
		}
		printf("\n");
	}
}

找靶点

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

首先先找出该行最大的一个数
然后找这个数所在列的最小一个数
如果相等,则是靶点
如果不相等,找第二行最大的数

int main() {
	int arr[50][50] = { 1,5,8,3,9,5 };
	int max = 0;
	int min = 0;
	int col = 0;//列数
	int row = 0;//行数
	int i = 0;
	int k = 0;
	int j = 0;
	while (1) {
		printf("请输入行数 列数(1--50以内):>");
		scanf("%d %d", &row, &col);
		if (col <= 50 && row <= 50)
			break;
	}
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			printf("请输入第%d行 第%d列数据:>", i + 1, j + 1);
			scanf("%d", &arr[i][j]);
		}
	}
		for (i = 0; i < row; i++) {
			for (j = 0; j < col; j++) {
				if (max < arr[i][j])
					max = arr[i][j];
			}
			j--;
			min = max;
			for (k = 0; k < row; k++) {
				if (min > arr[k][j])
					min = arr[k][j];
			}
			if (max == min)
				break;
		}
		if (max == min)
			printf("靶点为%d", arr[i][j]);
		else
			printf("无靶点");
	}
 

折半查找

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

int main() {
	int arr[15] = { 29,27,25,23,21,19,17,15,13,11,9,7,5,3,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz-1;
	int mid = sz/2;
	int k = 0;
	printf("请输入您要查找的数:>");
	scanf("%d", &k);

	while (left <= right) {
		if (arr[mid] > k) {
			left = mid + 1;
			mid = (left + right) / 2;
		}
		else if (arr[mid] < k) {
			right = mid - 1;
			mid = (left + right) / 2;
		}
		else {
			//printf("找到了,下标为%d,是%d", mid, arr[mid]);
		printf("该元素是数组中第%d个元素,下标为%d", mid+1,mid);

			return 0;
		}
	}
	printf("没找到");

}

统计字符

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

int main() {
	char str[3][80]={0};
	int up, low, num, space, oth;
	int i = 0;
	int j = 0;
	up = low = num = space = oth = 0;
	for (i = 0; i < 3; i++) {
		//gets(str);//scanf不读取空格 gets在vs中没有定义
		gets_s(str[i], 80);//scanf不读取空格

		for (j = 0; j < 80; j++) {
			if (str[i][j] >= 'A' && str[i][j] <= 'Z')
				up++;
			else if (str[i][j] >= 'a' && str[i][j] <= 'z')
				low++;

			else if (str[i][j] >= '0' && str[i][j] <= '9')
				num++;
			else
				oth++;
		}
	}
	printf("\n");
	printf("大写字母:%d个\n", up);
	printf("小写字母:%d个\n", low);
	printf("数字    :%d个\n", num);
	printf("空格    :%d个\n", space);
	printf("其他字符:%d个\n", oth);
}

输出以下图案

* * * * *
 * * * * *
  * * * * *
   * * * * *
	  * * * * *
int main() {
	int n = 0;
	int m = 0;
	int i, j;
	printf("请输入一行多少个*\n");
	scanf("%d", &n);
	printf("请输入打印几行\n");
	scanf("%d", &m);
	for (i = 0; i < m; i++) {
		for (j = 0; j < i; j++) {
			printf(" ");
		}
		for (j = 0; j < n; j++) {
			printf("* ");
		}
		printf("\n");
	}
}

破译

在这里插入图片描述

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

	char str[20];
	gets_s(str, 20);//gets()在vs中没有定义 如果不在vs中使用请使用gets
	int i = 0;
	for (i = 0; str[i] != '\0'; i++) {
		if (str[i] >= 'A' && str[i] <= 'Z') {
			str[i] =  90- str[i] + 65;
		}
		if (str[i] >= 'a' && str[i] <= 'z') {
			str[i] = 122 - str[i] + 97;
		}
	}
	printf("%s", str);
}

//13.

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

//自制my_strcat

#include<assert.h>
char* my_strcat(char* str1, const char* str2) {
	assert(str1!=NULL);
	assert(str2!= NULL);
	char* ret = str1;
	while (*str1 != '\0') {
		str1++;
    }
	while (*str1++ = *str2++) {
		
	}
	return ret;
}
int main() {
	char str1[100] = "I am";
	char str2[] = " student";
	printf("%s", my_strcat(str1, str2));
}

自制my_strcmp

在这里插入图片描述

int my_strcmp(const char* str1, const char* str2) {
	assert(str1);
	assert(str2);
	while (str1 != '\0' && str2 != '\0') {
	if(*str1!=*str2)
		return *str1 - *str2;
		str1++;
		str2++;
	}
	if (*str1 == *str2)
		return 0;
}
int main() {
	char str1[20];
	char str2[20];
	gets(str1);
   gets(str2);
	printf("%d", my_strcmp(str1, str2));
}

自制my_strcpy

在这里插入图片描述

char* my_strcpy(char* str1, const char* str2) {
	assert(str1);
	assert(str2);
	char* ret = str1;
	while (*str1++ = *str2++)
	{
	}
	return ret;
}
int main() {
	char str1[100] = "I am";
	char str2[] = " student";
	printf("%s", my_strcpy(str1, str2));
}

注意事项 !!!!!否则可能会报错

在使用assert的时候需要应用头文件assert.h 代码里面我没加进去
gets在vs2019以上都使用不了,显示未定义,如果是非vs编译软件请使用gets

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340