当前位置: 首页 > article >正文

C程序设计(潭浩强教授版)精选程序题

目录

(一)顺序程序设计部分

(二)选择程序设计部分

 (三)循环程序设计部分

 (四)数组处理数据部分


(一)顺序程序设计部分

1. 使用getchar读入两个字符,并分别用putchar和printf函数输出。

解题思路:明确putchar和getchar的用法。

#include<stdio.h>

int main() {
	//使用getchar读入两个字符,并分别用putchar和printf函数输出
	char c1, c2;
	printf("请输入两个字符:");
	c1=getchar();
	c2=getchar();
	printf("用putchar输出结果如下:\n");
	putchar(c1);
	putchar(c2);
	printf("\n");
	printf("用printf输出结果如下:\n");
	printf("%c %c", c1, c2);
	return 0;
}

(二)选择程序设计部分

1.  有一个函数,当x<1时,y=x;当1<=x<10时,y=2*x-1;当x>=10时,y=3*x-11.

要求:写程序,输入x的值,输出y相应的值。

解题思路:可以使用if-else等多分支语句来处理不同的x值,使其进行不同的运算。

#include<stdio.h>

int main() {
	//根据函数,输入一个x值,就会输出对应的y值
	int x, y;
	printf("请输入一个x值:\n");
	scanf("%d", &x);
	if (x < 1) {
		y = x;
	}
	else if (x >= 1 && x < 10) {
		y = 2 * x - 1;
	}
	else {
		y = 3*x - 11;
	}
	printf("y值为:%d", y);
	return 0;
}

2. 给一个不多于5位的正整数,要求:

1)求出它是几位数

2)分别输出每一位数字

3)按逆序输出各位数字,例如原数为321,应输出123.

解题思路:首先接收这个正整数,通过跟特定的数进行大小判断来判断它是几位数。接着利用除法求余等算术运算来输出每一位数字。

#include<stdio.h>

int main() {
	//给出一个不多于5位数的正整数
	int num;
	printf("请输入一个不多于5位数的正整数:\n");
	scanf("%d", &num);
	int flag, ge, shi, bai, qian, wan;
	if (num > 0 && num < 10) {
		flag = 1;
	}
	else if (num >= 10 && num < 100) {
		flag = 2;
	}
	else if (num >= 100 && num < 1000) {
		flag = 3;
	}
	else if (num >= 1000 && num < 10000) {
		flag = 4;
	}
	else {
		flag = 5;
	}
	wan = num / 10000;
	qian = num / 1000 % 10;
	bai = num / 100 % 10;
	shi = num / 10 % 10;
	ge = num % 10;
	printf("这是一个%d位数\n", flag);
	switch (flag) {
	case 1:
		printf("原数的每一位上面的数字为:%d\n", ge);
		printf("逆序输出结果为:\n");
		printf("%d", ge);
		break;
	case 2:
		printf("原数的每一位上面的数字为:%d %d\n", shi, ge);
		printf("逆序输出结果为:\n");
		printf("%d %d", ge, shi);
		break;
	case 3:
		printf("原数的每一位上面的数字为:%d %d %d\n", bai, shi, ge);
		printf("逆序输出结果为:\n");
		printf("%d %d %d", ge, shi, bai);
		break;
	case 4:
		printf("原数的每一位上面的数字为:%d %d %d %d\n", qian, bai, shi, ge);
		printf("逆序输出结果为:\n");
		printf("%d %d %d %d", ge, shi, bai, qian);
		break;
	case 5:
		printf("原数的每一位上面的数字为:%d %d %d %d %d\n", wan, qian, bai, shi, ge);
		printf("逆序输出结果为:\n");
		printf("%d %d %d %d %d\n", ge, shi, bai, qian, wan);
		break;
	default:
		printf("输入有误,请输入正确的数字!\n");
		break;
	}

	return 0;
}

 (三)循环程序设计部分

1. 输入两个正整数m和n,求其最大公约数和最小公倍数。

