• ベストアンサー

加算、減算、乗算、除算について

// 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

noname#6117
noname#6117

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

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

123+45-6*789/ の計算って(最後の / は不要ですよね?) ( 123 + 45 - 6 ) * 789 = 127818 でよいのでしょうか? もし、 123 + 45 - ( 6 * 789 ) のように計算させたいのならちょっと面倒ですよね。 とりあえず、 ( 123 + 45 - 6 ) * 789 = 127818 だとすると、 #include <stdio.h> #include <stdlib.h> int Operation( int i1, int i2, char cOperator ); int main() {   char strFomula[] = "123+45-6*789";   char *p;   char *pTop;   char cOperator;   char cPrevOperator;   int iResult;   int i;   cPrevOperator = '\0';   pTop = strFomula;   p = pTop;   while( *p ) {     switch( *p ) {     case '+':     case '-':     case '*':     case '/':       cOperator = *p;       *p = '\0';       i = atoi( pTop );       iResult = Operation( iResult, i, cPrevOperator );       cPrevOperator = cOperator;       pTop = p + 1;       break;     }     p++;   }   i = atoi( pTop );   iResult = Operation( iResult, i, cPrevOperator );   printf("Result = %d\n", iResult );   return 0; } int Operation( int i1, int i2, char cOperator ) {   switch( cOperator ) {   case '\0':     return( i2 );   case '+':     return( i1 + i2 );   case '-':     return( i1 - i2 );   case '*':     return( i1 * i2 );   case '/':     return( i1 / i2 );   }   return( 0 ); }

noname#6117
質問者

お礼

返事が遅くなりました。 その面倒なほうをやりたいです。 ロジックとして、参考になると思いますので、 いろいろやってみます。 ありがとうございました。 ソース自体が綺麗だと思います。 私は、行き当たりばったりのソースのような気がします。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

一般的なヒント。 このような処理を行う場合、逆ポーランド記法にして、スタックを使って処理を行うのが楽です。 http://santamartadotnet.hp.infoseek.co.jp/documents/cpp/polish.html http://www.sm.rim.or.jp/~shishido/pol.html

noname#6117
質問者

お礼

参考URLの逆ポーランド記法をみました。 時間のあるときにじっくり読ませていただきます。 ハイレベルのソースを見たような気がします。 自分なりにもう少し理解してからにします。 ありがとうございました。

noname#6117
質問者

補足

No.1の方、No.2の方ありがとうございます。 今、自宅でないので、何もできないですが、 帰ってから確認としたいとと思います。 ヒントだけでも助かります。 また、夜に改めて御礼いたします。

