Programmeringsmetodik: Inlämningsuppgift 3, Dating-programmet

Den här uppgiften går ut på att öva programutvecklingsmetodik med modularisering och abstrakta datatyper. (Uppgiften är lite ändrad i år, och använder C++-listtypen std::list.)

Uppgiften

Skriv ett program som kopplar ihop flickor med pojkar utgående ifrån deras gemensamma intressen.

Programmet ska läsa ett antal flick- och pojknamn från filerna girlfile.txt respektive boyfile.txt.

Hade det varit på riktigt hade det stått i filerna vilka intressen de har, men för att förenkla problemet ska programmet slumpa fram ett antal av intressena bio, dans, idrott, resor, djur och datorspel, för varje pojke och varje flicka.

Flickorna ska stoppas in i en flicklista, och pojkarna i en pojklista.

Programmet ska sedan fråga efter antalet gemensamma intressen (till exempel 4), och för varje flicka i flicklistan försöka hitta en pojke i pojklistan med minst detta antal lika intressen. Om en sådan lämplig partner hittas, ska paret stoppas in i en parlista, som ska vara sorterad efter flicknamn. Flickan ska då också tas bort från flicklistan, och pojken från pojklistan.

Programmet ska byggas av moduler:

Beroendediagrammet:

Modulerna

Några tips

Modulen "Intressetabell"

Modulen har en specifikationsfil, Intressetabell.h, som ser ut så här. Skriv implementationsfilen, Intressetabell.cpp. (Likadant för de andra modulerna.)
/* Intressetabell.h -- specifikation av intressetabellerna */

#ifndef INTRESSETABELL_H
#define INTRESSETABELL_H

enum intressetyp { bio, dans, idrott, resor, djur, datorspel };
#define ANTAL_INTRESSEN 6

struct Intressetabell {
    int har_intresset[ANTAL_INTRESSEN];
};

typedef struct Intressetabell Intressetabell;

/* Slumpar innehållet i en intressetabell itab */
void slumpa(Intressetabell *itab);

/* Visar intressetabellen itab på skärmen */
void visa_itab(Intressetabell itab);

/* Returnerar antal lika intressen i itab1 och itab2 */
int antal_lika(Intressetabell itab1, Intressetabell itab2);

#endif

Modulen "Person"

/* Person.h -- specifikation av personerna */

#ifndef PERSON_H
#define PERSON_H

#include "Intressetabell.h"

enum konstyp { pojke, flicka };

struct Person {
    char namn[30];
    enum konstyp kon;
    Intressetabell intressen;
};

typedef struct Person Person;

/* Skapar (egentligen initierar) pojke eller flicka med namnet namn */
void skapa_person(Person *person, char *namn, enum konstyp kon);

/* Visar en person på skärmen */
void visa_person(Person person);

/* Kollar om flicka och pojke har minst 'antal' lika intressen */
int passar_ihop(Person flicka, Person pojke, int antal);

/* Jämför person1 och person2 med avseende på personnamnen.
 * Funktionen returnerar ett sant värde, till exempel 1, om
 * personerna är ordnade i bokstavsordning, och ett falskt värde,
 * alltså 0, om de inte är det.
 */
int ordnade_personer(Person person1, Person person2);

#endif

Modulen "Personlista"

/* Personlista.h -- specifikation av personlistor */

#ifndef PERSONLISTA_H
#define PERSONLISTA_H

#include <list>
#include "Person.h"

typedef std::list<Person> Personlista;

/* Läser in namn från en fil, skapar personer, och stoppar in dem i listan */
void fyll_personlista(Personlista *lista, char *filnamn, enum konstyp kon);

/* Skriver ut listan på skärmen */
void visa_personlista(Personlista listan);

#endif

Modulen "Par"

/* Par.h -- specifikation av par-typen */

#ifndef PAR_H
#define PAR_H

#include "Person.h"

struct Par {
    Person flicka;
    Person pojke;
};

typedef struct Par Par;

/* Skapar (egentligen initierar) ett par av en flicka och en pojke */
void skapa_par(Par *par, Person flicka, Person pojke);

/* Visar ett par på skärmen */
void visa_par(Par par);

/* Jämför par1 och par2 med avseende på flickornas namn */
int ordnade_par(Par par1, Par par2);

#endif

Modulen "Parlista"

/* Parlista.h -- specifikation av personlistor */

#ifndef PARLISTA_H
#define PARLISTA_H

#include <list>
#include "Par.h"
#include "Person.h"
#include "Personlista.h"
#include "Parlista.h"

typedef std::list<Par> Parlista;

/* Skriver ut listan på skärmen */
void visa_parlista(Parlista listan);

/* Parar ihop pojkar och flickor med ett visst minsta antal intressen */
void para_ihop(Personlista *flicklista, Personlista *pojklista, Parlista *parlista, int minsta_antal);

#endif

Modulen "Dating"

Dating är huvudmodulen, med main-funktionen. Eftersom den inte ska användas av andra moduler, utan bara använder dem, har den inget gränssnitt i form av en .h-fil. Den består bara av filen Dating.cpp:

/* Dating.cpp -- implementation av huvudmodulen */
Ska börja med att skapa tomma listor för flickor, pojkar och par samt sedan forsätta med en meny enligt: Menyn ska ha filter för säker inmatning.

Frivillig extrauppgift 1

Komplettera med ett alternativ ompara som frågar efter en flicka i parlistan och parar om henne med en annan pojke med ett nytt inläst antal lika intressen. Den först parade pojken stoppas tillbaka i pojklistan om ny pojke hittats.

Frivillig extrauppgift 2

Vi ska ändra i programmet så att det hanterar gay-, bi- och heteropersoner. Lägg till följande datatyp i Person.h:
enum laggningstyp { gay, bi, hetero };
Slumpa fram läggningen för de inlästa personerna, eller ändra i textfilerna så den står redan där. Ändra sen programmet så att det matchar på rätt sätt, med hänsyn tagen till läggning.

Obs: Gör inte detta i ditt eller din grupps eget program, utan i en annan grupps färdiga program! Skriv inte om hela programmet från början, utan försök göra så få ändringar som möjligt!

Redovisning

Uppgiften ska redovisas med en fullständig rapport, inklusive försättsblad, innehållsförteckning och sammanfattning, med bilagor i form av användaranvisning (manual), exempel på utskrift av en parlista för 4 gemensamma intressen, samt den källkod som du skrivit. Ge eller skicka rapporten till labbhandledaren.

Skicka också in källkoden med mail till labbhandledaren.

Om samarbete på inlämningsuppgifterna: Varje grupp (som normalt består av en eller två studenter) ska göra en egen lösning, och skicka in den, men det är inte förbjudet att samarbeta eller fråga andra studenter om hjälp. Däremot ska man i så fall tydligt ange vilka som man samarbetat med. Varje lösning måste ange namnet på alla som bidrog i arbetet. Samarbete är alltså tillåtet, men måste redovisas.

Godkänd rapport utgör en del av delkurs 2 i kursen Programmeringsmetodik.

Inlämningsuppgifterna bör göras, och lämnas in, före tentan. Man får tenta utan att ha lämnat in uppgifterna, men:


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 24 oktober 2011