(Denne oppgaven er hentet fra ordinær eksamen 2014, oppgave nr. 2. Vi går gjennom de fire første deloppgavene, som handler om filbehandling og structs. Oppgaveteksten er gjengitt her for enkelhets skyld.)

Oppgave 2: Programmering Fallskjerm

(I denne oppgaven kan det være gunstig å kalle funksjoner som du har laget i tidligere deloppgaver. Selv om du ikke har fått til den tidligere oppgaven, kan du kalle funksjonen derfra med antagelse om at den virker som spesifisert i oppgaveteksten.)

NTNU fallskjermklubb (NTNU-FSK) trenger hjelp til å lage et nytt opplærings- og administrasjonsprogram. De har bedt firmaet ditt (ITGK) om hjelp, og du har fått jobben med å programmere funksjoner som beskrevet i deloppgavene under.

Vi benytter en litt forenklet versjon av jordens fysiske lover: En fallskjermhopper faller (med konstant/gjennomsnittlig hastighet) 100 fot pr. sekund, de 10 første sekundene, og deretter med konstant topphastighet på 200 fot pr. sekund til skjermen må åpnes i 300 fots høyde (se figur 1). Hvis man mot normalt hopper ut under 3000 fot må skjermen utløses umiddelbart (etter 0 sekunder)

Medlemsdatabasen til NTNU-FSK ligger lagret på en fil members.txt med følgende format:

NAVN;IDNR;VEKT;SKJERMST

Eksempel på innholdet i filen:

members.txt
Frank Stank;D-49334;75;120
Bjarne Stor;C-49335;95;150
Dumbo Ear;D-50105;450;750
Peter Pan;A-12345;30;100
 

Oppgave 2a

Lag en funksjon inputPerson som leser inn navn, id, vekt og skjermstørrelse fra tastaturet, og returnerer en struct person med riktige verdier i følgende felt: name, id, weight, size. Merk at "name" og "id" er tekststrenger, mens "weight" og "size" er tall. De kan anta at bruker skriver inn lovlige verdier.

Eksempel på kjøring (tekst med understrekning skrives inn av brukeren):

Oppgave 2b

Lag en funksjon readDbFile som leser inn hele medlemsbasen i en struct-vektor, med følgende feltnavn: "name", "id", "weight" og "size". "name" og "id" skal lagres som tekst, mens "weight" og "size" skal lagres som tall. Du kan anta at filen finner og at det ikke oppstår noen problemer ved åpning/lukking, og at filen ikke inneholder noen blanke eller ugyldige linjer. Funksjonen skal ha inn-parameter filename og retur-verdi db.

Eksempel på kjøring:

Oppgave 2c

Lag en funksjon printMemberList som skriver ut innholdet i struct-vektoren db (som forklart ovenfor) på skjermen med overskrifter og format som i følgende eksempel på kjøring:

Det skal være avsatt 15 tegn til NAVN, 9 tegn til ID-NR, 5 tegn/siffer til VEKT og 4 tegn/siffer til SKJERMSTØRRELSE. Du kan anta at databasen ikke har innhold som går utover de avsatte antall tegn for hvert felt. Feltene skal være høyrejusterte. Hvis verdier trenger mindre plass enn antallet avsatte tegn, skal resten av feltbredden fylles av blanke.

Inn-parameter db, ingen retur-verdi.

Oppgave 2d

Lag en funksjon addPerson med inn-parametere filename (der databasen er lagret). Funksjonen skal be bruker skrive inn informasjon om en person beskrevet med navn, id, vekt og skjermstørrelse, og lagre dette i variabelen person. Funksjonen skal så lese inn databasen som ligger lagret i filen filename til datastrukturen (struct-vektor db). Deretter skal opplysningene om den nye person legges til i db og i filen filename. Bruk riktig format: se "Eksempel på innholdet i filen" ved figur 1 (se side 6). Returverdi db skal inneholde den oppdaterte databasen. 

Du trenger ikke å skrive kode for feilhåndtering i forbindelse med å lese eller skrive fra/til fil. 

Eksempel på kjøring (Endringen er markert med fet skrift):

Videoforklaring (50:37) 

Del 1 (5:36)Del 2 (6:38)Del 3 (8:34)
Oppgaveintroduksjon, og litt om lesing av oppgavetekst på
eksamen.

Opprett struct fra bruker-innputt (oppgave 2a).

Lesing og konvertering av linjer i fil til struct-verdier
(oppgave 2b, del 1).
Del 4 (6:41)Del 5 (9:39)Del 6 (13:29)
Kode for å lage en struct-vektor gradvis i en while-løkke
(oppgave 2b, del 2).
Kode for formattert utskrift av struct-verdier, og for-løkke for å
gå gjennom alle element i en struct-vektor (oppgave 2c).
Kode for å skrive en struct-verdi som tekst til fil (oppgave 2d).

Løsningsforslag

inputPerson.m
function retur = inputPerson()
    retur.name = input('Name: ', 's');
    retur.id = input('ID: ', 's');
    retur.weight = input('Kg: ');
    retur.size = input('Size: ');
end 
readDbFile.m
function retur = readDbFile(filename)
    % 1. Åpne filen
    fd = fopen(filename, 'r');
    
    retur = struct('name', {}, 'id', {}, 'weight', {}, 'size', {});
    % 2. Bruk filen
    linje = fgetl(fd);
    while ischar(linje)
        % Behandle linjen
        felt = strsplit(linje, ';');
        medlem.name = felt{1};
        medlem.id = felt{2};
        medlem.weight = str2double(felt{3});
        medlem.size = str2double(felt{4});
        retur(end + 1) = medlem;
        linje = fgetl(fd);
    end
    
    % 3. Lukk filen
    fclose(fd);
end 
printMemberList.m
function printMemberList(db)
    fprintf('%15s%9s VEKT kg. SKJERMSTØRRELSE\n', 'NAVN', 'ID-NR');
    for i = 1:length(db)
        p = db(i);
        fprintf('%15s%9s%5d kg. %4d kvadratfot\n', p.name, p.id, p.weight, p.size);
    end
end 
addPerson.m
function retur = addPerson(filename)
    person = inputPerson();
    db = readDbFile(filename);
    db(end + 1) = person;
    retur = db;
    
    % 1. Åpne filen
    fd = fopen(filename, 'a');
    % 2. Bruk filen
    
    fprintf(fd, '%s;%s;%d;%d\n', person.name, person.id, person.weight, person.size);
    
    % 3. Lukk filen
    fclose(fd);
end 

 

 

  • No labels