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:

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: 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