Domarnas poäng
Uppgift:
Skriva ett program som läser in ett antal domarpoäng, beräknar medelpoängen utan att ta hänsyn till den högsta och den lägsta poängen. Slutligen ska programmet skriva ut högsta, lägsta och medelpoäng. Användaren ska kunna ange hur många domare som avger bedömning. Antalet domare ska kunna variera från och med 3 till och med 10.
Nedan visas hur interaktionen med användaren ska se ut.
Program information
The program reads in the number of judges and the score from each judge.
Then it calculates the average score without regard to the lowest and
highest judge score. Finally it prints the results (the highest, the
lowest and the final average score).
Number of judges (min 3 and max 10 judges)? 2
Number of judges (min 3 and max 10 judges)? 11
Number of judges (min 3 and max 10 judges)? 5
Score from judge 1? 7.5
Score from judge 2? 5.3
Score from judge 3? 8.6
Score from judge 4? 4.8
Score from judge 5? 6.7
Loaded scores:
Judge 1: 7.5
Judge 2: 5.3
Judge 3: 8.6
Judge 4: 4.8
Judge 5: 6.7
Final result:
Highest judge score: 8.6
Lowest judge score: 4.8
Final average score: 6.5
Algoritm
Följande algoritm ska användas i programmet:
1. Skriv ut information
2. Läs in antal domare
3. Läs in domarpoäng
4. Skriv ut de inlästa domarpoängen
5. Räkna fram resultat
6. Skriv ut resultat
Programmet ska använda sig av funktioner. Funktionaliteten i respektive steg i ovanstående algoritm ska ske i funktioner, minst en funktion för varje steg.
I steg 5 ska en funktion användas där högsta, lägsta och medelpoäng ''returneras'' via tre separata pekarparametrar.
Jag gjorde såhär: Jag kommer inte vidare och plus kunde inte kompilera koden för att i vissa ställe koden behöver ändras.
Jag kan göra punkt 5 och 6 i algoritmen via if eller for satsen men jag vet inte hur ska man använda pekare.
Vad blir det för kompileringsfel?
Laguna skrev:Vad blir det för kompileringsfel?
Många fel.
Kan du rätta några själv?
Jag försökte men får fotfarande warning och error.
Kika exempelvis på rad 29 och 36, ser det helt rätt ut?
På rad 36 fattas det ett semikolon.
På några ställen har du "int" i argumentet till ett funktionsanrop. Det ska man bara ha när man definierar funktionen, inte när man anropar den.
Dracaena skrev:Kika exempelvis på rad 29 och 36, ser det helt rätt ut?
ja men ska man inte skriva argumentens typ ??
Är jag på rätt spår? vet inte hur ska jag göra det här steget "I steg 5 ska en funktion användas där högsta, lägsta och medelpoäng ''returneras'' via tre separata pekarparametrar" .
Kan du förklara vad följande prototyp betyder?
int sum_of_two_numbers(int a, int b);
Vad förväntar vi oss att funktionen kommer göra baserat på hur den är deklarerad?
Dracaena skrev:Kan du förklara vad följande prototyp betyder?
int sum_of_two_numbers(int a, int b);
Vad förväntar vi oss att funktionen kommer göra baserat på hur den är deklarerad?
Den kommer ge summan av två heltal.
Ja, vi förväntar oss att den returnerar ett heltal eftersom det står "int ...." eller hur? Om den inte returnerar något är den av typ void.
Dina funktioner på rad 17 och 29 anger att de skall returnera en int och en double. Om du kikar i kodblocken så ser vi snabbt att det inte alls är fallet, eftersom de båda saknar nyckelordet "return".
Dracaena skrev:Ja, vi förväntar oss att den returnerar ett heltal eftersom det står "int ...." eller hur? Om den inte returnerar något är den av typ void.
Dina funktioner på rad 17 och 29 anger att de skall returnera en int och en double. Om du kikar i kodblocken så ser vi snabbt att det inte alls är fallet, eftersom de båda saknar nyckelordet "return".
Ja hänger med vad du menar. Men vad ska man göra kan inte skapa struct för att det tillhör inte denna uppgiften. På rad 29 det måste retunera något så man kan inte skriva void. Jag kan inte heller ändra på typerna.
Jag tycker båda ska vara en void.
Uppgiften vill ju att du ska använda dig av pekare, ta emot 3 pekare istället.
void score_from_judges(int* highest_score, int* lowest_score, int* average_score)
Här har du några enkla exempel:
#include <stdio.h>
void add_two_integers(int* sum, int a, int b)
{
*sum = a+b;
}
int main()
{
int sum = 0;
add_two_integers(&sum, 6, 5);
printf("%d", sum);
return 0;
}
Det fiffiga med pekare är att vi kan ändra många variabler samtdigit, låt säga nu att jag vill ta fram medelvärdet också:
#include <stdio.h>
void add_two_integers(int* sum, int* average, int a, int b)
{
*sum = a+b;
*average = (a+b)/2;
}
int main()
{
int sum = 0;
int average = 0;
add_two_integers(&sum, &average, 4, 6);
printf("%d, %d", sum, average);
return 0;
}
Hänger du med?
Dracaena skrev:Jag tycker båda ska vara en void.
Uppgiften vill ju att du ska använda dig av pekare, ta emot 3 pekare istället.void score_from_judges(int* highest_score, int* lowest_score, int* average_score)
Här har du några enkla exempel:
#include <stdio.h> void add_two_integers(int* sum, int a, int b) { *sum = a+b; } int main() { int sum = 0; add_two_integers(&sum, 6, 5); printf("%d", sum); return 0; }
Det fiffiga med pekare är att vi kan ändra många variabler samtdigit, låt säga nu att jag vill ta fram medelvärdet också:
#include <stdio.h> void add_two_integers(int* sum, int* average, int a, int b) { *sum = a+b; *average = (a+b)/2; } int main() { int sum = 0; int average = 0; add_two_integers(&sum, &average, 4, 6); printf("%d, %d", sum, average); return 0; }
Hänger du med?
Tusen tack för din förklaring!
Det är det som jag inte riktigt förstår. Hur kan man skicka variabel/ argument för något som man inte ens har räknat. Är det som man skriver som inom parantes framför funktionens namn det som den ges ut? I ditt exempel skrev du
void add_two_integers(int* sum, int a, int b)
{ *sum = a+b;
}
Hur kan man skicka pekare till sum som inte finns.
Ahaaaaaaa nu märkte jag det. De här variablerna måste först deklareras i funktionen main :)
Precis!
Notera också hur jag kallar på funktionen. Vi har redan angett i deklarering att den tar emot arugment av typ xyz. Av den anledningen behöver man inte skicka med typen i argumentet. Som du ser, skickar jag antingen in en variabel eller en konstant, men ingenstans har jag skickat med ett argument "int ?" där ? är en variabel eller konstant.
Försök nu beta av dina kompileringsfel och försök fixa till 5 och 6 i din algoritm enligt specifikationerna.
Varför det funkar inte med bara adress? Att skriva såhär i main (&sum, &a, &b) ?
void add_two_integers(int* sum, int a, int b)
{ *sum = a+b;
}
Hur kunde man skicka variablerna a och b men för sum behövde man en pekare? En funktion kan inte retunera flera värde. Så varför man kan inte skriva (int* sum, int* a, int* b)?
Om du vill ändra värdet för en variabel så måste du skicka med en pekare.
Låt mig demonstrera:
#include <stdio.h>
void increment_number(int a){
a = a + 1;
printf("the copy of a is now = %d \r\n", a);
}
int main()
{
int a = 0;
increment_number(a);
printf("but in main a = %d", a);
return 0;
}
Är resultatet som förväntat?
till din andra fråga:
Varför det funkar inte med bara adress? Att skriva såhär i main (&sum, &a, &b)
Det kan du också göra. Se här:
void add_two_integers(int* sum, int* average, int* a, int* b)
{
*sum = *a + *b;
*average = (*sum)/2;
}
int main()
{
int sum = 0;
int average = 0;
int a = 4;
int b = 6;
add_two_integers(&sum, &average, &a, &b);
printf("%d, %d", sum, average);
return 0;
}
Vi får exakt samma resultat som innan.
Aa juste!det för att en funktion vet inte vad som händer i den andra funktionen så pekare och adress hjälper de att ändra variablerna från den ena till den andra.
Behöver man alltid i anropen ange exakt vilka variabler som skickas och behöver man alltid skriva exakt vilka variabler den anropade funktionen tar? Jag blir lite förvirrad och vet inte riktigt om det är i anropen som man ska skriva vilka variabler som skickas eller om det är i själva funktionen som man skriva vilka variabler/argument den tar.
Har set att visa anropar en funktion men skriver inte vilka variabler som skickas och det funkade t.ex. print();
Det beror helt på hur funktionen är deklarerad.
när du deklarerar en funktion så har du valet att bestämma om den skall returnera något, int, double, float, int* osv.
Argumenten sen (den inuti paranteserna) kan du välja att inte skriva något, och då tar inte funktionen emot några argument.
Precis som jag ändrade argumenten mellan exempel 1 och 2 i inlägg #14.
Säg att jag skapar följande funktion:
void print_value(int a)
{
.
.
.
}
Om jag sedan försöker göra något som detta:
main()
{
print_value(1);
}
så går det fint. Om jag däremot försöker lägga till ett argument:
main()
{
print_value(1, 3);
}
Nu får vi kompileringsfel eftersom jag försöker kalla på en funktion som inte existerar. Vi har ingen funktion som tar emot 2 arugment.
Behöver man alltid skicka med parametrar? Nej, det måste du inte. Det beror helt på vad funktionen gör.
Scanf ser exempelvis ut så här:
int scanf(const char *format, ...)
Samma sak gäller printf.
Men I C, generellt, så får man oftast ange alla parametrar. I många fall så kan man skriva NULL (men du får läsa i dokumentation av funktionen innan du blint skickar med NULL som argument) om man inte vill ange det specifika värdet. I ditt fall dock, så ska du bara ange att en funktion tar emot ett argument om du verkligen behöver den.
I andra språk som exempelvis Java så finns det något som heter method overloading vilket tillåter en att skapa funktioner med exakt samma namn men de tar olika argument.