解题思路:求最大公约数可用辗转相除法,求最小公倍数,可由这两个数的乘积再除以这两个数的最大公约数。

#include<stdio.h>

int main() {
	//求两个正整数的最大公约数和最小公倍数
	//最大公约数用辗转相除法,最小公倍数用两数相乘再除以最大公约数来求
	int n, m;
	printf("请输入两个正整数:\n");
	scanf("%d,%d", &n, &m);
	if (n < m) {
		int temp = n;
		n = m;
		m = temp;
	}
	int p = n * m;
	int r = n % m;
	while (r!= 0) {
		n = m;
		m = r;
		r = n % m;
	}
	p = p / m;
	printf("最大公约数为:%d", m);
	printf("最小公倍数为:%d", p);
	return 0;
}

2. 求1!+2!+3!+...+20!的值

解题思路:除了1以外,每个数的阶乘都是前一个数的阶乘再乘以这个数。

#include<stdio.h>

int main() {
	//求1到20每个数的阶乘的和
	int sn = 1, n = 1;
	int sum = 0;
	while (n <= 20) {
		sum += sn;
		++n;
		sn = sn * n;
	}
	printf("这20个数的阶乘和为:%d", sum);
	return 0;
}

3. 有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13...

求出这个数列的前20项和。

解题思路:从第二项开始,每一项的分子都是前一个数的分子分母之和,分母则是上一个数的分子。

#include<stdio.h>

int main() {
	//求一个特殊分数序列的前20项和
	double m = 2.0, n = 1.0, sum = 2.0;
	for (int i = 1; i < 20; i++) {
		int temp = m;
		m = n + m;
		n = temp;
		sum += m / n;
	}
	printf("结果为%f", sum);
	return 0;
}

 

4. 用牛顿迭代法求下面方程在1.5附近的根:

        2x^{3}-4x^{2}+3*x-6=0

解题思路:牛顿迭代法又称牛顿切线法,它采用以下的方法求根:先任意设定一个与真实的根接近的值x0,作为第1次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把x1作为第2次近似根,再由x1求出f(x1),过(x1,f(x1))做f(x)的切线,交x轴于x2,再求出f(x2),再做切线。。。如此继续下去,知道足够接近真正的根x*为止.

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

int main() {
	//用牛顿迭代法求一个方程在1.5附近的根
	double x0 = 1.5, x1;
	x1 = x0 - (((2 * x0 - 4) * x0 + 3) * x0 - 6) / ((6 * x0 - 8) * x0 + 3);
	do {
		x0 = x1;
		x1 = x0 - (((2 * x0 - 4) * x0 + 3) * x0 - 6) / ((6 * x0 - 8) * x0 + 3);
	} while (fabs(x1 - x0) >= 1e-5);
	printf("the root of equation is %10.2f", x1);
	return 0;
}

 (四)数组处理数据部分

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

解题思路:所谓“筛选法”指的就是“埃拉托色尼筛法”。埃拉托色尼是古希腊的著名数学家。他采取的方法是,在一张纸上写上1~1000的全部整数,然后逐个判断它们是否素数,找出一个非素数,就把它挖掉,最后剩下的就都是素数。

具体做法可归结为:

1)先将1挖掉(因为1不是素数)

2)用2除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉

3)用3除它后面的个数,把3的倍数挖掉

4)分别用4,5。。。各数作为除数除这些数后面的各数。这个过程一直进行到在除数后面的数已全部被挖掉为止。

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

int main() {
	//利用筛选法求100以内的素数
	int str[100];
	for (int i = 1; i <= 100; i++) {
		str[i - 1] = i;
	}
	str[0] = 0;		//将1给排除,因为1不是素数
	for (int i = 1; i <= sqrt(100); i++) {
		for (int j = i+1; j <100; j++) {
			if (str[i]!=0&&str[j] != 0) {
				if (str[j] % str[i] == 0) {
					str[j] = 0;
				}
			}
		}
	}
	int count = 0;
	for (int i = 0; i < 100; i++) {
		if (str[i] != 0) {
			printf("%d\t", str[i]);
			count++;
			if (count % 10 == 0) {
				printf("\n");
			}
		}
		
	}
	return 0;
}

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

