各位前辈帮忙看一下。

状态的状 2017-12-07 08:36:42

我使用加法 减法运算完以后 返回主菜单或者取消都会出现卡机的情况 。乘发 除法则不会。












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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

float a ,b ,aa,cc ,bb=0; //a==存储运算方式 b==储存计算的个数 aa==储存单个运算数 bb==累计器
int i=1; //循环变量

printf("简易计算 \n 1=加法运算 \n 2=减法运算 \n 3=乘法运算 \n 4=除法运算\n ");
ll1: ll2: ll3: ll4:
printf(" 请输入序号选择运算符:");

l: ll:
scanf("%f",&a);
fflush(stdin);
if(a-(int)a!=0||a<=0)
{
printf("请输入范围内的序号 以便选择运算方式!....重新输入:") ;
goto ll;


}
else

{

switch((int)a)
{
case 1: printf("请输入需要相加个数:");
l1:
scanf("%f",&b );
if (b<=1||b-(int)b!=0){

printf("请输入正确的相加个数!重新输入:"); goto l1;

}

else
{


while(i<=b)
{

printf("请输入第%d一个数:",i);
scanf("%f",&aa);
bb=bb+aa;
i++;

}
printf("求和=%g\n\n",bb);

printf("\n选择是否返回主菜单!、 \n输入 0 结束,输入 1 返回主菜单: ");
scanf ("%f",aa);


if (cc)
{

goto ll1;
}

else {
break;
}

}

break;


case 2: printf("请输入需要被减次数:") ;
l2:
scanf("%f",&b);
if(b<=0||b-(int)b!=0){
printf("请输入正确的次数!重新输入:") ; goto l2;

}

else{


printf("请输入被减数:");
scanf("%f",&bb) ;

while(i<=b)
{
printf("请输入第%d个减数:",i);
scanf("%f",&aa) ;
bb=bb-aa;
i++;
}

printf("求差=%g\n\n",bb);

printf("\n选择是否返回主菜单!\n 输入 0 结束,输入 1 返回主菜单:");
scanf("%f",cc);
if(aa)
{
goto ll2;
}

else {
break;
}




}

break;

case 3: bb=1;

printf("请输入需要相乘的个数:") ;
l3:
scanf("%f",&b);
if(b<2||b-(int)b!=0)
{
printf("请输入正确的相乘个数!重新输入:") ; goto l3;
}

else
{


for(;i<=b;i++)
{


printf("请输入第%d个数:",i);
scanf("%f",&aa);

bb=bb*aa;



}

printf("求积=%g\n\n",bb);


printf("\n选择是否返回主菜单! \n输入 0 结束,输入 1 返回主菜单:");
scanf("%f",&cc);
if(cc)
{
goto ll3;

}

else {
break;
}
}


break;



case 4:
printf("请输入被除次数");
l4:
scanf("%f",&b);
if(b<1||b-(int)b!=0)
{
printf("请输入正确的次数!重新输入:"); goto l4;

}

else {

printf("请输入被除数:") ;
scanf("%f",&bb);

while(i<=b)
{
printf("请输入第%d个除数:",i);
scanf("%f",&aa);
bb=bb/aa;
i++;




}

printf("求商=%g\n\n",bb);

printf("\n选择是否返回主菜单!\n 输入 0 结束,输入 1 返回主菜单:");
scanf("%f",&cc);
if(cc)
{
goto ll4;

}
else {
break;
}



}

break;


default:
printf("请输入范围内的序号 以便选择运算方式!....重新输入:") ; goto l;

break;





}




}


getchar();






return 0;

}









...全文
201 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
自信男孩 2017-12-08
另外,注释不一定要多,只需要将关键和容易混淆的代码加上注释即可。简单的变量声明,定义,函数定义,声明没必要加注释。 如果变量和函数定义命名做到见名知意是最好的,完美的。可以省去注释
  • 打赏
  • 举报
回复
自信男孩 2017-12-08
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int get_opt(void)
{
    int ch = 1;

    while (1) {
        printf("简易计算 \n 1=加法运算 \n 2=减法运算 \n 3=乘法运算 \n 4=除法运算\n ");
        printf("请输入序号选择运算符:");
        scanf("%d", &ch);
        if (ch > 0 && ch <= 4)
            break;
        else
            printf("请输入范围内的序号 以便选择运算方式!....重新输入:") ;
    }

    return ch;
}

