以前にもさせてもらった質問の続きですが、月日を入力して実行すると、曜日は正確に出るのですが、日が正確に出ないのです。1月は問題ないのですが、例えば、2月5日を入力すると、日に1月分が足されてしまい、2月36日となってしまいます。2月以降も同様です。
for(i=0;i<tuki-1;i++){
hi=hi+dates[i];
と組み立ててるのですが、どうやら、hi=,,,のところがおかしい感じがするのですが、この文はこれでは間違いですか?

このQ&Aに関連する最新のQ&A

A 回答 (8件)

このソース、コンパイルエラー出ませんか?


for文の引数変数名が違っていたりします。

それを考慮に入れても、月入力で1を入れると
当然forループは回りません。
でも、1月は問題ないんですよね!?
あと、1月1日は、必ず月曜日ということでいいのでしょうか?
多分やりたいことは、1月1日から積算された日が何曜日になるかを
やりたいんだと思うのですが、そういう意図であれば、積算変数を
作ったほうが無難です。
このままのやり方だと、入力されたdayが、for文内で積算されて
表示するときにまた戻さなくてはなりません。
    • good
    • 0

printf("%d月%d日は、日曜日です。

",month,hi);
とやっているのでしょうか?
それとも
printf("%d月%d日は、日曜日です。",month,day);
とやっているのでしょうか?
補足で表示されているソースと質問されている変数が違っているので、
多分、解答している皆さんもどちらなのか迷っているのでは。
ちなみに、下のソースはコンパイルエラーがでます。
hi=dayと想定して、
曜日判定をしたら、加算されたhiを元に戻しましょう。
戻し方は、月と各月の日数がわかっているのですから
引き算するだけです。
加算しているのだから、その逆をやればいいのです。

あと、曜日は不変ですから、配列変数に入れると
if文はいらなくなりますよ。

この回答への補足

まぎらわしかったですね。すみません。month,dayでやっています。

補足日時:2001/01/26 19:23
    • good
    • 0

補足に対する回答


そうです。
あまりなんでも聞かずに、とりあえずやって見ましょう。
    • good
    • 0
この回答へのお礼

はい、やってみます。

お礼日時:2001/01/25 19:57

下で解答したsenjyuです。


積算ではなく加算です。
失礼しました。

この回答への補足

コンパイルエラーは出ないのですが、日にちがその日の前まですべて加算されて出てしまうのです。結局はエラーてことですね。それと、申し遅れましたが、このカレンダーは2001年度版でやってみていますので、今年の日付を○月○日は何曜日だと表示するように取り組んでいます。

補足日時:2001/01/25 19:23
    • good
    • 0

あっ、すみません、良くソースを見ていませんでした。



入力した日数をそのまま、曜日算出用に足しこんでいるんですね。

入力したdayはそのままで、別の変数を用意し、dayの入力後にその変数に代入して入力した日を確保します。
で、printf分でその確保した日を表示します。

この回答への補足

代入ということは、つまり、冒頭のところで例えばaを用意してa=dayという形をとって最後のprintfでday→aにするということでしょうか

補足日時:2001/01/25 19:41
    • good
    • 0

補足見ました。

前のままのソースですね(^^

printf("%d月%d日は、日曜日です。",month,day);

でいいんじゃないんでしょうか?
要求した入力をそのまま出力しましょう。
算出するのは、曜日のみなので、計算結果の月・日を出力する必要はありません。
余分な処理はバグの素です。

この回答への補足

以前に書いた質問をコピーして貼り付けてしまったので、printf("%d月%d日は、日曜日です。",month,day);のmonth,dayを加えて補足に書くことを忘れれしまいました。すると、for文の次のday=day+dates[i]は省いてしまっていいのでしょうか。それとも新たに書くことがあるのでしょうか。

補足日時:2001/01/25 18:20
    • good
    • 0

どのような表示を行う予定なのでしょうか?



前回の質問のソースから考えて、入力した月・日に対して、
○月○日は、日曜日です。
と表示するのでしょうか?
それなら、入力した月・日を表示すれば問題ないと思いますが、もし別の出力であれば、どういった表示をしようとしてるのかが、解らないので回答のしようもありません。

この回答への補足

エラーの意味を聞いたときに自分で作ってみたものを書いたのですが、このようにやってみたいのです。
#include <stdio.h>
main()
{
int i,day,month;
int dates[]={31,28,31,30,31,30,31,31,30,31,30,31};

printf(" 月を入力してください → ");
scanf("%d",&month);
printf(" 日を入力してください → ");
scanf("%d",&day);

for(i=0;i<monthi-1;i++){
day=day+dates[i];

if(day%7=0){
printf("%d月%d日は、日曜日です。");
}
else if(day%7=1){
printf("%d月%d日は、月曜日です。");
}
else if(day%7=2){
printf("%d月%d日は、火曜日です。");
}
else if(day%7=3){
printf("%d月%d日は、水曜日です。");
}
else if(day%7=4){
printf("%d月%d日は、木曜日です。");
}
else if(day%7=5){
printf("%d月%d日は、金曜日です。");
}
else if(day%7=6){
printf("%d月%d日は、土曜日です。");
}

}

補足日時:2001/01/25 17:53
    • good
    • 0

月と日を入力して、月、日、曜日を表示するプログラムですよね?



でしたら、hiは入力値のまま表示させないといけません。
これだと、1月1日から入力日付までの日数が、日の所に出てしまいます。

この回答への補足

と、いうことはhi=,,,のところのほかにも、改良する余地があるということでしょうか。文が前後になりましたが、そうです、つき、日、曜日を表示したいのです。

補足日時:2001/01/25 18:00
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qfor( ; ti >= 0; ti--, ci++)

C言語のループの表記のことです

for ( ; ti >= 0; ti- -, ci++)
この意味がわかりません
自分なりに解釈すると「;ti >= 0」から始まって「 ci++ 」を繰り返しながら「 ti- - 」になるまで繰り返す、というような感じです

「;ti >= 0」から始まるとはどういう意味でしょうか?
「 ti- - 」になるまでとは???

このソースが書かれているHPです
http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H12a2/pm11.html
52行目になります


わかる方がいらっしゃったら教えてください、お願いします

Aベストアンサー

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
for (i = 0; x[i] == 0; i++); // x[i] の先頭部分の0の要素を捨てて
for(; x[i] > 0; i++)
s += x[i]; // 「そのあと」の正の部分が継続する間足し込む
という場合、

また、再設定式は、

for(i = 0, j = 10; src[i] != 0; i++, j--)
dest[j] = src[i];
のように、二つ(以上)のものを変化させたい場合。
この例では、初期設定式も、コンマ演算子を使って、2つの初期化を行っています。

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
...続きを読む

Qg += a[i];の+=の意味とは

/* 合計点を求る*/
g = 0;
for (i= 0; i < 10; i++)
{
g += a[i];
}
以上ですが、g += a[i];の+=とはどんな意味なのでしょうか?
 よろしくお願いいたします。

Aベストアンサー

代入演算子の一種で、その左辺にある変数に、右辺にある値を加算します。
とりあえず処理としては
 g = g + a[i];
と同じ結果になります。
https://msdn.microsoft.com/ja-jp/library/5bk6ya5x.aspx

なぜ
 g = g + a[i];
でいいのにそんな書き方があるのかいうと、これだと「g の値を g に a[i] を足した値にする」という意味になるのに対して
 g += a[i];
だと「g に a[i] を足す」と意味が簡単になるためです。
……まあ、それ以外に歴史的・機械語的にこっちの方が速いという意味もあったんですが、最近のコンパイラはそのあたりを最適化するので左記の意味は薄れています。

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む


人気Q&Aランキング

おすすめ情報