C语言练习1

本文提供了一个C语言程序,用于计算输入日期是一年中的第几天,同时考虑了平年和闰年的差异。程序还包括了输入验证,确保月份和天数合法。此外,文章还展示了其他几个编程作业,包括打印阶梯形符号、输出偶数、显示数的因子、找完数以及质数的输出。这些作业都涉及到基本的循环和逻辑判断。
摘要由CSDN通过智能技术生成
1.编码作业:输入一个日期,输出这个日期是这一年的第几天。

注意:要考虑平年闰年的问题。

如输入:2023/3/1  则输出 2023年3月1日是2023年的第60天

如输入:2020/3/1  则输出 2020年3月1日是2020年的第61天


思想:
    1.首先定义一个变量leap,然后判断输入年份是否为闰年,若果是闰年将leap的值赋为1。因为闰年
的二月比平年多一天。
    2.判断月数和天数是否在合法范围内,如果合法则程序会继续往下执行,若果不合法则会提示用户重
新输入月份与天数,知道修改到正确为止。
    3.使用case穿透现象将前几个月的月相加,然后加上本月的天数就是所求的结果了。
#include<stdio.h>
#include<stdbool.h>
#define MOUNTH_1 31
#define MOUNTH_2 28
#define MOUNTH_3 31
#define MOUNTH_4 30
#define MOUNTH_5 31
#define MOUNTH_6 30
#define MOUNTH_7 31
#define MOUNTH_8 31
#define MOUNTH_9 30
#define MOUNTH_10 31
#define MOUNTH_11 30
#define MOUNTH_12 31
int main(){
	int year,month,day;
	int leap=0;//表示是否是闰年,0为不是闰年,1为闰年
	
		printf("请依次输入 年 月 日:");
		scanf("%d %d %d",&year,&month,&day);
		while(true){
			if((year%4==0&&year%100!=0)||year%400==0){
				leap=1;			//闰年为1
			}
			
			if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(12==month)){
				while(day>31||day<1){
						printf("天数输入不合法,请从新输入: ");
						scanf("%d",&day);
						continue;
				}
			}
			else if((month==4)||(month==6)||(month==9)||(month==11)){
				while(day>30||day<1){
					printf("天数输入不合法,请重新输入: ");
					scanf("%d",&day);
					continue;
				}
			}else if(month==2){
					if(leap==0){
						while(day>28||day<1){
						printf("天数输入不合法,请重新输入: ");
						scanf("%d",&day);
						continue;
						}
					}else{
						while(day>29||day<1){
						printf("天数输入不合法,请重新输入: ");
						scanf("%d",&day);
						continue;
						}
					}
			}else{
				printf("月数输入不合法,请重新输入: ");
				scanf("%d",&month);
				continue;
			}
			break;
		}
		int days=0; 
 //这里使用了case穿透现象,将前几个月的天数相加就得到了所要求的这一年的总天数   
		switch(month){
			case 12:
				days+=MOUNTH_11;
			case 11:
				days+=MOUNTH_10;
			case 10:
				days+=MOUNTH_9;
			case 9:
				days+=MOUNTH_8;
			case 8:
				days+=MOUNTH_7;
			case 7:
				days+=MOUNTH_6;
			case 6:
				days+=MOUNTH_5;
			case 5:
				days+=MOUNTH_4;
			case 4:
				days+=MOUNTH_3;
			case 3:
				days+=MOUNTH_2+leap;//这里加的leap,如果是闰年那就为1,
									//若果是平年那就为0
			case 2:
				days+=MOUNTH_1;
			case 1:
				days+=day;
			break;
		}
	//printf("year=%d\n",leap);
	printf("%d年 %d月 %d日 是今年的第%d天\n",year,month,day,days);
//	scanf("%d %d %d",&year,&month,&day);
	return 0;
}
后续会优化代码,定义函数用函数来判断年月日输入是否合法,不合法则从新输入
作业:
----------------------------------------------
      六行 展示出阶梯型