関連するQ&A

  • こんな処理は可能ですか?(動的な命名)

    以下のように、switchでnumの値を分岐させてその値ごとに tmp[j][i]に格納する変数を変えたいのですが、こういうことはもっと スマートにできないでしょうか? int num = (ランダムな数取得); for ( int j = 0; j < 100; j++ ){   for ( int i = 0; i < 100; i++ ){     switch ( num ){     case 1: tmp[j][i] = num1[j][i]; break;     case 2: tmp[j][i] = num2[j][i]; break;     case 3: tmp[j][i] = num3[j][i]; break;      ・      ・      ・     }   } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 上のコードを int num = (ランダムな数取得); char *str = "num"; strcat( str, (char *)num ); //文字列の連結 tmp[j][i] = (*str)[j][i]; 見たいな雰囲気でスマートにできるのではないかと思ったのですが・・。 動的な関数呼び出しとか##演算子とかそういうのと組み合わせてこんなことは 実現できないでしょうか?

  • 実行できません

    #include<iostream> #include<cstring> using namespace std; void reverse(char *str,int count=0); int main(){ char *s1="this is a test."; reverse(s1); cout<<s1; return 0; } void reverse(char *str,int count){ int i,j; char temp; if(!count)count=strlen(str)-1; for(i=0,j=count;i<j;i++,j--){ temp=str[i]; str[i]=str[j]; str[j]=temp; } } これはあるサンプルプログラムなのですが、visual studio 2008でコンパイルしたらこのように実行ファイルはできるのですが実行できません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C 4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま せん。/EHsc を指定してください。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:samplem.exe samplem.obj どうしてでしょうか?よろしくお願いします。

  • AOJの問題で、質問があります。

    AOJの問題で考えても全然わからない問題があり、他の人の解答例を参考にしようと思い、見てみたのですが、一つ分からないところがあり、質問させていただきます。 問題です。 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0089 自分が参考にしている解答例です。 http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=570672 以下は分かっていないところを書かせていただきます。 なお、コードは解答例と同じです。 include <stdio.h> #include <string.h> int max(int a,int b){ return (a > b) ? a : b; } /*上の数、i-1行目の数から、i行目の大きい数をとっていく関数だと思いましたが、じっくり考えてみると、何パターンかのdataの足し算をしていることに気づきました。まずは左端のみ足す場(data[i+1][0] += data[i][0];)、次に右端だけを足す場合( data[i+1][i+1] += data[i][i];) 、そして for(j = 1;j <= i;j++){ data[i+1][j] += max(data[i][j-1],data[i][j]); } という、端以外の数から足すものです。ここで分からないことは ・このdata[i+1][j] += max(data[i][j-1],data[i][j]);という解答はi+1行目から、i行目の大きな数を選んでいますが、i行目からi+1行目の隣の大きいほうの数を足すようにしないと、ただしい経路は求まらないと思うのですが、どうでしょうか?また、端のみを足しているdataは、どういう役割をしているのでしょうか? 試しに端だけを足す式を削除したら、間違いとなってしまいます。また、この関数はreturn などがないですが、どの値が残るのでしょうか?main関数内では、どのような役割をするのでしょうか?*/ void solve(int data[100][50],int cnt){ int i,j; for(i = 0;i < cnt/2;i++){ data[i+1][0] += data[i][0]; for(j = 1;j <= i;j++){ data[i+1][j] += max(data[i][j-1],data[i][j]); } data[i+1][i+1] += data[i][i]; } for(i = cnt/2+1;i < cnt;i++){ for(j = 0;j < cnt-i;j++){ data[i][j] += max(data[i-1][j],data[i-1][j+1]); } } } int main(){ int h,i,j,cnt,len,num; int data[100][50]; char str[1024]; memset(data,0,sizeof(data)); i = 0; cnt = 0; while(scanf("%s",str) != EOF){ h = 0; j = 0; len = strlen(str); while(h <= len){ if(h < len && str[h] != ','){ num = 0; while(h < len && str[h] != ','){ num *= 10; num += str[h]-'0'; h++; } data[i][j] = num; j++; } h++; } i++; cnt++; } solve(data,cnt);//ここでは、計算した結果、どのような値が帰ってくるのでしょうか? printf("%d\n",data[cnt-1][0]); return 0; } 長文失礼しました。 よろしくお願いします。

  • ポインタ勉強中です。しかも実行するとおかしいです。

    <本に載ってたソース> #include<stdio.h> #include<string.h> int main() { char msg[20]; char *str=NULL; int i; int cnt; str=&msg[0]; printf("文字を入力してください"); scanf("%s",&str); cnt=strlen(msg); str=msg+cnt; for(i=cnt;i>=0;i--){ printf("%c",*(str--)); } printf("\n"); return 0; } char *str=NULL;は、ポインタstrを空にするということでしょうか? いつもながらstrlenとsizeofが混じります。 sizeofがバイトの大きさで、strlenが、文字数でしたっけ?

  • 加算できない

    #define NUM 1 void main(int argc, char *argv[]) { int i; float su01[NUM],suetc[NUM],j; FILE *fpi,*fpl; fpi = fopen(argv[1],"r"); fpl = fopen(argv[2],"r"); for(i=0;i<NUM;i++){ fscanf(fpi,"%f",&su01[i]); } for(i=0;i<NUM;i++){ fscanf(fpo,"%f",&suetc[i]); } for(i=0;i<NUM;i++){ suetc[i] += su01[i]; } for(i=0;i<NUM;i++) printf("%f\n",suetc[i]); } このプログラムで「aaa.txt」に入った30と「bbb.txt」に入った20を足して、50が入った「ccc.txt」というファイルを作りたいのですが、足し算をすることが出来ません。 よろしければご指摘をお願いします。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • C アルファベットのカウント

    #include<stdio.h> #define N 97 #define M 122 int main(void) { char str[ ]="national university"; int i,h,count; char check; for(h=N-1;h<=M;h++){ h++; char check = (char)h; for(i=0;str[i] != '\0';i++){ if(str[i] = check){ count++; } } printf("%c:%d\n",check,count); } } というコードで、アルファベットをそれぞれ何文字使用しているか調べるつもりだったのですが、結果は次のようになってしまいました。解説お願いします。 a:28 c:56 e:84 g:112 i:140 k:168 m:196 o:224 q:252 s:280 u:308 w:336 y:364 {:392

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 void reverse(char *str, int count=0) { int i; char *s="momonga"; s+=strlen(s); count=strlen(s); for(i=count; i<0; i--, str++, s--){ *str++=*s++; } } int main() { char s1[20]; int c; reverse(s1,c); printf("%momongaを逆順にすると%sで文字数が%dです",s1,c); return 0; } このプログラムの間違ってる所をおしえてください。

  • 桁をわけたい!

    char* str = "456"; int cou[3]; // 文字列を数値に変換 int num = atoi( str ); このnumは456が入っているのですが これをcou配列に cou[0]=6 cou[1]=5 cou[2]=4 という具合に桁数値をわけて受け取りたいのです 皆目見当がつきません C言語はじめて1週間の者でもわかるように どうか、教えていただきたいm< _ _ >m

  • C言語での文字列ソート動作について

    任意の文字列を入力し、その文字列を昇順にソートするプログラムを作ったのですが、入力する文字の文字数が大きく異なると期待した結果が得られません。 文字数が少なくなったり、他の配列の文字が混ざったりと言う結果に成ってしまっています。 何が原因か分からない状態です。 以下にサンプルを記載させて頂きますので、助言よろしくお願いします。 /*----------------------------------------- 入力例 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBB AAAAAA -----------------------------------------*/ #include <stdio.h> #include <string.h> #include <stdlib.h> void swapc(char *cx , char *cy){ char tmp[100]; strcpy(tmp, cx); strcpy(cx, cy); strcpy(cy, tmp); } int main(){ char *num[100]; char str_tmp[100]; //文字列一時格納 int moji_cnt; //入力した文字列のカウント int n , m; // 文字列入力処理開始 printf("文字列を入力してください\n"); for( moji_cnt = 0 ; moji_cnt != 3 ; moji_cnt++){ scanf("%s", str_tmp); *(num+moji_cnt) = (char *)malloc(sizeof(char) * (strlen(str_tmp)+1)); //メモリ確保 strcpy(*(num+moji_cnt), str_tmp); } puts("\n"); // 文字数ソート処理 for(n = 0 ; n < moji_cnt-1 ; n++){ for(m = 1 ; m < moji_cnt-n ; m++){ if(strcmp(*(num+n) , *(num+n+m)) > 0){ swapc(*(num+n) , *(num+n+m)); // 文字列入れ替え } } } puts("\n"); for(n = 0;n != moji_cnt;n++){ printf("%s\n" , *(num+n)); } free(num); }

専門家に質問してみよう