2016-10-26 3 views
-2

私のC言語のコードが良くなっていますが、私のコードでいくつかの問題を解決する方法はまだ分かりません。教授は、その日(mm/dd/yyyy)を入力し、経過した日数を吐き出すコードを書くことを望んでいます。選択肢2については、特定の年の日数を入力し、対応する日付を吐き出します。問題は(私たちの教授が私たちに迷惑をかけるのが好きなので)4月31日のようなエラーを解決し、4月は31日を持たず、非閏年で366日を入力します。関数を介して渡された日付と日の解決

int leap(int x) 
{ 
if ((x % 4 == 0 && x % 100 != 0)|| x % 400 == 0) 
    return 1; 
else 
    return 0; 
} 


int monthFun(int d, int y) 
{ 
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 
int i; 


if (leap(y)) 
    days[1] = 29; 

for (i = 0; ; i++) 
    if (d > days[i]) 
     d = d - days[i]; 
    else 
     return i + 1; 
return i + 1; 


} 


int dateFun(int d, int y) 
{ 
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 
int i, m; 

if (leap(y)) 
    days[1] = 29; 
for (i = 0; i < m - 1; i++) 
    if (d > days[i]) { 
     d = d - days[i]; 
    } 
    else { 
     d = d; 
     m = i; 

    } 

return d; 



} 

int daysPast(int m, int d, int y) 
{ 
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 
int i, past = 0; 

if (leap(y)) 
    days[1] = 29; 

for (i = 0; i < m - 1; i++) 
    past = past + days[i]; 
return past + d; 
} 



int main() 
{ 
int mm, dd, yy, choice; 
char more; 

do { 
    printf ("\n\t\tThis program will find days passed or date in the year"); 
    printf ("\n\t\t\t\t1) Input date (mm/dd/yyyy) to find the days passed"); 
    printf ("\n\t\t\t\t2) Input passed days to find date in the year"); 
    printf ("\n\n\t\t\t\tYour choice (1/2): "); 
    scanf ("%d", &choice); 

    if (choice == 1) { 
     printf ("\n\t\tPlease input date (mm/dd/yyyy): "); 
     scanf ("%d/%d/%d", &mm, &dd, &yy); 
     printf ("\n\t\tThere are %d days passed in the year %d", daysPast(mm, dd, yy), yy); 
    } 
    else 
     if (choice == 2){ 
      printf ("\n\t\tInput days: "); 
      scanf ("%d", &dd); 
      printf ("\n\t\tInput year: "); 
      scanf ("%d", &yy); 
      printf ("\n\t\tThe date is %d/%d/%d", monthFun(dd, yy), dateFun(dd,yy), yy); 

     } 

     else 
      printf ("\n\t\tPlease choose 1 or 2"); 
    printf ("\n\n\t\tDo more (Y/N)? "); 
    scanf ("%s", &more); 
} while (more == 'y' || more == 'Y'); 
} 

私のdateFun()のコードはちょっと控えめです(または少なくとも私に似ています)。私は、上記の問題の1つが入力された場合、プログラムは「無効な入力」のようなものを表示し、「もっとやる」に戻ることを考えました。どのようなヒントをいただければ幸いです!

答えて

0

あなたのdateFunは、初期化されていないmをテストします。

dateFun()とmonthFun()は非常によく似ていますが、私はサンプルの結合バージョンを追加しました。

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


int monthFun(int d, int y) 
{ 
    int i, days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 

    days[1] += leap(y); 

    for (i=0 ; d>days[i] ; i++) 
    d -= days[i]; 
    return i+1; 
} 


int dateFun(int d, int y) 
{ 
    int i, days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 

    days[1] += leap(y); 

    for (i=0 ; d>days[i] ; i++) 
    d -= days[i]; 
    return d; 
} 

int datemonthFun(int d, int y) 
{ 
    int i, days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 

    days[1] += leap(y); 

    for (i=0 ; d>days[i] ; i++) 
    d -= days[i]; 
    return (i+1)*100+d; 
} 
関連する問題