calc関数の構造について、どなたかご教授お願いします。

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

calc関数の構造について、どなたかご教授お願いします。

#1

投稿記事 by gan » 3年前

数字と演算子(+,-)の計算をして返す関数を作りたいのですが
どう作ればいいのかいまいちです。
以下、プログラムです。

コード:

#include <stdio.h>
#include <stdlib.h>

/*
	名称	calc
	引数	const char *in_dat:数字と演算子(+,-)
	戻り値	計算結果
*/
/*----- ここより下に解答を記述してください -----*/
int calc(const char *in_dat)
}
	int i = 0;
	int kotae = in_dat[i];
	i++;
	while (in_dat[i] != '\0')
	{
		switch(in_dat[i]){
		case '+'	kotae += in_dat[i++]; break;
		case '-'	kotae -= in_dat[i++]; break;
		default    ?
		i++;
	}
	return kotae;
}
/*----- ここより上に解答を記述してください -----*/

int main(void)
{
	char in_buf[100];
	int ret;
	
	printf("数字と演算子(+,-)=");
	scanf("%s", in_buf);
	
	/*----- ここより下に解答を記述してください -----*/
	ret = calc(in_buf);
	/*----- ここより上に解答を記述してください -----*/
	
	printf("計算結果:%d\n", ret);
	
	return 0;
}
表示例1
数字と演算子=10+20-30
計算結果:0

表示例2
数字と演算子=55+60-5
計算結果:110
上記のように表示したいです。

最初に配列先頭に入っている数字をkotaeに入れ次の要素が演算子かどうか確認し処理を行うと
考えました。1つ1つ文字を見ていくので、1桁の場合はうまくいくかもしれないけれど
数字が連続して続いている場合(1の次0とか)の場合、どうゆう処理をしてあげればいいのかわかりません。
後、配列に入っている数字は文字列扱いなのでそれも数字に直してから処理をしなければいけないのでしょうか
プログラムも途中ですいません。よろしければ、ご教授お願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: calc関数の構造について、どなたかご教授お願いします。

#2

投稿記事 by みけCAT » 3年前

1. 今の演算子、今の項の暫定値、計算結果を覚える変数をそれぞれ用意する
2. 今の演算子を+、今の項の暫定値を0、計算結果を0で初期化する
3. 次の処理を左の文字から順に行う
3-1. 今の文字が数字だったら、今の項の暫定値を(今の項の暫定値×10+今の数字が表す値)に更新する
3-2. 今の文字が演算子だったら、
 計算結果を「計算結果 今の(覚えている)演算子 今の項の暫定値」に更新した後、
 今の演算子を今の文字に更新し、今の項の暫定値を0に更新する
4. 全ての文字の処理を終えたら、計算結果を「計算結果 今の(覚えている)演算子 今の項の暫定値」に更新する
5. 計算結果を返す

という手順で処理を行うといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

gan

Re: calc関数の構造について、どなたかご教授お願いします。

#3

投稿記事 by gan » 3年前

一応書いてみましたが10+20-30をすると答えが1644とでてきました...
文字列を数字に変換してないからと思ったので今の文字が数字だった時、暫定値を更新のところに
atoi関数を入れたら、エラーは起きないんですが何も表示されなくなってしまいました。
どこが間違っているかわからないです...教えてください...

コード:

#include <stdio.h>
#include <stdlib.h>

/*
	名称	calc
	引数	const char *in_dat:数字と演算子(+,-)
	戻り値	計算結果
*/
/*----- ここより下に解答を記述してください -----*/
int calc(const char *in_dat)
{
	int i, x, y, kotae;

	i = 0;													
	x = '+';													
	y = 0;														
	kotae = 0;												

	while(in_dat[i] != '\0'){									
		if(in_dat[i] >= '0' && in_dat[i] <= '9')				
			y = y * 10 + atoi(in_dat[i]);								
		else{													
			if(x = '+'){
				kotae += y;
				x = in_dat[i];
				y = 0;
			}else{
				kotae -= y;
				x = in_dat[i];
				y = 0;
			}
		}
	i++;
	}

	if(x = '+')
		kotae += y;		
	else
		kotae -= y;
	
	return kotae;
}
/*----- ここより上に解答を記述してください -----*/

int main(void)
{
	char in_buf[100];
	int ret;
	
	printf("数字と演算子(+,-)=");
	scanf("%s", in_buf);
	
	/*----- ここより下に解答を記述してください -----*/
	ret = calc(in_buf);
	/*----- ここより上に解答を記述してください -----*/
	
	printf("計算結果:%d\n", ret);
	
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: calc関数の構造について、どなたかご教授お願いします。

#4

投稿記事 by みけCAT » 3年前

文字の数値への変換にatoi関数を使っているのが間違っています。
atoi関数の引数に渡すのは、文字列(の先頭へのポインタ)でなければなりません。
'0'~'9'の文字コードは連続していることが保証されているので、
1文字を数値に変換するには、文字コードから'0'を引くといいです。

また、演算子を比較する場所で=演算子を用いた代入をしている、という間違いもあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

gan

Re: calc関数の構造について、どなたかご教授お願いします。

#5

投稿記事 by gan » 3年前

上手く表示できました!
しっかり確認する事って大事ですね...
アドバイスありがとうございます!

返信

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