1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6186

C言語の万年カレンダー作成
投稿者---周防一成(2006/07/19 21:51:54)


初めて投稿させていただきます、周防一成といいます。

学校の課題で万年カレンダーを作成しなさいといわれたのですが、まったくうまくいきません。

ソースは


#include <stdio.h>

void ymd_input(int *year, int *month); //年月入力処理関数
void get_day_of_week(int year, int month, int day); //曜日計算処理関数
void cal_diso(int year, int month, int dayofweek); //表示処理関数

int main (void)
{
    void ymd_input(int *year, int *month) //年月入力処理関数
    {
        printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n"); //入力
    
        printf("年:");
        scanf("%d", &year);
        printf("月");
        scanf("%d", &month);
        
        return 0;
    }


    int month[] = {0, 31,28,31,30,31,30,31,31,30,31,30,31};
    int i, j, x, dayofweek

    if((year > 1583) && (year < 3999) && (month > 1) && (month < 12)) //西暦が1983〜3999,月が1〜12の間じゃなかった場合
    {
        printf("入力された年月は正しくありません。もう一度入力してください。");
    }

            
    void get_day_of_week(int year, int month, int day) //曜日計算処理関数
    {
        
        for(x = 1; x <= month[]; x++)
        {
                
            dayofweek = (y +[y / 4] - [y /100] + [y / 400] + [((13 * m) + 8) /5] + d) % 7;

            void cal_diso(int year, int month, int dayofweek) //表示処理関数
            {      
                printf("%d年 %d月", year, month); //表示
                printf("  日  月  火  水  木  金  土\t\n");
                month[i][j] = x;
                
                printf("%4d\t", x);
                if((dayofweek+x) %7 == 0) printf("\n");

                return 0;
            }
                
                
            if((year / 4 == 0) && (year /100 != 0) || (year / 400 == 0) //閏年の表示
            {
                    
                month[2] = 29;
                for(x = 1; x <= month[2]; x++)
                {
                    dayofweek = (y +[y / 4] - [y /100] + [y / 400] + [((13 * m) + 8) /5] + d) % 7;

                    void cal_diso(int year, int month, int dayofweek) //表示処理関数
                    {   
                        printf("%d年 %d月", year, month); //表示
                        printf("  日  月  火  水  木  金  土\t\n");
                        month[i][j] = i * j;
                        printf("%4d\t", day[i][j]);
                        if((dayofweek+x) %7 == 0) printf("\n");

                        return 0;
                    }
                }
            }   

        }
        
    }
    return 0;
}



です。
わからないことは、

1、グローバル変数の複数使用の仕方
2、このプログラムにポインター、配列は必要でしょうか?

以上をお聞きしたいです。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C言語の万年カレンダー作成 6187 shu 2006/07/19 22:09:05


No.6187

Re:C言語の万年カレンダー作成
投稿者---shu(2006/07/19 22:09:05)


>わからないことは、
>
>1、グローバル変数の複数使用の仕方
>2、このプログラムにポインター、配列は必要でしょうか?
>
>以上をお聞きしたいです。

そんなことより、

閏年を考慮しないプログラム
入力した年は閏年か?
1月1日は何曜日か?

の方が気になります。


この投稿にコメントする

削除パスワード

No.6188

Re:C言語の万年カレンダー作成
投稿者---ruby(2006/07/19 22:21:08)


かててくわえて、main関数の「中で」他の関数の定義を
行なっている点も大いに気になります。


この投稿にコメントする

削除パスワード

No.6192

Re:C言語の万年カレンダー作成
投稿者---周防一成(2006/07/20 06:52:20)


syu様、ruby様、ご指摘有難うごいました。

私の頭で訂正できるところを訂正しました。


#include <stdio.h>

void ymd_input(void); //年月入力処理関数
void get_day_of_week(void); //曜日計算処理関数
void cal_diso(void); //表示処理関数

int main (void)
{

    

    printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n"); //入力

    return 0;

}


void ymd_input(void) //年月入力処理関数
{
    int *year, *month, y, m;

    
    y = 0;
    m = 0;
    
    year = &y;
    month = &m;

    printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n"); //入力
    
    printf("年:");
    scanf("%d", &y);
    printf("月");
    scanf("%d", &m);
    
    if((year > 1583) && (year < 3999) && (month > 1) && (month < 12)) //西暦が1983〜3999,月が1〜12の間じゃなかった場合
    {
        printf("入力された年月は正しくありません。もう一度入力してください。");
    }
        
}

void get_day_of_week(void) //曜日計算処理関数
{

    int year, day, dayofweek, y, m, d, i, j;
    int month[] = {0, 31,28,31,30,31,30,31,31,30,31,30,31};


    dayofweek = (y +[y / 4] - [y /100] + [y / 400] + [((13 * m) + 8) /5] + d) % 7;


    printf("%d年 %d月", year, month); //表示
    printf("  日  月  火  水  木  金  土\t\n");

}
void cal_diso(void) //表示処理関数
{
    int year, month, dayofweek, x, m;


    for(x = 1; x <= month[m]; x++)
    {      
        printf("%4d\t", x);
        if((dayofweek + x ) % 7 == 0) printf("\n");

    }
                
                
    if((year / 4 == 0) && (year /100 != 0) || (year / 400 == 0)) //閏年の表示
    {
                    
        month[2] = 29;

        for(x = 0; x < m; x++) 
        {
            dayofweek=dayofweek + month[x];
            dayofweek = dayofweek % 7;
        }

        for(x = 1; x <= month[2]; x++)
        {
            for(x = 0;x < dayofweek; x++)
            {
                printf("    ");
            }
            printf("%4d\t", x);
            if((dayofweek + x) % 7 == 0) printf("\n");

        }
        
    }   

}




どうでしょうか。



この投稿にコメントする

削除パスワード

No.6193

Re:C言語の万年カレンダー作成
投稿者---nop(2006/07/20 08:58:38)


>どうでしょうか。

どうもこうも、実行すれば動作がおかしいことは一目瞭然では?


この投稿にコメントする

削除パスワード

No.6194

Re:C言語の万年カレンダー作成
投稿者---acid(2006/07/20 09:01:19)


ちょ、いきなりトリッキーでびっくりしたぞww
そのプログラムではメインが始まってprintfしてそれで終わりです。
次の関数を実行しましょう。


この投稿にコメントする

削除パスワード

No.6195

Re:C言語の万年カレンダー作成
投稿者---REE(2006/07/20 09:44:11)


>syu様、ruby様、ご指摘有難うごいました。
>
>私の頭で訂正できるところを訂正しました。

頭の中だけでなく、実際にコンパイルして実行してみましょう

#家にコンパイル環境が無いとしてもそうしなくていい理由にはなりません。



この投稿にコメントする

削除パスワード

No.6196

Re:C言語の万年カレンダー作成
投稿者---ruby(2006/07/20 09:53:22)


>私の頭で訂正できるところを訂正しました。

可能であれば、ここで延々と続けるより先生に直接お聞きになる方が
早く解決するでしょう。


この投稿にコメントする

削除パスワード

No.6197

Re:C言語の万年カレンダー作成
投稿者---kz3(2006/07/20 10:27:42)


>void ymd_input(void); //年月入力処理関数
>void get_day_of_week(void); //曜日計算処理関数
>void cal_diso(void); //表示処理関数
>
>
>int main (void)
>{
>    printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n"); //入力
>    return 0;
>}

他のどの関数もちゃんと作られていたとしても、main関数がコレでは意味がありません。

そして、各関数の戻り値・仮引数はvoidとなっていますが、
各関数へのデータの授受はどのようになっていますか?
グローバル変数も見当たりません。

最初のコードより悪くなっています。あと、
    printf( "もう一度入力してください" ); 
と書いても、プログラムは「もう一度入力」の意味を理解できないので、
もう一度入力させるように書かなければなりません。



この投稿にコメントする

削除パスワード

No.6198

Re:C言語の万年カレンダー作成
投稿者---kafuka(2006/07/20 10:43:15)


雛形だけあげます。
勉強する気があるのなら、最後まで作りあげて下さい。

#include <stdio.h>

//void ymd_input(void);  //年月入力処理関数
//void get_day_of_week(void);   //曜日計算処理関数
//void cal_diso(void);    //表示処理関数
void ymd_input(int*, int*);
void get_day_of_week(int, int);
void cal_diso(int, int);

int main (void)
{
    int year, month;

    printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n");
    ymd_input(&year, &month);
    get_day_of_week(year, month);

    return 0;
}

//年月入力処理関数
//void ymd_input(void)
void ymd_input(int* year, int* month)
{
//  int *year, *month, y, m;
//  y = 0;
//  m = 0;
//  year = &y;
//  month = &m;

//  printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n");
    printf("年 : ");
//  scanf("%d", &y);
    scanf("%d", year);
    printf("月 : ");
//  scanf("%d", &m);
    scanf("%d", month);

    //西暦が1983〜3999,月が1〜12の間じゃなかった場合
//  if((year > 1583) && (year < 3999) && (month > 1) && (month < 12))
    if ((*year < 1583 || 3999 < *year) || (*month < 1 || 12 < *month)) {
        printf("入力された年月は正しくありません。もう一度入力してください。");
        // もう一度といっているわりには再入力ルーチンがないが。。。
    }
}

//曜日計算処理関数
//void get_day_of_week(void)
void get_day_of_week(int year, int month)
{
//  int year, day, dayofweek, y, m, d, i, j;
//  int month[] = {0, 31,28,31,30,31,30,31,31,30,31,30,31};
//  dayofweek = (y +[y / 4] - [y /100] + [y / 400] + [((13 * m) + 8) /5] + d) % 7;

    printf("%d年 %d月\n", year, month);   //表示
    printf("  日  月  火  水  木  金  土\t\n");
    cal_diso(year, month);
}

//表示処理関数
//void cal_diso(void)
void cal_diso(int year, int month)
{
    // ダミー中身は自分で作成せよ
    int lo_year, lo_month;

    lo_year = year;
    lo_month = month;
    printf("\n%d, %d\n", lo_year, lo_month);
    // ダミー中身は自分で作成せよ

//  int year, month, dayofweek, x, m;
//
//  for (x = 1; x <= month[m]; x++) {  
//    printf("%4d\t", x);
//    if((dayofweek + x ) % 7 == 0) printf("\n");
//  }
//  //閏年の表示
//  if ((year / 4 == 0) && (year /100 != 0) || (year / 400 == 0)) {
//    month[2] = 29;
//    for (x = 0; x < m; x++) {
//      dayofweek=dayofweek + month[x];
//      dayofweek = dayofweek % 7;
//    }
//    for (x = 1; x <= month[2]; x++) {
//      for (x = 0;x < dayofweek; x++) {
//        printf("");
//      }
//      printf("%4d\t", x);
//      if ((dayofweek + x) % 7 == 0)
//        printf("\n");
//    }
//  }
}



この投稿にコメントする

削除パスワード

No.6201

Re:C言語の万年カレンダー作成
投稿者---周防一成(2006/07/21 23:27:36)


アドバイス、忠告等等をくださった皆様。
無事万年カレンダーのプログラムを作成することができました。
ソースを載せます


#include <stdio.h>

void ymd_input(int *year, int *month);//年月入力処理関数

int get_day_of_week(int year, int month, int day);//曜日計算処理関数

void cal_diso(int year, int month, int dayofweek);//表示処理関数

int main (void)
{
    int year,month,day,dayofweek;

    printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n");
    ymd_input(&year, &month);
    get_day_of_week(year, month, day);
    cal_diso(year, month, dayofweek);


    return 0;
}

void ymd_input(int* year, int* month)//年月入力処理関数
{


    do
    {
        printf("1583年〜3999年の間のカレンダーを表示します\n表示したい年月を入力してください\n");
        printf("年: ");
        scanf("%d", year);
        printf("月: ");
        scanf("%d", month);


        //西暦が1983〜3999,月が1〜12の間じゃなかった場合
        if ((*year < 1583 || 3999 < *year) || (*month < 1 || 12 < *month))
        {
            printf("入力された年月は正しくありません。\n");
            
        }

    }while(((*year >= 1583) && (*year >= 3999)) && ((*month >= 1) && (*month >= 12)));
}

int get_day_of_week(int year, int month, int day)//曜日計算処理関数
{
    int dayofweek, y, m, d, i, j, tuki;

    y = year;
    m = month;
    d = 1;

    dayofweek = (y +(y / 4) - (y / 100) + (y / 400) + (((13 * m) + 8) / 5) + d) % 7;//Zellerの公式


    return dayofweek;

}

void cal_diso(int year, int month, int dayofweek)//表示処理関数
{
    int m, x;
    int tuki[] = {0, 31,28,31,30,31,30,31,31,30,31,30,31}; //月ごとの日数//閏年の表示
    
    if(((year / 4 == 0) || (year / 100 != 0)) || (year / 400 == 0)) 
    {
        tuki[2] = 29;//閏年だったら28を29にする
    }

    printf("%d年 %d月\n", year, month);   //表示
    printf("  日  月  火  水  木  金  土\t\n");

    
    
    for(x = 1; x <= tuki[month]; x++)
    {
        printf("%4d\t", x);
        if((dayofweek + x) % 7 == 0)//土曜日で改行
        {
            printf("\n");
        }
    }

}





このプログラムで大分理解することができました。
皆さまの言葉一つ一つを肝に銘じてC言語の勉強を続けていこうと思います。
どうも有難うございました。


この投稿にコメントする

削除パスワード

No.6202

Re:C言語の万年カレンダー作成
投稿者---ruby(2006/07/21 23:48:25)


>無事万年カレンダーのプログラムを作成することができました。

本当ですか?正しく動きませんよ。

>int get_day_of_week(int year, int month, int day);//曜日計算処理関数

↑この関数で、引数dayをどこで使っていますか?
int型の戻り値を、どこで使っていますか?

>        //西暦が1983〜3999,月が1〜12の間じゃなかった場合
>        if ((*year < 1583 || 3999 < *year) || (*month < 1 || 12 < *month))

↑細かいことですが、if文の内容とコメントが食い違っています。

>    }while(((*year >= 1583) && (*year >= 3999)) && ((*month >= 1) && (*month >= 12)));

↑この条件は正しくないのではありませんか?

>    if(((year / 4 == 0) || (year / 100 != 0)) || (year / 400 == 0)) 

↑閏年の条件が誤っています。

>        printf("%4d\t", x);
>        if((dayofweek + x) % 7 == 0)//土曜日で改行

↑曜日の表示との整合がとれていません。
また、1日が必ず日曜日になってしまっています。

完成までの道のりはまだ遠そうです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