• ベストアンサー

プログラムが動かない

電卓のプログラムを作ろうと以下のようなソースを書いたんですが、コンパイルするときに 警告 W8070 denntaku.c 38: 関数は値を返すべき(関数 main) というエラーが出てしまいます。 原因はなんなんでしょうか? (ソース) #include <stdio.h> main() {  int val1,val2,ans;  char p,m,k,w,how;  printf("val1? \n");  scanf("%d", &val1);  printf("how? \n");  scanf("%c", &how);  printf("val2? \n");  scanf("%d", &val2);  switch(how)  {   case 'p':   ans=val1+val2;   printf("%d+%d=%d \n", val1,val2,ans);   break;   case 'm':   ans=val1-val2;   printf("%d-%d=%d \n", val1,val2,ans);   break;   case 'k':   ans=val1*val2;   printf("%d*%d=%d \n", val1,val2,ans);   break;   case 'w':   ans=val1/val2;   printf("%d/%d=%d \n", val1,val2,ans);   break;  } }

質問者が選んだベストアンサー

  • ベストアンサー
noname#29127
noname#29127
回答No.5

linux上で実際にコンパイルして実験しましたが、 printf("how? \n"); scanf("%c", &how); を複数文字読み込みにして printf("how? \n"); scanf("%s", &how); にすればうまく行きました。1文字だけ読み込みにした場合に 前の入力のせいでおかしくなるようです。 %sでの動作はとりあえず確認できています。 fflush(stdin)は試しましたがうまくいきませんでした。 何故でしょう?

minimax2005
質問者

お礼

回答ありがとうございます。 %sに変更したところ、きちんと実行することができました。

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

順番に問題を片付けていきましょう。 まず、 > void mainにしない場合はmainの最後にreturn 0;をつける、ということなんですよね? についてですが、先に挙げた例外事例を除いて、void mainにはできません。main関数は必ずint mainにしてください。 次に、scanfの件ですが、 scanf("%d%*[^\n]%*c", &val1); のようにすれば、おそらく問題は解決するはずです。 あるいは、getsやfgetsで1行単位で読み込んでから、sscanfやstrtolで整数値に変換してください。 fflushにstdinのような入力ストリームを指定した場合の動作は未定義です。

minimax2005
質問者

お礼

回答ありがとうございます。 >必ずint mainにしてください。 そーだったんですか。誤解していました。 また、scanf("%d%*[^\n]%*c", &val1);のようにすると、%cのままでもうまく実行することが出来ました。 勉強不足で記号の意味が分からないのが残念ですが・・・。 最後に、回答してくださった3人の方々へ 2度も回答していただき本当にどうもありがとうございました。 僕も皆様のようになれるようにがんばって勉強していこうと思います。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

>> printf文は最後に1つにまとめたほうが > これは具体的にはどうしたらいいんでしょうか? 始めたばかりならとりあえずは今のままでいいでしょう。 > 実行してみると、val1を入力後に「how?val2?」 > と2つが同時に出てきてしまって、howを入力することができません。 実は厄介です。 5Enterと入力すると2つ目のscanfでEnterを読んでしまって勝手に 3つ目のscanfに行ってしまうのです。 とりあえずの対策としては scanf fflish(stdin) をセットにして使えば入力バッファーのごみがクリアーされ正常になるはずです。 但し、あくまでも邪道らしいですが。

参考URL:
http://www.wakhok.ac.jp/~kanayama/C/98/node29.html
minimax2005
質問者

お礼

回答ありがとうございます。 なるほど、2つ目でENTERを読んでしまったのが原因だったのですね。 fflish(stdin)なんですが、プロトタイプ宣言がない、みたいなエラーが出てしまいました。 まだ僕にはハードルが高かったようです。 ですが、%cを%sに変更したところ、うまく実行することが出来ました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

