ページ 1 / 1
無題
Posted: 2008年7月08日(火) 17:10
by 骨鳴男
初めまして。
早速ですがプログラムが作成できなくて困っています。
以下のような二つの整数の計算式(加減乗除)を入力し結果を得るプログラムです。
QUITが入力されるまで繰り返します。
./keisan
計算式を入力して下さい
1+2[Ente[/url]
計算結果:3
計算式を入力して下さい
1-5[Ente[/url]
計算結果:-4
計算式を入力して下さい
aa[Ente[/url]
入力が違います
計算式を入力して下さい
QUIT[Ente[/url]
プログラムを終了しますか(y/n):n[Ente[/url]
計算式を入力して下さい
プログラムを終了しますか(y/n):y[Ente[/url]
プログラムを終了します
以上のような入力例を示すプログラムです。
どうしても分からないのでよろしくお願いします。
Re:無題
Posted: 2008年7月08日(火) 17:16
by やそ
何が分からないのでしょう?
文字(文字列)の入力は出来ますか?
文字の判定や変換は別として、
変数や計算結果の出力はどのような関数を使うか分かりますか?
お使いの環境(os、コンパイラ)は何でしょう?
Re:無題
Posted: 2008年7月08日(火) 17:37
by 骨鳴男
環境はLINUXです。
EMACSで作ってます。
printfやfgetsでは、ないのでしょうか?
str関数を使用するのでは、ないかと思うのですが、いかがでしょうか?
回答よろしくお願いします。
Re:無題
Posted: 2008年7月08日(火) 17:39
by abc
計算式を入力して下さい →printf
1+2[Ente[/url] →scanf 変数2つ用意して足す。(例c=a+b)
計算結果:3 →printf cを表示
計算式を入力して下さい →printf
1-5[Ente[/url] →scanf 変数2つ用意して引く。(例c=a-b)
計算結果:-4 →printf cを表示
計算式を入力して下さい →scanf aaを入力
aa[Ente[/url] →if文で判定する(例if(a == 'aa')など)
入力が違います
計算式を入力して下さい
QUIT[Ente[/url]
プログラムを終了しますか(y/n):n[Ente[/url]
計算式を入力して下さい
プログラムを終了しますか(y/n):y[Ente[/url]
プログラムを終了します
while文でまわすのがよい
もしかして、、、入力されてから足し算とか引き算判定します??笑なら考え方違います
Re:無題
Posted: 2008年7月08日(火) 17:47
by abc
法則ありなら文字列から”+-*/”を検索してその前と後ろの値をatoiとかで変換して
できないかな笑
strstrだっけなー文字列検索標準関数もあるし(名前違うかも)
Re:無題
Posted: 2008年7月08日(火) 18:00
by 骨鳴男
文字列を配列に格納し、それが文字列か数字かを判断すると思うのですが、
その判断をどのように書けば良いのかがわかりません。
そして、QUITを入力した時、プログラムを終了させるかどうかを問うコメントを表示させる方法と実際にプログラムを終了させる方法を教えて頂ければうれしいです。
Re:無題
Posted: 2008年7月08日(火) 18:13
by Mist
> それが文字列か数字かを判断すると
isdigit関数を使う
> QUITを入力した時、プログラムを終了させるかどうかを問うコメントを表示させる方法
strcmp関数を使って入力された文字列が"QUIT"と一致するか判断する
一致したらコメント表示
> 実際にプログラムを終了させる方法
入力された文字がyかnかをチェックする。
yだったらexitでプログラム終了。
Re:無題
Posted: 2008年7月08日(火) 18:29
by 骨鳴男
皆さんありがとうござました。
皆さんの言葉を参考にして作ってみます。
より分かりやすいプログラム作成方法があるかたは書いて頂けるとうれしいです。
Re:無題
Posted: 2008年7月08日(火) 18:55
by やそ
うむ。骨鳴男 さんが作ってみるというので、現状待ち状態かもしれませんが、
式の入力は
”1+2”などと全部一度に入力するタイプなのか?
”1”エンター
”+”エンター
”2”エンター
エンター
なのかによって処理の仕方がだいぶ変わると思います。
後者のほうが何倍も楽^^
また、1行目の
「./keisan 」
は・・・もしかして・・・
//keisan
のコメントを書きたかった?
Re:無題
Posted: 2008年7月08日(火) 18:58
by 骨鳴男
計算は数字も演算子も一括入力するものです。
一行目の./keisanはコンパイルしたものを実行すると言うことです。
Re:無題
Posted: 2008年7月08日(火) 19:37
by box
> また、1行目の
> 「./keisan 」
UNIX系のOSでよくある、
カレントディレクトリのkeisanを実行する
という意味です。
Re:無題
Posted: 2008年7月08日(火) 19:39
by やそ
>計算は数字も演算子も一括入力するものです。
それならばfgetsでまとめて文字列(配列)に入れてしまえば良いでしょう。
あとは1文字ずつ読んでは判定していく。
isdigitで数字かどうか判定
演算子は読んだか?
まだならば1番目の数字
読んでいれば2番目の数字
変数に入れる
演算子ならば
演算の確定
数字でも演算子でもない文字ならばエラー処理
文字列が終わるまでループ
演算子を判断して、演算&結果表示
といった流れでしょうか。
エラー処理を追及すると一気に処理が長く(複雑に)なりそうですが。
Re:無題
Posted: 2008年7月08日(火) 20:32
by box
> 二つの整数の計算式(加減乗除)
二つの整数は一桁に限定ですか?
二桁以上も扱いたいのだとすると、
fgets()で数式全体を文字列として受け、
sscnaf()あたりで3つの要素(2つの数値と1つの演算子)に分解し
(3つの要素を獲得できなかったらエラーとする)、
演算子の内容に応じた四則演算を行なう、
という考え方はいかがでしょう。
Re:無題
Posted: 2008年7月09日(水) 09:24
by やそ
> 「./keisan 」
>UNIX系のOSでよくある、
>カレントディレクトリのkeisanを実行する
>という意味です。
あ、なんだ、実行ファイルを書いただけですか。
納得しました^^
>boxさん
整数部分の桁数によっても処理の仕方が多少変わりますね。
あとは整数のリミットをどうするかで変数の型もかわるでしょうし、
(まあintの範囲程度で十分だと思いますが)
0除算のチェックやマイナスを扱うかどうか、
全角文字(数字)は・・・やっぱりはじく?
etcetc・・・
追求していくと結構な手間かもしれません^^;