Avatar billede tchami Nybegynder
12. september 2003 - 12:07 Der er 7 kommentarer og
1 løsning

Uendelig løkke i lommeregner

Hej,

Jeg er netop gået i gang med at lære lidt C, og har fået lavet mig en lille lommeregner der kan addere, subtrahere, multiplicere og dividere alt efter hvad man vælger i menuen. Det virker også fint nok, hvis man altså indtaster et integer som valg og ikke f.eks. et bogstav. Hvis inputtet er ugyldigt laver den en uendelig løkke, så hvordan checker jeg på om inputtet rent faktisk er en int?

Og er der ellers nogle forslag til forbedringer?

Koden er her:

#include <stdio.h>

main () {

    int choice;
    float a, b;
   
    do{
    printf("Vaelg en regneart:\n");
    printf("1: Addere\n");
    printf("2: Subtrahere:\n");
    printf("3: Multiplicere:\n");
    printf("4: Dividere:\n");             
    printf("5: Stop\n");                 
   
    scanf("%i", &choice);

        switch(choice){     
          case 1:
                  printf("\nDu har valgt at addere\n");
                  printf("Indtast A: ");       
                  scanf("%f", &a);
                  printf("Indtast B: ");                               
                  scanf("%f", &b);
                  printf("Resultatet er: ");                               
                  printf("%.2f", a+b);                 
                  printf("\n\n");
                  break;
          case 2:
                  printf("\nDu har valgt at subtrahere\n");
                  printf("Indtast A: ");       
                  scanf("%f", &a);
                  printf("Indtast B: ");                               
                  scanf("%f", &b);
                  printf("Resultatet er: ");                               
                  printf("%.2f", a-b);                 
                  printf("\n\n");
                  break;
          case 3:
                  printf("\nDu har valgt at multiplicere\n");
                  printf("Indtast A: ");       
                  scanf("%f", &a);
                  printf("Indtast B: ");                               
                  scanf("%f", &b);
                  printf("Resultatet er: ");                               
                  printf("%.2f", a*b);                 
                  printf("\n\n");
                  break;
          case 4:
                  printf("\nDu har valgt at dividere\n");
                  printf("Indtast A: ");       
                  scanf("%f", &a);
                  printf("Indtast B: ");                               
                  scanf("%f", &b);
                  printf("Resultatet er: ");                               
                  printf("%.2f", a/b);                 
                  printf("\n\n");
          case 5:
                  break;                                                   
          default:
                  break;
          }
  }while (choice != 5);
}
Avatar billede arne_v Ekspert
12. september 2003 - 12:11 #1
Læs en streng ind og brug strtod til at konvertere til double med.
Avatar billede arne_v Ekspert
12. september 2003 - 12:12 #2
Her er et eksmepel som viser hvordan man tester på om man har læset et
validt tal:

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

void testi(char *s)
{
  int v;
  char *ep;
  v = atoi(s);
  printf("%s = %d\n",s,v);
  v = strtol(s, &ep, 10);
  if(ep > s)
  {
      printf("%s = %d\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}

void testfp(char *s)
{
  double v;
  char *ep;
  v = atof(s);
  printf("%s = %f\n",s,v);
  v = strtod(s, &ep);
  if(ep > s)
  {
      printf("%s = %f\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}

int main()
{
  testi("123");
  testi("abc");
  testfp("123.456");
  testfp("abc.def");
}
Avatar billede tonnybrandt Nybegynder
12. september 2003 - 12:18 #3
Nu er det et godt stykke tid siden jeg har programmeret i c, men jeg ville da bare lave min errorhandling i default. Rammer den derned, er der indtastet noget der ligger udenfor 1-->5 og det indtastede er dermed ugyldigt.
Avatar billede tchami Nybegynder
12. september 2003 - 12:28 #4
>> arne_v Altså med getchar?

>> tonnybrandt Mmm, hvordan?
Avatar billede arne_v Ekspert
12. september 2003 - 12:33 #5
Nej bare:

char s[100];
scanf("%s",s);
Avatar billede tonnybrandt Nybegynder
12. september 2003 - 12:35 #6
Du ved at den ikke er tastet 1--5 for ellers ville den ikke ende i default.
så du bestemmer egentligt hvad der skal ske.

        default:
                printf("\nDin indtastning var ikke korrekt\n");
                choice=0;
                break;
eller
        default:
                printf("\nDin indtastning var ikke korrekt. Lukker\n");
                choice=5;
                break;
Avatar billede arne_v Ekspert
12. september 2003 - 12:55 #7
Erstat:

printf("Vaelg en regneart:\n");
printf("1: Addere\n");
printf("2: Subtrahere:\n");
printf("3: Multiplicere:\n");
printf("4: Dividere:\n");             
printf("5: Stop\n");                 
scanf("%i", &choice);

med:

char buf[100],*ep;
...
do
{
    printf("Vaelg en regneart:\n");
    printf("1: Addere\n");
    printf("2: Subtrahere:\n");
    printf("3: Multiplicere:\n");
    printf("4: Dividere:\n");             
    printf("5: Stop\n");                 
    scanf("%s",buf);
    choice = strtol(buf, &ep, 10);
} while((ep==buf)||(choice<1)||(choice>5));

den vil læse ind indtil der er indtastet et tal 1-5.
Avatar billede tchami Nybegynder
20. september 2003 - 13:09 #8
Point til dig Arne, og en stor tak til jer begge.

Beklager det tog så lang tid.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester