2017-09-07 12 views
1

現在、ユーザーが入力した日に7日を追加する日付計算プログラムを作成しています。それは、カスタム関数のデータを渡す必要があります。しかし のコードをnewDateの下で実行すると、常に0/7/0になります。問題は私のカスタム関数であると確信していますが、どこに問題があるのか​​わかりません。私はプログラミングに慣れていないので、どんな助けでも大歓迎です。ありがとう!ユーザーが入力した日付を7日追加する日付計算プログラム

#include <time.h> 
#include <stdio.h> 

struct date { 
    int month; 
    int day; 
    int year; 
    }; 

struct date addSeven(struct date addSev) { 
    addSev.day += 7; 
// Months with 31 days 
    if ((addSev.month == 1 || // January 
     addSev.month == 3 || // March 
     addSev.month == 5 || // May 
     addSev.month == 7 || // July 
     addSev.month == 8 || // August 
     addSev.month == 10 || // October 
     addSev.month == 12) // December 
     && addSev.day > 31) { 
      addSev.day -= 31; // Equivalent to addSev.day = addSev.day - 31; 
      addSev.month += 1; 
      } 
    // Months with 30 days 
     else if ((addSev.month == 4 || // April 
     addSev.month == 6 || // June 
     addSev.month == 9 || // September 
     addSev.month == 11) // November 
     && addSev.day > 30) { 
      addSev.day -= 30; 
      addSev.month += 1; 
      } 
    // February 
     else { 
      if (addSev.year % 4 == 0 && addSev.day > 29) { // Leap year 
       addSev.day -= 29; 
       addSev.month += 1; 
       } 
      else if (addSev.day > 28) { 
       addSev.day -= 28; 
       addSev.month += 1; 
       } 
      } 
    if ((addSev.day == 25) 
      && addSev.day > 31) { 
      addSev.day -= 31; // Equivalent to addSev.day = addSev.day - 31; 
      addSev.month += 1; 
      } 
     else if ((addSev.day == 24) 
       && addSev.day > 30) { 
        addSev.day -= 30; 
        addSev.month += 1; 
        } 
     else { 
      if (addSev.year % 4 == 0 && addSev.day > 29) { // Leap year 
       addSev.day -= 29; 
       addSev.month += 1; 
       } 
      else if (addSev.day > 28) { 
       addSev.day -= 28; 
       addSev.month += 1; 
       } 
     if (addSev.month > 12) { 
      addSev.month = 1; addSev.year += 1; 
      } 
     return addSev; 
     } 
    } 

int main() { 
    struct date origDate, newDate; 
    newDate = addSeven (origDate); 
    printf("Please enter a date in mm/dd/yyyy format: "); 
    scanf("%d/%d/%d",&origDate.month,&origDate.day,&origDate.year); 

    printf("\n%d/%d/%d\n", origDate); 
    printf("\n%d/%d/%d\n", newDate); 

return 0; 
} 
+0

'2月の else {'部分には 'addSev.month == 2'の条件がありません。 – chux

+2

日付を入力した後、 'newDate = addSeven(origDate);'を実行します。 'printf(" \ n%d /%d /%d \ n "、origDate);' 'origDate'の各メンバが必要です。 – BLUEPIXY

+0

あなたのユーザが注意を払っていて、日付として '2017/09/07'1を入力していないことを確認しますか?実際、日付として '2017-09-07'を入力していないことをどこで確認していますか?入力の検証は難しいです。 –

答えて

0

関数呼び出しはデータを入力する前です。 @BLUEPIXYorigDateが入力された後にaddSeven()と呼び出します。

// newDate = addSeven (origDate); 
printf("Please enter a date in mm/dd/yyyy format: "); 
scanf("%d/%d/%d",&origDate.month,&origDate.day,&origDate.year); 
newDate = addSeven(origDate); 

// February else {部分におけるif() ... else ...addSev.month == 2条件を欠いています。

コードはかなり畳み込まれているので、書き直しをお勧めします。

int IsLeapYear(int year) { 
    // Left for OP to code leap year detection - see far below link. 
} 

int DaysPerMonth(int year, int month) { 
    // Left for OP to code the more simple task of finding the number of days in a month 
    ... if (IsLeapYear(year)) ... 
} 

struct date addSeven(struct date addSev) { 
    addSev.day += 7; 

    int dpm = DaysPerMonth(addSev.year, addSev.month); 

    if (addSev.day > dpm) { 
    addSev.day -= dpm; 
    addSev.month++; // next month 
    const int mpy = 12; 
    if (addSev.month > mpy) { 
     addSev.month -= mpy; 
     addSev.year++; // next year 
    } 
    } 
    return addSev; 
} 

BTW:addSev.year % 4 == 0leap yearため過度に単純化検出です。

関連する問題