《C语言程序设计学习指导与实践教程》——2.5.5 实验2 综合运用3种基本结构进行程序设计(题目分析与代码演示)

2023-12-29 10:21:31

目录

前言?

实验目的

实验内容与要求

1.百马百担。100匹马,共驮100担,大马驮3担,中马驮2担,2个小马驮1担,问大、中、小马各多少?

2.输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数。

3.打印输出“水仙花数”。“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身,如153就是一个水仙花数。

4.将一个正整数分解成每个质因数的乘积。如输入90,打印90=2*3*5*5。

5.利用循环语句编写程序实现以下功能:对一个正整数,将各位数字反序后形成一个新的整数输出。如输入12345,输出54321。

6.一个素数加上1000以后是37的倍数,求满足这个条件的最小素数。

7.找1000以内的所有“完数”。一个数如果恰好等于它的因子之和,这个数就称为“完数”,如6就是一个完数,因为6=1+2+3。


前言?

????本篇基于《C语言程序设计学习指导与实践教程》(刘涛 叶明全 主编 | 上海交通大学出版社)教材书中的2.5.5章节 实验2 综合运用3种基本结构进行程序设计。分析并编写相关例题程序代码以及演示结果(部分代码源于网络),供大家参考。如果有更为简洁高效的代码,或者有一些疑问等,也欢迎各位伙伴留言讨论分享。调试程序时若出现bug也请各位及时指出,博主会第一时间调试修改并答复,谢谢!

? ? ? ? 欢迎大家阅读本系列的相关篇章,也希望大家给出宝贵建议,谢谢。

2.5.5 实验1 循环结构程序设计icon-default.png?t=N7T8https://blog.csdn.net/qq_45580875/article/details/134667276

2.6.5 数组的定义及使用icon-default.png?t=N7T8https://blog.csdn.net/qq_45580875/article/details/134142141

2.7.5 函数程序设计icon-default.png?t=N7T8https://blog.csdn.net/qq_45580875/article/details/134218701


实验目的

(1)熟练运用“数据类型与表达式”相关内容,选择合适的数据结构定义问题需要的变量。

(2)熟练使用scanf函数和printf函数,进行数据的输入与输出。

(3)进一步掌握顺序、选择、循环结构程序设计的方法技巧。

(4)综合运用3种基本结构进行程序设计。


实验内容与要求

1.百马百担。100匹马,共驮100担,大马驮3担,中马驮2担,2个小马驮1担,问大、中、小马各多少?

①问题分析

? ? ? ? 通过数学思维,结合循环结构,将外循环大马数量从 0开始(注意终止条件),内循环中马数量从0开始,这样就能表示出小马的数量。并通过一个条件判断,将各种马的数量与所能驮的担数相乘再相加,是否等于100,且小马是2的倍数。若是则输出大马中马小马的数量。

②代码示例

#include<stdio.h>
void main() {
	int elder, middle, younger = 0;
	//定义三个整型变量,分别表示大马,中马,小马,并将小马初始化为0
	for (elder = 0; elder <= 100 / 3; elder++) {
		for (middle = 0; middle <= (100 - 3 * elder) / 2; middle++) {
			younger = 100 - middle - elder;
			if (3 * elder + 2 * middle + 0.5 * younger == 100 && younger % 2 == 0)
				printf("大马%d匹,中马%d匹,小马%d匹\n", elder, middle, younger);
		}
	}
}

③代码演示


2.输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数。

①问题分析

? ? ? ? 完成此题要实现两个关键步骤:一,接收一行字符;二,通过循环遍历,来对字符串中单个字符进行判断,是这四类的哪一类。

? ? ? ? 这里要涉及到数组的知识(如果有暂时还没有学到的同学,可以先记录下,或看看博主的相关文章,下一章就会学到)。先定义一个长度为100的字符数组str(长度也可以取其他值),再通过gets()函数给数组str连续赋值(从键盘上读取连续的字符),再分别定义四个计数变量,来累加数字,字母,空格,其它字符。通过for-if循环判断结构,来依次判断数组中元素属于哪一类(注意判断的条件)。

? ? ? ? 这里需要使用到string.h头函数中的strlen()函数,该函数可以计算出数组的有值长度(并非之前预定义的100)。

②代码示例

#include<stdio.h>
#include<string.h>
void main() {
	char str[100];
	//定义一个字符串,长度为100(这里可以设置其他长度,但不可没有)
	int num = 0, character = 0, space = 0, other = 0; int i = 0;
	//定义四个整型变量,分别存储数字,字母,空格和其他字符,并初始化为0
	//i用来充当数组中的元素位置,后续遍历会使用

	printf("输入一行字符:\n");
	gets(str);
	//使用gets函数来给字符串str连续赋值
	//与scanf函数不同的是,该函数可以读取空格,输入回车结束

	for (i = 0; i < strlen(str); i++) {
		//通过strlen()函数可以计算出str的实际长度
		if ('0' <= str[i] && str[i] <= '9')
			num++;
		else if (('a' <= str[i] && str[i] <= 'z') || ('A' <= str[i] && str[i] <= 'Z'))
			character++;
		else if (str[i] == ' ')
			space++;
		else
			other++;
		//分别将第i+1个元素str[i]与特定条件比较(i从0开始),对应的变量自加
	}
	printf("数字有%d个\n英文字母有%d个\n空格有%d个\n其他字符有%d个", num, character, space, other);
}