@
@@
@@@
@@@@
@@@@@
------------------------------------------------
FFFFFF      控制F的个数
@FFFFF
@@FFFF
@@@FFF
@@@@FF
@@@@@F
-----------------------------------------------
第一题思想:一共有五行,第一行输出一个第二行输出两个依次类推。
    那么直接可以使用两层for循环,外层控制层数,里层控制 ‘@’输出的个数
第二题思想:一共有六行
    第一行输出6个F
    第二行输出一个@,和5个F
    第三行输出两个@,和4个F
    ...
    可以利用for循环实现,外层控制层数。里层有两个for循环,for循环1控制'@'的个数,for循环2控制'F'的个数。
#include<stdio.h>
int main(){
    for(int i=0;i<6;i++){
        for (int j= 0; j < i+1; j++)
        {
            putchar('@');
        }
        printf("\n");  
    }
    int  sum = 0; 
    for(int i=0;i<6;i++){         //外层控制层数
        int j;
        for (j=0;j < i; j++)      //输出 ‘@’的个数依次增加 即输出@的个数为i个
        {
            printf("@");
        }
        for(int sum=0;sum<6-j;sum++){  //输出 ‘F’的个数依次减少 即输出F的个数为 6-j个
            printf("F");
        }
        printf("\n");
    }
    return 0;
}
作业:
    输出 [1,100] 范围内所有的偶数
#include<stdio.h>
int main(){
    int i=1;
    do{
        if(i%2==0){
            printf("i=%d\n",i);  //走到这一步那就是偶数,i++后结束本次循环
            i++;
            continue;  
        }
        i++;  //走到这一步就不是偶数,i++后进行下一次循环
        continue;
    }while(i<=100);  //跳出循环的条件需要改变
    return 0;
}
作业:
    输入一个整数,输出这个数的所有因子。如输入12, 则输出:1 2 3 4 6 12
/*
思想:需要一个变量用来寻找用户输入数据的因子,并且这个变量的最大只能与用户输入的数据相同,
最小只能为 1
*/
#include<stdio.h>
int main(){
    int number;
    int i=1;    //需要从1开始
    printf("请输入需要判断的数字: \n");
    scanf("%d",&number);
    printf("number的所有因子: ");
    while(i<=number){
        if((number%i)==0){
            printf("%d ",i);
            i++;            //需要一个自增条件  i的范围在[1,number],while最后一次循环为number
            continue;
        }
        i++;
        continue;
    }
    printf("\n");
    return 0;
}
作业:
    输出[2, 999] 范围内所有的完数。
    完数:一个数除了自身之外的所有因子和还等于自身。
    如,6 就是一个完数:  1  +  2  +  3  ==  6
#include<stdio.h>
int main(){
    int number=2;
    int perfect_number=0;   //给一个标记用来判断是不是完数,每次循环需要清零
                            //用来重新计算
    for(number;number<1000;number++){
        perfect_number=0;     
        for(int j=1;j<number;j++){    //注意完数是除了自身之外所有因子相加等于他自身
            if((number%j)==0){
                perfect_number+=j;
                continue;           
            }
                continue;
        }
        if(perfect_number==number){
            printf("%d 是完数",number);
            continue;
        }
        continue; 
    }
    return 0;
}
作业:
    输出 [2, 100] 范围内所有的质数。
    质数:因子只有1和自身的数。
#include<stdio.h>
int main(){
    int num=2;
    int primber_number=0; //使用标志位,除了1和自身外只要有因子那么久该变primber_number的值
                          //每次循环需要清零一次
    #ifdef 0
    for (num;num <=100;num++)
    {
         primber_number=0;
        for (int i = 2; i <num; i++) //任何数取余1,余数都为0,所以直接从2开始计算。
                                    //num自身不需要进行计算,因为任何数取余自身余数都为0
        {
            if (num%i==0)
            {
                primber_number=1;
            }  
        }
        if (primber_number==0)
        {
            /* code */
            printf("%d是质数\n",num);
        }
    }
    #endif
    #ifdef 1
    while(num<=100){
        primber_number=0;
        for(int i=2;i<num;i++){           
            if((num%i)==0){
                primber_number=1;
            }    
        }
        if(primber_number==0){
            printf("%d是质数\n",num);
            num++;
            continue;
        }
        num++;
        continue;
    }
    #endif
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值