解题思路:利用二维数组,对在对角线上的元素进行相加。

#include<stdio.h>

int main() {
	//求一个3*3的整型矩阵对角线元素之和
	int str[3][3];
	int sum = 0;
	printf("请依次输入这个矩阵元素值:\n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%d", &str[i][j]);
			if (i == j) {
				sum = sum + str[i][j];
			}
		}
	}
	printf("这个矩阵对角线元素之和为:%d", sum);
	return 0;

}

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

解题思路:可假设这个数组是按照从小到大进行排序的。首先比较最后一个元素,如果这个数大于最后一个元素,就把它插入到数组的最后。如果小于,那么从前面第一个元素比较,看是否小于这个元素,如果小于,就把这个位置的元素以及其后的元素都往后面移动一个位置。

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

int main() {
	//已有一个已经排好序的数组,要求插入一个数后,原来的排序规律不变
	int arr[11] = { 11,22,33,44,55,66,77,88,99,100 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int num;
	printf("数组长度为:%d\n", len);
	printf("请输入要插入的数:\n");
	scanf("%d", &num);
	if (num > arr[len - 2]) {
		arr[len-1] = num;
		printf("插入一个数后的数组为:\n");
		for (int i = 0; i < len; i++) {
			printf("%d ", arr[i]);
		}
		return 0;
	}
	for (int i = 0; i<arr[len-2]; i++) {
		if (num < arr[i]) {
			for (int j = len-1; j>i; j--) {
				arr[j] = arr[j - 1];
			}
			arr[i] = num;
			break;
		}
	}
	printf("插入一个数后的数组为:\n");
	for (int i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

4. 输出十行杨辉三角。

解题思路:明确杨辉三角的实质,即各行的第一个数都是1,各行的最后一个数都是1。从第三行开始,中间的数都是上一行同列和前一列的两个数之和。

#include<stdio.h>

int main() {
	//要求输出10行的杨辉三角
	int arr[10][10];	//10行10列
	for (int i = 0; i < 10; i++) {
		arr[i][i] = 1;
		arr[i][0] = 1;
	}
	for (int i = 2; i < 10; i++) {
		for (int j = 1; j <=i-1; j++) {
			arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
		}
	}
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j <= i; j++) {
			printf("%3d", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

5. 输出“魔方阵”。所谓魔方阵就是指这样的方阵,它的每一行,每一列和对角线之和均相等。要求输出1~n*n的自然数构成的魔方阵。

解题思路:魔方阵的排列规律为:首先1必须放在第一行的中间一列,这也就要求我们魔方阵的阶数必须是奇数。然后其余数都放前一个数的上一行后一列。如果位置已有元素,那么这个数就放在前一个数的下面。

#include<stdio.h>

int main() {
	//输出一个1~n*n的魔方阵
	int arr[15][15];
	int n;
	printf("请输入n的值(1~15内的奇数):\n");
	scanf("%d", &n);
	//判断输入n的值是否正确
	if (n <= 0 || n > 15 || n % 2 == 0) {
		printf("您输入的n值有误,请重新输入!");
		return 1;
	}
	//初始化这个方阵都为0
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			arr[i][j] = 0;
		}
	}
	int h = 0, l = n / 2;
	int num = 1;
	while (num <= n * n) {
		arr[h][l] = num++;
		int h1 = h - 1;
		int l2 = l + 1;
		if (h1 == -1 && l2 == n) {
			h1 = n - 1;
			l2 = 0;
		}
		else if (h1 == -1) {
			h1 = n - 1;
		}
		else if (l2 == n) {
			l2 = 0;
		}

		//处理填充位置已经满了的情况
		if (arr[h1][l2] != 0) {
			h1 = h + 1;
			l2 = l;
		}
		h = h1;
		l = l2;
	}

	//打印这个魔方阵
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	

	
}

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

解题思路:可以先求出每一行的最大值,然后再判断是不是这一列中最小值。设置一个标志来判断这个二维数组是否包含鞍点。

#include<stdio.h>

int main() {
	//找出一个数组中的鞍点
	int arr[4][5] = {
		{1,2,3,4,5},
		{2,4,21,8,9},
		{3,6,9,12,15},
		{4,8,12,16,20}
	};
	int flag = 1, lie = 0;
	for (int i = 0; i < 4; i++) {
		int max = arr[i][0];
		lie = 0;
		flag = 1;
		for (int j = 1; j < 5; j++) {
			if (arr[i][j] > max) {
				max = arr[i][j];
				lie= j;
			}
		}
		for (int k = 0; k < 4; k++) {
			if (max>arr[k][lie]) {
				flag = 0;
				break;
			}
		}
		if (flag == 1) {
			printf("这个数组有鞍点,鞍点为%d", max);
			printf("位于arr[%d][%d]", i, lie);
			//break;	//这里break的作用可用来控制鞍点的个数
		}
	}
	return 0;
}

7. 有一行电文,已按下面规律译成密码:A→ Z, a→z,B→Y,b→y,C→X,c→x...。即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。

解题思路:利用ASCII码来判断是第几个字母,然后再将其进行处理。

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

int main() {
	//将一行电文密码遵循一定的规则翻译回原文
	char password[100];
	char account[100];
	printf("请输入一行电文密码:\n");
	fgets(password, sizeof(password), stdin);
	int len = strlen(password);
	for (int i = 0; i < len; i++) {
		printf("%c", password[i]);
	}
	printf("\n");
	for (int i = 0; i < len; i++) {
		if (password[i] >= 'A' && password[i] <= 'Z') {
			password[i] = 155 - password[i];
		}
		else if (password[i] >= 'a' && password[i] <= 'z') {
			password[i] = 219 - password[i];
		}
		else {
			continue;
		}
	}
	printf("该电文密码的原文为:\n");
	for (int i = 0; i < len; i++) {
		printf("%c", password[i]);
	}
	return 0;
}

 

 

 

 

 

 


http://www.kler.cn/news/285229.html

相关文章:

  • Bluetooth: gatt profile
  • 学习之SQL语句之DCL(数据控制语言)
  • 广电手机卡靠谱吗?
  • 【爬虫软件】YouTube评论采集工具
  • LVS工作模式
  • IBM退出中国,LabVIEW未来走向何方?
  • 5G智慧工地项目汇报方案
  • ElementPlus下拉框实现可选择,可输入
  • pm2 + linux + nginx
  • C++拷贝构造函数
  • 智能儿童对讲机语音交互,乐鑫ESP-RTC音视频通信,ESP32无线语音方案
  • JAVA:文字写入图片、图片插入图片
  • 睿考网:2024年中级经济师考试备考技巧
  • Java设计模式【享元模式】-结构型
  • mac在终端中使用vscode打开文件或者文件夹
  • PowerShell脚本编写:自动化Windows开发工作流程
  • audiocraft - 免费文本转音乐、AI音乐生成、AI音乐创作工具,Facebook开源,本地一键整合包下载
  • Redisson 实现分布式锁
  • 类和对象(4)
  • zabbix对接Grafana
  • Linux的远程登录教程(超详细)
  • 排序算法之桶排序详细解读(附带Java代码解读)
  • 模型 错位竞争(战略规划)
  • 从Vuex 到 Pinia,Vue 状态管理的进化
  • HTB-sequal(mysql)
  • 十一. 常用类
  • 如何开发针对不平衡分类的成本敏感神经网络 python
  • 遇到“Interpreter parsed an intent ‘xxx‘ which is not defined in the domain“报错
  • 贵州大数据实验室建设案例分享
  • vue调用booststrap弹窗