C言語について教えて下さい。
全く知識もなく、正直全然分からないのですが課題をやらなくてはなくて・・・調べてやっては見たのですが基本もないのでなにがエラーなのかさっぱりわかりません。
他の方の質問内容から下記のようなものはできたのですが・・・
内容は
問題・キーボードから日本円を入力し、ドルに変換した後、ドルを100ドルなどの紙幣とコインに割り振りなさい。
ただし1ドル109円とする。また、日本円が0円の時にプログラムを終了する。
こういう問題です。また、このプログラムは、1次元配列、for文、if文、while文、do~while文、printf、scanfしか使えず、main()で()の中は空欄です。
もしわかる方がいたら教えてください。
#include <stdio.h>
main()
{
printf("kingaku ");
scanf("%d, &money");
money = (int)( (double) money 100/109.57) ;
for(i=0; i<=6; i++)
{
n[i] = money / kinshu[i];
money = money % kinshu[i];
k[i] = money / kin[i];
}
for(printf("\n"), i=0; i<=6; i++)
printf("\\%-3d%3d Mai \n",kinshu[i],n[i]);
for(printf("\n"), i=0; i<=4; i++)
printf("\\%1.0f%3d Mai \n",kin[i],k[i]);
}
回答(5)
1.

先ず、C言語は"宣言型言語"であり、スクリプトのような非宣言型言語とは異なります。したがって、変数money,n[],kinshu[]のデータ型やサイズ、構造をmainの前か直後の行で宣言する必要があります。
(1)scanfの括弧内記述を間違えています。
記述仕様を読み直すべきです。
(2)"money 100/109.57"記述に演算子が抜けています。
何の計算をしているか、私にも解りません。
(3)0円が入力されたときの処理が抜けています。
以上を参考に、見直してみてください。表示された数字を見て、どこが間違っているのか次第に見えてくるでしょう。
コメント欄にも追記ありがとうございました。
なんとか出来ました。
2.
実際に試したわけではないので、間違っていたらすみません。
#include <stdio.h>
main() //int main(void) にする
{
printf("kingaku ");
//money を宣言する必要がある、ブロックの先頭({ のあとの場所)で、
//int money ; //のようにする
scanf("%d, &money"); //おそらく、scanf("%d" &money);//とかの間違い
//money と 100 の間に 乗算演算子(*)が必要
//double へのキャストは、(自動的に行われるので)特に必要ない
//int へのキャストもおそらく必要ない
money = (int)( (double) money 100/109.57) ;
for(i=0; i<=6; i++)// i が宣言されている必要がある
{
n[i] = money / kinshu[i]; //n[7],kinshu[7] が宣言されている必要がある、kinshu[i]については、この前までに値が設定されている必要がある
money = money % kinshu[i];
k[i] = money / kin[i]; //k[7],kin[7] が定義されている必要がある。kin についてkinshuと同じく値が設定されている必要がある
}
for(printf("\n"), i=0; i<=6; i++)
printf("\\%-3d%3d Mai \n",kinshu[i],n[i]);
for(printf("\n"), i=0; i<=4; i++)
printf("\\%1.0f%3d Mai \n",kin[i],k[i]);
//int main にしたら、return で値を返す必要がある
}
//おそらく、コイン?の金種計算の仕方が間違っている
//ドル紙幣は現在7種で、コインは6種であり、同じループで処理できないし、紙幣とコインを同時には処理できない(はず)
//1ドル=100セントでもあり、さらに1ドル紙幣で金種を選んだ場合100セントコインは使用しないのでは?
//0を入力した場合の終了処理あるいは、0以外の場合の繰り返しの処理がない
とりあえず、まったくわからないという状態であれば、いきなり全体を作るのではなく、小部分の動作をテストして組み合わせてみてはどうでしょうか?たとえば、
まず、
・日本円を入力していくら入力できたかを表示するプログラムを作る。
・日本円をドルに変換したものを計算し表示するプログラムを作る。
…
3.
日本円を入力する変数と、
ドルを保持する変数は別にした方がいいと思います。
また、ドルを保持する変数はint でなくdouble などの浮動小数変数が適当かと思います。
4.
$1=¥109円
だとしたら、
日本円/109=ドル
ではないですか?
あと、
2の
scanf("%d" &money);
は、
scanf("%d",&money);
の間違いでした。
5.
コメント(10)
わからなかったら、できたところまでこのコメント欄に報告がてら質問してくださいね。
変換する紙幣やコインは何があるのか、
という根本的な所もしっかりと調べて定義付け
を行なう必要があります。
一応、私もご質問の制約に従ってローカル関数なしで
だらだらとコードを書いてみましたが、
ドル紙幣とセントコインを分けて考えるのか、
それとも同時に処理するのか、
が悩み所だと思います。
(ただ、まずはもう少し簡単なプログラムから
徐々にレベルアップしていくほうが懸命かとも思います
例:日本円→日本の紙幣・コインの数を表示)
>なにがエラーなのかさっぱりわかりません。
コンパイラはないのでしょうか?
問題文も過去質問のコピペっぽいのが気になりますが。。
コンパイラはお持ちと思う。
エラーメッセージが何やら解らないのではないですか。
ご本人のため、このケースではモロに回答を寄せられません。
コンパイルしながら、その理解できない部分をここ(コメント)で報告し、理解の足跡をつけておくと他の初心者に役立つと思いますが。
なにはともあれいい質問です。
だまされたか!
>>#6
質問文に
>他の方の質問内容から下記のようなものはできたのですが・・・
と記載あるので、もしかしたら、
”他の方の質問”というのが http://knowledge.livedoor.com/19572
かもしれませんよ。
おや、そういういきさつでしたか。
高齢は思考が短絡してイカン。
ゴ、ゴ・メ・ン・ナ・サ・イ。
money = (int)( (double) money 100/109.57) ;
の記述は、入力した¥単位をセント単位に変換しているのでしょうね。そのとき端数がでます。この端数を丸め(切り上げ)ようとするなら、次のように記述します。
money = (double)money*100.0/109.0+0.57 ;
0.43セント未満は切り捨てということでよろしいか?
なおmoneyは整数で、
int money ;
の型宣言をしてあるものとします。
右辺で(int)のキャストを省略しているのは、右辺の計算結果を左辺に代入するとき、自動的に左辺の変数型にキャストされる約束があるからです。
この部分が上手く処理できれば、以降の処理は楽勝と思えますが、どうなりましたろうか?
なおこのコメントでは標準記号文字であるはずの「セント」記号を使用すると字化けする。実にけしからん。
浮動小数を含む計算式はdouble に昇格して計算されますので、(double) のキャストも省略できます。



