注册 登录
编程论坛 C++教室

新手习作,遇上问题,请高手指点

badmen 发布于 2004-07-01 12:42, 1847 次点击

我刚学C没多久,老师给布置了这样一道作业。

判断平年还是闰年。

要求:1、输入年份时,要校验年份是否在100<year<9999之间,如若不在,直接否定。

   2、如果是闰年,输入二月,给出正确的天数;输入其他月份也要给出正确的天数。

   3、如果是平年,输入二月,给出正确的天数。

我编完了所有的代码,在单个块运行时,只有警告,没错,可一汇总,就出现一个else的错误,我对if...else语句理解不是很透,我不知问题出在哪?请高手指点一下。

#include <stdio.h> void main() { int year,month; month=1; month=3; month=5; month=7; month=8; month=10; month=12; month=2; month=4; month=6; month=9; month=11; printf("输入一个年份:\n"); scanf("%d",&year);

if (100<year && year<9999) if(year%4==0) printf("这是闰年\n"); else printf("这是平年\n"); printf("输入一个月份:\n"); scanf("%d",&month); if (0<month && month<12) if (month==1 || month>2) if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12) printf("month=31 \n",month); if (month==2 && year%4==0) printf("month=29 \n",month); else printf("month=28 \n",month); else printf("month=30 \n",month);

}

17 回复
#2
onicuka2004-07-01 15:00

你写的IF和ELSE里面一个大括号也没有你叫程序怎么判断啊,先把语句看看熟,然后自己改改试试

#3
kuangjingbo2004-07-01 17:14

month=1; month=3; month=5; month=7; month=8; month=10; month=12; month=2; month=4; month=6; month=9; month=11;

这一堆好象没有用!

你在编写程序之前是否认真的考虑过?流程图画了吗?

还是先整理好你的思维吧,语言只不过是对思维的描述!!

#4
badmen2004-07-01 20:43

我自己也知道,上面那一长串赋值没用,发帖时,忘记删掉了。

我对IF...ELSE一直就理解不透。请高手指出我的不足

#5
kai2004-07-02 06:04

#include <stdio.h> #include <stdlib.h>

int main() { int year,month; bool isLeapYear; printf("输入一个年份:\n");

scanf("%d",&year); if (100<year && year<9999) { isLeapYear = (year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0);

if(isLeapYear) { printf("这是闰年\n"); } else { printf("这是平年\n"); } printf("输入一个月份:\n"); scanf("%d",&month); if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12) printf(" %d. month has 31 days \n",month); else if (month==2 && isLeapYear) printf(" %d. month has 29 days.\n",month); else if(month==2 && !isLeapYear) printf("%d. month has 28 days. \n",month); else printf("%d. month has 30 days. \n",month);

}

system("pause"); return 0; }

#6
badmen2004-07-02 21:21

请问,在“isLeapYear = (year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0);”中,“(year % 100 != 0)”和“(year % 400) == 0)”是作什么的,为什么要分别模上“100”和“400”?

#7
kuangjingbo2004-07-02 21:27

那不就是测试是否能被整除用的吗!

知道闰年的含义吗?基本上是这样的:可以被4整除但不能被100整除的是,能被100整除且能被400整除的也是!!

#8
kai2004-07-02 22:44

badmen,

那是用来判断闰年的一个算法。

#9
badmen2004-07-02 23:29

在看了大家给的提示和代码,我结合了自己现在学到的知识,在反复画流程图后,重新的写了一段代码,请大家批评不足。

#include <stdio.h> void main() { int year,month; printf("输入一个年份:\n"); scanf("%d",&year); if (100<year && year<9999) { if(year%4==0) printf("这是闰年\n"); else printf("这是平年\n"); printf("输入一个月份:\n"); scanf("%d",&month); if (month>0 && month<13) { if (month==2) if(year%4==0) printf("本月为29 \n"); else printf("本月为28 \n"); if ((month>0 && month!=2) || month>2) if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12) printf("本月为31 \n",month); else printf("本月为30 \n",month); } else printf("月份有误。\n"); } else printf("年份输入有误。\n"); }

