四則演算のみの電卓

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C言語入門者

四則演算のみの電卓

#1

投稿記事 by C言語入門者 » 14年前

四則演算のみの電卓を作成しています。
入力できる数値の項は3項までとします。
途中まで作成したのですが、上手くいきません。
問題点は以下に記載します。
・2項の演算が行われない。
・3項の演算は正確に行われるが、処理が抜けてしまって2項の計算結果も表示されてしまう。
二項に飛ぶ処理が上手くいかないのです。ご指導お願いします。

コード:

 
#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 (1);
				}
				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 (1);
				}
				answer=x/answer;
				break;

				default:
				printf("ERROR\n");
				return 0;
			}			
		printf("答え:%d\n",answer);
		}
		
		if(op1=='+'|'-'|'*'|'/')
		{	
			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 (1);
				}
				answer=x/y;
				break;

				default:
				printf("ERROR\n");
				return 0;
			}			
			printf("答え:%d\n",answer);
			}
		}
}


non
記事: 1097
登録日時: 14年前

Re: 四則演算のみの電卓

#2

投稿記事 by non » 14年前

>if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/'))
これは、何をしたいのかわかりませんが、恐らく間違ってます。

また、計算の優先順位について考慮しなくてもよいのですか?
non

アバター
さかまき
記事: 92
登録日時: 14年前

Re: 四則演算のみの電卓

#3

投稿記事 by さかまき » 14年前

>・2項の演算が行われない。

scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z);
は5個の入力を行わなければ先に進みません。3個しか入力しないと
後2個の入力待ちになっています。
入力の方法に工夫が必要です。

>・3項の演算は正確に行われるが、処理が抜けてしまって2項の計算結果も表示されてしまう。
抜けているんじゃなくて3項の処理の後に2項の処理も行っています。
こちらは「else」をどこかに一行追加すれば解決します。

C言語入門者

Re: 四則演算のみの電卓

#4

投稿記事 by C言語入門者 » 14年前

サイトから色々なソースをひっぱてきて何とか作成できましたが、処理内容が分かりません。
誰かコメントを入れていただけますか?特にcalc関数ないでのポインタの使い方、式の変形について詳しく入れていただけると幸いです。
宜しくお願いします。

コード:

#include <stdio.h>

double calc(char s[])
{
  char           *p1 = s, s2[100], *p2 = s2, op[2];
  double          number[3];
  int             i;
  //文字列を数字と演算子に分解
  while (*p1) {
    if ((*p1 >= '0') && (*p1 <= '9')) {
      *p2++ = *p1++;
    } else {
      *p2++ = ' ';
      *p2++ = *p1++;
      *p2++ = ' ';
    }
  }
  *p2 = '\0';
  sscanf(s2, "%lf %c %lf %c %lf", number, op, number + 1, op + 1, number + 2);

  /*式を変形(例:5 / 2 - 4--->2.5 * 1 + -4)*/
  for (i = 0; i < 2; i++) {					
    if (op[i] == '*') {						
      number[i] = (number[i])*(number[i + 1]);			
      number[i + 1] = 1;
    }
    if (op[i] == '/') {
      number[i] = (number[i]) / (number[i + 1]);
      number[i + 1] = 1;
      op[i] = '*';
    }
    if (op[i] == '-') {
      number[i + 1] = (number[i + 1]) * (-1);
      op[i] = '+';
    }
  }
  for (i = 0; i < 2; i++) {
    if (op[i] == '*') {
      number[i + 1] = (number[i + 1]) * (number[i]);
    } else {
      number[i + 1] = (number[i + 1]) + (number[i]);
    }
  }
  return number[2];
}

int main()
{
  char            s[100];
  printf("式を入力してください\n");
  while (printf("式:"), 1 == scanf("%s", s)) {
    printf("答え = %f\n", calc(s));
  }
  return 0;
}

non
記事: 1097
登録日時: 14年前

Re: 四則演算のみの電卓

#5

投稿記事 by non » 14年前

C言語入門者 さんが書きました:サイトから色々なソースをひっぱてきて何とか作成できましたが、処理内容が分かりません。
誰かコメントを入れていただけますか?特にcalc関数ないでのポインタの使い方、式の変形について詳しく入れていただけると幸いです。
ポインタがわからないのなら、身の丈にあったプログラムにするべきではないですか。
コメントにしても、自分でわかるだけ入れて、どうしてもわからないところだけ聞くべきでしょう。

また、このプログラムでは2項までの計算(例えば 2+3)はできませんよ。
non

box
記事: 2002
登録日時: 14年前

Re: 四則演算のみの電卓

#6

投稿記事 by box » 14年前

C言語入門者 さんが書きました: 何とか作成できましたが、処理内容が分かりません。
おっしゃっていることが、全くわかりません。どういう意味なんでしょうか。
作成できたのに内容がわからない、なんていうことがあり得るんでしょうか。

なお、
http://okwave.jp/qa/q6885823.html
ここに、似たような質問があがっています。参考になるかもしれません。
マルチポストであるかどうかは知りませんし、興味もありません。個人的には。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る