まず、mainからの返却値は原則としてintでなければなりません。そして、returnによって整数値を返さなければなりません。 「原則として」と書いたのは、若干の例外があるからです。 ・C99の場合、int以外の返却値型を持つ処理系定義の形式であっても構わないことになっています。 ・フリースタンディング環境(組み込み機器のようなOSがない環境)では、プログラム開始処理の関数の名前と型は処理系定義になります。 また、C++の場合、main関数からのreturnが省略されると、関数の末尾でreturn 0;を書いたのと同じ意味になります。 上記を踏まえた上で、(標準規格に準拠した)C++であれば、今回の警告は大きなお世話なので、無視しても問題ありません。 Cの場合、main関数の最後にreturn 0;を追加すべきです。警告メッセージから見て、C99の可能性はまずありませんし、printfなどを使っていることから見て、フリースタンディング環境でもなさそうですので、return 0;を追加する以外の選択肢はありません。

minimax2005
質問者

お礼

回答ありがとうございます。 えーと、まだ初心者なのでよくは分からないんですが、void mainにしない場合はmainの最後にreturn 0;をつける、ということなんですよね? それと少し質問の趣旨が変わってしまうんですが、 このプログラムではval1を入力してから、足すか引くかなどの処理(how)を入力し、最後にval2を入力すると計算結果が出る、という流れにしたかったんです。 しかし実行してみると、val1を入力後に「how?val2?」 と2つが同時に出てきてしまって、howを入力することができません。 当然その後の答えもでてきません。 どうしたら解決できるんでしょうか?

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

No.1の方の言われる通りです。 この場合戻り値が不要でしょうから void main()とすればいいですね。 余計なお節介ですが、printf文は最後に1つにまとめたほうが判りやすいような。

minimax2005
質問者

お礼

回答ありがとうございます。 void mainに変えたところ、コンパイルは無事行うことができました。 >printf文は最後に1つにまとめたほうが これは具体的にはどうしたらいいんでしょうか? C言語の勉強は昨日はじめたばかりなもので・・・。 それと少し質問の趣旨が変わってしまうんですが、 このプログラムではval1を入力してから、足すか引くかなどの処理(how)を入力し、最後にval2を入力すると計算結果が出る、という流れにしたかったんです。 しかし実行してみると、val1を入力後に「how?val2?」 と2つが同時に出てきてしまって、howを入力することができません。 当然その後の答えもでてきません。 どうしたら解決できるんでしょうか?

noname#29127
noname#29127
回答No.1

ただのmain()としている部分がコンパイラによって int main()と解釈されているのだと思います。 int mainかvoid mainかに関して下記を参照ください。 http://www9.plala.or.jp/sgwr-t/c/sec11.html

minimax2005
質問者

お礼

回答ありがとうございます。 参考になりました。 void mainに変えたところ、コンパイルは無事行うことができました。 少し質問の趣旨が変わってしまうんですが、 このプログラムではval1を入力してから、足すか引くかなどの処理(how)を入力し、最後にval2を入力すると計算結果が出る、という流れにしたかったんです。 しかし実行してみると、val1を入力後に「how?val2?」 と2つが同時に出てきてしまって、howを入力することができません。 当然その後の答えもでてきません。 どうしたら解決できるんでしょうか?

