计算器程序是我的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;
}
为了更好的可读性或减少程序的大小,还有什么我可以解决的吗?
答案 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
而是使用sscanf
和fgets
,因为它们可以减少您的意外。
该功能可能如下所示:
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);