IT

C, scanf og while-løkke

12. februar 2006 af Sabrina (Slettet)
Det lader til, at jeg er den eneste herinde, som har brug for support :)

Jeg er ved at lære at programmere i C og har i den forbindelse et par spørgsmål efter 1. forelæsning.

1) Hvad er idéen i at sætte variablerne til at have værdier til at starte med, hvis man alligevel beder brugeren indtaste nogle? F.eks.:

float radius = -1.0;
while (radius
printf("\
Enter radius: ");
scanf("%f",&radius);
}

2) I lærebogen C by Dissection er følgende program:
/* Sums are computed. */

#include

int main(void)
{
int cnt = 0;
float sum = 0.0, x;

printf("The sum of your numbers will be computed\
\
");
printf("Input some numbers: ");
while (scanf("%f", &x) == 1) {
cnt = cnt + 1;
sum = sum + x;
}
printf("\
%s%5d\
%s%12f\
\
",
"Count:", cnt,
" Sum:", sum);
return 0;
}

Hvad gør linien
while (scanf("%f", &x) == 1)?
Bliver alle tallene, der indtastes, ikke lagret i x på samme tid?

3) Der er også et andet program i bogen:

/* Find the maximum of n real values. */

#include

int main(void)
{
int cnt = 0, n;
float max, x;

printf("The maximum value will be computed.\
");
printf("How many numbers do you wish to enter? ");
scanf("%d", &n);
while (n
printf("\
ERROR: Positive integer required.\
\
");
printf("How many numbers do you wish to enter? ");
scanf("%d", &n);
}
printf("\
Enter %d real numbers: ", n);
scanf("%f", &x);
max = x;
while (++cnt
scanf("%f", &x);
if (max
max = x;
}
printf("\
Maximum value: %g\
", max);
return 0;
}

Her er mit problem, at jeg ikke forstår, hvorfor der står scanf("%f", &x); inde i while-løkken?


Håber der er en programmeringskyndig person derude, som kan hjælpe en vildfaren på vej.

Svar #1
05. marts 2006 af Sabrina (Slettet)

Hej fixer

Mange tak for din mail! :)

Jeg tror, jeg har fundet ud af spørgsmål 1. Så vidt jeg forstår, tildeles variablerne en værdi til at starte med, så man undgår at komme i en situation, hvor variablen undervejs ikke får en værdi, og den så har en værdi gemt i sig fra tidligere.

Dog har jeg stadig ikke helt styr på scanf i whileløkker.

Hver gang den skal tjekke whileløkkens betingelse, bliver brugeren så bedt om at indtaste en værdi?

Brugbart svar (1)

Svar #2
05. marts 2006 af fixer (Slettet)

1) Initilværdier er nødvendige hvis objekter ikke via eksekveringen af programmet tildeles værdier inden de bruges.

I det konkrete eksempel ville udeladelsen af initialiseringen af radius (til float-værdien -1.0) indebære resultatet af første udførsel af sammenligningsoperationen i whileløkken ville være uforudsigeligt. Der vil ved oversættelsen ske det, at variablen 'radius' associeres med en given lageraddresse. Når processoren skal udføre sammenligningsoperationen vil den hente hvad der står på denne addresse. Hvis ikke man søger for, at der står noget meningsfyldt, kan der i princippet stå hvad som helst. Man kan ikke forlade sig på, at oversætteren (=compileren) sørger for at lagerområdet er initialiseret (f.eks. nulstillet).

Prøv at udelade initialiseringen af radius. Du vil formodentligt se, at du aldrig bliver spurgt om en værdi. I så fald skyldes det, at første gang sammenligningsoperationen udføres, står der en værdi i lageret, som tilfældigvis ikke svarer til en negativ float. Sammenligningen evaluerer derfor til falsk og løkken udføres aldrig.

2) scanf er en funktion, der scanner stdin (standard input) for input, sender det igennem en formattering og gemmer resultatet af denne formattering via pegere (pointers) til pladsholdere. Funktionen returnerer antallet af input, den med succes har formatteret.

Funktionsdeklarationen er

int scanf(const char* format,...);

hvor format er formatstrengen, som indledes med et %. Efter formatstrengen følger en liste af pegere til de pladsholdere, hvortil de formatterede input skal gemmes.

I sætningen

while (scanf("%f", &x) == 1)?

skal scanf således aftaste standard input for eet input, konvertere dette til en float ("%f" - f betyder float) og gemme den i variablen x. Udtrykket &x betyder addressen af x, og er derfor en peger til x. Bemærk at symbolet & også bruges i logiske sammenligningsoperationer - dybt ulogisk.

Hvis konverteringen går godt, dvs hvis der rent faktisk indtastes en værdi, som _kan_ konverteres til en float, så vil scanf returnere værdien 1. Der står da at læse, at while løkken skal udføres indtil der indtastes en værdi, der ikke kan konverteres.

3) Burde du nu kunne svare på: der læses en værdi fra stdin som -om muligt- konvereteres til en float og gemmes i x. Dette så længe den akkumulerede værdi i cnt ikke ovrestiger n, d.v.s. indtil der er indtastet præcis n tal.

Sammenlign med

printf("\
Enter %d real numbers: ", n);

som henter det antal cifre, n, som whileløkken skal hente.

Svar #3
08. marts 2006 af Sabrina (Slettet)

Mange tak for dit svar! :)

Standard input er blot det input, som jeg indtaster på tastaturet? Mens standard outout er det, som vises på skærmen?

Har hørt de to begreber før, men er ikke helt sikker på, om det forholder sig således (især med standard output).

Brugbart svar (1)

Svar #4
09. marts 2006 af fixer (Slettet)

Ja, som standard tilgår stdin tastaturet og stdout skærmen. Der findes også en stederr stream som også per default tilgår skærmen. På UNIX-systemer kan man separere stdout og stderr så output sendes forskellige steder hen.

Svar #5
11. marts 2006 af Sabrina (Slettet)

Mange tak for svaret :)

Du må have en god weekend!

Skriv et svar til: C, scanf og while-løkke

Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk? Klik her for at oprette en bruger.