関連するQ&A

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • C言語の四則演算プログラムについて

    こんにちは。hayato2192といいます。 今回は、C言語についてのことを質問したいとおもいます。 MSN相談箱の質問の中で数ある四則演算プログラムに対する質問をみたのですが、僕がつくろうとしているプログラムとはまったくちがいました。 プログラムコードは以下です。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ #include <stdio.h> main() { int d1, d2; char op; printf("START PROGRAM : Arithmetic operation\n"); printf("ENTER THE NUMBER\n"); scanf(" %d", &d1); printf("ENTER THE OPERATOR\n"); scanf(" %c", &op); switch (op) { case '+': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1+d2); break; case '-': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1-d2); break; case '*': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1*d2); break; case '/': printf("ENTER THE NUMBER\n"); scanf(" &d", &d2); printf("ANSWER IS %d\n", d1/d2); break; default: printf("NO ANSWER\n"); break; } return 0; } \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 使っている関数はscanf printf switchだけというとてもシンプルなプログラムなのです。 じっさい、このプログラムをBorlandのコンパイラでコンパイルすると、switch関数がまったく使われずに、演算子(このプログラムでいうOPERATORです)を入力するところで終了してしまいます。 どのように直せばよいのでしょうか。教えてください

  • 銀行のATMを想定したプログラム

    銀行のATMを想定したプログラム だいたい出来上がったのですが、 error C2143: 構文エラー : ';' が '型' の前にありません。 と出るのですがよくわかりません。 どこが違うのか指摘お願いします。 #include<stdio.h> void gamen();//メニュー画面を表示するユーザ関数をつくる。 int syori(int);//番号を入力した場合の処理はユーザ関数で作り、main関数から呼び出す。 int zandaka; int main(void) { int no,zandaka=100; printf("いらっしゃいませ\n"); do{ gamen(); scanf("%d",&no); int syori(int no); }while(no!=4); return 0; } void gamen() { printf("ご希望のメニューを入力してください\n" "1、お預け入れ\n" "2、残高照会\n" "3、おひきだし\n" "4、終了\n"); } int syori(int no) { int nuwkin,orosu; switch (no){ case 1:printf("お預入れ>"); scanf("%d",&nuwkin); zandaka=zandaka+nuwkin; printf("残高は%d円になります\n\n",zandaka); break; case 2:printf("残高は%d円です\n\n",zandaka); break; case 3:printf("おひきだし額は>"); scanf("%d",&orosu); if(orosu>zandaka){ printf("おひきだし額限度額は%dです" "残高不足なので引き出せません",zandaka); } else { if (zandaka>orosu){ zandaka=zandaka-orosu; printf("残高は%d円になりました",zandaka); } } break; case 4:printf("ありがとうございました\n\n"); break; default:("もう一度ご希望のメニューを入力\n"); } }

  • このプログラムの問題点を教えてください。

    いつもお世話になっております。 また質問させていただきます。 あるサイトの課題を自分なりにやってみました。 問題文 クイズを3題出題し、ユーザの解答に応える(「正解」とか「不正解」とか言う)プログラムを書いてください。   クイズは何でもかまいません。 それで作ってみたプログラムがこれです。 #include <stdio.h> int main(void){ int x,y; printf("1234\n"); scanf("%d",&x); switch(x){ case 0: return 0; case1: printf("hgfhgfhsa\n"); break; case2: printf("hjtuyer\n"); break; case3: printf("uytcbbvxbn\n"); break; case4: printf("oiu68fgfd\n"); break; } while(1){ printf("haydhgfsjd?\n"); printf("1,kukakaka 2,hihihi 3,yayay\n"); scanf("%d",&y); if(y == 1){ printf("763827648327ue\n"); break; } else if(y == 2){ printf("menndokusai\n"); break; } なんとかコンパイルができました。本当は3問問題を書かなければいけないのですが2問目が終わって確認の意味でコンパイルしました。 それで実行してみたところ、1問目の答えが出ませんでした。自分でも理由がわかりません。 なので皆様に問題点を指摘してほしいのです。 へんな質問ですがよろしくおねがいします。

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • 教えてください!!

    このソースを実行しても、1~4を選んでも足し算になってしまいます。どこが違っているか、教えてください。 int main(void) { int na, nb, nc; printf("二つの整数の演算を行います。\n"); printf("二つの整数を入力してください\n"); printf("整数A"); scanf("%d", &na); printf("整数B"); scanf("%d", &nb); printf("1:加算\n2:減算\n3:乗算\n4:除算\n"); printf("1~4のどれかを入力してください。"); scanf("%d", &nc); switch(nc) { case1: printf("%d + %dは、%dです。\n", na, nb, na + nb); break; case2: printf("%d - %dは、%dです。\n", na, nb, na - nb); break; case3: printf("%d * %dは、%dです。\n", na, nb, na * nb); break; case4: printf("%d / %dは、%dです。\n", na, nb, na / nb); break; default: printf("%dは番号が違います。\n"); } return(0); }

  • プログラムが上手く動作しません。

    質問です。 1.整数を1個入力し、その数を3で割った余りが0ならば"Good morning"、1ならば"Good evening"、2ならば"Good afternoon"と出力するプログラムを作成せよ。ただしswhitc文を用いること。 という問題で私は #include <stdio.h> main() {      int a;      printf("整数a:");      scanf("%d",&a);      switch(a%3)      {      case '0':           printf("Good morning \n");           break;      case '1':           printf("Good evening \n");           break;      case '2':           printf("Good afternoon \n");           break;      } } と考えましたが実行しても入力はできますがprintfが表示されません。 どこが間違っているのでしょうか?ちゃんとコンパイルはできるのですが・・・。 2.10個の整数値をキー入力し、合計と平均値を計算してその結果を表示するプログラムを書きなさい。 #include <stdio.h> main() {      int a[11],b,c,i;      for(i=1;i<11;i++)      {           printf("整数%d:\n",i);           scanf("%d",&a[i]);      }      for(i=1;i<11;i++)           b+=a[i];      c=b/10;      printf("合計値は%d",b);      printf("平均値は%d",c); } というプログラムを考えましたが、計算結果がめちゃくちゃになってしまいます。 これもどこを直したらいいべきでしょうか?

  • ネイピア数(e)のプログラム

    テイラー展開によってネイピア数の近似値を求める プログラミングが全くわかりません。 e = 2.71828 18284 59045 23536 02874 71352 … を計算したいのですが。 #include <stdio.h> #include <math.h> int kaijou(int p) { int cnt; int val=1; for(cnt=1 ; cnt<=p ; cnt++){ val=val*cnt; } return(val); } double napier(int p) { printf("eを計算します。E = (1+(1/k))^k\n"); printf("k=いくつまで計算しますか ?\n"); scanf("%d", &n); double E[n]; E[1] = 1; for (j = 1; j <= n; j++){ E[j] = E[j] + 1; } for (k = 1; k <= n; k++) { K = K + 1; A = 1 / K; // printf("A = %e, ",A); B = 1 + A; // printf("B = %e\n",B); for ( i = 1; i<=k; i++){ E[k] = E[k] * B; // printf("E[%3d]= %e\n",k,E[k]); } void main(void) { int n; int cnt; double answer; printf("計算する最大の項nを入力してください:"); scanf("%d",&n); for(cnt=1 ; cnt<=n ; cnt++){ answer=napier(cnt); printf("第%d項までの近似値:%f 真値:%f 差:%f\n",cnt,answer,exp(1),answer-exp(1)); } }

  • C言語のswitch文について間違っているところを教えてください

    初めに初心者ですので間違っているところは説明つきの回答をしていただければありがたいです。 今回switch文を使って 「足し算、引き算、掛け算、割り算」のプログラムを作ったつもりなのですが、intを使うと割り算の小数点が出ないしfioat文を使うとswitch文には、使えないと出るしどのようにしたら良いのか御回答よろしくお願いします。 (今は、int文でプログラムを作っているつもりです。) #include <stdio.h> void main (void) { int a,b,k; printf("どのような計算をしたいか数字を選んでください。\n"); printf(" 1.足し算 (例 a+b)\n"); printf(" 2.引き算 (例 aーb)\n"); printf(" 3.掛け算 (例 a×b)\n"); printf(" 4.割り算 (例 a÷b)\n"); printf("計算したい番号を入力してください "); scanf("%d",&k); switch (k){ case 1: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a+b で %d です\n",a+b); break; case 2: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは aーb で %d です\n",a-b); break; case 3: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a×b で %d です\n",a*b); break; case 4: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a÷b で %d です\n",a/b); break; default: printf("明記してあるどれかの数字を再入力してください"); } }

  • 出力されない・・・。

    #include <stdio.h> #include <stdlib.h> #include <string.h> void Rank(int, char*); main() { int a; char msg[100]; printf("数字を入れてください\n"); scanf("%d",&a); Rank(a, msg); printf("順位%s\n",msg); } void Rank(int a_p, char *msg_p) { switch(a_p) { case 1: msg_p = "1番"; break; case 2: msg_p = "2番"; break; case 3: msg_p = "3番"; break; case 4: msg_p = "4番"; break; case 5: msg_p = "5番"; break; } } 上のプログラムのように関数を使ってプログラムを作ったのですがmsgが出力されないのはなぜでしょうか?

専門家に質問してみよう