C程序打印两次

时间:2017-05-16 04:41:50

标签: c

所以我有一个程序,我正在检查这一年是否是闰年,然后取决于它是否是一个飞跃我将从(1-366)给出年份的日期数...我得到了这个代码我已经工作到目前为止,当我输入一个非闰年我得到一个正常的答案,但当我输入闰年我得到displayDate(天)运行两次并打印两次,复制粘贴我的代码请亲自尝试一下,请告诉我它有什么问题。我也是C的新手,所以如果它很简单请放轻松

int main ()
{
  int day ,month , year, LeapOrNot, date ;

  printf("PLease enter a date in the following format Month/day/year:  ");
  scanf("%d/%d/%d" , &month , &day , &year );

  LeapOrNot = isLeap(year);
  switch (LeapOrNot)
  {
    case 1 :
        switch (month)
        {
            case 1:
                date = day;
                break;
            case 2:
                date = 31 + day;
                break;
            case 3 :
                date = 60 + day;
                break;
            case 4 :
                date = 91 + day;
                break;
            case 5 :
                date = 121 + day;
                break;
            case 6:
                date = 152 + day;
                break;
            case 7:
                date = 182 + day;
                break;
            case 8 :
                date = 213 + day;
                break;
            case 9 :
                date = 244 + day;
                break;
            case 10:
                date = 274 + day;
                break;
            case 11 :
                date = 305 + day;
                break;
            case 12 :
                date = 335 + day;
                break;
        }
        displayDate(date);
    case 0 :
        switch (month)
        {
            case 1:
                date = day;
                break;
            case 2:
                date = 31 + day;
                break;
            case 3 :
                date = 59 + day;
                break;
            case 4 :
                date = 90 + day;
                break;
            case 5 :
                date = 120 + day;
                break;
            case 6:
                date = 151 + day;
                break;
            case 7:
                date = 181 + day;
                break;
            case 8 :
                date = 212 + day;
                break;
            case 9 :
                date = 243 + day;
                break;
            case 10:
                date = 273 + day;
                break;
            case 11 :
                date = 304 + day;
                break;
            case 12 :
                date = 334 + day;
                break;
        }
        displayDate(date);
  }     
}

int isLeap(int year)
{
  int LeapOrNot;
  if ((year % 4 == 0 && year % 100 != 0) || year % 400 ==0)
    LeapOrNot = 1 ;
  else 
    LeapOrNot = 0 ;
  return LeapOrNot;
}

int displayDate(int date )
{
  printf("the day for that year is %d", date);  
}

2 个答案:

答案 0 :(得分:4)

你没有

的中断声明
switch (LeapOrNot)
{
    case 1 :

因此它将继续执行案例0:代码并且两次调用displayDate

答案 1 :(得分:0)

如果你想给你的老师留下深刻的印象,你可以把这个略短的变种作为替代(leapOrNot.c)给他:

#include <stdio.h>

int isLeap(int year);

void displayDate(int date);

int main()
{
  int day, month, year, leapOrNot, date;
  int dates[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };

  printf("PLease enter a date in the following format Month/day/year: ");
  scanf("%d/%d/%d", &month, &day, &year);

  date = dates[month - 1] + day + (month >= 3) * isLeap(year);
  displayDate(date);

  return 0;
}

int isLeap(int year)
{
  return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

void displayDate(int date)
{
  printf("The day for that year is %d.\n", date);
}

测试:

$ gcc -std=c11 -o leapOrNot leapOrNot.c 

$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 3/1/2016
The day for that year is 61.

$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 3/1/2017
The day for that year is 60.

$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 12/31/2016
The day for that year is 366.

$ ./leapOrNot
PLease enter a date in the following format Month/day/year: 12/31/2017
The day for that year is 365.

$ 

尽管如此,使用switch可能是一项任务,而且这项实施没有任何......

注意:

  1. 而不是使用switch语句,偏移量(取决于month)存储在数组中。

  2. (month >= 3) * isLeap(year)是典型的C编程 (month >= 3)如果为真,则产生1,否则为0 isLeap()也会产生1或0 将两个值相乘再次产生1或0 因此,可以简单地添加结果 C程序员对效率非常敏感。因此,乘法被认为是if的更快替代。

  3. 我将displayDate()的返回类型从int更改为void,因为该函数未返回任何值。我有点惊讶的是,在我做之前,C编译器没有对此发出警告。 (可能是,我必须提高编译器警告级别才能得到一个。)

  4. main()函数中,return 0;可能会被遗漏。 (这是C标准中的一个奇怪的例外。)但是,它通常被认为是“更好的风格”来明确表示它。