dポイントプレゼントキャンペーン実施中!

C言語の問題が2問ほどわからなかったので教えて下さい。
問1、西暦*y年*n月*d日の日付を”前の日”あるいは”次の日”の日付に変更する関数を作成せよ。
       void decrement_date(int *y,int *n,int *d){
vod increment_date(int *y,int *n,int *d){ を使え。
    閏年を考慮して計算を行うこと。

問2、要素型がint型で要素数がnの配列を受け取って、全要素に添字と同じ値を代入する関数set_idxを作成せ    よ。
       void set_idx(int *v,int n){ を使え。

考えたのですがわからないので、教えて下さい。お願いします。

質問者からの補足コメント

  • すみません。decrement_dateではなくて、increment_dateでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/12/06 23:58

A 回答 (2件)

考え方は、だいたいよいかと思いますが、その考えをうまく「言葉」にできていないようです。



○ 関数は
型 名前(引数) {
本体
}
という形になります。このとき、本体に別の関数の定義が入ったりましません。

main関数も関数です。
このままでは
void decrement _date(int *y,int *m,int *d)
{ に対応した } がありません。

○ incrementとdecrement が逆になっていませんか?
 decrementなのに、一日増やす(次の日にする)ようなプログラムになっています

○> case 10 : (*d==31);*m=*m+1; *d=1; break;
やりたいことは見当付きますが、コンピュータはそう解釈してはくれません。
(*d==31) と書いても「*dが31だったら」という意味にはなりません。

また、31日以外のときに 日付を単純に1日増やす、という処理がありません。

○ printf("前の日は%d年%d月%d日です。\n");
各%dに対応する値が指定されていません。
あと、おそらくここに打ちこんだときにそうなってしまったのだとは思いますが、%dに「全角文字」が使われているので、期待通りには動いてくれません。
    • good
    • 0
この回答へのお礼

とてもわかりやすいご説明ありがとうございます。
やっと理解できました。

お礼日時:2015/12/07 00:03

まず、どこがわからないのか、はっきりさせましょう。




例えば、問2ですが

int main() {

int v[20];
int n = 20 ; /* vの要素数 */

ここに「vの全要素に添字と同じ値を代入する」 処理を書く

}


という問題だったらわかるのか、これでもわからないのか。
この回答への補足あり
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
問1は
#include <stdio.h>
void decrement _date(int *y,int *m,int *d)
{
の後、
swiitch (*m){
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 : (*d==31);*m=*m+1; *d=1; break;
case 12 : *y=*y+1; *m=1;*d=1; break;
case 4 :
case 6 :
case 9 :
case 11 : (*d==30);*m=*m+1; *d=1; break;
case 2 : if(*y%4==0)*d==29;*m=*m+1; *d=1;
else *d==28;*m=*m+1;*d=1; break;
}
int main(void)
{
int y,m,d;
printf("年、月、日を入力してください。\n”);
printf("年:”);scanf("%d",&y);
printf("月:”);scanf("%d",&m);
printf("日:”);scanf("%d",&d);
decrement_date(&y,&m,&d);
printf("前の日は%d年%d月%d日です。\n");
return 0;
}
だと思いましたが実行できませんでした。
問2はもう少し考えてみます。ありがとうございます。

お礼日時:2015/12/06 23:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!