ショッピングモール  Personal Health / Stress ( Alexander Technique )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4884

電卓さくせいについて・・・
投稿者---C言語初心者(2005/11/21 23:04:14)


OS:WindowsXP
コンパイラ:Borland C++ Compiler 5.5
仕様
1.コマンドライン上から演算式の入力を行い、演算結果を表示する。
2.演算結果は次の演算の元値として使用する。
3.浮動小数点は5桁までとし、6桁以降は四捨五入する。
4.演算の表示桁数は12桁とする。
5.1行の演算に演算式は1つまでとする。
6.C、cの入力でクリアとする。
7.数値の正負を変換する。(例)5793の「−」入力で-5793と表示。

教えて頂きたいのは、仕様の赤字の部分のソースです。
これが、私の作ったソースなのですが、どうかご教授ください。


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

void main(void){
    char str[30];
    char astr[14];
    char bstr[14];
    char x;
    int a,b,c=0;
    int i,ai=0,bi=0;
    int flagb=0;

    while(1){

        printf("演算結果:%d\n",c);
        printf("演算入力>>");
        gets(str);
        fflush(stdin);

        for(i=0;str[i] != '\0'; i++){
            if(str[i] >= '0' && str[i] <= '9'){
                if(flagb == 0){  
                    astr[ai] = str[i];
                    ai++;
                }
                else{
                    bstr[bi] = str[i];
                    bi++;
                }
            }
            else{
                x = str[i];
                flagb=1;
            }

        }
        a = atoi(astr);
        b = atoi(bstr);

        switch(x){
            case '+':
                c=a+b;
                break;
            case '-':
                c=a-b;
                break;
            case '*':
                c=a*b;
                break;
            case '/':
                c=a/b;
                break;
            case 'c':
                c=0;
                break;
            case 'C':
                c=0;
                break;
            default:
                printf("erro\n");
                break;
        }
    }
    printf("演算結果:%d\n",c);
    printf("演算入力>>");

}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:電卓さくせいについて・・・ 4886 RAPT 2005/11/21 23:36:18
<子記事> Re:電卓さくせいについて・・・ 4891 まきじ 2005/11/22 01:28:23
<子記事> Re:電卓さくせいについて・・・ 4892 かずま 2005/11/22 18:39:22


No.4886

Re:電卓さくせいについて・・・
投稿者---RAPT(2005/11/21 23:36:18)


その仕様で、このアルゴリズムだと破綻しますね。
その前にいくつか仕様を確認したいのですが。

まず、入力値は、[0-9]と+-*/cCを想定しているようですが、
それ以外の文字入力は考慮しなくてよいでしょうか。
例えばスペースとか。

また、演算子は1つとありますが、これも複数個入力されることはない
との仮定でしょうか。

0による除算も考慮しないのでしょうか。

正負の変換と、引き算とは、どう区別するのでしょうか。

void main(void) は非標準です。
int main(void) を使用しましょう。



この投稿にコメントする

削除パスワード

No.4889

Re:電卓さくせいについて・・・
投稿者---C言語初心者(2005/11/21 23:49:43)


<pre>
>まず、入力値は、[0-9]と+-*/cCを想定しているようですが、
>それ以外の文字入力は考慮しなくてよいでしょうか。
>例えばスペースとか。

スペースなどの入力は考慮していないので、[0-9]と+-*/cCだけです。

>また、演算子は1つとありますが、これも複数個入力されることはない
>との仮定でしょうか。

演算子の複数個入力はしないとの仮定で作成してきました。

>0による除算も考慮しないのでしょうか。

0による除算は実行するようにしたいです。

>正負の変換と、引き算とは、どう区別するのでしょうか。

配列の先頭に演算子(+か-)が入力されたら…と区別したいのですが、方法もわからず、苦戦しています。

</pre>



この投稿にコメントする

削除パスワード

No.4891

Re:電卓さくせいについて・・・
投稿者---まきじ(2005/11/22 01:28:23)


>fflush(stdin);

入力ストリームに対する fflush() の動作は未定義です。


この投稿にコメントする

削除パスワード

No.4892

Re:電卓さくせいについて・・・
投稿者---かずま(2005/11/22 18:39:22)


ちょっとプログラムを書いてみました。

「演算子 数値」、または「演算子」のみ、または「数値」のみという入力を
許すことから、元の質問の仕様と異なるので解答ではありませんが、
参考になるところはあると思います。
#include <stdio.h>

int main(void)
{
    double x, y;  char buf[256], op, c, e;

    for (x = e = 0; ; ) {
        printf(e ? " Error\n> " : " %.5f\n> ", x);
        if (!fgets(buf, sizeof buf, stdin)) return 0;
        switch (sscanf(buf, " %c%lf %c", &op, &y, &c)) {
        case 1:
            if (op == 'c' || op == 'C') { x = e = 0; continue; }
            if (op == '-') { x = -x; continue; }
            break;
        case 2:
            switch (op) {
            case '+': x += y; continue;
            case '-': x -= y; continue;
            case '*': x *= y; continue;
            case '/': if (y) { x /= y; continue; }
            }
        }
        if (sscanf(buf, "%lf %c", &y, &c) == 1) x = y;
        else e = 1;
    }
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity