Vad säger lösningen
Uppgiften är :
Ett användningsområde för fält är att räkna hur ofta något förekommer, t.ex. hur ofta vissa heltal
förekommer. Skriv ett program som låter användaren mata in heltal mellan 0 och 10. Använd ett fält
för att hålla reda på hur många nollor, ettor, tvåor osv som användaren gett. Loopen avslutas när
användaren skriver in ett negativt tal eller ett tal större än 10. Efter loopen skall innehållet i fältet
skrivas ut på samma sätt som tidigare.
Exemp el på körning:
Enter an integer (0-9): 1
Enter an integer (0-9): 2
Enter an integer (0-9): 4
Enter an integer (0-9): 3
Enter an integer (0-9): 4
Enter an integer (0-9): 5
Enter an integer (0-9): 5
Enter an integer (0-9): 6
Enter an integer (0-9): 4
Enter an integer (0-9): 3
Enter an integer (0-9): 4
Enter an integer (0-9): 9
Enter an integer (0-9): -1
The number 0 was entered 0 time(s).
The number 1 was entered 1 time(s).
The number 2 was entered 1 time(s).
The number 3 was entered 2 time(s).
The number 4 was entered 4 time(s).
The number 5 was entered 2 time(s).
The number 6 was entered 1 time(s).
The number 7 was entered 0 time(s).
The number 8 was entered 0 time(s).
The number 9 was entered 1 time(s).
Tänk på hur stor ditt fält b ör vara. Tänk också på att utforma din loop (kanske med en if-sats eller
två) för att hindra att ett felaktigt index används i fältet.
I lösningsförslaget står det:
#include <stdio.h>
int main(void) {
int count[11] = {0}; Varför deklarerade de fältet på det sättet? varför {0}????
int answer;
do {
printf("Ange ett heltal (0 –10):");
scanf("%d", &answer);
if (answer >= 0 && answer <= 10) {
count[answer]++; Tacksam om någon kan berätta tydligt vad som händer här.
}
} while (answer >= 0 && answer <= 10);
printf("\n"); Kan man alltid gå vidare i koden genom att skriva printf("\n") ???
for (int i = 0; i < 11; i++) {
printf("Det fanns %d tal med värdet %d\n", count[i], i);
}
return 0;
}
Varför skriver de {0} ??
vad säger denna lopp??
if (answer >= 0 && answer <= 10) {
count[answer]++;
Första frågan: Det skrivsättet har jag aldrig sett. Kanske får varje elementi fältet värdet noll?
Andra frågan: Om det är så att answer är minst noll och högst tio (dvs ett giltigt svar) skall count[answer] öka.
y++ är ett kort skrivsätt för "öka y".
Bubo skrev:Första frågan: Det skrivsättet har jag aldrig sett. Kanske får varje elementi fältet värdet noll?
Andra frågan: Om det är så att answer är minst noll och högst tio (dvs ett giltigt svar) skall count[answer] öka.
y++ är ett kort skrivsätt för "öka y".
I en annan lösningsförslag står det
#include <stdio.h>
#define N 10
int main (void)
{
int count (N) ={0};
int answer;
do......
Hur vet man att man ska använda do- while här?
Bubo skrev:Första frågan: Det skrivsättet har jag aldrig sett. Kanske får varje elementi fältet värdet noll?
Andra frågan: Om det är så att answer är minst noll och högst tio (dvs ett giltigt svar) skall count[answer] öka.
y++ är ett kort skrivsätt för "öka y".
Ja , jagvet att answer är minst noll och högst tio och vördet av count [answer] ska ökas med 1 för varje gång vi kör.
Jag tror det är den del av koden alltså
if (answer >= 0 && answer <= 10) {
count[answer]++;
som ska hålla reda på hur många nollor och ettor, tvåor osv som användaren har gett. Men hur räknas det? Om man ser det som matematik så är answer som variabeln x och count [answer] som y . Det vi vill göra är att vi ska räkna hur många y som har värdet 3 och hur många 2 osv , så hur kan man ta reda på det genom att öka värdet för y alltså count[answer] med 1 för varje gång vi går igenom loopen? Alltså hur kan vi ta reda på hur många av varje tal vi har genom count [answer]++ ?
Som vanligt: Bästa hjälpmedlet vid programmering är papper och penna.
Skriv upp dina variabler, gå genom programmet rad för rad och ändra variablerna efter hand.
Det gjorde jag, men hängde inte med vad som hände.
Eftersom vi har 10 siffror borde det egentligen stå count[10] och inte count[11]
int count[11] = {0};
Så till din fråga om ++
if (answer >= 0 && answer < 10) { // borde vara < 10 inte <= 10
count[answer]++;
}
variabel++ är en kortform av variabel = variabel + 1 men postfix notation innebär att man kan läsa av värdet innan det höjs eller för att ge ett annat exempel:
if (variabel++ == 42) {
..
}
då kan man kolla värdet av "variabel" innan man höjer det med ett.
i ditt fall, count[answer]++ är samma som
if (answer >= 0 && answer < 10) {
count[answer] = count[answer] + 1;
}
"answer" är ju siffran, 0-9
printf("\n");
printf ovan skriver bara ut en ny new line på skärmen och är väl bara för att det skall se lite snyggare ut.
varför skriver der {0} ?
int count[11] = {0};
det initialiserar hela arrayen till 0, dvs samma som
count[0] = count[1] = ... = count[10] = 0
En liten detalj:
De elva tillåtna värdena är 0 1 2 3 4 5 6 7 8 9 10
Bubo skrev:En liten detalj:
De elva tillåtna värdena är 0 1 2 3 4 5 6 7 8 9 10
Ok ser lite udda ut när man har följande prompt
"Enter an integer (0-9)"
Då hade man tänkt sig att 10, -1 osv. hanteras utanför arrayen.
Ok reviderat
if (answer >= 0 && answer <= 10) {
count[answer]++;
}
variabel++ är en kortform av variabel = variabel + 1 men postfix notation innebär att man kan läsa av värdet innan det höjs eller för att ge ett annat exempel:
if (variabel++ == 42) {
...
}
då kan man kolla värdet av "variabel" innan man höjer det med ett.
i ditt fall, count[answer]++ är samma som
if (answer >= 0 && answer <= 10) {
count[answer] = count[answer] + 1;
}
"answer" är ju 0-10
printf("\n");
printf ovan skriver bara ut en ny new line på skärmen och är väl bara för att det skall se lite snyggare ut.
varför skriver der {0} ?
int count[11] = {0};
det initialiserar hela arrayen till 0, dvs samma som
count[0] = count[1] = ... = count[10] = 0