課題ができません

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

課題ができません

#1

投稿記事 by トント » 18年前

すみません。学校の課題です。

   外部から西暦、月、日を順に入力後、何日後を求めるかを問い合わせます。
   そして、入力した日付からあとに入力した日数後の年月日を計算して出力します。
   また,今回は、閏年も考慮します。
    たとえば、
    西暦:1990
    月 :6
    日 :30
    何日後:45

    結果 → 1990 年6 月 30 日から 45 日後は、1990年8月14日です。

という問題が出題されましたが6月30日が入力された場合、45日後は6月75日です。次に、6月の末日を75日から

引くと7月45日になります。つづいて、45日はまだ7月の末日よりも大きいので、7月の末日から引くと8月14日

にする方法が分かりません。どなたか教えていただけませんか?

私の途中までのプログラムは

#include <stdio.h>

int IsUruYear(int year)
{
int ret=0;

if(((year%4)==0 && (year%100)!=0) || (year%400)==0){
ret=1;
}

return ret;
}

int get_lastday(int year,int mon)
{
int days[/url]={31,28,31,30,31,30,31,31,30,31,30,31};
int d;

d=days[mon-1];
if(mon==2){
if(IsUruYear(year)){
d++;
}
}
return d;
}
int IsLastDay(int year,int mon,int day)
{
int days[/url]={31,28,31,30,31,30,31,31,30,31,30,31};
int ret=0;
int lastday;

lastday=days[mon-1];

if(mon==2){
if(IsUruYear(year)){
lastday++;
}
}

if(day==lastday) ret=1;

return ret;
}
void after(int num,int i)
{
while(i>num){
printf("%d",++i);
num++;
         }
}

int main(void)
{
int year,day,mon,after;
int year1,day1,mon1;

printf("year:"); scanf("%d",&year);
printf("month:"); scanf("%d",&mon);
printf("day:"); scanf("%d",&day);
printf("after:"); scanf("%d",&after);

year1=year;
mon1=mon;
day1=day;
yestarday(&year,&mon,&day);
printf("何日後:%4d/%02d/%02d\n",year,mon,day);


return 0;
}
です。よろしくお願いします。

box

Re:課題ができません

#2

投稿記事 by box » 18年前

> int get_lastday(int year,int mon)
> int IsLastDay(int year,int mon,int day)

似たようなロジックを持つこれら2つの関数の本質的な違いは何ですか?

> yestarday(&year,&mon,&day);

この関数の実体がどこにもありません。
ところで、「昨日」を求めるのではないですよね?スペルも正しくないし…。

一度きちんと設計してからコードを書くことをおすすめします。

管理人

Re:課題ができません

#3

投稿記事 by 管理人 » 18年前

う~ん、私も処理を追っかけてみましたけど、書きたいアルゴリズムがよくわかりません;
呼んでる関数は無いし、「何日後」を計算したいプログラムのはずなのに、afterは使われていないし、
関数名と変数名がかぶってるし。

もう少し流れを確認して、書きたいアルゴリズムを一緒に書いて投稿してもらえませんか?

トント

Re:課題ができません

#4

投稿記事 by トント » 18年前

↓のプログラムは上に書いたプログラムの続きです。これは昔出された似たような問題で、入力した日の次の日を出力するようにされたものです。このプログラムを参考にして変えてみました。しかしこれを「何日後」という形で出力できません。dayにafterの値をうまく入れる方法を教えていただけませんか。


#include <stdio.h>

int IsUruYear(int year)
{
int ret=0;

if(((year%4)==0 && (year%100)!=0) || (year%400)==0){
ret=1;
}

return ret;
}

