自作四則演算プログラムのエラー

このQ&Aのポイント
  • 自作の四則演算プログラムでエラーが発生しました。どこが間違っているのか教えてください。
  • 足し算以外の演算子に対応するプログラムで指定された文字が正しくありません。
  • 足し算の結果を計算するプログラムで計算結果が期待通りではありません。
回答を見る
  • ベストアンサー

ソースプログラムのエラー

自分で四則演算のプログラムを組んだのですが エラーが出てお手上げ状態です。 どこが間違っているのかどなたか教えていただけませんか?? ちなみに足し算の場合はいくつ足しても計算できるという プログラムです☆ #include<stdio.h> int main(int argc, char *argv[]){ int i,a=0,b=0,x=0; int m=0; if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||){ printf("指定された文字ではありませんよ\n"); return -1; } a = atoi(argv[2]); b = atoi(argv[3]); if(argv[1]=="-"){ m=a-b; } if(argv[1]=="*"){ m=a*b; } if(argv[1]=="/"){ m=a/b; } if(argv[1]=="+"){ for(i=2;i<argc;i++){ x=atoi(argv[i]); m+=x; } printf("%d\n",m); return 0; }

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

  • ベストアンサー
  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.2

if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||){ や if(argv[1]=="-"){ などが間違っています。 文字列を比較する場合には、strcmp()もしくはstrncmp()を使いましょう。 なぜ間違っているか...それはargv[1]が何を示しているかを考えればおのずと見えてくるはずです。

tarirari99
質問者

補足

ちなみに実行時は >ex10 * 2 3 と入力したいんです。 学習した範囲での関数しか使用できないので strcmp()は使えないです(゜O゜;

その他の回答 (4)

  • KenKen07
  • ベストアンサー率0% (0/1)
回答No.5

アドバイス程度で申し訳ないのですが・・・ if文ですが文字列「""」との比較は関数を使わなければなりません。 ですが、文字「''」比較では問題なくできます。 文字で比較する場合の注意事項としては main(int argc, char *argv[]) での引数*argv[]がポインタと配列が使われていることです。 現時点で使われているargv[1]はargv配列1番目のアドレスを比較しています。 ポインタの中の要素を取り出すにはどうすればいいのか、調べてみましょう。 if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||) なのですが、もう一度見直してください。 何を入力しても全てif文の中に入りreturn-1が返ってしまうと思います。(一番最後の「||」も余分ですw) atoi関数ですが、必要なヘッダがincludeされていないため使用できない可能性があります。 以上の点を変更すれば動作すると思います。

参考URL:
http://www9.plala.or.jp/sgwr-t/
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

argv[1]!="+" とかしている部分を *argv[1]!='+' とします。

  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.3

#2です。 strcmpを使えないのであれば、自作の関数を作るか、それとも別の方法を取るかです。 渡される引数が1文字のみと分かっている場合でしたら、 char op; op = argv[1][0]; if( op=='+' || op=='-' || op=='*' || op=='/' ) { . . . で対応することが出来ます。

  • nin2-y
  • ベストアンサー率43% (14/32)
回答No.1

どんなエラーでしょうか? if(*argv[1]!='+'&&*argv[1]!='-'&&*argv[1]!='*'&&*argv[1]!='/'){ 忘れているなぁ、C、あっているんだろうか?

関連するQ&A

  • atoi() 実行エラー

    以下のプログラムをコンパイル・実行しようとすると、コンパイルはエラーなくできますが、実行すると「プログラムは動作を停止しました」という表示が出て、エラーになってしまいます。 たぶんatoi()が原因だと思うのですが、何が問題なのでしょうか? それとも環境の問題でしょうか? どなたかご存知の方がいらしたら教えてもらえないでしょうか。 <環境> VISTA、VC++ //------ここから---------- #include <stdio.h> #include <stdlib.h> #define AAA atoi(argv[1]) #define BBB atoi(argv[2]) #define CCC atoi(argv[3]) #define DDD atoi(argv[4]) #define EEE atoi(argv[5]) #define FFF atoi(argv[6]) #define GGG atoi(argv[7]) int main(int argc, char **argv) { FILE *fo; int i, j, k, l, m, v, cnt1; int v_tmp = CCC; int x_cnt; int y_cnt = 0; int cnt = 0; int arr[8190]; if(argc != 9){ printf("引数の数が違います。\n"); printf("使用法:<プログラム名><AAA><BBB><CCC>\n"); printf(" <DDD><EEE><FFF><GGG><出力ファイル名>"); exit(1); } if((fo = fopen(argv[8], "w"))==NULL){ printf("can not open file\n"); exit(1); } v = v_tmp; for(l=0; l<AAA; l++){ arr[l] = v; cnt++; if(cnt == FFF){ v += DDD; cnt = 0; } } for(i=0; i<BBB; i++){ m = 1; cnt1 = 0; x_cnt = 0; while(x_cnt < AAA){ fprintf(fo, "%04x", arr[m]); x_cnt++; if(!(x_cnt%2)) fprintf(fo, "\n"); cnt1++; if(cnt1%2){ }else{ m += 3; } m -= 1; } y_cnt++; if(y_cnt == GGG){ v_tmp += EEE; y_cnt = 0; v = v_tmp; cnt = 0; for(l=0; l<AAA; l++){ arr[l] = v; cnt++; if(cnt == FFF){ v += DDD; cnt = 0; } } } } fclose(fo); return 0; }

  • Cで書かれたユークリッド互除法プログラムをJavaに

    a と b とを与えて d=GCD(a,b) と ax+by=d の解 x,y を与えるプログラム: #include<stdio.h> void f(int a,int b,int*d,int*x,int*y) { int x1,y1; if(b==0) {*x=(a>=0?1:-1); *y=0; *d=abs(a);} else { f(b,a%b,d,&x1,&y1); *x=y1; *y=x1-(a/b)*y1; } return;} int main(int argc, char**argv) { int a,b,d,x,y; if(argc!=3) exit(0); f(a=atoi(argv[1]), b=atoi(argv[2]), &d, &x, &y); printf("\n %d * %d + %d * %d = %d \n\n", a,x,b,y,d); } 上記のCプログラムをJavaに書き換えたいのですが、まったくといっていいほど手も足も出ません。 Javaはまだ初心者なもので… どなたか詳しい方、どうかアドバイス、またはご教授お願い致します。

    • ベストアンサー
    • Java
  • プログラミング(argcとargv)

    入力された数の合計とその計算式を表示するプログラムをつくっています。惜しい(?)ところまでいったのですがその先がなかなか進みません。以下のプログラムのどこを修正したらよいでしょうか?教えてください。 #include <stdio.h> #include <stdlib.h> #define nMAX 10 int main(int argc, char **argv){ int sum = 0; if(argc < 2){ printf("Too few option!\n"); return 1; } int i, n; for(i = 1; i < argc; i++){ n = atoi(argv[i]); sum = sum + n; } printf("%d\n", sum); }

  • 全くわかりません。

    C言語の課題が全くわかりません。 (1)~(5)には何が入りますか? 丸投げですいません。後でじっくり考えます。 お願いします。 コマンド行引数に整数と符号(+、ー)を指定し、 その和を表示するプログラム。 例%calc -5+10+100-10=95と表示するプログラム #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { int sum=0,i=1; if(argc(1)1) put("komanasi"); else if(argv[i],(2)=='+'){ i++; sum += atoi(argv[i(3)]); }else if (argv[i],(2)=='-'){ i++; sum-=atoi(argv[i(3)]); }else sum+=atoi(argv[i(3)]); while((4)<(5)){ if(argv[i],(2)=='+'){ i++; sum+=atoi(argv[i(3)]); }else{ i++; sum-=atoi(argv[i(3)]); } } printf("%d\n",sum); return(0); }

  • ポインタのポインタ

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv){ int i; if(argc != 2) { fprintf(stderr, "Usage: %s vector\n\tEx: %s 11110000\n", argv[0], argv[0]); return 1; } for(i=0;i<8;i++){ if(**argv == '0'){ printf("%d\n",i); } else{ printf("A%d\n",i); } argv++; } return 0; } コンパイルして./a.exe 10010011などと入力しても A0 A1 Segmentation Faultとなります。 どうすれば、 A1 0 ・・・省略 for文で回した8回分、出力が可能になるのか教えてください。 初歩的な質問ですいません。

  • 並べ替えのプログラム

    整数を20個入力し、まずそのまま表示してその後大きい順に並べ替えて表示するプログラムを作っているのですが、最大値しか表示されません。多分for文の3重ループの中がおかしいと思うのですがよくわかりません。 #include <stdio.h> int main(int argc, char* argv[]) { int c,i,x,max; int sav = 0; int before[20]; int after[20]; int check[20] = {0}; printf("整数を20個入力してください: "); for(i = 0; i < 20; i++) { scanf("%d",&before[i]); } printf("\n"); printf("BEFORE\n"); for(i = 0; i < 20; i++) { printf("%d\n",before[i]); } printf("\n"); max = 0; for(c = 0; c < 20; c++) { for(x = 0; x < 20; x++) { for(i = 0; i < 20; i++) { if(before[i] > max && check[i] == 0) max = before[i]; sav = i; } if(check[sav] == 0) check[sav] = 1; after[19 - x] = max; } } printf("AFTER\n"); for(x = 0; x < 20; x++) { printf("%d\n",after[x]); } return 0; } よろしくお願いします。

  • 10個で改行したいのですが

    int _tmain(int argc, _TCHAR* argv[]) { int i,n,j,w,m,; printf("素数は\n"); n=0; for(i=1; i<=2000; i++){ n=n+i; w=0; for(j=1; j<=i ;j++){ m=i%j; if(m==0){ w=w+1; } } if(w==2){ printf("%d、",i); } } return 0; } このプログラムは2000までの素数を出力するプログラムです。この結果の素数10個ずつで改行したいのですが、どうすればよいでしょうか? お願いします。

  • プログラムのフローチャートがかけません。

    次のプログラムのフローチャート(流れ図)を書いてください。お願いします。 フローチャートの書き方は以下のwebから見れます。 http://sasuke.main.jp/furo.html #include<stdio.h> #include<math.h> #include<stdlib.h> #define MAX_DATA_NUMBER 400 int check_value(int x, char* error_message); int main(int argc ,char*argv[]){ int M=0 ,i=0,N,U double x[2][MAX_DATA_NUMBER],y_bunshi FILE *in_file; in_file = fopen(argv[1],"r"); M = 0; if(argc != 3){ printf("使い方: ./smooth 入力データファイル名 平滑化数N"); exit(1); } N = check_value(atof(argv[2]),"平滑化数は正の値を入力してください。\n使い方: ./smooth 入力データファイル名 平滑化数N"); if(argc == 3){ if( in_file == NULL){ printf("使い方: ./smooth 入力データファイル名 平滑化数"); exit(1); } } while( EOF != fscanf(in_file, "%lf", &x[0][M]) && M<MAX_DATA_NUMBER){ M++; } fclose(in_file); for(i=0;i<=N-1;i++){ y_bunshi = 0; for(U=0;U<=i+N;U++){ y_bunshi += x[0][U]; } x[1][i] = y_bunshi/(i+N+1); } for(i=N;i<M-N;i++){ y_bunshi = 0; for(U=1;U<=N;U++){ y_bunshi += x[0][i+U]; y_bunshi += x[0][i-U]; } y_bunshi += x[0][1]; x[1][i] = y_bunshi/(2*N+1); } for(i=M-N;i<=M-1;i++){ y_bunshi = 0; for(U=i-N;U<=M-1;U++){ y_bunshi += x[0][U]; } x[1][i] = y_bunshi/(M+N-i); } for(i=0;i<M;i++){ printf("%3d,%8.2f,%8.3f\n",i,x[0][i],x[1][i]); } return 0; int check_value(int x,char* error_message){ if( x <= 0.0){ printf(error_message); exit(1); return x; }

  • 二行目の*の意味を教えてください。

    #include <stdio.h> int main(int argc, char *argv[]) { int i; for ( i = 0; i < argc; i++ ){ printf("argv[%d]=%s\n", i, argv[i]); } return argc; }  以上プログラムで、二行目の*の意味を教えてくさい。  6行目のargvには*が付いていません!?  よろしくお願いします。

  • MPIプログラムの実行でエラーが出てしまいます

    エラストテネスのふるいのプログラムなんですが、どうもエラーが出て実行できません。 他の部分などを直して、なんとかエラーをひとつにしたんですが、どうも#include "MyMPI.h"に関連する部分でミスがあってできないようなのです。 エラーの内容は文字化けしているので読めません。 どなたかお教えしてもらえないでしょうか。 #include<mpi.h> #include<math.h> #include<stdio.h> #include "MyMPI.h" #define MIN(a,b) ((a)<(b)?(a):(b)) int main(int argc, char *argv[]) { int count; double elapsed_time; int first; int global_count; int high_value; int i; int id; int index; int low_value; char *marked; int n; int p; int proc0_size; int prime; int size; MPI_Init(&argc, &argv); MPI_Barrier(MPI_COMM_WORLD); elapsed_time = -MPI_Wtime(); MPI_Comm_rank (MPI_COMM_WORLD,&id); MPI_Comm_size (MPI_COMM_WORLD,&p); if (argc != 2) { if (!id) printf("Command line: %s <m>\n", argv[0]); MPI_Finalize(); exit(1); } n = atoi(argv[1]); low_value = 2 + BLOCK_LOW(id,p,n-1); high_value = 2 + BLOCK_HIGH(id,p,n-1); size = BLOCK_SIZE(id,p,n-1); proc0_size = (n-1)/p; if ((2 + proc0_size) < (int) sqrt((double) n)) { if (!id) printf("Too many processes\n"); MPI_Finalize(); exit (1); } marked = (char *) malloc (size); if (marked == NULL) { printf("Cannot allocate enough memory\n"); MPI_Finalize(); exit(1); } for (i = 0; i < size; i++) marked[i] = 0; if (!id) index = 0; prime = 2; do { if (prime * prime > low_value) first = prime * prime - low_value; else { if (!(low_value % prime)) first = 0; else first = prime - (low_value % prime); } for (i = first; i < size; i += prime) marked[i] = 1; if (!id) { while (marked[++index]); prime = index + 2; } MPI_Bcast (&prime, 1, MPI_INT, 0, MPI_COMM_WORLD); } while (prime * prime <= n); count = 0; for (i = 0; i < size; i++) if (!marked[i]) count++; MPI_Reduce (&count, &global_count, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); elapsed_time += MPI_Wtime(); if (!id) { printf("%d primes are less than or equal to %d\n",global_count, n); printf("Total elapsed time: %10.6f\n", elapsed_time); } MPI_Finalize(); return 0; }

専門家に質問してみよう