C简单的计算器,摆脱无用的线条

时间:2017-06-15 14:14:30

标签: c

计算器程序是我的C介绍网络课程的作业。

我如何才能更好地包含此部分:(目前包含在其他所有if语句中)

                printf("\nSyötä ensimmäinen luku:");
                scanf("%d", &ekaluku);

                printf("Syötä toinen luku:");
                scanf("%d", &tokaluku);
代码中的

而不更改output

源代码:

#include <stdio.h>

int laskesumma(int a, int b);
int laskeerotus(int a, int b);
int lasketulo(int a, int b);

int main(void)  
{
    int valinta, ekaluku, tokaluku;

    do {

        printf("1: kahden luvun summa\n2: kahden luvun erotus\n3: kahden luvun tulo\n<0: ohjelman lopetus\n\nValitse laskutoimitus:");
        scanf("%d", &valinta);


        if (valinta < 0)
        { printf("Ohjelma lopetetaan...\n\n"); }

        else if (valinta == 1)
        {  

            printf("\nSyötä ensimmäinen luku:");
            scanf("%d", &ekaluku);

            printf("Syötä toinen luku:");
            scanf("%d", &tokaluku);

            printf("%d + %d = %d\n\n", ekaluku, tokaluku, laskesumma(ekaluku,tokaluku)); 


        }

        else if (valinta == 2)
        { 
            printf("\nSyötä ensimmäinen luku:");
            scanf("%d", &ekaluku);

            printf("Syötä toinen luku:");
            scanf("%d", &tokaluku);

            printf("%d - %d = %d\n\n", ekaluku, tokaluku, laskeerotus(ekaluku,tokaluku)); 

        }

        else if (valinta == 3)
        { 

            printf("\nSyötä ensimmäinen luku:");
            scanf("%d", &ekaluku);

            printf("Syötä toinen luku:");
            scanf("%d", &tokaluku);

            printf("%d * %d = %d\n\n", ekaluku, tokaluku, lasketulo(ekaluku,tokaluku)); 

        }

        else 
        { printf("Antamasi luku ei kelpaa.\n"); }

    } while (valinta>0);

    return 0;
}

//Addition
int laskesumma(int a, int b) {
    int tulos;
    tulos = a+b;
    return tulos;
}

//Subtraction
int laskeerotus(int a, int b) {
    int tulos; 
    tulos = a-b;
    return tulos;
}   

//Multiplication
int lasketulo(int a, int b) {
    int tulos; 
    tulos = a*b;
    return tulos; 
}

为了更好的可读性或减少程序的大小,还有什么我可以解决的吗?

6 个答案:

答案 0 :(得分:2)

一种可能性是:

int ekaluku_tokaluku(int *ekaluku, int *tokaluku)
{
    printf("\nSyötä ensimmäinen luku:");
    if (scanf("%d", ekaluku) != 1)
        return EOF;

    printf("Syötä toinen luku:");
    if (scanf("%d", tokaluku) != 1)
        return EOF;
    return 0;
}

请注意,变量作为指针传递给函数,因此&调用中没有scanf()。有些人可能会在名称上使用p_ekaluku(或pEkaluku)等前缀来表示它们是指针。

你会这样使用它:

else if (valinta == 1)
{  
    if (ekaluku_tokaluku(&ekaluku, &tokaluku) != 0)
        break;
    printf("%d + %d = %d\n\n", ekaluku, tokaluku, laskesumma(ekaluku, tokaluku));
}

成功时返回0是一种常见模式。总是值得检查您的代码处理EOF条件。您可以考虑在函数中的fflush(stdout);之后和printf()语句之前添加scanf()

答案 1 :(得分:1)

如果您经常重复这些代码行并返回整数值,请使用函数。

int userInput() {
    int ekaluku;
    printf("\nSyötä ensimmäinen luku:");
    scanf("%d", &ekaluku);
    return ekaluki;
}