int get_lastday(int year,int mon)
{
int days[/url]={31,28,31,30,31,30,31,31,30,31,30,31};
int d;

d=days[mon-1];
if(mon==2){
if(IsUruYear(year)){
d++;
}
}
return d;
}
int IsLastDay(int year,int mon,int day)
{
int days[/url]={31,28,31,30,31,30,31,31,30,31,30,31};
int ret=0;
int lastday;

lastday=days[mon-1];

if(mon==2){
if(IsUruYear(year)){
lastday++;
}
}

if(day==lastday) ret=1;

return ret;
}





void tommorow(int *year,int *mon,int *day)
{
if(IsLastDay(*year,*mon,*day)){
if(*mon==12){
*mon=1;
(*year)++;
}
else{
(*mon)++;
}
*day=1;
}
else{
(*day)++;
}
}
void sum(int day2,int after2,int *sum)
{
*sum=day2+after2;
}


int main(void)
{
int year,day,mon,after;
int year1,day1,mon1,after1;
int wa=0;
int day2=0,after2=0;

printf("year:"); scanf("%d",&year);
printf("month:"); scanf("%d",&mon);
printf("day:"); scanf("%d",&day);
printf("after:"); scanf("%d",&after);
sum(day2,after2,&wa);


year1=year;
mon1=mon;
day1=day;
after1=after;

tommorow(&year1,&mon1,&day1);
printf("何日後:%4d/%02d/%02d\n",year1,mon1,day1,wa);

return 0;
}

Justy

Re:課題ができません

#5

投稿記事 by Justy » 18年前

しかしこれを「何日後」という形で出力できません
 効率が悪くてもいいのなら、X日後は「次の日」を求める処理をX回繰り返せばいいのでは?

むつ

Re:課題ができません

#6

投稿記事 by むつ » 18年前

■日数換算関数 int -> long
static int [/url]=各月の3/1からの通算日数(1月と2月は前年の13月、14月とする)
何月か?
return Fairfield公式

■main
scanf
printf("%ld\n", 日数換算関数(y,m,d) - 日数換算関数(y, m, d))

うまくすると、mainと日数換算関数1個で実現できます。

管理人

Re:課題ができません

#7

投稿記事 by 管理人 » 18年前

作ってみましたけど、もっとスマートになりますよ。わかりやすく書いても20行ちょっとでかけました。
1日ずつ計算する処理だと簡単ですよ。

関数は
mainとafter_dayとでも名づけた2つの関数でよく
after_day(&year,&mon,&day,after);
で呼びましょう。
受け取った関数側では

while(after>0){

として、ループさせ、day++、after--しましょう。1日ずつ計算し、
その月のあるべき日数を超える、例えば、1月の32日になってしまったら次の月にして、日を1に戻す。
そこで同時にうるう年の判定もする。
13月になったら1月にして年を増やす。
そうやっていけば、処理の時間はかかれど(実際一瞬ですが)、簡単に実装できると思います。

トント

Re:課題ができません

#8

投稿記事 by トント » 18年前

返事遅れてすみませんでした。
プログラムは何とかできました。
どうもありがとうございました!

管理人

Re:課題ができません

#9

投稿記事 by 管理人 » 18年前

(パソコンがネットにつながらないという状況がどんなに不便なものか・・、

(ネットに依存している状況がうかがえる今日この頃です・・;



解決されましたか、よかったです^^

一応参考にソースを紹介します。
#include <stdio.h> 

void afterday(int *year, int *mon, int *day, int after){
	int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	while(after>0){
		(*day)++;
		after--;
		if(!(*mon==2 && *day==29 && *year%4==0) && *day>month_day[*mon-1]){
			(*mon)++;
			if(*mon==13){
				*mon=1;
				(*year)++;
			}
			*day=1;
		}
	}
	return;
}

int main(void){ 
	int year,day,mon,after; 
	printf("年 月 日 日後\n");
	scanf("%d %d %d %d",&year,&mon,&day,&after); 
	afterday(&year,&mon,&day,after); 
	printf("%d日後:%d/%d/%d\n",after,year,mon,day); 
	return 0; 
}

閉鎖

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