C言語で自然数の四則演算を行うプログラムでエラーが発生する原因について

このQ&Aのポイント
  • C言語で自然数の四則演算を行うプログラムを作成しましたが、実行時にエラーが発生し、プログラムが停止してしまいます。
  • エラーの原因を特定することができず、助けを求めています。
  • 使用している環境はWindows 7 Home Premium 64-bitとVisual Studio 2013です。
回答を見る
  • ベストアンサー

C言語 自然数の四則演算 エラー原因不明

プログラミング初心者です 自然数の四則演算のプログラムを作ったところ コンパイル時にはエラーは起こりませんでしたが実行時にエラーが起こり、動作が停止してしまいました。 自分で原因が特定できなかったのでこちらを頼らせてもらうことにしました。 ご教授お願いします。 <環境> Windows 7 Home Premium 64-bit Visual Studio 2013 #include<stdio.h> #include<ctype.h> #include<stdlib.h> int main( void ) { char str[2][128]={{0}}; int i,j,err=0,cont=0,wari=0; double c,d,dans; long a,b,lans; puts("自然数の四則演算('+''-''*''/')を計算"); //被加数,被減数,被乗数,被除数と演算の判定 i=0; while((str[0][i]=getchar())!='\n'){ if(str[0][0]=='+' || str[0][0]=='*' || str[0][0]=='/' || str[0][0]=='-'){ err=1; } if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){ cont=1; //2つ目の数字を読み込むか否かの判定 break; }else if(isdigit(str[0][i])==0){ err=1; //数字と演算方法以外の入力はエラー } i++; } //加数,減数,乗数,除数の判定 if(cont==1 && err!=1){ j=0; while(str[1][j]!='\n'){ if(isdigit(str[0][i])==0){ err=1; //数字以外の入力があればエラー } j++; } str[1][j]='\0'; if(err==1){ printf("エラー入力"); return 0; } switch(str[0][i]){ case '+': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a+b; break; case '-': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a-b; break; case '*': str[0][i]='\0'; a=atol(str[0]); b=atol(str[1]); lans=a*b; break; case '/': str[0][i]='\0'; c=atol(str[0]); d=atol(str[1]); dans=(double)c/d; wari=1; //割り算の判定 break; default: break; } } if(err==0){ if(wari==0){ printf("計算結果:%ld\n",lans); }else if(wari==1){ printf("計算結果:%f\n",dans); } }else{ printf("エラー入力です\n"); } return 0; }

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

  • ベストアンサー
回答No.3

もう少しちゃんと見てみましたが、やはり不思議な仕様のコードですね。 > //被加数,被減数,被乗数,被除数と演算の判定 > i=0; > while((str[0][i]=getchar())!='\n'){ と書いているので'\n'で入力が終了することを期待しているのでしょうが、実際に四則演算を入力しようとすると、次のところでループから脱出します。 > if(str[0][i]=='+' || str[0][i]=='*' || str[0][i]=='/' || str[0][i]=='-'){ > cont=1; //2つ目の数字を読み込むか否かの判定 > break; 例えば、"1+2"という入力をしたら、"1+"(ただし、NULL文字では終わっているとは限らない)がstr[0]に入った状態でループを出ます。 その後、次のコードを実行します。 > //加数,減数,乗数,除数の判定 > if(cont==1 && err!=1){ > j=0; > while(str[1][j]!='\n'){ なぜか、str[1]となっているので、中に何が入っているか不明なところを\nが出てくるまで探し続けます。 > if(isdigit(str[0][i])==0){ > err=1; //数字以外の入力があればエラー > } > j++; > } と、数値以外が来てもお構いなしにstr[1]の中身を読み続け、str[1]に運良く'\n'が入っていない限り、OSがメモリーへのアクセス違反を検出して強制終了となるまでメモリーを読み続けるでしょう。 ちなみに、whileの条件を while(str[1][j]!='\n'){としてもダメです。なぜなら、'\n'が入っていないから。 他にも色々と不思議なところはありますが、 多分、2項の自然数の四則演算をするプログラムだと思ったので、質問文にあるコードを元に、プログラムを読みにくくするところを省いて多分やりたいことだろうというコードに書き換えてみました。 #include<stdio.h> #include<ctype.h> #include<stdlib.h> int main(void) { char str [128] = {0}; int i , j, err = 0, op_pos = 0, wari = 0; double dans; long a , b, lans; puts("自然数の四則演算('+''-''*''/')を計算"); //被加数, 被減数, 被乗数, 被除数と演算の判定 i = 0; while ((str[i] = getchar()) != '\n') { if (str[0] == '+' || str[0] == '*' || str[0] == '/' || str[0] == '-') { err = 1; } if (str[i] == '+' || str[i] == '*' || str[i] == '/' || str[i] == '-') { //オペレーターの位置を保存 if (op_pos != 0) { err = 1; break; } op_pos = i; } else if (!isdigit(str[i])) { err = 1; //数字と演算方法以外の入力はエラー } i++; } if (err == 1) { printf("エラー入力"); return 0; } a = atol(&str[0]); b = atol(&str[op_pos + 1]); switch (str[op_pos]) { case '+': lans = a + b; break; case '-': lans = a - b; break; case '*': lans = a * b; break; case '/': if (b == 0) { // devided by 0. err = 1; } else { dans = (double)(a) / (double)(b); wari = 1; } break; default: break; } if (err == 0) { if (wari == 0) { printf("計算結果:%ld\n", lans); } else if (wari == 1) { printf("計算結果:%f\n", dans); } } else { printf("エラー入力です\n"); } return 0; } 今後、1+2*3に7と答えるようにするなら、字句解析や演算子順序解析に付いて勉強したほうがよいかもしれません。

