C: Övningar i C-programmering
Det här är ett antal övningsuppgifter om programmering i C.
Det svåra med programmering är egentligen inte språkdetaljer,
som att veta var semikolonen ska sitta,
och inte heller är det att kunna sitt programmeringsverktyg,
som att veta vilka knappar man ska klicka på i Visual Studio,
utan det svåra med programmering är att kunna bryta ner och lösa problem.
Därför handlar många av uppgifterna om programmering i allmänhet,
och skulle lika gärna kunna lösas i något annat programmeringsspråk.
Men det finns också uppgifter som handlar om hur man gör saker just i C,
eller just i den C-dialekt som Visual Studio använder.
De flesta uppgifterna går att lösa även i någon annan miljö, till exempel med GCC på Linux,
men beskrivningarna om hur man ska göra handlar om Visual Studio på Windows.
Det finns också övningsuppgifter i läroboken.
Snabblänkar: Datorövning
1
2
3
4
5
6
7
Datorövning 1
Datorövning 1 A
Starta Visual Studio 2012. Det gör du genom att först logga in på
datorn med din användare, ta fram startmenyn, och sen välja Microsoft
Visual Studio 2012. Om du arbetar hemma, måste du (förmodligen) själv
installera Visual Studio 2012.
På kursens hemsida (eller direkt
här)
finns en instruktion om hur man startar Visual Studio,
och sen skapar och provkör ett enkelt C-program.
På kursens hemsida (eller direkt
här)
finns också en instruktion om hur man laddar hem och installerar Visual Studio.
Följ dessa instruktioner, och skapa och provkör det enkla C-programmet.
Några ytterligare tips:
-
Kompileringen har gått bra om det står 0 errors och 0 warnings i Output-fönstret
nedanför editorfönstret. Får du kompileringsfel kan du dubbelklicka på felet och felets
position i koden kommer att markeras.
-
Får du felmeddelanden vid kompileringen eller länkningen måste du rätta felen och
bygga projektet på nytt.
-
Det är bra att även läsa, och åtgärda varningarna.
Kompilatorn försöker hjälpa till genom att hitta konstruktioner i programmet som
kanske inte är förbjudna enligt programmeringsspråket,
men som är farliga och som programmerare ofta använder fel.
Den hjälpen bör man inte avvisa.
Programmering är svårt nog ändå.
Datorövning 1 B
Skriv in, spara, kompilera, länka och kör nedanstående program.
Börja med att välja File, New osv.
/* bensin.c version 1.3
* Beräkning av bensinpris
* Inte specialanpassat för Microsoft Visual C++
*/
#include <stdio.h>
int main(void) {
float literpris, liter, totalpris;
/* Läs in literpriset */
printf("Literpris = ");
scanf("%f", &literpris);
/* Läs in antalet liter */
printf("Antal liter = ");
scanf("%f", &liter);
/* Beräkna och skriv ut totalpriset */
totalpris = literpris * liter;
printf("Totalpriset för bensinen är %.2f kr.\n", totalpris);
return 0;
}
Förbättra följande saker:
-
Om man kör programmet i Visual Studio med Start Debugging
försvinner utskriften med totalpriset innan man hinner se den.
Fixa det genom att lägga till en #include-rad med conio.h
och ett anrop till _getch på rätt ställe i programmet.
-
Om man kör programmet i Visual Studio
blir de svenska tecknen i utskriften med totalpriset konstiga.
Laga det!
Du bör ha lärt dig hur man gör i A-uppgiften.
-
När man kompilerar programmet (Build Solution)
ger Visual Studio en del varningar.
En del av dem handlar om att funktionen scanf "kan vara farlig",
och just de varningarna behöver vi inte bry oss om, än så länge.
Men för att andra, viktigare varningar inte ska drunkna i ovikiga varningar,
bör vi stänga av dessa oviktiga varningar.
Försök googla reda på hur man gör det!
Efter att du kört programmet och sett att det fungerar, skriver du ut
källkoden genom att välja File, Print från huvudmenyn.
(Det kan hända att du först måste lägga till en skrivare i Windows.)
Datorövning 1 C
Skriv ett program i filen summa.c som läser in två reella tal
(som är matematikerspråk för "flyttal"),
och som beräknar och skriver ut talens summa, skillnad, produkt och kvot.
Datorövning 1 D
Vad händer i summa-programmet ovan om det andra talet som man matar in är 0?
Prova!
Komplettera sen programmet så att kvoten bara beräknas om nämnaren
(det andra talet) är skilt ifrån 0.
Är nämnaren 0 ska istället ett felmeddelande skrivas ut.
Datorövning 1 E
Gå tillbaka till bensin-programmet.
Komplettera programmet i filen så att det
upprepat frågar efter antalet liter och skriver ut totalpriset.
Om man matar in 0 liter,
ska programmet avslutas.
Datorövning 1 F (om du hinner)
Sätt på motsvarande sätt in en upprepning i summa-programmet så att
det upprepas så länge det första talet ej är 0.
Matar man in 0 på det första talet ska programmet avslutas direkt,
utan att det andra talet efterfrågas.
Datorövning 1 G (om du hinner)
Komplettera bensin-programmet så att inläsningen av antal liter alltid
sker mitt på en tom skärm.
Vi ska använda funktionerna clrscr och gotoxy
i det lilla programbiblioteket MSViscon.
Programbiblioteket består av filerna MSViscon.c och MSViscon.h,
som finns med i filen Studprog.zip.
Packa upp den i baskatalogen M:\PCSA\Program
(eller var det nu är du har dina filer).
För att det ska gå att använda clrscr och gotoxy
måste vi ha med filerna MSViscon.c och MSViscon.h i projektet.
Man kan helt enkelt dra och släppa dem på Source Files respektive Header Files i Solution Explorer,
som normalt finns till vänster i Visual Studio-fönstret.
Dock kan det vara lite krångligt att få till rätt
#include-rad för MSViscon.h om man gör så
(exempel: #include "C:\Documents and Settings\Padrone\Desktop\Sviskon\Studprog\Studprog\MSViscon.h"),
och därför kan det vara enklare att skapa en helt ny include-fil i projektet.
Högerklicka på Header Files i Solution Explorer,
välj Add, New Item, skapa där en ny MSViscon.h,
och klistra in innehållet från den gamla i den.
Nu räcker det att skriva #include "MSViscon.h".
Här är ett exempelprogram som använder MSViscon:
#include <stdio.h>
#include <conio.h>
#include "MSViscon.h"
int main() {
gotoxy(5, 5);
printf("Hej!\n");
gotoxy(10, 10);
printf("Tryck nu på en tangent!\n");
_getch();
return 0;
}
Det finns lösningar till datorövning 1.
Datorövning 1 H (om du hinner)
Öppna något av dina första program,
och döp om källkodsfilen från någonting.c till någonting.cpp.
Då kommer den att kompileras som C++ i stället för C.
Blir det några skillnader?
Datorövning 2
Datorövning 2 A
Skriv ett program som läser in massa och höjd för en kropp,
och sedan beräknar och skriver ut dess potentiella energi
enligt formeln g*massa*höjd.
Definiera konstanten g = 9.81 först med #define och sedan med const.
Datorövning 2 B
Skriv ett program som läser in antalet timmar, minuter och sekunder
samt beräknar
och skriver ut motsvarande tid i sekunder.
Datorövning 2 C
Skriv ett program som läser in två sidor och mellanliggande vinkel för
en triangel samt
beräknar och skriver ut triangelns area enligt 0.5*sida1*sida2*sin(v).
Vinkeln v ska
läsas in i grader.
Datorövning 2 D
Skriv ett program som läser in en tid i hela sekunder och skriver ut
den i timmar,
minuter och sekunder.
Datorövning 2 E
Skriv ett program som läser in ett datum på formen yymmdd (6-siffrigt
heltal
exempelvis 020124 och på skärmen skriver ut :
År = 2002
Mån = 01
Dag = 24
Datorövning 2 F
Låt oss kalla ett tresiffrigt positivt heltal för ett spegeltal om
entalssiffran är lika med
hundratalssiffran. Talet 474 är exempelvis ett spegeltal. Skriv ett
program som läser in
ett 3-siffrigt tal och kontrollerar om det är ett spegeltal.
Datorövning 2 G
Skriv ett program som läser in en stor bokstav mellan A och Z och
skriver ut nästa
stora bokstav i alfabetet. Bokstaven Z måste du hantera separat och
skriva ut texten
'Detta är den sista stora bokstaven!'.
Datorövning 2 H (om du hinner)
Komplettera programmet i D) så att det upprepat frågar efter tid.
Programmet ska
avslutas då tiden 0 matas in.
Datorövning 2 I (om du hinner)
Skriv ett program som läser in en entals- och en tiotalssiffra som
tecken och sedan
beräknar motsvarande heltal som multipliceras med 25 och skrivs ut.
Datorövning 2 J (om du har gott om tid)
C-standarden lämnar en del detaljer till den som ska skriva C-kompilatorn.
Det gäller till exempel hur stora tal som ska gå att lagra med de olika datatyperna.
Där finns det krav, men det är minimikrav.
Till exempel måste en int alltid kunna lagra tal upp till och med 32767,
men i många moderna C-implementationer är int 32-bitarstal, och kan lagra tal upp till och med 2147483647.
Skriv ett program som inkluderar headerfilerna limits.h och float.h,
som innehåller information om ditt aktuella C-system.
Skriv sedan ut de största och minsta tal som kan sparas i en variabel av typerna
char, int, long, long long, float, double och long double.
Datorövning 2 K (om du har gott om tid)
Komplettera uppgift G ovan så att även Å, Ä och Ö behandlas.
Det finns lösningar till datorövning 2.
Datorövning 3
Datorövning 3 A
Skriv ett program som frågar efter ett heltal och skriver ut om talet
är udda eller jämnt.
Datorövning 3 B
Skriv ett program som frågar efter en positiv vinkel i hela grader och
skriver ut om vinkeln är
spetsig (mindre än 90 grader),
trubbig (större än 90 grader)
eller rät.
Datorövning 3 C
Skriv ett program som frågar efter ett reellt tal och skriver ut
talets kvadratrot med 3
decimaler. Om det inlästa talet är negativt ska ett felmeddelande
skrivas ut.
Datorövning 3 D
Skriv ett program som frågar efter en siffra mellan 0 och 5 och
skriver ut motsvarande
morsekod. Använd en switch-sats. Morsekoderna för 0 till 5 är:
0 -----
1 .----
2 ..---
3 ...--
4 ....-
5 .....
Datorövning 3 E
Under vissa förutsättningar gäller att bromssträckan för en bil med
hastigheten v i km/h ges av den här formeln:
s = 0.015v2 (meter)
Skriv ett program som skriver ut en tabell som visar bromsträckorna
för hastigheterna
30, 40, 50, ...., 130 km/h.
Datorövning 3 F
Gör ett C-program som räknar ut talet en miljon genom att en miljard
gånger addera
en tusendel. Vad blir resultatet? Blir det verkligen en miljon? Om
inte - varför? Prova med både float och double!
Datorövning 3 G
Lägg till en upprepning i uppgift C så att programmet upprepat frågar
efter ett reellt
tal och skriver ut kvadratroten. Upprepningen avslutas om talet 0
inmatas.
Datorövning 3 H
Skriv ett program som beräknar antalet termer (n) som behövs för att
summan av den harmoniska serien 1 + 1/2 + 1/3 ..... + 1/n ska överstiga 10.
Datorövning 3 I (om du hinner)
Skriv ett program som skriver ut delsumman 1 - 1/2 + 1/3 - 1/4 ...1/n
för ett inläst
värde på n. Inläsningen ska upprepas och avslutas då 0 inläses.
Datorövning 3 J (om du hinner)
Skriv ett program som slumpar ett tal mellan 0 och 99 och frågar efter
en gissning av
talet. Beroende på storleken av det gissade talet skall texten RÄTT,
FÖR STORT eller
FÖR LITET skrivas ut på skärmen. Programmet ska upprepa så länge man
gissar fel
och vid avslut ska antalet gissningar skrivas ut. För
att slumpa tal ska du använda
funktionerna srand som startar slumpgeneratorn slumpmässigt och rand
som returnerar
slumptalet. Använd hjälpen med F1 (eller Google) för dessa funktioner.
Datorövning 3 K (om du hinner)
Här är ett problem som sägs komma från en jobbintervju:
The Zorganian Republic has some very strange customs. Couples only
wish to have female children as only females can inherit the
family's wealth, so if they have a male child they keep having more
children until they have a girl. If they have a girl, they stop
having children. What is the ratio of girls to boys in Zorgania?
Skriv ett program som simulerar familjer som får barn enligt scenariot,
till exempel en miljon familjer,
och visar resultatet.
Det finns lösningar till datorövning 3.
Datorövning 4
Datorövning 4 A
Skriv ett program som definierar en vektor (även kallad array) innehållande 4
heltalselement, läser in
värden till alla element och skriver ut elementen i omvänd ordning.
Datorövning 4 B
Skriv ett program som läser in 5 reella tal till en vektor och
därefter skriver ut vektorns
summa, största och minsta element.
Datorövning 4 C
Skriv ett program som slumpar 100 tresiffriga heltal till en vektor,
skriver ut vektorn,
sorterar vektorn samt skriver ut den sorterade vektorn.
Datorövning 4 D
Skriv ett program som med funktionen gets läser in en sträng
innehållande ett antal ord
som åtskiljs med blanktecken. Skriv sedan ut strängen tecken för
tecken och byt rad
efter varje ord alltså vid blanktecken. Strängen kan maximalt
innehålla 80 tecken.
Datorövning 4 E
Skriv ett program som läser in en sträng med gets och skriver ut
strängen baklänges.
För att bestämma strängens längd kan du använda den färdiga funktionen
strlen i string.h.
Datorövning 4 F
Skriv ett program som läser in data till en post som innehåller fälten
medlemsnummer,
namn och telefonnummer och skriver ut postens fält på skärmen.
Datorövning 4 G
Skriv ett program som läser in data till två poster av typen
struct rtal { int taljare; int namnare;};
som ska avbilda bråktal som
exempelvis 3/5. Programmet ska efter inläsning addera
ihop bråken till ett summabråk och sedan skriva ut detta summabråk.
Datorövning 4 H (om du hinner)
Skriv ett program som skapar en skruv-vektor innehållande
skruvdiametrar med
värdena 1.80, 2.15, 2.50, 2.80, 3.15, 3.45, 3.80, 4.15, 4.50, 4.80,
5.45, 6.15, 6.80, 7.50,
och 8.15, frågar efter en håldiameter och skriver ut den skruvdiameter
som är närmast
större.
Datorövning 4 I (om du hinner)
Skriv ett program som läser in flera medlemsposter enligt uppgift F ovan till
en vektor av
poster innehållande max 10 medlemmar. Inläsningen avslutas då
medlemsnummer 0
inläses. Programmet ska avslutningsvis fråga efter ett medlemsnummer
och skriva ut
namn och telefonnummer för denna medlem.
Datorövning 4 J (om du har gott om tid)
Skriv ett program som läser in ett heltal i form av en sträng,
omvandlar strängen till ett
tal och slutligen skriver ut talet multiplicerat med 2. Exempelvis ska
"123" omvandlas till 123 och utskriften ska bli 246. Större än 4-siffriga tal behöver
ej hanteras.
Datorövning 4 K (om du har gott om tid)
Skriv ett program som slumpar en lottorad bestående av 7 tal
mellan 1 och 35.
Observera att samma tal ej får återkomma. Lottoraden skrivs slutligen
ut sorterad.
Det finns lösningar till datorövning 4.
Datorövning 5
Datorövning 5 A
Skriv ett program som läser in ett tecken och antalet gånger som
tecknet ska skrivas ut
samt anropar en funktion för utskriften med huvud enligt:
/* Skriver ut tecknet "tecken" "antal" gånger */
void skriv_tecken(char tecken, int antal)
Testa att köra programmet i debuggern. Börja med att sätta en
brytpunkt i början av
main-funktionen, genom att klicka på den vänstra kanten av
kodfönstret. Brytpunktensyns som en stor röd prick. När man sen
startar programmet med Start Degugging
kommer programkörningen att stanna vid varje brytpunkt. Sen kan man
stega sig fram
rad för rad med F10 eller F11. Kolla variabelvärden genom att ställa
dig med
muspekaren på variabeln och vänta.
Datorövning 5 B
Skriv ett program som läser in ett positivt heltal och kontrollerar om
talet är ett primtal
dvs. att det ej är jämnt delbart med något annat heltal större än 1
utom sig självt.
Primtalstestet ska göras av en funktion som tar talet som parameter
och returnerar 1
(sant) om primtal annars 0 (falskt). I funktionen ska du upprepat
dividera med först 2
sedan 3 osv. till tal-1 och returnera 0 så fort det går jämnt upp. Går
det inte jämnt upp
någon gång returneras 1.
Datorövning 5 C
Skriv ett program som läser in ett pris i kronor och avrundar priset till
närmaste 50 öre.
Exempelvis ska priset 23.36 avrundas till 23.50 och 23.78 till 24.00.
Avrundningen
ska ske i en funktion som tar priset som parameter och returnerar det
avrundade värdet
Börja med att i funktionen plocka ut hela kr med hel = (int)pris och
sedan
decimaldelen med dec = pris - hel.
Datorövning 5 D (om du hinner)
Skriv ett program som skapar en vektor initierad med 10 tresiffriga
vinstnummer i ett
lotteri och som sedan läser in ett lottnummer och kontrollerar om
lotten har vinst eller
är en nitlott. Programmet ska innehålla en funktion som tar vektorn
och lottnumret
som parametrar och returnerar numret på vinsten (1 till 10) om
vinstlott annars 0.
Datorövning 5 E (om du hinner)
Skriv ett program som läser in ett personnummer i form av en sträng
med 11 tecken
och som kontrollerar och skriver ut om personnumrets alla tecken är ok
dvs alla tecken
utom det 7:e, som kan vara + eller -, är siffror. Kontrollen ska göras
i en funktion som
returnerar 1 om allt ok annars 0.
Datorövning 5 F (om du hinner)
Komplettera programmet i E ovan med en funktion som anropas
efter
teckenkontrollen och som kontrollerar om datum är korrekt angivet med
månad mellan
1 och 12 och dag mellan 1 och 31.
Datorövning 5 G (om du har gott om tid)
Skriv ett program som i en funktion slumpar värden till en
vektor bestående av 10
poster numrerade från 100 till 109 med värden mellan 10.0 och 20.0 av
typen:
struct matdata {
int nr;
double x;
};
Sortera sedan posterna efter värdet på x och skriv ut dessa.
Slumpning, sortering och
utskrift ska ske i funktioner med lämpliga parametrar.
Det finns lösningar till datorövning 5.
Datorövning 6
Datorövning 6 A
Skriv ett program som från tangentbordet läser in ett antal reella tal
(avslutas med 0.0)
och skriver in dessa tal i en textfil rtal.txt, ett tal per rad.
Kontrollera filen i en
texteditor efter det att du kört programmet.
Datorövning 6 B
Skriv ett program som läser filen rtal.txt ovan och beräknar talens
medelvärde.
Datorövning 6 C
Skriv ett program som räknar antalet semikolon i en textfil vars namn
inläses. Testa på
något av dina C-program.
Datorövning 6 D
Skriv med editorn en textfil innehållande ett antal personers namn,
ett per rad. Skriv
sedan ett program som läser filen och skriver ut namnen numrerade på
skärmen.
Numret (börja med 1) ska stå framför namnet på samma rad.
Datorövning 6 E
Skriv ett program som slumpar 500 tärningskast och skriver in dessa i
en binärfil
tarning.dat.
Datorövning 6 F
Skriv ett program som läser binärfilen tarning.dat ovan och skriver ut
tärningsutfallens
medelvärde.
Om slumpningen är bra ska medelvärdet bli nära 3.5.
Datorövning 6 G (om du hinner)
Skriv ett program som slumpar temperaturer mellan 20 och 30 grader
till posterna med
nummer 100 till och med 199 av typen:
struct matpost {
int nr;
double temp;
};
och skriver in posterna i en binärfil temp.dat.
Datorövning 6 H (om du hinner)
Skriv ett program som läser filen temp.dat ovan och skriver ut
posterna med lägsta
resp högsta temperatur på skärmen.
Datorövning 6 I (om du har gott om tid)
Skriv med editorn en textfil bil.txt, som innehåller ett antal bilar
med registreringsnummer, ägare och bilmärke, på var sin rad. Skriv sedan ett program
som läser värden
från bil.txt till poster av lämplig typ och skriver in posterna i en
binärfil bil.dat.
Datorövning 6 J (om du har gott om tid)
Skriv ett program som läser in ett registreringsnummer, söker efter
denna bil i bil.dat ovan och uppdaterar bilens ägare. Den nya ägarens namn läses in.
Det finns lösningar till datorövning 6.
Datorövning 7
Datorövning 7 A (om du hinner)
I filen slump.c (som finns med i
Studprog.zip)
finns funktionen slump som slumpar en vektor med heltal mellan ett
minsta och ett
största värde och i filen search.c finns funktionen linsearch som
söker linjärt efter en
nyckel i en vektor och om nyckeln finns returnerar nyckelns
platsnummer. Skriv ett
program som slumpar en vektor innehållande ett inläst antal (max 100)
tresiffriga
heltal, skriver ut vektorn och sedan frågar efter ett heltal och söker
efter dess plats i
vektorn. Kopiera in de funktioner som du behöver från slump.c och
search.c till ditt
program.
Datorövning 7 B (om du hinner)
I filen slump.c i din katalog finns funktionen slumpsort som slumpar
en sorterad
vektor med heltal mellan ett minsta och ett största värde och i filen
search.c finns
funktionen binsearch som söker binärt efter en nyckel i en vektor och
om nyckeln
finns returnerar nyckelns platsnummer. Skriv ett program som slumpar
en sorterad
vektor med ett inläst antal (max 100) fyrsiffriga heltal, skriver ut
vektorn och sedan
frågar efter ett heltal och söker efter dess plats i vektorn.
Datorövning 7 C (om du hinner)
I filen sort.c i din katalog finns sorteringsrutinen ursort som
sorterar vektorer i
stigande ordning. Skriv ett program, som använder slump-funktionen i
slump.c för att
slumpa ett inläst antal (max 100) tre-siffriga heltal till en vektor,
skriver ut vektorn på
skärmen, sorterar vektorn med ursort samt skriver ut den sorterade
vektorn.
Datorövning 7 D (om du har gott om tid)
Använd funktionen clock i time.h för att betämma hur lång
tid i sekunder det tar för
ursort att sortera en slumpad vektor med 1000, 2000 resp. 3000
slumpade heltal. Hur
ändras sorteringstiden med antalet element i vektorn. Använd hjälpen
med F1 för att få
reda på hur clock-funktionen används.
Datorövning 7 E (om du har gott om tid)
Jämför sorteringstiderna för att sortera en slumpad vektor
med 2000 element för de tre
sorteringsalgoritmerna ursort, bubbsort och insort som alla finns i
sort.c.
Datorövning 7 F (om du har gott om tid)
Skriv om sök-funktionerna i search.c så att de söker efter
en nyckelsträng i en vektor
av strängar. Spara funktionerna i stsearch.c och skriv ett
huvudprogram där du initierar
en vektor med 10 strängar och sedan läser in en sträng som man söker
efter i vektorn
och om den finns skriver ut platsnummer för.
Datorövning 7 G (om du har gott om tid)
Skriv om sorterings-funktionerna i sort.c så att de sorterar
strängar. Spara funktionerna
i strsort.c och skriv sedan ett program som initierar en vektor av
strängar och skriver ut
strängarna sorterade på skärmen.
Datorövning 7 H (om du har gott om tid)
Skriv en textfil med editorn innehållande ett antal namn, en
per rad. Skriv sedan ett
program som läser in namnen från filen till en vektor, sorterar
vektorn och skriver ut
namnen sorterade på samma fil.
Det finns lösningar till datorövning 7.
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
16 april 2014