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