honechicken
質問者

お礼

ご回答ありがとうございます。 多々ツッコミたいところがあると存じますが自分の力不足であります。大変申し訳ありません。 > //被加数,被減数,被乗数,被除数と演算の判定 > i=0; > while((str[0][i]=getchar())!='\n'){ この部分に関しまして算術演算子が入力されない場合を考慮して書きました。 > //加数,減数,乗数,除数の判定 > if(cont==1 && err!=1){ > j=0; > while(str[1][j]!='\n'){ この部分も改めて見直してみると確かにおかしく感じました。 自分の見落としです。 while((str[1][j]=getchar())!='\n') このように書いた気になっていました。 申し訳ありません。 そうです!私がやりたかったことは書き換えていただいたコードのようなプログラムです。 私のつたない文章と見るにも耐えないコードで書き換えていただいて本当にありがとうございました。 後々やりたく思っていましたの字句解析や演算子順序解析についても勉強していきたいと思います。

その他の回答 (4)

回答No.5

演算子順位構文解析ですね。演算子の優先順位に基づいた構文解析なので。 なんで順序と書いたんだろう。 >>char str[2][128]={{0}}; >で、全域0x00でクリアされていますので。 たしかにそうですね。 あと、入力でバッファを溢れさせられるというのも気になりますよね。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>例えば、"1+2"という入力をしたら、"1+"(ただし、NULL文字では終わっているとは限らない)がstr[0]に入った状態でループを出ます。 '\0'ターミネートは…おそらく保証されていると考えよいかと思われます。 >char str[2][128]={{0}}; で、全域0x00でクリアされていますので。 よって… >なぜか、str[1]となっているので、中に何が入っているか不明なところを\nが出てくるまで探し続けます。 で、バッファオーバーランも保証されていますね。 str[1]には0x00しかないのですから。 その結果が、 >・123*aiueo >のような入力をしましたところ >・(省略).exeは動作を停止しました >問題が発生したため,プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はWindowsから通知されます。 なのでしょう。 # str[1]にもstr[0]の時の入力があると読み違えてました。 # まぁどちらにしろ正しく動作しないのですが。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

動作確認時のネタとしてひとつ。 ・最初の文字で「+」「-」「/」「*」のいずれかを入力したときにどうしたい?  で、現状のコードで何が起こる? ・最初の入力で「a」「Backspace」「b」「Enter」とした場合にどうなる?  str[0][]に入っている文字列はどうなってる?  iの値はそれぞれの入力後にどうなってる? ・最初の入力で「a」「1」「/」とした場合にどうなる? ・最初の入力で「1」「z」「/」として、次に「a」「Enter」とした場合にどうなる? などなど。 デバッガ使ってステップ実行やらしてみることを勧めますよ。 # printf()デバッグでもいいんだけど…標準入力使っている場合ちょっと…ね。