static int get_nums(void)
{
    int n;

    while (1) {
        printf("请输入需要相加/相减/相乘/相除个数:");
        scanf("%d", &n);
        if (n > 1)
            break;
        else
            printf("请输入正确的个数!重新输入:");
    }

    return n;

}

void add(void)
{
    int n = 0, i = 0;
    float sum = 0, num;

    n = get_nums();
    while (i < n) {
        printf("请输入第%d一个数:", i+1);
        scanf("%f",&num);
        sum += num;
        i++;
    }

    printf("求和 = %f\n\n", sum);
}

void sub(void)
{
    int n = 0, i = 0;
    float s, num;

    n = get_nums();

    printf("请输入被减数:");
    scanf("%f", &s);
    while (i < n) {
        printf("请输入第%d一个数:", i+1);
        scanf("%f", &num);
        s -= num;
        i++;
    }

    printf("求差 = %f\n\n", s);
}

void mul(void)
{
    int n = 0, i = 0;
    float sum = 1.0, num;

    n = get_nums();
    while (i < n) {
        printf("请输入第%d一个数:", i+1);
        scanf("%f", &num);
        sum *= num;
        i++;
    }

    printf("求积 = %f\n\n", sum);
}

void div(void)
{
    int n = 0, i = 0;
    float s, num;

    n = get_nums();

    printf("请输入被除数:");
    scanf("%f", &s);
    while (i < n) {
        printf("请输入第%d一个数:", i+1);
        scanf("%f", &num);
        if (fabs(num - 0) < 1e-6)
            continue;
        s /= num;
        i++;
    }
    printf("求商 = %f\n\n", s);
}



int main(int argc, char *argv[])
{

    int ch;

    while (1) {
        ch = get_opt();

        switch (ch) {
            case 1:
                add();
                break;

            case 2:
                sub();
                break;

            case 3:
                mul();
                break;

            case 4:
                div();
                break;
        }

    }

    return 0;
}
代码的可读性是一个很重要的问题,建议将自己的代码不论是格式,风格都做好好一些,有条理一些; 不建议使用goto,尤其楼主这样的使用goto。其实可以用循环实现goto的功能的。 以上的代码是我的修改,可以参考一下。
  • 打赏
  • 举报
回复
自信男孩 2017-12-08
引用 2 楼 HomerRo 的回复:
楼主:慎用 goto无条件转移语句。
建议接收这个建议。因为goto语句很容易让自己不知道程序运行到哪了。为了不给自己找麻烦,用其他方法替换goto使用
  • 打赏
  • 举报
回复
HomerRo 2017-12-07
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> void Calc(char* str) { char* pRes = strpbrk(str, "+-*/%"); if (!pRes) { puts("本软件支持+-*/%五种运算,请按格式输入,例如:输入XX 1+2回车"); return ; } char c = *pRes; double left = atof(str); double right = atof(pRes + 1); double result = 0; switch (c) { case '+': result = left + right; break; case '-': result = left - right; break; case '*': result = left * right; break; case '/': //{ //if (!right) //{ // puts("错误!除数不能为0"); //} result = left / right; break; //} case '%': result = (int)left % (int)right; break; } printf("=%lf\n", result); //字符串字符查找函数 } //int main(int count,char* ps[]) int main(int count,char** ps)//DOS应用程序 { if (count < 2) { puts("本软件支持+-*/%五种运算,请按格式输入,例如:输入XX 1+2回车"); return -1; } //假设用户如此键入:DOS 33+52 char s[64] = {0}; int i = 0; while (ps[++i]) strcat(s, ps[i]); Calc(s); return 0; } 这是DOS界面或控制台下运行的计算器程序,供参考和学习O(∩_∩)O
  • 打赏
  • 举报
回复
HomerRo 2017-12-07
楼主:慎用 goto无条件转移语句。
  • 打赏
  • 举报
回复
paschen 2017-12-07
printf("\n选择是否返回主菜单!、 \n输入 0 结束,输入 1 返回主菜单: "); scanf("%f", aa); 改成: printf("\n选择是否返回主菜单!、 \n输入 0 结束,输入 1 返回主菜单: "); scanf("%f", &aa);
  • 打赏
  • 举报
回复
相关推荐
发帖
新手乐园
加入

3.3w+

社区成员

C/C++ 新手乐园
社区管理员
  • 新手乐园社区
申请成为版主
帖子事件
创建了帖子
2017-12-07 08:36
社区公告
暂无公告