第5章 循环结构程序设计实验题

某不知名学校C语言作业 循环这个玩意 总结一句话就是确定次数用for 不确定用while

想先进行一次循环用do while 不过很少用到 看题先

第一题

两数合并成一个整数

输入两个两位数的正整数a、b,编写程序将a、b合并形成一个整数放在c中,合并的方式是:将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上,输出c的结果。

分析 首先a,b,都是正整二位数 们要单独提取出十位个位怎么办

假设a是16 我们用整型除法 16/10 就会得到1 也就是十位的数字 如果16%10 会得到6也就是个位数字 假设a是167 我们要得到十位就是a%100/10 小朋友们学会了吗 但是数字大了后期推荐用数组存 这也是为什么只考二位数的原因

提取出来就好办了 对应位数乘以倍率就是对应位数

个人答案如下

# include <stdio.h>

int main()
{
	int a,b,c;
	scanf("%d %d",&a,&b);
	c=a/10*100+a%10+b/10*10+b%10*1000;
	printf("%d",c) ;

	return 0;
}

老师答案如下

#include  "stdio.h"
int main()
{	int a,b,c;
    scanf("%d%d",&a,&b);
    if (a>=10&&a <=99&&b>=10&&b <=99){//老师多了一个二位正数判断
                                      //感觉没必要 题目已经说明了输入
        int i,j,k,l;
        i=a/10;
        j=a%10;
        k=b/10;
        l=b%10;
        printf("%d\n",i*100+j+k*10+l*1000);
    }
    else
        printf("input error");
     return 0;
}

第二题

模拟简单计算器

编写一个模拟简单计算器的程序,计算表达式:a1 op a2的值,要求 a1.op、a2从盘输入。其中a1.a2(作除数时不能为0)为数值,op为运算符+、-、*、/。 输出结果要求为double类型,如输入:1+1,程序应该返回2.000000。

分析 

加减乘除 仅四种情况 可以用if 也可以 swich 要注意运算符号是字符用%c就好了 同时答案也是犯病 明明都用double了还只输出两位小数

个人代码如下

# include <stdio.h>

int main()
{
	double a1,a2;
	char op;
	scanf("%lf %c %lf",&a1,&op,&a2);
	if(op=='+')printf("%.2lf",a1+a2);
	else if(op=='-')printf("%.2lf",a1-a2);
	else if(op=='*')printf("%.2lf",a1*a2);
	else printf("%.2lf",a1/a2);
		
	return 0;
}

老师答案如下 多了无关紧要的判断句 感觉答案是书上的不是自己手打的

#include  "stdio.h"
int main()
{	
  double a1,a2;
  char op;
scanf("%lf%c%lf",&a1,&op,&a2);
    switch(op){
        case '+':printf("%lf",a1+a2);break;
        case '-':printf("%lf",a1-a2);break;
        case '*':printf("%lf",a1*a2);break;
        case '/':
        	if (a2!=0) printf("%lf",a1/a2);
         else printf("input error");
        break;
default:printf("input error");
    }
     return 0;
}

第三题

三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。某人从2000年1月1日起开始“三天打鱼两天晒网”,编写程序判断这个人在以后的某一天中是“打鱼”还是“晒网”

分析

首先判断是不是闰年 闰年可以被4整除但不能被100整除或者可以被400整除

其次要算出当年过去的天数 比较复杂

然后算出一共几年加起来的天数time

最后对5取余 余数是1 2 3则打鱼 其他情况则晒网

而且 这出题每次不告诉你输入输出 蒸乌鱼 日期要2022/11/1 输出是fishing和sleeping

个人代码如下(其实可以分出函数或者结构体来优化好看一点,后面再试试)

#include<stdio.h>

main()
{

	int year, month, day, time, i;
	
	
	int each_month[12] = {31, 29, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31};
	
	scanf("%d/%d/%d", &year, &month, &day);
	
	time = 0;
	
	
	for(i = 2000; i < year; i++)
	{
		if((i % 400 == 0) || (i % 4 == 0) && (i % 100 != 0))
		{
			time += 366;
		}
		else
		{
			time += 365;
		}
    }
    
    //判断闰年
	if((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0))
	{
	
		if(month > 2)
		{
			for(i = 0; i < (month - 1) ; i++)
			{
				time += each_month[i];
			}
			
			time += day;
		}
		
		else if(month < 2)
		{
			time += day;
		}
		
		else
		{
			time = time + 31 + day;
		}
	}

	else
	{
		
		each_month[1] = 28;
		
		if(month > 2)
		{
			for(i = 0; i < (month - 1) ; i++)
			{
				time += each_month[i];
			}
			time += day;
		}
		else if(month < 2)
		{
			time += day;
		}
		else
		{
			time = time + 31 + day;
		}		
	}
	//判断处于打鱼日还是晒网
	if(0 < (time % 5) && (time % 5) < 4)
		printf("fishing");
	else
		printf("sleeping");
}

老师答案如下

#include "stdio.h"
int main()
{
    int y,m,d,days=0;
scanf("%d/%d/%d",&y,&m,&d);
    days=365*(y-2000);//计算整年的天数
    for (int i=2000;i <y;i++)  //修正闰年的366天
        if((i%400==0)||((i%100!=0)&&(i%4==0)))
            days++;
    for (int i=1;i <m;i++){  //计算整月的天数
        switch (i){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days=days+31;break;
            case 4:
            case 6:
            case 9:
            case 11:
                days=days+30;break;
            case 2:
                days=days+28;
                if((y%400==0)||((y%100!=0)&&(y%4==0))) days++;
                break;
        }
    }
    days=days+d;  //计算当月已经过去的天数
    if (days%5==1||days%5==2||days%5==3)
printf("fishing\n");
    else
printf("sleeping\n");
    return 0;
}