#10
kai2004-07-03 01:41

其中还是有问题, 判断闰年的算法不对.

那个if (month>0 && month<13) 是不必要的.

我的建议:

if(month == 2 && isLeapyear)

printf("本月为29 \n");

else if(month == 2 && !isLeapyear)

printf("本月为28 \n"); else if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12) printf("本月为31 \n");

else if(month==4 || month==6 || month==9 || month==11) printf("本月为31 \n");

else

printf("月份有误。\n");

另外,你的这句还是有错

printf("本月为30 \n",month); // 这个month 没有必要

#11
kuangjingbo2004-07-03 11:46

if和else不要嵌套那么多,嵌套多了看起来都不爽!

还有,闰年的逻辑不是那么简单的:

if(year%4==0) printf("这是闰年\n");

#12
badmen2004-07-03 21:07
那如何去判断月份是否超过或小于呢?
#13
kai2004-07-05 22:49

根本没必要去关心是否小于0 或大于12 ,你想想 是不是。

我们关心的是这个月是12个月中的哪个月。 这种题还可以用 switch 语句来写。

#14
badmen2004-07-23 22:07

#include <stdio.h> void main() { int year,month; printf("输入一个年份:\n"); scanf("%d",&year); if (100<year && year<9999) { if(year%4==0) printf("这是闰年\n"); else printf("这是平年\n"); printf("输入一个月份:\n"); scanf("%d",&month); if (month>0 && month<13) { if (month==2) if(year%4==0) printf("本月为29 \n"); else printf("本月为28 \n"); if ((month>0 && month!=2) || month>2) if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12) printf("本月为31 \n",month); else printf("本月为30 \n",month); } else printf("月份有误。\n") } else printf("年份输入有误。\n"); }

[此贴子已经被作者于2004-07-23 22:12:31编辑过]

#15
live412004-07-24 15:16
高手啊!不过可以用cout cin吗?小的看得眼花了!
#16
金多虾2009-08-04 21:51
你这代码写得真的是乱啊!
没点清晰度!
#17
罗罗小菜鸟2009-08-13 22:23
#include<stdio.h>
void main()
{
    int year,p,q;
    int month_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
    printf("请输入年份year=:");
    scanf("%d",&year);
    if(year<100||year>9999)
    printf("输入有误,请重新输入");
    p=(year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0);
    if(p!=0)
    {
        printf("输入的年份为闰年\n");
        printf("输入的月份(1-12):");
        scanf("%d",&q);
        printf("该月的天数是%d:\n",month_tab[1][q-1]);
    }
    else
    {
 
        printf("输入的年份为平年\n");
        printf("输入的月份(1-12):");
        scanf("%d",&q);
        printf("该月的天数是%d:\n",month_tab[0][q]);
    }
}
这是我写的,恳请大家指正
#18
daisylin2009-08-14 17:34
#include <stdio.h>
void main()
{
int year,month;
 month=1; month=3; month=5; month=7;
month=8; month=10; month=12; month=2;
month=4; month=6; month=9; month=11;     //上面三句是多余的;
 printf("输入一个年份:\n"); scanf("%d",&year);

if (100<year && year<9999)   
{
if(year%4==0) {printf("这是闰年\n"); switch语句输出每月的天数}
else {printf("这是平年\n"); switch语句输出每月的天数}
}
else 显示输入出错
printf("输入一个月份:\n"); scanf("%d",&month); //这句建议放到if语句之前,
                                                 这样直接输入年月即可输出该月的天数

if (0<month && month<12)    //此后语句可以不要,
if (month==1 || month>2)
if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 ||month==12)
printf("month=31 \n",month); if (month==2 && year%4==0) printf("month=29 \n",month); else printf("month=28 \n",month); else printf("month=30 \n",month);

}
1