首页 > 编程语言 >C程序设计(潭浩强教授版)精选程序题

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

时间:2024-08-29 15:50:37浏览次数:10  
标签:arr num int 精选 潭浩强 printf 程序设计 x0 include

目录

(一)顺序程序设计部分

(二)选择程序设计部分

 (三)循环程序设计部分

 (四)数组处理数据部分


(一)顺序程序设计部分

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

 

 

 

 

 

 

标签:arr,num,int,精选,潭浩强,printf,程序设计,x0,include
From: https://blog.csdn.net/2303_78660417/article/details/141678187

相关文章

  • Mac OS 高效操作秘籍:精选快捷键全解析
    1、显示隐藏文件、文件夹的快捷键【Command+Shift+.】,注意需要同时按下,演示如下:没有显示隐藏文件、文件夹效果如下图:按下快捷键【Command+Shift+.】,显示隐藏的文件、文件夹,效果如下:若想再次隐藏,就再按一下就可以了2、定位文件夹快捷键【Command+Shift+G】,演......
  • C语言程序设计:链表删除相关结点
        创建一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。1.声明结构体类型结构体类型structStudent,包含成员学生学号(整型)、学生姓名(字符数组)、性别(字符型)、年龄(整型),next结构体指针。声明全局变量n......
  • C语言程序设计-实现三(N)子棋游戏
    画自己喜欢的画,别停笔小艺术家。实现三子棋:test.c //测试游戏的逻辑#include"game.h"//自己的头文件voidmenu(){ printf("*****************************\n"); printf("******1.play0.exit******\n"); printf("*****************************\n&quo......
  • 【精选】数码论坛系统设计与实现(计算机毕业设计福利,计算机毕业设计参考,JAVA毕业设计)
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • C程序设计语言(第2版·新版)练习题1-10
    练习1-10 编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,把回退符替换为\b,把反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来。#include <stdio.h>#include <conio.h>int main(int argc, char *argv[]){    (void)argc;    (void......
  • 【有源码】基于python的国内地震数据可视化分析与预测系统hadoop项目hive计算机程序设
    注意:该项目只展示部分功能,如需了解,文末咨询即可。本文目录1.开发环境2系统设计2.1设计背景2.2设计内容3系统展示3.1功能展示视频3.2页面页面4更多推荐5部分功能代码1.开发环境开发语言:Python采用技术:K-means算法数据库:MySQL开发环境:PyCharm2系统......
  • MFC程序设计(一) MFC框架
    基本概念SDK:开发软件的套件WDK:开发驱动的套件当我们开发驱动时,两者版本需要一致MFC:MicrosoftFundationclass,即微软基础类库。是基于Win32SDK进行的封装的框架。MFC为我们提供了大量的WindowsSDK的代码及设计重用,因此我们并不需要像SDK一样对消息过程进行处理,而是只需......
  • [JS]精选面试题-4
    1.介绍js的基本数据类型基本数据类型的数据直接存储在栈(stack)内存中String:字符串在JavaScript中是不可变的Number:JavaScript中的数字类型是不分整型和浮点型的,所有的数字都是以64位浮点数形式存储的。Number支持一些特殊的值,如NaN(非数字)、Infinity(无穷大)和-Infinity......
  • Spring Cloud Consul精选面试题及答案
    SpringCloudConsul面试题及答案:1.什么是SpringCloudConsul?答:SpringCloudConsul是一个基于SpringBoot和SpringCloud的微服务框架,用于实现服务发现、配置中心和负载均衡等功能。Consul是HashiCorp公司开源的一款提供服务注册与发现的开源软件。2.Consul......
  • C程序设计语言(第2版·新版)练习题1-4
    练习1-4编写一个程序打印摄氏温度转换为响应华氏温度的转换表。#include <stdio.h>int main(int argc, char *argv[]) {    (void) argc;    (void) argv;        float fahr, celsius;    int lower, upper, step;        ......