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

news2024/9/27 12:06:50

目录

(一)顺序程序设计部分

(二)选择程序设计部分

 (三)循环程序设计部分

 (四)数组处理数据部分


(一)顺序程序设计部分

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.coloradmin.cn/o/2089387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对比 PDAF、CDAF 和 LAAF 自动对焦技术

深入解析相位检测自动对焦&#xff08;PDAF&#xff09; 相位检测自动对焦&#xff08;PDAF&#xff0c;Phase Detection Auto Focus&#xff09;是一种高效的自动对焦技术&#xff0c;广泛应用于现代数码相机、无反相机和智能手机摄像头中。为了更好地理解 PDAF&#xff0c;我…

C++11中的lambda匿名函数

一、引言 C11中引入的lambda表达式&#xff08;也称为匿名函数或lambda函数&#xff09;提供了一种方便且灵活的方式来定义和使用小的匿名函数对象。这些lambda表达式在编写回调函数、操作容器的算法中、或者在需要快速定义和传递一个函数逻辑给另一个函数时特别有用。 二、基…

行得稳,跑得远,美团如何做到长期主义持续发力?

在今天这样一个充满不确定性的时代&#xff0c;最能确定的是什么呢&#xff1f;我们这一代人&#xff0c;有幸成为诸多历史性时刻的亲历者和见证者。在此背景下&#xff0c;越来越多的企业家和经营者开始关注回归经营的本质和实现稳健经营的问题。 企业的稳健经营贯穿于企业的…

联华证券-掌握尾盘买入法的多种策略与实用技巧

尾盘买入法的常见方法与具体技巧 尾盘买入法是指在股票交易日的尾盘时段&#xff08;通常指收盘前的15-30分钟&#xff09;进行买入操作的策略。由于尾盘时段能够反映市场全天的交易情况以及主力资金的意图&#xff0c;尾盘买入法在捕捉短线机会方面具有一定的优势。以下是尾盘…

Python编码—掌握Python与Kubernetes:构建高效微服务架构

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

涨粉20w!AI真人视频转动漫,太好涨粉了,3步学会AI视频转绘!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 这类视频&#xff0c;流量超大。从去年一直火到了现在。 前有…

dubbo:巧用dubbo的SPI机制实现各类定制功能(六)

文章目录 0. 引言1. dubbo SPI机制1.1 什么是SPI1.2 java的SPI机制1.3 dubbo的SPI机制1.4 dubbo的SPI使用 2. 基于SPI实现定制功能2.1 dubbo的上下文参数2.2 实现权限校验、参数日志等功能2.3 dubbo spi条件激活机制Activate 3. dubbo的SPI与java的SPI有什么区别4. 总结 0. 引言…

机器学习:词向量转换及代码实现

CountVectorizer 是 scikit-learn 库中的一个文本向量化工具&#xff0c;它将文本数据转换为词频特征矩阵。以下是 CountVectorizer 的算法原理和步骤&#xff1a; 原理 文本预处理&#xff1a; 分词&#xff1a;将文本分割成单词或短语&#xff08;tokens&#xff09;。小写化…

mysql配置与日常使用

mysql配置 1.从官网下载zip文件并解压&#xff0c;解压的路径中最好不要有中文 2.添加环境变量 这一步的作用是可以在任意文件夹下操作mysql指令 操作步骤&#xff1a;环境变量 ->用户变量Path -> 添加mysql的bin目录 V 3. 在mysql解压路径下添加配置文件my.ini …

力扣刷题第二阶段Days35(javascript)

1&#xff0c;题目描述 -- 和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2,代码详解 哈希&#xff0b;前缀和 /*** param {number[]} nums* param {number} k* ret…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…

MIT 6.5840(6.824) Lab 4:Fault-tolerant Key/Value Service 设计实现

1 实验要求 本实验旨在利用lab 3中的Raft库&#xff0c;构建一个具备容错能力的键值存储服务。服务将作为一个复制状态机&#xff0c;由多个服务器组成&#xff0c;各服务器通过Raft协议同步数据库状态。即使在部分故障或网络隔离的情况下&#xff0c;只要大多数服务器正常&am…

通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题

组合优化问题&#xff1a;图着色问题 通过MindOpt APL建模求解组合优化问题中的常见问题&#xff1a;图着色问题 1. 背景知识 1.1. 组合优化问题 在之前发布的《组合优化问题&#xff1a;装箱问题》中&#xff0c;我们讲解了什么是组合优化&#xff08;Combinatorial Optimi…

【练习1】数字统计

题目&#xff1a; 分析&#xff1a; 枚举法数字拆分&#xff08;tmp % 10&#xff0c;tmp / 10&#xff09; 代码实现&#xff1a; public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int l in.nextInt(), r in.nextInt();…

【2024 CCF编程能力等级认证(GESP)Python 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 编程规范3.3 基础语法3.4 数据类型3.5 三大基本结构3.6 运算符3.7 模块导入与输入输出3.8 Turtle绘图4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

11 对话模型微调

提问&#xff1a;其实我一直觉的数据是最费事的一个&#xff0c;现在都是使用别人的数据&#xff0c;如果对于实际场景中那么我们该如何获取处理数据呢&#xff01; 1 数据处理&#xff1b; 2 模型选择&#xff0c;调参数&#xff1b; 数据 llm-wizard/alpaca-gpt4-data-zh …

简单的二叉树问题——二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

【二叉树进阶】--- 前中后序遍历非递归

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇博客我们将来了解有关二叉树前中后序遍历的非递归版本。 &#x1f3e0; 前序遍历 要迭代非递归实现二叉树的前序遍历&#xff0c;首先还…

【pgAdmin4】创建/删除:数据库Database和数据库表Table

目录 0.环境 1.简介 2.详细步骤 1&#xff09;创建数据库 法一&#xff1a;UI界面创建 法二&#xff1a;sql语句创建数据库 2&#xff09;创建数据库表 查看数据库表 查看数据库表内容 法一&#xff1a;UI界面创建数据库表 法二&#xff1a;sql语句创建数据库表 3&…

C_09_字符操作

字符串相关函数 头文件都是 string.h 概述&#xff1a; 由系统提供的由字符串处理的函数 属于库函数 所属头文件 string.h 1 strlen 测量字符串长度 语法&#xff1a; size_t strlen(const char *s);参数&#xff1a;要测量的字符串返回值&#xff1a;长度注意:测量的长度…