ページ 11

キーボード入力について

Posted: 2009年8月07日(金) 19:55
by もちもち
電卓を作ろうとしているのですが、キーボード入力で

1+2

としたら2の後ろになにか文字みたいなものがあるのでしょうか?

文字列なら一番最後にNULLが存在するので疑問に思ったのでどうか教えてください。
お願いします。

Re:キーボード入力について

Posted: 2009年8月07日(金) 20:14
by non
getsで入力した場合は、自動的に'\0'が追加されます。

Re:キーボード入力について

Posted: 2009年8月07日(金) 20:24
by KEYONN_
文字列は分かりませんが、
多分一番簡単な電卓プログラムを作ってみました。
参考にしてください。
#include<stdio.h>

int main()
{
    int num1,num2;
    char enzan;
    int resultA;
    double resultB;
    printf("%%d%%c%%dの順で入力してください。\n");
    
    while(1)
    {
    scanf("%d%c%d",&num1,&enzan,&num2);
    
    switch(enzan)
    {
        case '+':
            resultA=num1+num2;
            break;
        case '-':
            resultA=num1-num2;
            break;
        case '*':
            resultA=num1*num2;
            break;
        case '/':
            if(num2==0)
            {
                printf("0除算エラーです。\n");
                return -1;
            }
            resultB=(double)num1/num2;
            break;
    }
    
    if(enzan!='/')
    {
        printf("=%d\n",resultA);
    }else{
        printf("=%1.2f\n",resultB);
    }
    
    }
    return 0;
}

Re:キーボード入力について

Posted: 2009年8月07日(金) 20:25
by もちもち
nonさんありがとうございます。

それとすいません。入力形式は


int c;

c=getchar();

です。この場合ではどうなるのでしょうか?
お願いします。

Re:キーボード入力について

Posted: 2009年8月07日(金) 20:35
by もちもち
TKOZさんありがとうございます。今自分が作っているプログラムはLR構文解析表をつかって作ろうとしているのですが、どこで計算が終わるかの条件として

1+2

の後ろに何かないか疑問に思ったのですが、すいませんあいまいな質問をしてしまって。

下記に自分が作ったLR構文解析表を記しました。別にこれがどうこうということではないのですが、
一応こういうプログラムを作るということで、貼っておきます。

何度もすいませんが、1+2を

int c;

c=getchar();

でキーボード入力したら、2の後ろになにか文字みたいなものがつくのでしょうか?


#include<stdio.h>
#include<ctype.h>

int gettoken(int *);

int c;

int main(void)
{
	struct sr{
		char s;
		int n;
	};
	
	struct sr pta[12][6]={

			/*  i       +       *       (       )       $   */

			{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //0
			{{'s',0},{'s',6},{'e',0},{'e',0},{'e',0},{'a',0}}, //1
			{{'e',0},{'r',2},{'s',7},{'e',0},{'r',2},{'r',2}}, //2
			{{'e',0},{'r',4},{'r',4},{'e',0},{'r',4},{'r',4}}, //3
			{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //4
			{{'e',0},{'r',6},{'r',6},{'e',0},{'r',6},{'r',6}}, //5
			{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //6
			{{'s',5},{'e',0},{'e',0},{'s',4},{'e',0},{'e',0}}, //7
			{{'e',0},{'s',6},{'e',0},{'e',0},{'s',11},{'e',0}},//8
			{{'e',0},{'r',1},{'s',7},{'e',0},{'r',1},{'r',1}},//9
			{{'e',0},{'r',3},{'r',3},{'e',0},{'r',3},{'r',3}},//10
			{{'e',0},{'r',5},{'r',5},{'e',0},{'r',5},{'r',5}} //11
	};
	
	int ptg[12][3]={
			{1,2,3},
			{0,0,0},
			{0,0,0},
			{0,0,0},
			{8,2,3},
			{0,0,0},
			{0,9,3},
			{0,0,10},
			{0,0,0},
			{0,0,0},
			{0,0,0},
			{0,0,0}
	};

この後ろに、トークンの切り取りと、生成規則の条件があります。

Re:キーボード入力について

Posted: 2009年8月07日(金) 21:12
by non
1+2
の後に普通は改行を入力すると思います。
そうでないと式が終わったかどうかわかりませんからね。
したがって、getcharを使うなら、'\n'を式の終わりと
判断するのが一般的でしょう。
また、改行を入力しないと、バッファから取り込まれないし。

そういう回答でいいでしょうか?

Re:キーボード入力について

Posted: 2009年8月07日(金) 21:20
by もちもち
nonさんありがとうございました。

手伝ってくれた皆様も本当にありがとうございました。

無事完成することができました。