använda returnerade värdet istället för funktionen i c

Permalänk
Medlem

använda returnerade värdet istället för funktionen i c

Hej!

Håller på med en uppgift i c och kört fast.
Uppgiften går ut på att skriva ett program som läser in ett antal domarpoäng,
beräkna medelpoängen utan att ta hänsyn till den högsta och den lägsta poängen.

Felet ligger i att jag i funktionerna "printScores" och "find_Max_Min_Average" använder mig av judges=nrJudges()
vilket resulterar i att funktionen "nrJudges()" upprepas ett antal gånger.

Jag kan inte heller slå ihop funktionerna "printScores" och "find_Max_Min_Average" som jag så gärna skulle vilja göra
då uppgiften går ut på att varje det ska finnas minst en funktion för varje steg i programmet :/

min fråga är då; Hur ska jag använda mig utav det returnerade värdet "judges" i resterande funktioner utan att det ska bli upprepningar hela tiden?

All hjälp uppskattas!

#include <stdio.h> /*prints program info*/ void programInfo(){ printf("Program information\n"); printf("The program reads in the number of judges and the score from each judge.\n"); printf("Then it calculates the average score without regard to the lowest and\n"); printf("highest judge score. Finally it prints the results (the highest, the\n"); printf("lowest and the final average score).\n"); printf("\n"); } /*scans and returns the number of judges*/ int nrJudges(){ int judges; do { printf("Number of judges (min 3 and max 10 judges)? "); scanf("%d", &judges); } while (judges < 3 || judges > 10); printf("\n"); return judges; } /*prints the score from each judge*/ double printScores (double scores[]){ int judges; judges=nrJudges(); for (int i= 0; i < judges; i++){ printf("Score from judge %d? ", i+1); scanf("%lf", &scores[i]); } printf("\n"); printf("Loaded scores: \n"); for (int i= 0; i < judges; i++){ printf ("Judge %d: %.1lf\n", i+1, scores[i]); } return *scores; } /*Finds and prints the smallest and largest scores and calculates the average score without regard to the largest and the smallest score*/ void find_Max_Min_Average(double scores[]){ double max; double min; double average=0; double sum=0; int judges; judges= nrJudges(); *scores=printScores(scores); max = scores[0]; for (int i = 1; i < judges; ++i) { if (scores[i]> max){ max=scores[i]; } } min = scores[0]; for (int i = 1; i < judges; ++i) { if (scores[i] < min){ min=scores[i]; } } for (int i = 1; i < judges; ++i) { sum+=scores[i]; average=(sum-max)/(i-1); } printf("\n"); printf("Final result: \n"); printf("Highest judge score: %.1lf\n", max); printf("Lowest judge score: %.1lf\n", min); printf("Final average score: %0.1lf\n", average); } int main(void){ double scores; programInfo(); find_Max_Min_Average(&scores); return 0; }

Permalänk
Medlem

De funktioner som behöver veta antalet domare skriver du om så att de får det värdet som ett ytterligare argument.
Anropa nrJudges() en gång i din main() funktion och tilldela resultatet till en variabel som sedan skickas som argument till de funktioner som behöver det.

Din funktion double printScores (double scores[]) blir då istället double printScores (double scores[], int judges) , och motsvarande för andra funktioner där det behövs.

Permalänk
Medlem

Använd code-taggar [code][/code] runt din kod så att det blir lättare att läsa den.

Du kan skriva om de metoder som anropar nrJudges() så att de tar en int som parameter.
Då kan du anropa nrJudges() i din main-metod och skicka vidare resultatet till printScores och find_Max_Min_Average istället för att anropa metoden flera gånger.

Alltså:

double printScores (double scores[], int judges) { } void find_Max_Min_Average(double scores[], int judges) { } int main(void) { double scores; programInfo(); int judges = nrJudges(); find_Max_Min_Average(&scores, judges); return 0; }

Detta med reservation för eventuella syntaxfel då C är ett språk jag inte kodat särskilt mycket i och det var länge sedan sist.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

nu har jag uppdaterat koden och den funkar bra när jag testar den i terminalen.
men när jag for in den i universitetets inlämningsprogram skriver programmet helt plötsigt inte längre ut funktionen print_Max_Min_Average(). Jag vet inte riktigt vad jag kan ha missat i och med att den funkar i terminalen.

