2016-11-09 14 views
1

私は与えられた日付の曜日を返す簡単なプログラムをC++で書こうとしています。与えられた日付のC++の曜日

入力形式は、日、月、年です。私はうるう年で働くことができません。私は入力年がうるう年であるときにa変数から1を引いてみましたが、プログラムはエラーメッセージなしでクラッシュするだけです。

私はどんな提案もありますが、単純なままにしてください。私はまだ初心者です。愚かな質問の謝罪、私の間違いを許してください、これは私がこのサイトに投稿する初めてです。

#include <iostream> 
#include <string> 
#include <vector> 
#include <cmath> 
using namespace std; 


int d; 
int m; 
int y; 


string weekday(int d, int m, int y){ 
    int LeapYears = (int) y/ 4; 
    long a = (y - LeapYears)*365 + LeapYears * 366; 
    if(m >= 2) a += 31; 
    if(m >= 3 && (int)y/4 == y/4) a += 29; 
    else if(m >= 3) a += 28; 
    if(m >= 4) a += 31; 
    if(m >= 5) a += 30; 
    if(m >= 6) a += 31; 
    if(m >= 7) a += 30; 
    if(m >= 8) a += 31; 
    if(m >= 9) a += 31; 
    if(m >= 10) a += 30; 
    if(m >= 11) a += 31; 
    if(m == 12) a += 30; 
    a += d; 
    int b = (a - 2) % 7; 
    switch (b){ 
    case 1: 
     return "Monday"; 
    case 2: 
     return "Tuesday"; 
    case 3: 
     return "Wednesday"; 
    case 4: 
     return "Thursday"; 
    case 5: 
     return "Friday"; 
    case 6: 
     return "Saturday"; 
    case 7: 
     return "Sunday"; 
    } 
} 

int main(){ 
    cin >> d >> m >> y; 
    cout << weekday(d, m, y); 
} 
+3

は、ここでの実装例(日付が有効な入力であるかどうかをチェックしません)ですか? – MrEricSir

+0

日付については、単純なプログラムのようなものはありません(jon skeetに質問してください)。その機能はすでに再発明されています。 –

+1

計算を実行するための簡単な数式があります。 https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_weekを参照してください。 –

答えて

0

数字が7で割り切れるとどうなりますか?

7分の14 = 2 14%7 = 0

モジュロ演算子(%n)は0からnまでの番号が返され-1

nは残りは決してでき7によって分割された場合

これを試してみてくださいので、

この場合
int b = (a - 2) % 7; 
    switch (b){ 
    case 1: 
     return "Monday"; 
    case 2: 
     return "Tuesday"; 
    case 3: 
     return "Wednesday"; 
    case 4: 
     return "Thursday"; 
    case 5: 
     return "Friday"; 
    case 6: 
     return "Saturday"; 
    case 7: 
     return "Sunday"; 
    } 
} 

それは日曜日

になることはありません7 こと

int b = (a - 2) % 7; 
     switch (b){ 
     case 0: 
      return "Sunday"; 
     case 1: 
      return "Monday"; 
     case 2: 
      return "Tuesday"; 
     case 3: 
      return "Wednesday"; 
     case 4: 
      return "Thursday"; 
     case 5: 
      return "Friday"; 
     case 6: 
      return "Saturday"; 
     default: 
      return "Error"; 
     } 
+0

あなた自身の関数を使わないと言う人を聞かないでください。 – ComradeJoecool

+0

私たちはあなたが楽しみながら、または学習のためにこれをやっていることを知っています。 – ComradeJoecool

+0

また、あなたの最終的なプログラムは、曜日について間違っていることに注意してください。なぜなら、うるう年は常に4年ごとに起こらないトリッキーなものだからです。閏年の例は100年目には起こりませんが、400年目には起こります。だからええ、カレンダーはすごく難しくなります。私の答えは主に、あなたのプログラムがクラッシュする理由についての原因を見つけるのを助けることです。 – ComradeJoecool

2

最初に:すでに同じ問題を処理できる標準化された関数がある場合は、独自の関数を記述しないでください。ポイントはあなたが簡単に間違いを犯す可能性があることです(すでにweekday()関数の最初の行に表示されています)。一方、標準化された関数の実装は完全にテストされており、結果が得られると確信できますあなたは得ることが期待されます。

言われて、ここにstd::localtimestd::mktimeを使用して可能なアプローチであること:

#include <ctime> 
#include <iostream> 

int main() 
{ 
    std::tm time_in = { 0, 0, 0, // second, minute, hour 
     9, 10, 2016 - 1900 }; // 1-based day, 0-based month, year since 1900 

    std::time_t time_temp = std::mktime(&time_in); 

    //Note: Return value of localtime is not threadsafe, because it might be 
    // (and will be) reused in subsequent calls to std::localtime! 
    const std::tm * time_out = std::localtime(&time_temp); 

    //Sunday == 0, Monday == 1, and so on ... 
    std::cout << "Today is this day of the week: " << time_out->tm_wday << "\n"; 
    std::cout << "(Sunday is 0, Monday is 1, and so on...)\n"; 

    return 0; 
} 
+0

あなたの提案をありがとう、しかし、このプログラムを書くのは、プログラミングを練習し、C++の構文を理解しようとすることです。私は私のポストでこれを言及しなかったので、全く別のアプローチを提案してあなたを非難することはできません。しかし、より多くの経験を持つより複雑なプログラムを書くときに私がこれのようなものを必要とするなら、私はこの方法を検討することを確実にするでしょう! – OerllydSaethwr

+0

1年、〜1800回のビュー、および単一のアップヴォートはありません。ちょうどそれを固定した。 @OerllydSaethwrスコアの近くにある緑色のチェックマークをクリックして、この(または別の)回答を受け入れてください。 – YSC

+0

'std :: localtime'に関する解決策は、できるだけ早く戻り値のコピーを作成することです:' const std :: tm time_out = * std :: localtime(&time_temp); '。 – YSC

1

うるう年構成するもののご理解が間違っています:

うるう年はEXCEPT 4年ごとですが100で割り切れる場合はBUTでも、それが400で割り切れる場合はまだ閏年です。

"日番号"(dn)を計算する方法の明確かつ簡潔な説明はhereです。

日数(dn)を取得したら、モジュラス7を実行します。結果は曜日(ダウ)になります。あなたは、デバッガでそれをステップ実行するとどうなります

#include <iostream> 
#include <iomanip> 

typedef unsigned long ul; 
typedef unsigned int ui; 

// ---------------------------------------------------------------------- 
// Given the year, month and day, return the day number. 
// (see: https://alcor.concordia.ca/~gpkatch/gdate-method.html) 
// ---------------------------------------------------------------------- 
ul CalcDayNumFromDate(ui y, ui m, ui d) 
{ 
    m = (m + 9) % 12; 
    y -= m/10; 
    ul dn = 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + (d - 1); 

    return dn; 
} 

// ---------------------------------------------------------------------- 
// Given year, month, day, return the day of week (string). 
// ---------------------------------------------------------------------- 
std::string CalcDayOfWeek(int y, ul m, ul d) 
{ 
    std::string day[] = { 
    "Wednesday", 
    "Thursday", 
    "Friday", 
    "Saturday", 
    "Sunday", 
    "Monday", 
    "Tuesday" 
    }; 

    ul dn = CalcDayNumFromDate(y, m, d); 

    return day[dn % 7]; 
} 

// ---------------------------------------------------------------------- 
// Program entry point. 
// ---------------------------------------------------------------------- 
int main(int argc, char **argv) 
{ 
    ui y = 2017, m = 8, d = 29; // 29th August, 2017. 
    std::string dow = CalcDayOfWeek(y, m, d); 

    std::cout << std::setfill('0') << std::setw(4) << y << "/"; 
    std::cout << std::setfill('0') << std::setw(2) << m << "/"; 
    std::cout << std::setfill('0') << std::setw(2) << d << ": "; 
    std::cout << dow << std::endl; 

    return 0; 
} 
-1
int dayofweek(int day,int month,int year) 
{ 
    int arr[] = {0,3,2,5,3,5,1,4,6,2,4}; 
    if(month<3) 
     year--; 
    return ((year+year/4-year/100+year/400+arr[month-1]+day)%7); 
} 

int main() 
{ 
    int day,month,year; 
    cout<<"Enter the Date for which day of the week need to be find (DD/MM/YYYY)."<<endl; 
    cin>>day>>month>>year; 
    int x = dayofweek(day,month,year); 
    if(x==0) 
     cout<<"Sunday"<<endl; 
    else if(x==1) 
     cout<<"Monday"<<endl; 
    else if(x==2) 
     cout<<"Tuesday"<<endl; 
    else if(x==3) 
     cout<<"Wednesday"<<endl; 
    else if(x==4) 
     cout<<"Thursday"<<endl; 
    else if(x==5) 
     cout<<"Friday"<<endl; 
    else if(x==6) 
     cout<<"Saturday"<<endl; 

} 
関連する問題