小弟初学c,程序写的很烂,请大家帮忙看一个错误

软件和网站开发以及相关技术探讨
回复
boxjellyfish
帖子: 89
注册时间: 2009-08-18 20:35

小弟初学c,程序写的很烂,请大家帮忙看一个错误

#1

帖子 boxjellyfish » 2010-08-17 19:38

以下是我写的一段代码,只是练习

#include <stdio.h>

char sel;
float a,b;

char getfirst();
float getfloat();
void getnum();

int main()
{
while(sel!='q')
{
printf("Please enter your option: \n");
printf("p.plus m.minus\n");
printf("t.multiply d.divide\n");
printf("q.quit\n");
sel=getfirst();
sel=tolower(sel);
if(sel=='q')
break;
switch(sel)
{
case 'p':
getnum();
printf("%f+%f=%f\n",a,b,a+b);
break;
case 'm':
getnum();
printf("%f-%f=%f\n",a,b,a-b);
break;
case 't':
getnum();
printf("%f*%f=%f\n",a,b,a*b);
break;
case 'd':
getnum();
printf("%f/%f=%f\n",a,b,a/b);
break;
default:
printf("Wrong letter,please enter again\n");
printf("Please choose p,m,t,d or q\n");
continue;
break;
}
}
printf("Bye!");
getchar();
getchar();
return 0;
}

char getfirst()
{
sel=getchar();
while(getchar()!='\n')
continue;
return sel;
}

void getnum()
{
printf("Please enter a number: ");
a=getfloat();
printf("Please enter another number :");
b=getfloat();
if(b==0 && sel=='d')
{
while(b==0)
{
printf("Please enter a number other than 0 :");
b=getfloat();
}
}
}

float getfloat()
{
float input;
char error;
while(scanf("%f",&input)!=1)
{
printf("\"");
while((error=getchar())!='\n')
putchar(error);
printf("\" is not a correct number,please enter again: ");
}
return input;
}

目的是为了让用户输入一个选项(+-*/),然后输入两个数字,按照选项进行运算,选项如果错误就会让用户重输入,可是运行时第一次可以正常选,第二次错误,第三次正确,第四次错误,如此交替,请问我哪里做错了?帮忙各位看一看......虽然已经是很久远的问题了,可是我真的很想搞清楚...谢谢 :em06
boxjellyfish
帖子: 89
注册时间: 2009-08-18 20:35

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#2

帖子 boxjellyfish » 2010-08-17 19:41

额,发错地方了,谁来帮我?
头像
Lavande
论坛版主
帖子: 5352
注册时间: 2008-12-21 15:27
来自: TARDIS

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#3

帖子 Lavande » 2010-08-17 20:13

:em20 不缩进一下看了吃力啊
VIVXIX
帖子: 17
注册时间: 2010-07-22 18:08

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#4

帖子 VIVXIX » 2010-08-18 12:47

貌似自己也作了一个命令行下的简单计算器,不过哦风格和LZ很不同,它的功能倒是简单了,但自己愣是把它弄成那种有很多个模块组成的
程序,编译还得写个Makefile ,想着以后有空把它扩展到更强大的计算功能,而不是简单加减乘除。
头像
Destine
论坛版主
帖子: 568
注册时间: 2009-05-05 20:45

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#5

帖子 Destine » 2010-08-18 13:14

怎么看着好昏。
The world never lacks miracles.
boxjellyfish
帖子: 89
注册时间: 2009-08-18 20:35

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#6

帖子 boxjellyfish » 2010-08-19 17:49

代码: 全选

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

char sel;
float a,b;

char getfirst();
float getfloat();
void getnum();

int main()
{
    while(sel!='q')
    {   
       printf("Please enter your option: \n");
       printf("p.plus          m.minus\n");
       printf("t.multiply      d.divide\n");
       printf("q.quit\n");
       sel=getfirst();
       sel=tolower(sel);
       if(sel=='q')
         break;
       switch(sel)
       {
        case 'p':
             getnum();
             printf("%f+%f=%f\n",a,b,a+b);
        break;
        case 'm':
             getnum();
             printf("%f-%f=%f\n",a,b,a-b);
        break;
        case 't':
             getnum();
             printf("%f*%f=%f\n",a,b,a*b);
        break;
        case 'd':
             getnum();
             printf("%f/%f=%f\n",a,b,a/b);
        break;
        default:
            printf("Wrong letter,please enter again\n");
            printf("Please choose p,m,t,d or q\n");
            continue;
        break;
       }
    }
    printf("Bye!");
    getchar();
    getchar();
    return 0;
}

char getfirst()
{
     sel=getchar();
     while(getchar()!='\n')
        continue;             
     return sel;
}

void getnum()        
{
     printf("Please enter a number: ");
     a=getfloat();
     printf("Please enter another number :");
     b=getfloat();
     if(b==0 && sel=='d')
     {
        while(b==0)
        {
           printf("Please enter a number other than 0 :");
           b=getfloat();
        }
     }
}

float getfloat()    
{
     float input;
     char error;
     while(scanf("%f",&input)!=1)
     {
        printf("\"");
        while((error=getchar())!='\n')
          putchar(error);
        printf("\" is not a correct number,please enter again: ");
     }
     return input;
}
boxjellyfish
帖子: 89
注册时间: 2009-08-18 20:35

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#7

