C言語関係掲示板

過去ログ

No740 演算子の優先順位を考えて計算するプログラム

[戻る] [ホームページ]
No.9208

四則演算
投稿者---tete(2003/09/04 16:05:19)


例えば「125+5*20」と入力した時、「+」「*」の優先順位を考え、計算してくれるプログラムをつくりたいのですが。
とりあえず、演算記号を区切りとしてその他の数字を文字列とみなしてそれぞれ違う配列に格納して最後に計算しようと思ってつくったのですが、
(上の例だとbuf1[]="125",buf2[]="5",buf3[]="20")
違う配列に格納することすらままなりません。

#include <stdio.h>
#include <string.h>

int main(void){
char buff[20]buf1[20],buf2[20],buf3[20]; /*入力文字列用*/
int i;

printf("文字列 :"); /* プロンプト表示 */
gets(buff);

for(i=0;i<strlen(buff);i++){
if(buff[i] == '+'){
buff[i] = '\0';
}
}

return 0;
}

見ての通り、途中です。
選択授業の課題で出たのですが、さっぱりです。
誰か分かる方、教えてください。お願いです。

No.9209

Re:四則演算
投稿者---nop(2003/09/04 16:13:43)


>とりあえず、演算記号を区切りとしてその他の数字を文字列とみなしてそれぞれ違う配列に格納して最後に計算しようと思ってつくったのですが、
>(上の例だとbuf1[]="125",buf2[]="5",buf3[]="20")
>違う配列に格納することすらままなりません。

違う配列ではなく、2次元配列に入れてみてはいかがでしょうか?
# buf[0][]、buf[1][]、buf[2][]…

それから、isdigit() などを使用して、
数字かどうかの判定は入れた方が良いでしょう。

No.9210

Re:四則演算
投稿者---tete(2003/09/04 17:52:38)


>違う配列ではなく、2次元配列に入れてみてはいかがでしょうか?
># buf[0][]、buf[1][]、buf[2][]…
>
>それから、isdigit() などを使用して、
>数字かどうかの判定は入れた方が良いでしょう。

nopさん、ありがとうございます。今も考えていたのですが、strtokで区切ってみるのはダメなんでしょうか?
作ってみたのはいいのですが、表示は出来るけれど、計算はできませんでした。
やっぱりnopさんが言うように2次元配列とisdigit()を使用した物の方が簡単なのでしょうか?

#include <stdio.h>
#include <string.h>

int main(void){
char buff[20],*p;
int sum=0;

printf("文字列:");
gets(buff);

p = strtok(buff,"+");
puts(p);
while(p != NULL){
p = strtok(NULL,"+");
if(p != NULL)
printf("%d\n",atoi(p));
sum += atoi(p);
}
printf("sum=%d\n",sum);
return 0;
}




No.9211

Re:四則演算
投稿者---nop(2003/09/04 18:04:42)


>nopさん、ありがとうございます。今も考えていたのですが、strtokで区切ってみるのはダメなんでしょうか?
>作ってみたのはいいのですが、表示は出来るけれど、計算はできませんでした。
>やっぱりnopさんが言うように2次元配列とisdigit()を使用した物の方が簡単なのでしょうか?

初心者なら二次元配列でしょうかね。
腕に自信があるのなら、
逆ポーランド表記に変換して計算することをお薦めします。

※詳細は自分で調べて下さい。

No.9212

Re:四則演算
投稿者---かずま(2003/09/04 20:06:16)


> 例えば「125+5*20」と入力した時、「+」「*」の優先順位を考え、
> 計算してくれるプログラムをつくりたいのですが。

【掲示板ご利用上の注意】をよく読んで、ソースを添付してください。

インデントをつけるのが嫌なら、次のように書くしかないかな。
#include <stdio.h>
#define x(a, b, d, e, f) while (c==a?(v b f(),1):c==d?(v e f(),1):0)
char   c; 
double f(void) { double v;       scanf("%lf%c", &v, &c); return v; }
double t(void) { double v = f(); x('*', *=, '/', /=, f); return v; }
double e(void) { double v = t(); x('+', +=, '-', -=, t); return v; }
int main(void) { printf("  %.16g\n", e()); return 0; }