Avatar billede piske Nybegynder
03. august 2005 - 19:26 Der er 10 kommentarer

do while løkke

Jeg kan ikke rigtig få dette til at virke. Jeg vil gerne have det sådan, at når den har udregnet resultatet, at den så spørger om man vil lave en beregning mereog hvis man så trykkede 1/j eller 2/n så hoppede tilbage til start/afslutter programmet.

Min kode ser således ud :

/* Opgave 2 - Temperatur */

#include <stdio.h>            // Inkluderer denne standard fil
#include <stdlib.h>            // Inkluderer denne standard fil

void main(void)
{                            // Program start

int temp,skala = 0,resultat;

system("cls");
       
    printf("\t\tVelkommen til Nielsens temperatur omregner \n");
    printf("\t\t\t\tV\x91lg beregner : \n\n\n");
    printf("\t\t1 : Celcius til Fahrenheit! \n");
    printf("\t\t2 : Fahrenheit til Celcius! \n");
    printf("\t\t3 : Celcius til Kelvin! \n");
    printf("\t\t4 : Celcius til Newton!");
   

    scanf("%d" ,&skala);
   
    printf("\t\tIndtast temperatur der skal omregnes: ");
    scanf("%d", &temp);
   
    if (skala == 1)                                                   
    {
        printf("\t\tResultatet i Fahrenheit er : %d grader fahrenheit", (temp * 2) - (temp * 2 * 0,1) + 32);    // Beregner og viser resultatet C til F
    }
   
    if (skala == 2)
    {
        printf("\t\tResultatet i Celcius er : %d grader celcius", (temp - 32) * 5 / 9);                            // Beregner og viser resultatet F til C
    }

    if (skala == 3)
    {
        printf("\t\tResultatet i Kelvin er : %d grader Kelvin", (temp + 273,15));                                // Beregner og viser resultatet C til K
    }   

    if (skala == 4)
    {
        printf("\t\tResultatet i Newton er : %d Newton", (temp * 33 / 100));                                    // Beregner og viser resultatet C til N
    }
   
}                            // Program slut
Avatar billede arne_v Ekspert
03. august 2005 - 19:34 #1
du skal vel have en do while løkke - noget a la:

char c;
...
do
{
  ...
  printf("Vil du fortsætte ?");
  scanf("%c",&c);
} while(c=='J' || c=='j');
Avatar billede bertelbrander Novice
03. august 2005 - 20:36 #2
Du skal, som Arne nævner, have en do {} while, men det hjælper ikke fordi du bruger scanf.

Når prgrammet skal læse karakteren til slut er der en '\n' i keyboard buffern, så den vil du læse og ikke det brugeren har trykket!

Den bedste måde at omgå problemet er at bruge fgets til at læse et char array, og strtol til at konvertere char array'et (en string) til en int.

Du mener nok 0.1 og 273.15 og ikke 0,1 og 273,15
Avatar billede piske Nybegynder
03. august 2005 - 20:50 #3
jeg takker for svarene! :)
Avatar billede arne_v Ekspert
03. august 2005 - 21:13 #4
en lidt modificeret udgave:

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

int main()
{
    int temp,skala = 0,resultat;
    char c;
   
    do
    {
        system("cls");
       
        printf("\t\tVelkommen til Nielsens temperatur omregner\n");
        printf("\t\t\t\tV\x91lg beregner :\n\n\n");
        printf("\t\t1 : Celcius til Fahrenheit!\n");
        printf("\t\t2 : Fahrenheit til Celcius!\n");
        printf("\t\t3 : Celcius til Kelvin!\n");
        printf("\t\t4 : Celcius til Newton!\n");
        scanf("%d" ,&skala);
        fflush(stdin);
       
        printf("\t\tIndtast temperatur der skal omregnes: ");
        scanf("%d", &temp);
        fflush(stdin);
       
        switch(skala)
        {
            case 1:
            printf("\t\tResultatet i Fahrenheit er : %d grader fahrenheit\n\n", (temp * 2) - (temp * 2 * 0,1) + 32);
            break;
            case 2:
            printf("\t\tResultatet i Celcius er : %d grader celcius\n\n", (temp - 32) * 5 / 9);
            break;
            case 3:
            printf("\t\tResultatet i Kelvin er : %d grader Kelvin\n\n", (temp + 273,15));
            break;
            case 4:
            printf("\t\tResultatet i Newton er : %d Newton\n\n", (temp * 33 / 100));
            break;
            default:
            printf("\t\tUkendt konvertering\n\n");
        }
        printf("Vil du fortsætte ?");
        scanf("%c",&c);
    } while(c=='J' || c=='j');
    return 0;
}

jeg har:
  - sat do while løkken ind
  - skiftet de 4 if'er med en switch
  - ændret main fra void til int
  - bruger fflush på stdin for at undgå de problemer bertel påpeger
Avatar billede bertelbrander Novice
03. august 2005 - 21:27 #5
Der er et lille problem med fflush(stdin); der er ingen garanti for at det virker.
Avatar billede arne_v Ekspert
03. august 2005 - 21:32 #6
Er den ANSI undefined for input streams ?
Avatar billede bertelbrander Novice
03. august 2005 - 21:36 #7
Der står i C standarden (det er det samme i C++):
7.19.5.2 The fflush function
Synopsis
#include <stdio.h>
int fflush(FILE *stream);
Description
If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.
Avatar billede arne_v Ekspert
03. august 2005 - 21:40 #8
så må vi nøjes med at sige at koden tilfældigvis virker med nogle af de
gængse compilere
Avatar billede bertelbrander Novice
03. august 2005 - 21:42 #9
Så vidt jeg ved virker det ikke på Linux/Unix.
Avatar billede arne_v Ekspert
03. august 2005 - 22:04 #10
Lidt hurtig googling siger at fflush vil returnere fejl på Linux, men at man
til gengæld skulle kunne kalde en glibc specifik funktion __fpurge.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis