目录
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 循环结构程序设计https://blog.csdn.net/qq_45580875/article/details/134667276
2.6.5 数组的定义及使用https://blog.csdn.net/qq_45580875/article/details/134142141
2.7.5 函数程序设计https://blog.csdn.net/qq_45580875/article/details/134218701
(1)熟练运用“数据类型与表达式”相关内容,选择合适的数据结构定义问题需要的变量。
(2)熟练使用scanf函数和printf函数,进行数据的输入与输出。
(3)进一步掌握顺序、选择、循环结构程序设计的方法技巧。
(4)综合运用3种基本结构进行程序设计。
①问题分析
? ? ? ? 通过数学思维,结合循环结构,将外循环大马数量从 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);
}
}
}
③代码演示
①问题分析
? ? ? ? 完成此题要实现两个关键步骤:一,接收一行字符;二,通过循环遍历,来对字符串中单个字符进行判断,是这四类的哪一类。
? ? ? ? 这里要涉及到数组的知识(如果有暂时还没有学到的同学,可以先记录下,或看看博主的相关文章,下一章就会学到)。先定义一个长度为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);
}
③代码演示
①问题分析
? ? ? ? 首先要知道水仙花的定义,如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);
}
}
③代码演示
①问题分析
? ? ? ? 这里的主要问题在于如何将正整数拆解成每个质因数的乘积。这里用到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("*");
}
}
}
③代码演示
①问题分析
(待补充)
②代码示例
#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);
}
③代码演示
①问题分析
(待补充)
②代码示例
#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++;
}
}
③代码演示
①问题分析
? ? ? ? 此题的关键在于如何得出一个数的因子。可以通过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各自对抗的名单。