期間の日数のプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ろべりあ

期間の日数のプログラム

#1

投稿記事 by ろべりあ » 10年前

こんにちは。どうしても1人では上手くいかず・・お力をかしてください。

/* youbi2.c */
#include <stdio.h>
long nday(int, int, int);
int main() {
int y,m,d;
long n;
while(printf("年月日  "), scanf("%d%d%d",&y,&m,&d)!=EOF) {
n = nday(y,m,d);
printf("西暦元年1月1日からの日数 = %d\n",n);
}
return 0;
}
/* Fairfield関数 */
long nday(int iy, int im, int id) {
long ny,nm;
ny = iy;
nm=im;
if ( im <= 2 ) {
ny--;
nm += 12;
}
return (365*ny+ny/4-ny/100+ny/400+306*(nm+1)/10+id-428);
}

こちらのプログラムを編集して、
期間(y1, m1,d1 y2, m2, d2)を入力して期間の日数を数えるプログラムを作成したいのです。

今日は今年の1月1日から数えて何日目になるか、また今日は自分の誕生日から数えて何日目になるのかもちゃんと表示させたいです。

どうぞよろしくお願いします。

LL

Re: 期間の日数のプログラム

#2

投稿記事 by LL » 10年前

まずこれを最後まで、一字一句漏らさず声に出して読んでみてください。
http://dixq.net/board/board.html

コード:

/* youbi2.c */
#include <stdio.h>
long nday(int, int, int);
int main() {
        int    y,m,d;
        long   n;
        while(printf("年月日  "), scanf("%d%d%d",&y,&m,&d)!=EOF) {
               n = nday(y,m,d);
               printf("西暦元年1月1日からの日数 = %d\n",n);
        }
        return 0;
}
/* Fairfield関数 */
long nday(int iy, int im, int id) {
        long ny,nm;
        ny = iy;
        nm=im;
        if ( im <= 2 ) {
                ny--;
                nm += 12;
        }
        return (365*ny+ny/4-ny/100+ny/400+306*(nm+1)/10+id-428);
}
フォーラムルールをほぼすべて無視されているようですが、まずあなたのプログラムスキルはどのくらいでしょうか?どの程度の行為まで出来るのでしょうか?
変数については理解できていますか?
scanfの使い方について最低限理解できていますか?
printfが何をしているか説明できますか?
いきなり答えを提示してもあなたの学習の為にならないので、
まずは6つのキーボードから入力した数値(これはつまりあなたが求めたい2つの年月日の入力にあたります)を表示するだけのプログラムを組んで、ここに提示してみてください。
それもわからないのであればそこから説明します。

もし上記の内容(変数という概念、入力して出力)が理解できるのであれば、
以下のアルゴリズムでプログラムを考えて見てください。
1、6つの数値を入力させる(2つの年月日)(scanf)
2、計算により2つの年月日の日数の差を求める。
3、出力する。(printf)

※これは差分の日数を求める部分のアルゴリズムを大雑把に考えた物です。

LL

Re: 期間の日数のプログラム

#3

投稿記事 by LL » 10年前

これは期間の日数を求めるだけのプログラムです。
ただし、一部の計算を”意図的に”間違えています。
また最初に提示されたプログラムを”一切”編集して(利用して)いません。
どうやら最初に提示されたプログラムは何かしらの課題用と推測しますゆえ、わざと直接的な答えは避けました。

コード:

#include<stdio.h>

int main(){
    int y1,y2,m1,m2,d1,d2;      //入力された値の格納用
    
    int Difference;             //差分の値の格納用
    printf("年月日を入力:");
    scanf("%d,%d,%d",&y1,&m1,&d1);      //入力を求める
    printf("\nもう一度入力");
    scanf("%d,%d,%d",&y2,&m2,&d2);      //入力を求める
    //閏年やら、月ごとの日数差を一切考慮に入れてない。
    Difference = (365 * y2 + 30 * m2 + d2) - (365 * y1 + 30 * m1 + d1);
    printf("差分:%d",Difference);         //結果の表示
    return 1;
}
また最初に提示されたプログラムの処理を注釈分で詳細に書きました。
それぞれがどういう意味を持って処理をしているのか見直して見てください。
これが理解できればあなたの求めたい処理はすべて小学校レベルの簡単な足し算引き算程度で求められます。
さらにヒントを言うとFairfield関数がすべての問題を解決してくれます。

コード:

/* youbi2.c */
#include <stdio.h>          //インクルード宣言
long nday(int, int, int);   //メソッドのプロトタイプ宣言(プロトタイプ宣言については独自に調べてください)
int main() {                //メイン関数
        int    y,m,d;       //値格納用の変数宣言
        long   n;           //最終的な日数を格納する変数(long型なのは膨大な日数の場合に対応するため)
        while(printf("年月日  "), scanf("%d%d%d",&y,&m,&d)!=EOF) {     //scanfで問題が発生(EOF=ERROR)が発生したらループを抜け終了させる
               n = nday(y,m,d);                                 //西暦元年1月1日からの日数を求める自作メソッドに入力された値を通す
               printf("西暦元年1月1日からの日数 = %d\n",n);      //結果の出力
        }
        return 0;
}
/* Fairfield関数 */
//元年からの日数を求める自作メソッド(戻り値はlong)
long nday(int iy, int im, int id) {
        long ny,nm;
        ny = iy;
        nm=im;
        if ( im <= 2 ) {
                ny--;
                nm += 12;
        }
        //計算結果を返す
        return (365*ny+ny/4-ny/100+ny/400+306*(nm+1)/10+id-428);
}

閉鎖

“C言語何でも質問掲示板” へ戻る