Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

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

Code Block
languagenone
titlemembers.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)
Widget Connector
urlhttps://www.youtube.com/watch?v=MqQV9YVEyCI
Widget Connector
urlhttps://www.youtube.com/watch?v=O7Tpj-7ndpI
Widget Connector
urlhttps://www.youtube.com/watch?v=qGhENw4UKrk
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)
Widget Connector
urlhttps://www.youtube.com/watch?v=nIdrrfd12go
Widget Connector
urlhttps://www.youtube.com/watch?v=oHyB0gcTiSQ
Widget Connector
urlhttps://www.youtube.com/watch?v=SsgtEzXIpbA
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

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Expand
titleOppgave 2a)
Code Block
titleinputPerson.m
function retur = inputPerson()
    retur.name = input('Name: ', 's');
    retur.id = input('ID: ', 's');
    retur.weight = input('Kg: ');
    retur.size = input('Size: ');
end 
Expand
titleOppgave 2b)
Code Block
titlereadDbFile.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 
Expand
titleOppgave 2c)
Code Block
titleprintMemberList.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 
Expand
titleOppgave 2d)
Code Block
titleaddPerson.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