Rekomenderade övningsuppgifter

Syfte

Syftet med denna laboration är att du skall:

Introduktion

Uppgiften är uppdelad i två stycken delar (ni kommer alltså att skriva två stycken program denna gång). Lösningen på den första uppgiften (Att läsa från filer) ska skrivas i en fil med namnet salary.c och lösningen till det andra problemet ska skrivas i en fil crypto.c

Läsa från filer

I ett led i ert företags jämställdhetsarbete så ska ert företag införa uppföljning på hur mkt männen och kvinnorna i snitt tjänar varje månad (månadslönen är det som ska räknas).

Företaget vill även kunna ta reda på namnet på personen som tjänat mest under månaden (som har högst månadslön), för att kunna utnämna månadens anställd.

Användarna av programmet ska kunna välja fil och vad som ska göras av programmet via kommandoradsparametrar programmet ska alltså kunna startas tex på följande vis:
salary_checker -g salary.txt.

Den första kommandoradsparametern avgör vad programmet ska göra och ska vara -g för att undersöka männs och kvinnors medellön och -m för att hitta personen med högst lön. Nästa kommandoradsparameter ska ange filnamnet. Får programmet in fel antal eller felaktiga kommandoradsparametrar så ska det avslutas med ett felmeddelande som beskriver hur det är tänkt att användas

Utdata:

Inget annat än ovanstående ska skrivas ut om allt går som det ska i programmet.

Filen som lönesystemet exporterar (alltså det format som indata-filerna måste följa) ser ut så här:

[antal övriga rader i filen]
[Namn person1]:[personnummer person1]:[jobbade timmar]:[timlön]
[Namn person2]:[personnummer person2]:[jobbade timmar]:[timlön]
...
[Namn personn]:[personnummer personn]:[jobbade timmar]:[timlön]
ex:
3
Erik Svensson:121212-1234:126:200
Magdalena Nilsson:851211-1244:200:150
Bertil Eriksson:540310-7294:100:100

Ni hittar en exempelfil här

Som hjälp till att skriva ert program så får ni av chefen följande funktion som kan hjälpa dig i arbetet:

/* Funktion för att bestämma könet på en person utifrån ett
 * personnummer
 * Returnerar: 0 om personen är en kvinna 1 annars.
 * Indata: En sträng med personnumret på formatet xxxxxx-xxxx
 */
int gender(char personnr[])
{
    return ((personnr[9]-'0')%2);
}

Pekare och dynamiskt minne

Här ska vi titta på hur man kan allokera minne för tvådimensionella arrayer och använda sig av dessa.

Du ska nu skriva funktionen char **create_char_array(int antalr,int antalk). Strukturen på det allokerade minnet ska se ut som på bilden nedan. Börja med att allokera en vektor med pekare (char *) som är lika lång som antalet rader som skall allokeras (antalr). Allokera sedan minne för de olika raderna lika långa som antalet kolumner (antalk) och stoppa in dessa i pekarvektorn, som du sedan returnerar.

Allokerat minne måste också avallokeras (lämnas tillbaka till systemet). I detta fall så räcker det inte med att anropa free direkt med pekaren till vår matris som argument eftersom minnet inte är allokerat samtidigt, utan vi måste först avallokera det minne som hör till de olika raderna. Skriv därför en funktion void free_char_array(char **m,int antalr) som tar en char** allokerad av create_char_array och en int antalr som anger antal rader i strukturen och avallokerar minnet. Tänk på huvudregeln att man måste anropa free lika många gånger som malloc/calloc anropades.

Er dynamiska matris ska ni sedan använda för att koda meddelanden. Kodningen ska göras så att användaren får välja en storlek på matrisen då han/hon startar programmet via komandoradsparametrar. Den första komandoradsparametern ska ange antalet rader i matrisen och den andra antalet kolumner (matrisen måste vara stor nog för meddelandet). Ni ska sedan läsa in ett meddelande från stdin (meddelandet kommer vara en rad långt) som ska skrivas in radvis tecken för tecken i matrisen. Då mellanslag sällan är nödvändiga för att man ska kunna tyda texten (men tillför extra informantion till någon som vill knäcka kryptot) så ska inga mellanslag eller blanktecken skrivas utan bara bokstäver/siffror osv. Blir det utrymme kvar i slutet på matrisen så fyll det med bokstaven q. Meddelandet ska sedan läsas kolumnvis ur matrisen och skrivas ut i block om 5 bokstäver med ett mellanslag mellan varje block på stdout (inget annat än det kodade meddelandet får skrivas ut förutsatt att allt har gått som det ska.

Exempel:
Orginaltext: "Detta är ett hemligt meddelande."
Vi väljer matrisstorleken 7x4 och skriver in meddelandet i matrisen:

Dett
aäre
tthe
mlig
tmed
dela
nde.
Det kodande meddelandet blir då: "Datmt dneät lmedt rhiel eteeg da."

Väl kommenterad källkod ska vara inlämnad via det webbaseraserade inlämningssystemet som ni hittar här senast den 23/10 kl. 13.00. Skriv ert namn, användarnamn och grupp som en kommentar i filerna.
Uppgiften ska lösas enskilt.