帖子 boxjellyfish » 2010-08-19 17:50

首先,哪位帮我移动一下此帖?
头像
philbar
帖子: 35
注册时间: 2010-02-17 16:53

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#8

帖子 philbar » 2010-08-19 18:03

这个很简单getchar()会读到上面的缓冲区中的回车
每次成功读取后下面都不会读后面的
随便改了一下

代码: 全选

#include <stdio.h>

char sel;
float a, b;

char getfirst();
float getfloat();
void getnum();

int main()
{
	while (sel != 'q') {
		printf("Please enter your option: \n");
		printf("p.plus m.minus\n");
		printf("t.multiply d.divide\n");
		printf("q.quit\n");
		sel = getfirst();
		sel = tolower(sel);
		if (sel == 'q')
			break;
		switch (sel) {
		case 'p':
			getnum();
			printf("%f+%f=%f\n", a, b, a + b);
			break;
		case 'm':
			getnum();
			printf("%f-%f=%f\n", a, b, a - b);
			break;
		case 't':
			getnum();
			printf("%f*%f=%f\n", a, b, a * b);
			break;
		case 'd':
			getnum();
			printf("%f/%f=%f\n", a, b, a / b);
			break;
		default:
			printf("%c", sel);
			printf("Wrong letter,please enter again\n");
			printf("Please choose p,m,t,d or q\n");
			continue;
			break;
		}
	}
	printf("Bye!");
	getchar();
	getchar();
	return 0;
}

char getfirst()
{
	sel = getchar();
	while (getchar() != '\n')
		continue;
	return sel;
}

void getnum()
{
	printf("Please enter a number: ");
	a = getfloat();
	printf("Please enter another number :");
	b = getfloat();
	if (b == 0 && sel == 'd') {
		while (b == 0) {
			printf("Please enter a number other than 0 :");
			b = getfloat();
		}
	}
	getchar();
}

float getfloat()
{
	float input;
	char error;
	while (scanf("%f", &input) != 1) {
		printf("\"");
		while ((error = getchar()) != '\n')
			putchar(error);
		printf("\" is not a correct number,please enter again: ");
	}
	return input;
}
:em11 楼主喜欢计算器的话推荐bc :em11
上次由 philbar 在 2010-08-19 18:12,总共编辑 1 次。
头像
philbar
帖子: 35
注册时间: 2010-02-17 16:53

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#9

帖子 philbar » 2010-08-19 18:08

lz的代码我只是用indent稍微改了一下缩进。。。不过还是有点囧阿 :em20
boxjellyfish
帖子: 89
注册时间: 2009-08-18 20:35

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#10

帖子 boxjellyfish » 2010-08-19 21:29

我不是喜欢计算器,只是学习c的菜单的一个练习,重点在于菜单的界面和错误输入的处理
boxjellyfish
帖子: 89
注册时间: 2009-08-18 20:35

Re: 小弟初学c,程序写的很烂,请大家帮忙看一个错误

#11

帖子 boxjellyfish » 2010-08-19 21:30

philbar 写了:这个很简单getchar()会读到上面的缓冲区中的回车
每次成功读取后下面都不会读后面的
随便改了一下

代码: 全选

#include <stdio.h>

char sel;
float a, b;

char getfirst();
float getfloat();
void getnum();

int main()
{
	while (sel != 'q') {
		printf("Please enter your option: \n");
		printf("p.plus m.minus\n");
		printf("t.multiply d.divide\n");
		printf("q.quit\n");
		sel = getfirst();
		sel = tolower(sel);
		if (sel == 'q')
			break;
		switch (sel) {
		case 'p':
			getnum();
			printf("%f+%f=%f\n", a, b, a + b);
			break;
		case 'm':
			getnum();
			printf("%f-%f=%f\n", a, b, a - b);
			break;
		case 't':
			getnum();
			printf("%f*%f=%f\n", a, b, a * b);
			break;
		case 'd':
			getnum();
			printf("%f/%f=%f\n", a, b, a / b);
			break;
		default:
			printf("%c", sel);
			printf("Wrong letter,please enter again\n");
			printf("Please choose p,m,t,d or q\n");
			continue;
			break;
		}
	}
	printf("Bye!");
	getchar();
	getchar();
	return 0;
}

char getfirst()
{
	sel = getchar();
	while (getchar() != '\n')
		continue;
	return sel;
}

void getnum()
{
	printf("Please enter a number: ");
	a = getfloat();
	printf("Please enter another number :");
	b = getfloat();
	if (b == 0 && sel == 'd') {
		while (b == 0) {
			printf("Please enter a number other than 0 :");
			b = getfloat();
		}
	}
	getchar();
}

float getfloat()
{
	float input;
	char error;
	while (scanf("%f", &input) != 1) {
		printf("\"");
		while ((error = getchar()) != '\n')
			putchar(error);
		printf("\" is not a correct number,please enter again: ");
	}
	return input;
}
:em11 楼主喜欢计算器的话推荐bc :em11
谢谢这位仁兄
回复