Programmeringsteknik 3p, ht-00 UPPGIFT Skriv ett menystyrt

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