③代码演示


3.打印输出“水仙花数”。“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身,如153就是一个水仙花数。

①问题分析

? ? ? ? 首先要知道水仙花的定义,如153=1^3+5^3+3^3。这里立方可以写成三个数连乘,或使用math.h库中的pow()函数。如pow(5,3)表示5的3次方。通过for循环从100开始遍历到999,依次判断该数是否为“水仙花数”。

????????接下来的问题就是如何取出改三位数的各个位上的数字。对于三位数n,n/100取出百位,n/10%10取出十位,n%10取出个位。

②代码示例

#include<stdio.h>
#include<math.h>
void main() {
	int n;
	for (n = 100; n <= 999; n++){
		//从100遍历到999
		if (n == pow(n / 100, 3) + pow(n / 10 % 10, 3) + pow(n % 10, 3))
			//判断n是否满足水仙花数的条件,若是则输出
			printf("%d是水仙花数\n", n);
	}
}

③代码演示


4.将一个正整数分解成每个质因数的乘积。如输入90,打印90=2*3*5*5。

①问题分析

? ? ? ? 这里的主要问题在于如何将正整数拆解成每个质因数的乘积。这里用到for-while循环嵌套,中间变量i从最小质因数2开始,遍历到该正整数num,当num对i取余等于0,则i为num的一个质因数,再让num除以该i,得出剩下的部分,再与i进行取余,直到num为满足条件的最小整数。每次找出一个质因数后输出一个星号 。

②代码示例

#include<stdio.h>
void main() {
	int num, i;
	printf("输入一个正整数:\n");
	scanf("%d", &num);
	printf("%d=", num);
	//输入一个正整数num
	for (i = 2; i <= num; i++) {
		//通过for-while循环嵌套结构找出num的所有质因数
		while (num % i == 0) {
			printf("%d", i);
			num /= i;
			//num除以i并赋值给num,让剩下的部分再与i进行取余运算,找出下一个质因数
			if (num > 1)
				printf("*");
		}
	}
}

③代码演示


5.利用循环语句编写程序实现以下功能:对一个正整数,将各位数字反序后形成一个新的整数输出。如输入12345,输出54321。

①问题分析

(待补充)

②代码示例

#include<stdio.h>
void main() {
	int num, result = 0;
	printf("输入一个整数:");
	scanf("%d", &num);
	while (num > 0) {
		int a = num % 10;
		result = result * 10 + a;
		num = num / 10;
	}
	printf("%d", result);
}

③代码演示


6.一个素数加上1000以后是37的倍数,求满足这个条件的最小素数。

①问题分析

(待补充)

②代码示例

#include<stdio.h>
void main() {
	int num = 2, i;
	while (1) {
		int prime = 1;
		for (i = 2; i * i <= num; i++) {
			if (num % i == 0) {
				prime = 0;
				break;
			}
		}
		if (prime && (num + 1000) % 37 == 0) {
			printf("满足条件的最小素数是:%d\n", num);
			break;
		}
		num++;
	}
}

③代码演示


7.找1000以内的所有“完数”。一个数如果恰好等于它的因子之和,这个数就称为“完数”,如6就是一个完数,因为6=1+2+3。

①问题分析

? ? ? ? 此题的关键在于如何得出一个数的因子。可以通过for循环将fact从1遍历到该数本身,内置一个判断语句,条件为该数num对fact取余是否等于零,若满足条件则fact为num的一个因子。

? ? ? ? 再将各个因子依次累加,用sum接收,再与num进行相等判断,若相等则输出num是完数。再最外面套一层循环,将num从1遍历到999,注意每次累加判定后要将sum重新赋值为0。

②代码示例

#include<stdio.h>
void main() {
	int num, sum, fact;
	//num为1-1000的数,sum为因子和,fact为因子
	for (num = 1; num <= 1000; num++) {
		sum = 0;
		//每次内循环完后将sum的值重置为0
		for (fact = 1; fact < num; fact++) {
			if (num % fact == 0) {
				sum += fact;
			}
		}//通过循环判断结构来算出num的因子,并累加到sum中
		if (sum == num)
			printf("%d是完数\n", num);
		//判断该数是否为完数
	}
}

③代码演示


留下两题给读者思考,后续会补充相关分析与程序。

8.从键盘输入一串数字字符(该字符串至多包含一个点号'.'),将其转换成对应的实数。说明:点号前有0~9位数字字符,点号后有0~6位数字字符,但是点号前后不能同时没有数字字符。例如输入“36.8”或“36.80”,则输出实数36.800000;输入“.8”、“0.8”或“0.800”,则输出实数0.800000;输入字符串“36”或“36.0”,则输出实数36.000000。

9.两个羽毛球队进行两两单打比赛(每名选手只能上场1次),每队3名选手。甲队为A,B,C三人,乙队为X,Y,Z三人,已知A不和X对抗,C不和X,Z对抗。编写程序找出A,B,C各自对抗的名单。

文章来源:https://blog.csdn.net/qq_45580875/article/details/134668551
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。