Как исправить "return 0 / exit (0) не работает должным образом внутри цикла"? - PullRequest
0 голосов
/ 28 апреля 2019

Я делал научный калькулятор. И думал о зацикливании операторов, пока пользователь не попросит остановиться, используя 0 в качестве одного из вариантов. Но даже после ввода 0. Он просит в последний раз это утверждение: printf("Enter two numbers (For only one no. required you can just enter other number anything)\n");

Я пытался использовать операторы goto, exit(0) и return 0. Даже while(1) и for(;;) петля также.

#include <stdio.h>
#include<math.h>
int main()
{
    int a;
    float b,c;
    float d=3.14159/180;
    while(1)
    {
    printf("\nScientific Calculator :\n");
    printf("Enter option:\n 0- Exit, 1-Add, 2-Sub, 3-Multiply, 4-Divide,\n 5-sin(x), 6-cos(x), 7-tan(x), 8-sinh(x), 9-cosh(x), 10-tanh(x),\n11-log10(x),12-exponent,13-power of x w.r.t y \n");
    scanf("%d",&a);
    printf("Enter two numbers (For only one no. required you can just enter other number anything)\n"); //Here is where it starts even after return 0
    scanf("%f%f",&b,&c); //Here after inputting value it ends.
    switch(a)
    {
        case 0:return 0; //Here is the return 0;
        case 1:printf("%d",(int)(b+c)); break;
        case 2:printf("%d",(int)(b-c)); break;
        case 3:printf("%d",(int)(b*c)); break;
        case 4:printf("%f",b/c); break;
        case 5:printf("%f",sin(b*d)); break;
        case 6:printf("%f",cos(b*d)); break;
        case 7:printf("%f",tan(b*d)); break;
        case 8:printf("%f",sinh(b*d)); break;
        case 9:printf("%f",cosh(b*d)); break;
        case 10:printf("%f",cosh(b*d)); break;
        case 11:printf("%f",tanh(b*d)); break;
        case 12:printf("%f",log10(b)); break;
        case 13:printf("%f",exp(b)); break;
        case 14:printf("%f",pow(b,c)); break;
        default:printf("Enter correct option\n");
    }
    }
    return 0;

}

Я хотел, чтобы он просто вышел и вышел из программы, но он запрашивает ввод printf("Enter two numbers ---\n");, а после ввода значений он выходит.

1 Ответ

0 голосов
/ 28 апреля 2019

Но даже после ввода 0. В последний раз спрашивает это утверждение: printf("Enter two numbers (For only one no. required you can just enter other number anything)\n");

вам нужно немедленно проверить регистр '0', поэтому

 printf("Enter option:\n 0- Exit, 1-Add, 2-Sub, 3-Multiply, 4-Divide,\n 5-sin(x), 6-cos(x), 7-tan(x), 8-sinh(x), 9-cosh(x), 10-tanh(x),\n11-log10(x),12-exponent,13-power of x w.r.t y \n");
 scanf("%d",&a);
 printf("Enter two numbers (For only one no. required you can just enter other number anything)\n"); //Here is where it starts even after return 0
 scanf("%f%f",&b,&c); //Here after inputting value it ends.
 switch(a)
    case 0:return 0; //Here is the return 0;
    case 1:printf("%d",(int)(b+c)); break;
    ...

должно быть

printf("Enter option:\n 0- Exit, 1-Add, 2-Sub, 3-Multiply, 4-Divide,\n 5-sin(x), 6-cos(x), 7-tan(x), 8-sinh(x), 9-cosh(x), 10-tanh(x),\n11-log10(x),12-exponent,13-power of x w.r.t y \n");
scanf("%d",&a);
if (a == 0)
  return 0;

printf("Enter two numbers (For only one no. required you can just enter other number anything)\n"); //Here is where it starts even after return 0
scanf("%f%f",&b,&c); //Here after inputting value it ends.
switch(a)
   case 1:printf("%d",(int)(b+c)); break;
   ...

Обратите внимание, что также может быть хорошей идеей проверить правильность введенного значения int , чтобы проверить, возвращает ли scanf("%d",&a) 1, и то же самое для scanf("%f%f",&b,&c), поэтому проверка возвращает 2 ...

Как сказано в замечании @OznOg для случаев 12 и 13, вам нужно прочитать только одно число, а не два. Обратите внимание, что бесполезно запрашивать номер, если код недействителен, поэтому:

  if (scanf("%d",&a) != 1)
    return -1;

  if (a == 0)
    return 0;

  if ((a < 0) || (a > 14))
    printf("Enter correct option\n");
  else if ((a == 12) || (a == 13)) {
    printf("Enter one number\n");
    if (scanf("%f",&b) != 1)
      return -1;
    if (a == 12)
      printf("%f",log10(b)); 
    else
      printf("%f",exp(b)); break;
  }
  else {
    printf("Enter two numbers\n");
    if (scanf("%f%f",&b,&c) != 2)
      return -1;
    switch(a)
    {
    case 1:printf("%d",(int)(b+c)); break;
    case 2:printf("%d",(int)(b-c)); break;
    case 3:printf("%d",(int)(b*c)); break;
    case 4:printf("%f",b/c); break;
    case 5:printf("%f",sin(b*d)); break;
    case 6:printf("%f",cos(b*d)); break;
    case 7:printf("%f",tan(b*d)); break;
    case 8:printf("%f",sinh(b*d)); break;
    case 9:printf("%f",cosh(b*d)); break;
    case 10:printf("%f",cosh(b*d)); break;
    case 11:printf("%f",tanh(b*d)); break;
    case 14:printf("%f",pow(b,c)); break;
    }
  }
...