honechicken
質問者

お礼

ご回答ありがとうございます。 デバッカを使ったことがなかったので調べて実行してみます。 ありがとうございました

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>コンパイル時にはエラーは起こりませんでしたが実行時にエラーが起こり、動作が停止してしまいました。 >自分で原因が特定できなかったのでこちらを頼らせてもらうことにしました。 どういう入力を行い、どんなエラーが発生して、動作が停止したと判断した根拠はなんです? 軽くしか見ていませんが、不思議な仕様のコードですねぇ。 ・入力エラーがあってもその文字は有効とする。  ->のでatol()は0(変換不可でエラー)とする。 ・2つ目の数字入力は数字かどうかは関係ない。  ->ので、やっぱりatol()は0を返す。 ・除算だったらOSが止めてくれる。

honechicken
質問者

補足

解答ありがとうございます。 >どういう入力を行い、どんなエラーが発生して、動作が停止したと判断した根拠はなんです? 大変申し訳ありません。私の説明不足です。 terapadで作成した拡張子[.c]のファイルを開発者コマンドプロンプトfor VS2013 にてコンパイルしexeファイルを実行した際にキーボードから  ・123+123 ・123*aiueo のような入力をしましたところ ・(省略).exeは動作を停止しました 問題が発生したため,プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はWindowsから通知されます。 上記のように表示されましたので 動作が停止したと判断しました。 >入力エラーあってもその文字は有効とする。 >2つ目の数字入力は数字かどうかは関係ない。 に関しましては if(err==1){ printf("エラー入力"); return 0; } この記述でプログラムを終了することができると私が思っているので気にしていませんでした。 >除算だったらOSが止めてくれる。 また見返しましたところ分数において分母が0の場合を考えておりませんでした。申し訳ありません

