2014-11-15 112 views
1

我的問題指出: 編寫一個C語言函數命名爲天()決定之日起1/1/1900天數爲structure.Pass的轉交地址的任何日期days()函數的Date結構變量。在main()中編寫一個程序,用於輸入用戶的月份,日期和年份,將輸入寫入Date結構變量,調用days()函數並顯示結果。使用以下日期結構:C編程傳遞結構到功能

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

在編寫此函數時,使用所有年份爲360天,每個月包含30天的約定。該函數應返回傳遞給它的任何日期結構的天數。

這是我迄今爲止,它是每次計算0:

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

int main() 
{ 
    int monthMain, dayMain, yearMain;  //declaring the int variables 
    int totalDays; 
    printf("Enter a Month: ");    //requesting user to input the month 
    scanf("%d", &monthMain);    //accepting the user input for month 
    printf("Enter a Day: ");    //requesting user to input the day 
    scanf("%d", &dayMain);     //accepting the user input for day 
    printf("Enter a Year: ");    //requesting user to input the year 
    scanf("%d", &yearMain);     //accepting the user input for year 
    totalDays = days(); 
    printf("the date you entered = %d days", totalDays); 
return 0; 
} 

int days(struct date *d) 
{ 
    int yearCalc, daysAmount; 
    int monthMain, dayMain, yearMain;  //declaring the int variables 

    yearCalc = 1900 * 360; 
    yearMain = (yearMain * 360) - yearCalc; 

    if(monthMain == 1) 
    { 
     monthMain = 0; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 2) 
    { 
     monthMain = 30; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 3) 
    { 
     monthMain = 60; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 4) 
    { 
     monthMain = 90; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 5) 
    { 
     monthMain = 120; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 6) 
    { 
     monthMain = 150; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 7) 
    { 
     monthMain = 180; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 8) 
    { 
     monthMain = 210; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 9) 
    { 
     monthMain = 240; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 10) 
    { 
     monthMain = 270; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 11) 
    { 
     monthMain = 300; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    if(monthMain == 12) 
    { 
     monthMain = 360; 
     daysAmount = monthMain + dayMain + yearMain; 
    } 
    return daysAmount; 
} 

任何幫助將是巨大的:)

+0

由於計算'daysAmount = monthMain + dayMain + yearMain;'每次都是相同的,您可以在'if'語句集之後移動它。在11月和12月之間從300跳到360是錯誤的。有一個簡單的算法給出一個有效的月份數來推算出一年前的天數(對於這些簡單的大小均勻的月份):'(month_number - 1)* 30'給出了你之後的答案。你有沒有添加任何打印語句,看看爲什麼你得到0? –

回答

3

你的主要問題是這樣的呼叫:

totalDays = days(); 

您需要將指向日期結構的指針傳遞給該函數。這意味着你需要在main()一個局部變量:

struct date given; 

,你需要對它進行初始化:

given.day = 11; 
given.month = 11; 
given.year = 1918; 

,你需要將它傳遞:

totalDays = days(&given); 

,你需要學習如何設置編譯器警告,以便在不用完整原型預先聲明函數並且不準確調用函數時從編譯器中收到錯誤消息。

如果你的編譯器是gcc,使用方法:

gcc -O3 -std=c11 -g -Wall -Wextra -Werror … 

爲出發點。您可能需要-Wstrict-prototypes-Wold-style-declaration-Wold-style-definition-Wmissing-prototypes過;我將其中大部分作爲常規來確保我不犯愚蠢的錯誤。

此外,由於計算daysAmount = monthMain + dayMain + yearMain;是相同的每一次,你可以在一組的if語句後動議。在11月和12月之間從300跳到360是錯誤的。有鑑於有效的月份數在此之前(這些漂亮的簡單的尺寸均勻月)推斷當年天數數的簡單算法:(month_number - 1) * 30給你後的答案。

你有沒有添加任何報表打印明白爲什麼你得到0?

printf("Date: %.4d-%.2d-%.2d\n", d->year, d->month, d->day); 

你會打印在ISO 8601格式的日期:例如,如果你在函數的起步一樣增加了一個聲明。如果這沒有告訴你你認爲你輸入的答案,你就會知道有問題。打印值以確保計算機看到的是您認爲計算機應該看到的是一種基本的調試技術。

+0

非常感謝,我不知道爲什麼我沒有想到要按照你給我的計算。我是一個可怕的程序員,但是這門課是我的專業必修課。這工作就像一個魅力:) – lordcideon

+0

+1爲'%.4d - %。2d - %。2d'。看起來好一些(負數年)比我以前使用的'%04d-%02d-%02d'好。 – chux

1
struct date 
{ 
    int month; 
    int day; 
    int year; 
}; // unsigned int would serve this purpose better, as negative values are not valid here 

int days(struct date *d) 
{ 
    int daysTotal; // Declaring variable to hold total number of days since 1900-01-01 

    // Adding days from date::day 
    if (d->day > 0 && d->day < 31){ // Only execute if day is valid 
     daysTotal = d->day - 1; 
    } 
    // Adding days from date::month 
    if (d->month > 0 && d->month < 13){ // Only execute if month is valid 
     daysTotal += 30 * (d->month-1); 
    } 
    // Adding days from date::year 
    if (d->year > 1899){ // Only execute if year is valid 
     daysTotal += 360 * (d->year-1900); // subtracting 1900 years 
    } 

    return daysTotal; // This may still be a negative value, but is accepted here for simplicity 
}; 

int main() 
{ 
    date myDate; // Declaring an object of struct date 

    printf("Enter a Month: ");    //requesting user to input the month 
    scanf("%d", &myDate.month);    //recieving the user input for month 
    printf("Enter a Day: ");    //requesting user to input the day 
    scanf("%d", &myDate.day);    //recieving the user input for day 
    printf("Enter a Year: ");    //requesting user to input the year 
    scanf("%d", &myDate.year);    //recieving the user input for year 

    printf("the date you entered = %d days", days(&myDate)); // Passing object pointer to function 
return 0; 
}; 

您最初沒有使用該結構。你沒有爲此目的製造一個結構物體。最後有一大塊可以摺疊成if語句。其他結構成員沒有應用驗證。有不必要的變數。我進行了更改以簡化事情。在main()之前放置days()函數,以防止「未在此範圍中聲明的」函數日(struct date * d)「錯誤。

編輯:我的執行現在返回0 days for 1900-01-0131 days for 1900-02-02。這是通過從日期和月份中減去1來完成的,將其轉換爲索引,而不是通過的單位數量,因爲這是幾天和幾個月的實際含義(而不是年份,它們從0年或這裏開始,與1900年)。

+0

您是否需要計算有效月份之前的日期?目前,你的代碼將在1900-01-01報告31天,而不是僅僅1(或者確實爲0)。 –

+0

感謝Jon,我現在改變了我的實現。需要通過減去1來將日期和月份值轉換爲索引,因此它們以0開始,因爲那是自第一次以來通過的單位數量。這種情況並非如此,在這個例子中,它們以0或1900開始。 – Sam