答案 2 :(得分:0)

这可能会更短(行数):

  int laskesumma(int a, int b) { return (a+b);} //Addition
  int laskeerotus(int a, int b){ return (a-b);} //Subtraction
  int lasketulo(int a, int b) {  return (a*b);} //Multiplication

但在需要更复杂功能的情况下可读性更低......

答案 3 :(得分:0)

无论何时在程序中的某个地方重复代码块,都应该考虑将该代码块放入函数中。这将使维护代码变得更加容易。

除此之外,我建议您不要使用scanf - 它有许多惊喜。例如,尝试为您的程序提供输入1a

而是使用sscanffgets,因为它们可以减少您的意外。

该功能可能如下所示:

int get_input(FILE *fp, int n)
{
    int d = 0;
    char line[LINESIZE];

    if (n > 0)
    {
        printf("Input the %d. number\n", n);
    }

    if(!fgets(line, LINESIZE,fp))
    {
        printf("Error reading input\n");
        return 0;
    }

    if (sscanf(line, "%d", &d) != 1)
    {
        printf("Error reading input\n");
        return 0;
    }

    return d;
}

它可以像:

一样使用
do 
{
    printf("1: kahden luvun summa\n2: kahden luvun erotus\n3: kahden luvun tulo\n<0: ohjelman lopetus\n\nValitse laskutoimitus:");

    valinta = get_input(stdin, 0);
    if (valinta < 0)
    { 
        printf("Ohjelma lopetetaan...\n\n"); 
    }
    else if (valinta == 1)
    {  
        ekaluku= get_input(stdin, 1);
        tokaluku= get_input(stdin, 2);
        printf("%d + %d = %d\n\n", ekaluku, tokaluku, laskesumma(ekaluku,tokaluku)); 
    }

答案 4 :(得分:0)

像这样减少代码

#include <stdio.h>

#define make_func(name, op)\
static inline int name(int a, int b){\
    return a op b;\
}\
/**/

make_func(laskesumma , +) //Addition
make_func(laskeerotus, -) //Subtraction
make_func(lasketulo  , *) //Multiplication

#define op(no)   ( " +-*"[no] )
typedef int (*Func)(int,int);
#define func(no) ( (Func[]){ 0, laskesumma, laskeerotus, lasketulo}[no] )

enum { QUIT, ADD, SUB, MUL };

int main(void){
    int valinta, ekaluku, tokaluku;

    do {
        printf("%d: kahden luvun summa\n"
               "%d: kahden luvun erotus\n"
               "%d: kahden luvun tulo\n"
               "<%d: ohjelman lopetus\n\n"
               "Valitse laskutoimitus:", ADD, SUB, MUL, QUIT);fflush(stdout);
        scanf("%d", &valinta);

        switch(valinta){
        case ADD:
        case SUB:
        case MUL:
            printf("\nSyota ensimmainen luku:");fflush(stdout);
            scanf("%d", &ekaluku);

            printf("Syota toinen luku:");fflush(stdout);
            scanf("%d", &tokaluku);

            printf("%d %c %d = %d\n\n", ekaluku, op(valinta), tokaluku, func(valinta)(ekaluku, tokaluku));
            break;
        default:
            if(valinta < QUIT){
                printf("Ohjelma lopetetaan...\n\n");
                return 0;
            }
            printf("Antamasi luku ei kelpaa.\n"); 
        }
    } while (valinta > QUIT);

    return 0;
}

答案 5 :(得分:0)

尝试在代码中使用switch case

do
{
if(valinta<0)
   printf("Ohjelma lopetetaan...\n\n");
switch(valinta)
{
case 1:
case 2:
case 3:
          printf("\nSyötä ensimmäinen luku:");
            scanf("%d", &ekaluku);
            printf("Syötä toinen luku:");
            scanf("%d", &tokaluku);
            break;
default: printf("Antamasi luku ei kelpaa.\n");
}
}while(valinta>0);