Programmeringsteknik 3p, ht-00 (övning i att modularisera lösningen av ett givet problem mha funktioner) UPPGIFT Skriv ett menystyrt program i C som klarar att: -Läsa in ett positivt heltal från tangentbordet -Beräkna och skriva ut talets siffersumma -Ta reda på om talet är ett primtal och skriva ut resultatet -Skriva ut alla primtal mellan 1 och talet -Avsluta programmet Inledande kommentarer Börja med att skriva PSEUDOKOD som indikerar hur lösningen kan moduliseras. Det är lämpligt att huvudfunktionen (main) innehåller en loop där man visar menyn och låter användaren göra sitt val samt att man utför det val som gjorts. Stegvis förfining (top-down) är nyckelordet. Dvs beskriv först på hög nivå vad som ska göras, därefter förfinas (mer detaljer tas med) beskrivningen tills lämplig nivå nåtts. Högsta nivån (i huvudfunktionen main) 1 Initieringar 2 WHILE programmet inte ska avbrytas BEGIN 2.1 Visa menyn och låt användaren välja alternativ 2.2 IF inläsning av talet ska göras 2.2.1 Läs in till variabeln number ELSEIF siffersumman ska beräknas 2.2.2 Beräkna och skriv ut siffersumman av number ELSEIF primtalskontroll ska göras 2.2.3 Ta reda på om number är ett primtal och skriv ut ELSEIF alla primtal mellan 1 och number ska skrivas ut 2.2.4 Skriv ut alla primtal mellan 1 och number ELSEIF programmet ska avbrytas 2.2.5 Markera att avbrott ska göras ELSE 2.2.6 Skriv ”felaktigt val, försök igen” END_IF END_WHILE Funktioner i C -Separata procedurer som utför en eller flera uppgifter. Jfr int main(void) -Jfr matematikens funktionsbegrepp: f(x)=”beskrivning av hur indata x ska transformeras” -Indata (parametrar) till funktionen är de värden som ska ”transformeras” -Utdata (normalt det/de värde/n som returneras av funktionen) -Normalt lagras varje funktion i en fil. Man kan dock lagra flera funktioner i en och samma fil -Dokumentera varje funktionen genom att inleda med /************************************************ *Namn: funktionens namn *Syfte: kortfattad beskrivning av vad funktionen ska göra *Parametrar: räkna upp parametrarna och vad de ”står för” *Returnerar: vad returneras av funktionen *Anmärkningar: vad man speciellt vill observera ************************************************/ Exempel 1 /************************************************* *Namn: max3 *Syfte: bestäm maximum av tre tal *Parametrar: tal1, tal2 och tal3 vars maximum ska returneras *Returnerar: maximum av (tal1, tal2, tal3) *Anmärkningar: inga *************************************************/ double max3(double tal1, double tal2, double tal3){ /* deklaration av lokala variabler */ if (tal1 > tal2){ if (tal1 > tal3) return tal1; else return tal3; } /* end of inner if */ else if (tal2 > tal3) return tal2; else return tal3; } /* end of max3 */ Separatkompilering görs med (resultatet blir max3.o om allt är ok) gcc -c -Wall max3.c Anrop av funktioner -Anrop av en funktion kan ske i en annan funktion (vissa funktioner kan tom anropa sig själva, sk rekursiva anrop). -Funktionshuvudet för de funktioner som anropas måste definieras i den funktion där anrop görs. Detta kallas att definiera funktionsprototyper. Tex finns funktionsprototyper för printf() och scanf() i filen <stdio.h> -Vid anrop av en funktion är det viktigt att de sk aktuella parametrarna (argumenten) överensstämmer med de formella parametrarna (de som är definierade i funktionshuvudet) till antal och datatyp -En funktion kan användas där det är syntaktiskt rätt att använda den datatyp den har Exempel 1 fortsättning /*************************************************** * Ett program som slumpar fram 3 tal mha en * sk pseudoslumptalsgenerator. * I C heter den rand() och är definierad i <stdlib.h> * Den anropas med tex tal=rand() vilket ger ett * heltaligt slumptal mellan 0 och RAND_MAX. * Vi vill ta fram reella slumptal i intervallet [0,1[ * Skriv ut talen och det största av de tre. * Lagra detta program i filen exempel1.c ***************************************************/ #include <stdio.h> #include <stdlib.h> double max3(double, double, double); /* Prototyp */ int main(void){ double s1, s2, s3; /* s1 s2 s3 Slumpa de tre talen */ = rand() / (double) RAND_MAX; = rand() / (double) RAND_MAX; = (double)rand() / RAND_MAX; /* Visa resultat */ printf("\nSlumptalen är: %.4f, %.4f, %.4f\n",s1,s2,s3); printf("Det största av dem är: %.6f\n",max3(s1,s2,s3)); return 0; }/* end of main */ Separatkompilera som tidigare med gcc -c –Wall exempel1.c Ladda ihop till körbar fil med gcc –o Ex1 exempel1.o max3.o Kör med Ex1