ページ 1 / 1
課題
Posted: 2009年12月16日(水) 11:04
by null
下のプログラムを実行すると、エラーがでるのですが理由がわかりません。
疑問や書き方、おかしいと思われるところがあれば教えていただけるとありがたいです。
#include<stdio.h>
struct syuppi
{
char name[21];
unsigned int bunrui;
int year,month,day,cost;
};
int main()
{
struct syuppi data[100]; int i,j,stop;
FILE *fp;
if(fp=fopen("syuppi.txt","a")==NULL)
{ printf("can`t open file."); return;}
for(i=0;;i++)
{
printf("年");
scanf("%d",&data.year); if(data.year==0) { printf("終了します。"); return;}
printf("月");
scanf("%d",&data.month);
printf("日");
scanf("%d",&data.day);
printf("分類");
scanf("%d",&data.bunrui);
printf("出費");
scanf("%d",&data.cost);
printf("名前");
scanf("%s",&data.name);
}
for(j=0;j<i;j++)
{
fprintf(fp,"%s %d %d %d %d %d\n",&data[j].name,data[j].bunrui,data[j].year,data[j].month,data[j].day,data[j].cost);
}
fclose(fp);
return(0);
}
Re:課題
Posted: 2009年12月16日(水) 11:21
by sizuma
・ (提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい
・ ソースコードは< pre>と< /pre>のタグで囲んでください
詳しくはこの掲示板の使い方をご覧ください→
http://dixq.net/board/board.html
Re:課題
Posted: 2009年12月16日(水) 11:23
by non
おかしなところはいっぱいありそうですが、まず、何のエラーか示してください。
Cなら、警告だけのような気がするのですが・・・
C++ならエラーかも。
Re:課題
Posted: 2009年12月16日(水) 11:32
by softya
とりあえず、「規約と注意事項」をよく読んで捕捉してください。
[flash 600,100]http://dixq.net/flash/kiyaku4.swf[/flash]
規約と注意事項
http://dixq.net/board/board.html
特にテンプレを見て足らないを補足してほしいのとC言語系だと思われますので、使っているコンパイラの名称とC言語系の規格でC90,C99,C++のどれかも明確にしてくださいね。
Re:課題
Posted: 2009年12月16日(水) 11:45
by たかぎ
> エラーがでるのですが理由がわかりません。
規約を守っていないので、回答もエラーメッセージだらけになります。
Re:課題
Posted: 2009年12月16日(水) 12:02
by Naohiro19
家計簿のプログラムを作ろうとしてるのですか?
Re:課題
Posted: 2009年12月16日(水) 21:08
by null
コンパイラ : Microsoft Visual C++ 2008
言語 : 詳しくはわからないのですが、調べてみるとc99だと思います。
>>(提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい。
全部なのですが・・・もしかして自分はおかしいことを言っているのですか?
>>家計簿のプログラムを作ろうとしてるのですか?
課題としてこういうのを作れと言われただけなので、家計簿なのかはわかりませんが、特になにかを作っているわけではないと思います。 構文などを理解してるかどうかを調べているのかもしれません。
すいません勘違いで、エラーではなくテキストに書き込めてないということです。本当すいません。
いろいろ規約違反ですいません。コメントにタグが使えるのか疑問だったので・・・。
ソールコードの前後に
を挟むだけで良いのでしょうか?htmlみたいな感じですか?
Re:課題
Posted: 2009年12月16日(水) 21:23
by non
まず、評価される優先順位を考えて
if((fp=fopen("syuppi.txt","a"))==NULL)
次に、年を入力して終了の時のreturnですが、returnしたら終わってしまって出力できません。
can`t open fileのreturnも何か値を返すようにします。
Re:課題
Posted: 2009年12月16日(水) 21:26
by ねこ
>nullさん
HTMLみたいにソース部分を
タグで囲めばOKです。
結果に関しては
・ファイルが出来ない
・ファイルはあるが何も書かれていない
等思いつきますが、具体的にどう動いて欲しくてこうなってしまう、というように書くと良いかと思います。
とりあえず
[pre]
if( fp = fopen( "syuppi.txt", "a" ) == NULL )
これは
if( ( fp = fopen("syuppi.txt", "a" ) ) == NULL )
こうな気がします。
Re:課題
Posted: 2009年12月16日(水) 22:40
by null
訂正ありがとうございます。
>>次に、年を入力して終了の時のreturnですが、returnしたら終わってしまって出力できません。
条件を書き忘れましたが、年の入力のときに0が入力された瞬間に終了するようにすることなのですが、確かにおっしゃる通りです。直したいのですが、returnで抜ける以外に方法があるのでしょうか?
>>can`t open fileのreturnも何か値を返すようにします。
例えば1を返したとすると、どこにかえるのですか? 関数だったら呼び出したところですよね?
メイン関数だと・・・・?? もしメイン関数に1がreturnされたのなら意味があるのでしょうか?
すいませんくだらない質問で。
>>HTMLみたいにソース部分を
タグで囲めばOKです。
ありがとうございます。次から自信を持って使います。
>>具体的にどう動いて欲しくてこうなってしまう、というように書くと良いかと思います。
ファイルはできていますので、書き込めていないのかと思います。上で訂正してくれた通りでreturnで出力できてないみたいです。
if文はすぐに直しました。
Re:課題
Posted: 2009年12月16日(水) 22:52
by たかぎ
> 例えば1を返したとすると、どこにかえるのですか? 関数だったら呼び出したところですよね?
> メイン関数だと・・・・?? もしメイン関数に1がreturnされたのなら意味があるのでしょうか?
そのプログラムを呼び出したプログラムにかえります。
あるプログラムが、下請け処理を別のプログラムにまかせた場合、処理が成功したか失敗したかは(原則として)mainからの返却値を見るしかありません。
画面上に「エラー」と表示しても、それをプログラム的に認識するには、画像・文字認識を行わなければならないため、非常に難しくなります。
Re:課題
Posted: 2009年12月16日(水) 23:15
by sizuma
>mainにreturn
Cの決まりですね。
Javaだとvoidですし、C#でもvoidです。
0以外が返された場合はたかぎさんの書いてるように失敗を呼び出し元に返すそうです。
(実際にどういう動作を呼び出しもとがしてるのかわからないので・・・)
さて、プログラムのほうを。
まず、次からじゃなくて、今最初のプログラムを編集してタグをつけてくれたら見やすくなります。
>returnで処理が終わってしまう
方法はなんだかんだ出来ると。
せっかくstopがあるんで僕はfor文からstopフラグの判定で抜け出すようにしました。
0が入力されたら、stopフラグをfalseにしてcontinueで再判定させて抜け出せばいいですね。
この場合だと、iは一つ多いと思うので、fprintfの判定を気をつけましょう。
あとは入力部分を関数にする
こうすればreturnで入力データを返せばいいですよね。
goto文を使う
まぁこんだけ単純な動作だったら使っても問題ないと。
使わなくてもできるんで使う必要もないけどね。
上のループの中に下の処理を入れる。
returnする前に処理を済ませてしまえばいいですね。
コードは見づらくなるでしょうけど。
他にも関数の書式が違ったりするんで、実際動かしてみて想定された結果と見比べてみればいい勉強になるでしょう。
Re:課題
Posted: 2009年12月17日(木) 00:01
by null
ありがとうございます。
おかげさまで無事解決しました。
continue・・・知らなかったです・・すいません。教わることなんて本当に基礎だけなんですね。構文をいろいろ調べてみることにします。
goto文おもしろそうなので今から使ってみます。
Re:課題
Posted: 2009年12月17日(木) 00:01
by null
テスト
Re:課題
Posted: 2009年12月17日(木) 00:06
by sizuma
>goto
はわわ、使わなくてもいいならそれでいいんですよ^^;
Re:課題
Posted: 2009年12月17日(木) 00:13
by たかぎ
> >goto
> はわわ、使わなくてもいいならそれでいいんですよ^^;
使えるようにしておくのはよいことです。
実践的なプログラミングで、本当に必要かどうかは、使えるようになっていないと判断ができませんから。
Re:課題
Posted: 2009年12月17日(木) 08:34
by non
あれれ、何でbreakって案は出てないの?
Re:課題
Posted: 2009年12月17日(木) 09:53
by sizuma
間違いない^^;
こういうのって気づかないときは気づかないのは僕だけ?