関連するQ&A

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • 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です)を入力するところで終了してしまいます。 どのように直せばよいのでしょうか。教えてください

  • C言語プログラミング 初心者

    現在2つの文字列を比較するstrcmp()関数と同じ動作をするプログラムを制作しています。 もちろん、strcmp()は一切用いません。 何とか作ってみたものの、文字列が等しいときなどにはうまく作動しません。 分かる方アドバイスお願いします。 以下のプログラムでは2つの50文字以下の文字列を入力することを想定しています。 #include<stdio.h> int main(void) { char str1[50],str2[50]; int a,b,i; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /*文字列の長さを確認します*/ for(a = 0;str[a];a++) ; for(b = 0;str2[b];b++) ; printf("%s ha %d mozinonagasadesu\n",str1,a); printf("%s ha %d mozinonagasadesu\n",str2,b); /*文字列を比較します*/ for(i = 0;;i++){ if(str1[i] > str2[i]) printf("%s は %s より大きい\n"str1,str2); else if(str1[i] < str2[i]) printf("%s は %s より小さい\n"str1,str2); if(str1[i] > str2[i] || str1[i] <str2[i]) break; } for(i=0;str1[i] && str2[i];i++) if(str1[i] == str2[i] ) printf("文字列は等しい\n"); /*上のプログラミングだとstr1がaab、str2がaacのときも文字列が等しいと表示してしまうので、ぴったり等しいときのみ表示するにはどのように条件付けしたらよいでしょうか?*/ return 0; } ちなみにstr1[0]=a ,str1[1]=b, str2[0]=a, str[1]=b, str[2]=cが格納されていた場合、str1 < str2になると思うのですが正しいでしょうか? もし正しければこの場合str1[2]にはヌル文字が入っており、それがstr2[2]のcと比較されたためなのでしょうか? いろいろと質問してしまいましたが、分かる方解答お願いします。

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • C言語でセグメンテーションエラーの原因がわからず困っています。

    こんにちは。いつもお世話になっております。 C言語なのですが、何故かプログラムを実行するとセグメンテーション違反が表示されてしまい全く動きません。皆さんのお力を貸して頂けないでしょうか。 以下が問題のプログラムです。 前提条件: ・別プログラムによりfile.txtは末尾に文章が追加され続けている ・本プログラムは永劫的に動き続ける #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main () { int i = 1, a; FILE *fp, *fp2; char *tok; //NULLを入れて初期化 char buf[1024] = ""; char str[1024] = ""; char str2[1024] = ""; //出力するファイルを開く if ((fp2 = fopen ("out.txt", "a")) == NULL) { printf ("out.txt:open error\n"); exit (-1); } while (1) { //何度もfopenするのでループ二週目以降は一旦fpを閉じる if (str2 != NULL) { fclose (fp); } //一度読み込み、2週目以降もさらに読み込み続ける if ((fp = fopen ("file.txt", "r")) == NULL) { printf ("file.txt:open error\n"); exit (-1); } //str2はループ2週目以降で使われる if (str2 != NULL) { while (1) //新しい行を見つけ出す { fgets (str, 1024, fp); if (strstr (str, str2) != NULL) { printf ("前回の最終行です:%s\n", str); break; } } } else { printf ("str2はNULLです:%s\n", str2); } //fopenで読み込んだ現段階のテキストファイルをout.txtに移す while (1) { if( (fgets (str, 1024, fp) ) == NULL)break; if ((a = strlen (str)) >= 2) { str[a - 1] = '\0'; } else { printf ("抽出した文字列が1文字以下です:%s\n", str); break; } if (strlen (str) >= 17) { strcpy (str2, str); } else { printf ("抽出した文字列が16文字以下です:%s\n", str); break; } printf ("%s\n", buf); fprintf (fp2, "%s\n", buf); strcpy (buf, ""); strcpy (str2, str); } printf ("これが検索語です:%s\n", str2); } fclose (fp2); return 0; } プログラムの内容は、 更新され続けるテキストファイル(file.txt)から、別のテキストファイル(out.txt)に出力するというプログラムです。(file.txtの内容を若干変えつつ、out.txtに出力することが本来の目的ですが、その部分は省略させて頂きました。) fopenで開くと、「その時点まで」のfile.txtしか開かれません。更新され続けているfile.txtの内容をコンスタントに読み取る為に、while文でfopenし続ける方法を取っていますが、そうするとout.txtに移し終わった行まで読み込んでしまい重複した文章をout.txtに移すことになりますので、strstrを使い、「前回fopenで開いたfile.txt」の最終行を検索してその位置からまたout.txtに移す、という方法を取りました。しかし、結果は何故かセグメンテーション違反でした。 以上のプログラムや私の意図する所で何か気づかれた点や、おかしいと思われた点等ありましたら是非ご教授頂きたく思います。 どんな些細なことでも構いませんので、教えて頂けないでしょうか。 環境はCentosです。どうぞよろしくお願いします。

  • 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"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • C言語

    次のプログラムは、自然数を入力して,その約数を表示するものである。ブログラム中の0 ~に適するものを答えなさい。ただし,a%bはaをbで割ったときの会りを求める演算 である。 参考 約数とは、入カした自然数に対して,その数を割り切ることのできる整数である。 例えば、6の約数は、1, 2, 3,6となる。 #include <stdio.h> int main (void) int i, num; printf("自然数を入カしてください。"): scanf ("%d", &num); printf("%dの約数は", num) ; for (i =@;i <= num; i++) ( if (num % i @ 0) { printf ("%d,i@1): printf("です。 ¥n"): return 0; 9 この問題の@の部分に入る数字、記号を教えて欲しいのとなぜそうなるのかも教えていただきたいです(-。-;

  • C言語で電卓を作成する。

    C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。

  • C言語について教えてください

    ファイルの文を読み込み、I、Weなどの定めた単語の数を数えるプログラムを作りたいのですが、うまくいきません。 具体的な問題点は、単語の数を数える際、一致する単語があった場合、再び最初から文を見直すため、無限ループしてしまう。 We,WE、weなど大文字小文字の違いで単語が数えられないなどです。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int w; char str[50]; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } } fscanf(fp,"%50s",str); for(w=0;w<=j+k+l+m+n+o;w++) { if(strcmp("I",str)==0) { j++; } if(strcmp("We",str)==0) { k++; } if(strcmp("You",str)==0) { l++; } if(strcmp("He",str)==0) { m++; } if(strcmp("She",str)==0) { n++; } if(strcmp("They",str)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

専門家に質問してみよう