#include <stdio.h> void programInfo(){ printf("Program information\n"); printf("The program reads in the number of judges and the score from each judge.\n"); printf("Then it calculates the average score without regard to the lowest and\n"); printf("highest judge score. Finally it prints the results (the highest, the\n"); printf("lowest and the final average score).\n"); printf("\n"); } int nrJudges(){ int judges; do { printf("Number of judges (min 3 and max 10 judges)? "); scanf("%d", &judges); } while (judges < 3 || judges > 10); printf("\n"); return judges; } double printScores(double scores[], int judges){ for (int i= 0; i < judges; i++){ printf("Score from judge %d? ", i+1); scanf("%lf", &scores[i]); } printf("\n"); printf("Loaded scores: \n"); for (int i= 0; i < judges; i++){ printf ("Judge %d: %.1lf\n", i+1, scores[i]); } return *scores; } void find_Max_Min_Average(double scores[], int judges, double *pMax, double *pMin, double *pAverage){ double sum=0; *pMax = scores[0]; *pMin = scores[0]; for (int i = 0; i < judges; ++i) { if (scores[i]> *pMax){ *pMax=scores[i]; } if (scores[i] < *pMin){ *pMin=scores[i]; } sum= sum + scores[i]; } *pAverage=(sum - *pMax - *pMin)/(judges - 2); } void print_Max_Min_Average(double pMax, double pMin, double pAverage){ printf("\nFinal result: \n"); printf("Highest judge score: %.1lf\n", pMax); printf("Lowest judge score: %.1lf\n", pMin); printf("Final average score: %0.1lf\n", pAverage); printf("\n"); } int main(void){ double scores; int judges; double max; double min; double average; programInfo(); judges=nrJudges(); printScores(&scores, judges); find_Max_Min_Average(&scores, judges, &max, &min, &average); print_Max_Min_Average(max, min, average); return 0; }

Permalänk
Medlem

@jincksed: Problemet är att programmet kraschar (eller borde krascha i alla fall). Ta en titt på hur du deklarerat scores i main.

Permalänk
Medlem
Skrivet av perost:

@jincksed: Problemet är att programmet kraschar (eller borde krascha i alla fall). Ta en titt på hur du deklarerat scores i main.

förstår inte riktigt vad som är fel med deklarationen

Permalänk
Medlem
Skrivet av jincksed:

förstår inte riktigt vad som är fel med deklarationen

Vilken typ är den deklarerad som och hur används den egentligen?

Permalänk
Medlem
Skrivet av perost:

@jincksed: Problemet är att programmet kraschar (eller borde krascha i alla fall). Ta en titt på hur du deklarerat scores i main.

Programmet behöver inte krascha - även om det är en möjlig konsekvens av felet.
Beroende på exakt var i minnet variablerna allokeras så kan det där programmet se ut att fungera perfekt vid testkörning. eller krascha, eller skriva ut konstiga värden, eller göra något helt annat. Odefinierat beteende i program är väldigt oförutsägbart.
Men du har alldeles rätt i att scores är felaktigt definierad i main()

Permalänk
Medlem
Skrivet av Erik_T:

Programmet behöver inte krascha - även om det är en möjlig konsekvens av felet.
Beroende på exakt var i minnet variablerna allokeras så kan det där programmet se ut att fungera perfekt vid testkörning. eller krascha, eller skriva ut konstiga värden, eller göra något helt annat. Odefinierat beteende i program är väldigt oförutsägbart.
Men du har alldeles rätt i att scores är felaktigt definierad i main()

Hur borde jag då definiera scores? Är fortfarande väldigt ny i programmeringsvärlden så har inte riktigt koll på sånt än

Permalänk
Medlem
Skrivet av jincksed:

Hur borde jag då definiera scores? Är fortfarande väldigt ny i programmeringsvärlden så har inte riktigt koll på sånt än

Funktionerna som den skickas som argument till, de är definierade att ta en array som argument och använder den mycket riktigt som en array, så det rimliga och naturliga vore ju att definiera variabeln som en array med lämplig storlek.

Permalänk
Medlem
Skrivet av Erik_T:

Funktionerna som den skickas som argument till, de är definierade att ta en array som argument och använder den mycket riktigt som en array, så det rimliga och naturliga vore ju att definiera variabeln som en array med lämplig storlek.

ändrade mitt main så att den ser ut på detta sätt, men fortfarande så strular den

int main(void){ programInfo(); int judges=nrJudges(); double scores[judges]; double max; double min; double average; printScores(&scores[judges], judges); find_Max_Min_Average(&scores[judges], judges, &max, &min, &average); print_Max_Min_Average(max, min, average); return 0; }

Permalänk
Medlem

När du skickar en array som argument till en funktion, använd bara själva namnet på arrayen som argument.
Nu skickar du en pekare till ett element i arrayen som argument - vilket blir fel om det inte råkar vara det allra första elementet i arrayen.
Med andra ord, byt ut

printScores(&scores[judges], judges);

mot

printScores(scores, judges);

och motsvarande för find_Max_Min_Average/(

Permalänk
Medlem
Skrivet av Erik_T:

När du skickar en array som argument till en funktion, använd bara själva namnet på arrayen som argument.
Nu skickar du en pekare till ett element i arrayen som argument - vilket blir fel om det inte råkar vara det allra första elementet i arrayen.
Med andra ord, byt ut

printScores(&scores[judges], judges);

mot

printScores(scores, judges);

och motsvarande för find_Max_Min_Average/(

Nu funkar programmet som den ska göra! Tack så jättemycket!