第四题

求两数的最大公约数和最小公倍数

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

最小公约数 使用欧几里得算法 最大公倍数 就是两数相乘除以最小公约数

思路简单明了 欧几里得算法实例如下(百度百科)

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

1997 ÷ 615 = 3 (余 152)

615 ÷ 152 = 4(余7)

152 ÷ 7 = 21(余5)

7 ÷ 5 = 1 (余2)

5 ÷ 2 = 2 (余1)

2 ÷ 1 = 2 (余0)

至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

个人代码如下(很乱** )

# include <stdio.h>

int main()
{
	int m;//数学原理转化成程序 欧几里得算法 
	int n;
	scanf("%d %d",&m,&n);
	int i;
		if(m<n) {
	i=m;m=n;n=i;}//这是防止除数大于被除数 进行交换 
	int t1 ,t2;
	t1=m;t2=n;
	int r=m%n;

	 if(m>=n){
	
	while(r!=0){
		r=m%n;
	m = n;
	n = r;
	r = m%n;
		
		
	}
	printf("最大公约数:%d\n最小公倍数:%d",n,t1*t2/n);
}else{
	printf("程序错误");
	
}

	return 0;
}

老师答案如下(这次的确答案更好 自己写没有大局观 总是少哪一步加哪一步

include  "stdio.h"
int main() 
{
	int  p,r,n,m,temp;
	scanf("%d %d",&n,&m);
	if (n <m) {
		temp=n;
		n=m;
		m=temp;
	}
	p=n*m;
	while(m!=0) {
		r=n%m;
		n=m;
		m=r;
	}
	printf("最大公约数:%d\n",n);
	printf("最小公倍数:%d\n",p/n);
	return 0;
}

第五题

循环次数确定 用for 这题感觉没什么值得分析的,c语言经典100题之一

个人代码如下

#include<stdio.h>
int main()
{
    float h,s;
    h=s=100;
    h=h/2; //第一次反弹高度
    for(int i=2;i<=10;i++)
    {
        s=s+2*h;
        h=h/2;
    }
    printf("第10次落地时共经过%f米\n第10次反弹%f米",s,h);
    return 0;
}

老师代码如下

#include  "stdio.h"
int main() 
{
	double sn=100,hn=sn/2;
	int n;
	for (n=2; n <=10; n++) {
		sn=sn+2*hn;   
		hn=hn/2;      
	}
	printf("第10次落地时共经过%.6lf米\n",sn);
	printf("第10次反弹%.6lf米\n",hn);
	return 0;
}

第六题

求1到100数字相加之和

用while语句编写程序求1+2+3+…+100

分析:这还分析个啥 直接干啊

个人代码如下(当然 你也可以用等差数列求和公式 不过那就不是循环了

#include<stdio.h>
int main()
{
	int sum=0;
	int i;
    for(i=1;i<=100;i++)sum+=i;
    printf("%d",sum);
    return 0;
}

老师答案如下(正好我for他while

#include  "stdio.h"
int main() {
	int i=1,sum=0;
	while (i <=100) {
		sum=sum+i;
		i++;
	}
	printf("%d\n",sum);
	return 0;
}

第七题

计算不大于正整数n值的所有正偶数的和

编写一个sum函数求和:输入一个正整数n,统计不大于n值的所有正偶数的和,在主函数中完成输入输出。要求用 do-while 语句实现。

分析:用循环遍历1~n 然后如果%2=0 就计数进去sum  而且这题目不是说不大于n吗 n自己居然不算 。。。。

个人代码如下(我都确定是n-1次循环了还用do while干啥子勒

#include<stdio.h>
int main()
{
	int sum=0;
	int n;
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		if(i%2==0)sum+=i;
	}
	printf("%d",sum);
   

老师答案如下

#include  "stdio.h"
int main() {
	int n,sum=0,i ;
	scanf("%d",&n) ;
	i = 2;
	do {
		sum=sum+i;
		i+=2;
	} while(i <n);
	printf("%d\n",sum) ;
}

第八题

韩信点兵

韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。编程求韩信至少有多少兵?

分析:这道题用for没搞错吧 也不给数据范围 报数1到5 最后一个是1 意思就是n%5==1条件判断 依次类推 但是其实这题有很多答案 但是他输出只要2111一个答案吐了 所以for遍历范围在3000到4000就好(**题目)

个人代码如下

#include<stdio.h>
int main()
{
	
    for(int i=11;i<4000;i++){
    	if( i%5==1&&i%6==5&&i%7==4&&i%11==10)
    	printf("%d ",i);
	}
   return 0;
}

老师答案(他也输出了很多答案 但只取第一个 啥玩意

#include "stdio.h"
int main() {
	int i;
	for(i=1;; i++) {
		if(i%5==1&&i%6==5&&i%7==4&&i%11==10) {
			printf("%d",i);
			break;
		}
	}
}

其他部分答案如下

最后  本人也只是一只大一菜狗 如有错误 请多包涵 谢谢观看

好耶 作业做完了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr丶锤子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值