Prosjektoppgave i «IMT1082 - Objekt-orientert programmering» våren 2016 Frister: Tirsdag 19.april 2016 kl.14.00 NB: Fredag 18.mars kl.09.00 (1.delinnlevering) Arbeidsform: Arbeidsinnsats: Torsdag 7.april kl.09.00 (2.delinnlevering) Gruppe (tre (evt. to) personer flere er ikke relevant) Mye Innledning Dere skal i denne prosjektoppgaven lage et noe større program som holder orden på ulike kunders kjøp og salg på en nettauksjon, samt gjenstandene (og deres bud) som er lagt ut for salg i ulike kategorier. Programmet er en sterk forenkling av slikt som ebay og QXL. I hovedsak skal programmet håndtere: at en kunde kan: o registrere seg / logge inn / logge ut o skrive alle egne kjøp og salg o registrere at en kjøpt gjenstand er betalt o gi en annen kunde (kjøper eller selger) karakter og tilbakemelding o for en underkategori: se hoveddataene om alle gjenstandene legge inn en ny gjenstand for auksjonering o for en gitt gjenstand: se alle detaljer (inkludert alle nåværende bud) gi bud på den at en administrator kan (i tillegg til det ovenfor): o endre rettigheter for en annen kunde (til/fra å være administrator) o legge inn en ny hoved- og/eller underkategori for salg av gjenstander at flere ulike typer datastrukturer leses fra / skrives til (mange) filer tre ulike kategorier av brukere: 1) Ikke innlogget, 2) Innlogget vanlig bruker, 3) Innlogget administrator. Disse tilbys noe ulike menyvalg ift. punktene ovenfor. Globale variable, klasser (og litt datastrukturen) Programmet skal kun inneholde tre globale objekter av klassene: Kunder, Kategorier og Gjenstander. Inni disse objektene ligger til sammen hele datastrukturen. Programmet skal (i hvert fall) inneholde de syv klassene med minst datamedlemmene: 1. Kunder inneholder datastrukturen med Kunde er, samt evt. navnet på nåværende innlogget bruker/kunde. 2. Kunde inneholder et unikt brukernavn (ett sammenhengende ord, sortert på dette), passord, fullt reelt navn, gateadresse, postnr, poststed, mail, antall kjøp, antall salg og om vedkommende har admin-rettighet eller ei. 1
3. Kategorier inneholder datastrukturen med Kategori ene (både hoved- og underkategorier), samt de fortløpende økende og unike numrene på en kategori (hoved eller under) og auksjonsgjenstand. 4. Kategori inneholder et unikt kategorinavn (sortert på dette), dets unike (og delvis skjulte) nummer og evt. datastrukturen med underkategorier. 5. Gjenstander - inneholder datastrukturen med Gjenstand ene (for nåværende underkategeori) og navnet for filen disse er hentet fra. 6. Gjenstand inneholder et unikt gjenstandsnummer (sortert på dette), selgerens brukernavn, gjenstandens tittel, beskrivelse, starttidspunkt, sluttidspunkt, startpris, budøkning, porto og datastrukturen med alle nåværende Bud. (Om det finnes bud på gjenstanden så ligger høyeste bud lagret i det 1.budet.) 7. Bud inneholder budets størrelse (sortert på dette med det største først), budgiverens brukernavn og tidspunkt for budet. Tips: Tegn opp, og bli ordentlig sikker på hvordan datastrukturen må være (ser ut), og hvordan den fungerer ifm. de ulike funksjonene dere skal lage (angitt nedenfor). Menyvalg / funksjoner Programmet skal (i hvert fall) håndtere følgende 15 menyvalg: K R Registrer en ny kunde. Et nytt unikt brukernavn og alle dataene om den nye kunden leses inn. Vedkommende registreres som innlogget, og aktuell meny vises. (Tilbys/virker bare for en som ikke er logget inn.) K L Logg inn en eksisterende kunde. Ved korrekt passord logges en eksisterende kunde inn. Aktuell meny vises. (Tilbys/virker bare for en som ikke er logget inn.) K U Logg ut en innlogget kunde. Registreres som utlogget, og «ny» aktuell meny vises. (Tilbys/virker bare for en som er innlogget.) K S Se alle egne kjøp og salg. Alt innholdet på kundens to filer (S<brukernavn>.DTA og K<brukernavn>.DTA) vises på skjermen (med et passende utseende). (Tilbys/virker bare for en som er innlogget.) K B Betale en vunnet auksjon/gjenstand. En kjøpt gjenstand settes betalt i kundens K-fil og som betalt i selgerens S-fil. Må bl.a. ivareta at det skrives inn et gjenstandsnummer som ikke er kjøpt, nok penger er betalt eller at den allerede er betalt. (Tilbys/virker bare for en som er innlogget.) K F Gi en annen kunde karakter og feedback/tilbakemelding. Gir en annen kunde man har handlet (solgt eller kjøpt en gjenstand) med, karakter (1-6) og feedback/tilbakemelding. Dette skrives direkte inn på vedkommendes K- eller S-fil. Håndtere feilsituasjoner som: feil brukernavn, ikke karakter til seg selv, aktuell fil finnes ikke, ulovlig gjenstandsnummer, gjenstanden ikke handlet mellom de to eller at har gitt karakter allerede. (Tilbys/virker bare for en som er innlogget.) 2
K E Endre en annen kundes rettigheter (til/fra administrator). En annen kunde får invertert sin rettighet. Kan ikke bytte på seg selv. (Tilbys/virker bare for en innlogget administrator.) A H Legge inn en ny unik hovedkategori. Dens gis et «skjult» nummer som fortløpende telles opp. (Tilbys/virker bare for en innlogget administrator.) A U Legge inn en ny underkategori (under en hovedkategori). Dens gis også et «skjult» nummer (fra samme variabel som ovenfor). (Tilbys/virker bare for en innlogget administrator.) A S Auksjoner Se. Kunden «blar» seg frem til en underkategori. Alle gjenstandene som er til auksjonering i kategorien leses fra filen G<nr.>.DTA. Kunden tilbys så evt. de fire neste menyvalgene inntil det velges Q : (Tilbys alle type brukere, innlogget eller ei.) Q A E L B Se alle auksjonsgjenstandene i aktuell underkategori. Alle aktive vises. (Tilbys alle type brukere - innlogget eller ei.) Se alle detaljer om en gjenstand. For en aktiv gjenstand (ut fra nummeret) vises alle data, inkl. alle budene. (Tilbys alle type brukere - innlogget eller ei.) Legg inn en ny auksjonsgjenstand (i aktuell underkategori). Før den nye gjenstanden legges inn, leses alle data om den. Gjenstanden tildeles automatisk et fortløpende nummer. (Tilbys/virker bare for en som er innlogget.) Legg inn bud på en gjenstand. Det legges inn et bud på en aktiv gjenstand. Budet kan være likt med startprisen (om er 1.bud) eller min. lik: forrige bud+økning. (Tilbys/virker bare for en som er innlogget.) Avslutte A S -modusen eller hele programmet (Tilbys alle type brukere - innlogget eller ei.) Alle slags feilsituasjoner (f.eks. ulovlige kommandoer, ikke-eksisterende navn og numre), og dertil egnede meldinger, er så vidt nevnt ovenfor. Dette må også selvsagt gjøres/kodes. I tillegg må selvsagt main lages (som «styrer hele butikken»), samt funksjoner for å lese brukerens valg/kommando og en lengre utskrift med liste over aktuelle valg/kommandoer. En del annet også, f.eks: at tall virkelig er numeriske verdier, at de er i rimelig intervall, bygge ulike filnavn (G-, K- og S-filer) eller å «strippe» alle tekster for blanke foran og bak. Data til/fra filer I programmet er det involvert fem ulike (typer) filer (alle filformat bestemmer dere selv): To av de (tre) globale objektenes data lagres på henholdsvis filene: KUNDER.DTA og KATEGORIER.DTA. Alle gjenstandene i en underkategori er lagret på filen G<ukat.nr>.DTA, der <ukat.nr> er det «skjulte» nummeret lagret i vedkommende Kategori-objekt. Det er data fra en slik fil som til enhver tid evt. er lest/lagt inn i datastrukturen i det globale Gjenstander-objektet. Disse tre typene av filer inneholder tilsammen alle relevante data fra de syv klassene. 3
Alle gjenstandene som en bruker har kjøpt/solgt er lagret på henholdsvis filene: K<brukernavn>.DTA og S<brukernavn>.DTA. Disse filene bør ha identisk samme format, innholdende alle relevante data for handelen av en gjenstand mellom to kunder, inkludert karakter og tekstlig feedback. De skal oppdateres (legges til info bakerst), for både kjøperen (K-fila) og selgeren (S-fila), hver gang en auksjon er avsluttet. I alle tilfeller bør det automatisk skrives til fil hver gang en datastruktur er oppdatert. Prosjekt / multifil-program Dere skal utvikle hele dette programmet som et prosjekt, der programmet er splittet opp i flere ulike filer. Følgende (minst 11).h-filer må lages: en med alle const er (og evt. en med alle enum er) en med deklarasjon av alle globale funksjonsheadinger en pr.klasse med deklarasjon av dets innhold (datamedlemmer og funksjonsheadinger) ListTool2B.h (ligger allerede ferdig på PROSJEKT-katalogen) timer4.h (ligger allerede «ferdig» på PROSJEKT-katalogen) Følgende (minst 11).cpp-filer må lages: en som inneholder main og definisjon av de globale variablene minst en fil som inneholder definisjon (innmaten) av alle de globale funksjonene en pr.klasse med definisjon av klassens funksjoner (deres innmat) ListTool2B.cpp (ligger allerede ferdig på PROSJEKT-katalogen) timer4.cpp (ligger allerede «ferdig» på PROSJEKT-katalogen) Hjelp: Se og lær av filene E19*.* på EKSEMPEL-katalogen. Annet (klargjørende?) I oppgaveteksten brukes ordene «kunde» og «bruker» synonymt. ListTool skal brukes ifm. løsningen av denne prosjektoppgaven. Legg merke til og bruk ListTool2B.H og ListTool2B.CPP (se rett ovenfor). Definer de globale variablene på samme fil som main. Om dere trenger å bruke disse på/i andre filer, så refererer dere til dem vha. extern i disse filene. Noen aktuelle const er kan være: NVNLEN, STRLEN, STARTGJNR, MAXBUD, MAXPRIS, MAXPORTO, MAXOKNING,.. Det skal sikres at alle tall som leses inn virkelig er numeriske, samt at de ligger i fornuftige intervaller. Det kan være lurt å lagre alle tidspunkt på formen: ÅÅMMDDTTMM, da dette gjør det enkelt å sjekke om et tidspunkt er passert. Men, det må lages funksjoner som viser dette på skjermen med et mer fornuftig format, samt å sjekke at et tidspunkt er lovlig. Uansett: Bruk timer4.* for å hente dato og klokkeslett på maskinen. At en gjenstand er «aktiv» betyr ikke bare at den er lagt ut for auksjon i en underkategori, men også at nåværende tidspunkt (dato/kl.) er mellom gjenstandens start- og sluttidspunkt. Når og hvordan vil dere oppdage (og håndtere) at en auksjon er ferdig/avsluttet? 4
Programmet trenger f.eks. ikke håndtere slikt som (noe av det er selvsagt en svakhet): Slette/endre en kunde, kategori, gjenstand eller bud. Spørsmål og svar mellom potensiell kjøper og selger, autobud, flere til salgs av samme gjenstand, forlengelse av sluttidspunkt, bilde av gjenstanden, direkte kjøp (uten budrunde), vise gjenstandsliste sortert på ulike kriterier, se alle gjenstander fra en bestemt selger, søke vha. nøkkelord, mail/melding til kjøper og selger når en auksjon er avsluttet, eller betaling via slikt som PayPal o.l. Det er lurt å tidlig planlegge hvilken rekkefølge dere bør implementere dette i (se neste avsnitt), og hva som kan gå parallelt, eller forutsetter at annet er laget/fungerer allerede. Denne oppgaveteksten er nok ikke helt entydig og utfyllende på alle punkter/måter. Derfor er det mulig at dere må gjøre deres egne klargjøringer/presiseringer/forutsetninger (se aller siste punkt under «Sluttinnlevering»). Forslag til rekkefølge på implementasjonen 1. Main m/leskommando, skrivmeny og omrisset av klassene m/datamedlemmer. 2. Bestem formatet for KUNDER.DTA og KATEGORIER.DTA. Legg inn noen testdata på disse, og les dette inn i datastrukturen. 3. Bestem flest mulig const er, skriv pesudokode og kod (globale) hjelpefunksjoner (jfr. siste avsnittet rett over tittelen «Data til/fra filer» ovenfor). 4. Implementer kommandoene: K R, K L, K U, K E, K S, A H og A U 5. Implementer (de mest avanserte) kommandoene: K B, K F og «alt» under A S Når formatet for Gxxxxx.DTA, Kxxxxx.DTA og Sxxxxx.DTA må bestemmes, og når det skal leses fra/skrives til disse, må dere selv finne ut. Gjøremål 1.arbeidsuka (14.-18.mars) 1. Gjøre pkt 1.1 og punktene 2.1-2.5 på websiden om prosjektet. 2. Sette seg inn i/lese nøye oppgaveteksten (jfr. pkt.5 på websiden om prosjektet). Analyse av problemstillingen og datastrukturen. 3. Delta på de tre forelesningene i uke 11 (mandag, tirsdag og fredag). 4. Lage grupperegler (jfr. pkt.1.2 på websiden om prosjektet). NB: Dokumentet som ligger ute er innspill, ingen ferdig kontrakt. 5. Gjøre pkt.3 og 4 på websiden om prosjektet. 6. Bestemme datoene for når de ulike punktene under «Forslag til rekkefølge på implementasjonen» (rett ovenfor) skal være ferdig. 7. Utføre og avkrysse alt på sjekklisten (jfr. pkt.6 på websiden om prosjektet). 8. Overholde fristen for og innholdet i «Delinnlevering nr.1» (se rett under). 5
Delinnlevering nr.1 Innen fredag 18.mars 2016 kl.09.00 skal dere ha gjort følgende: Levert (på papir) til emnelærer: 1. navnet på gruppedeltagerne, inkl. kontaktinfo (mail og mobil) for alle i gruppen. 2. ett A4- eller A3-ark med detaljert tegning av datastrukturen. 3. gruppereglene, signert av alle gruppens medlemmer. 4. individuelt signert bekreftelse fra hver av gruppedeltagerne (jfr. pkt.1.3 på websiden om prosjektet). 5. utført, avkrysset og signert sjekkliste (jfr. pkt.6 på websiden om prosjektet). Dataene i pkt.1 legges også inn i README-filen for prosjektet på Bitbucket (fjern all den andre teksten Bitbucket foreslår skal være med der). Dokumentene i pkt.2-3 ovenfor skal også (innscannet) legges inn i GruppeXX-mappen deres på Google Docs. Delinnlevering nr.2 Innen torsdag 7.april 2016 kl.09.00 skal dere ha lastet opp (committed) deres siste versjon av koden i prosjektet. Dere skal minst ha gjort ferdig (kodet og fungerer korrekt) t.o.m. pkt.4 under «Forslag til rekkefølge på implementasjon» (ellers vil dere ligge dårlig an ). I tillegg skal alle aktuelle testfiler i GruppeXX-mappen på Google Docs være oppdatert (jfr. pkt.2.6 på websiden om prosjektet). Disse lages/fylles ut etter hvert som dere skriver pseudokode for hver kommando (altså før dere begynner å skrive selve koden). Sluttinnlevering Innen tirsdag 19.april 2016 kl.14.00) skal dere ha: lastet opp (committed) deres fungerende, endelige og siste versjon av koden i prosjektet. i GruppeXX-mappen (på Google Docs): oppdatert og ferdigstilt (fylt ut komplett) alle testfilene. lagt en fil med beskrivelse av alle filformatene og eksempler på filenes utseende. evt. ha lagt en egen fil («readme.doc/pdf») med egne presiseringer/forutsetninger. Gruppe(sam)arbeid Sørg for at alle ytre rammer er lagt til rette for et godt og konstruktivt samarbeide. Dette gjøres best ved å sette opp klare og konkrete grupperegler (se pkt.1.2 på websiden om prosjektet, som er innspill til dette). Jobb mye, effektivt og målrettet allerede fra første stund (dvs. start «langspurten» tidlig, se «Gjøremål 1.arbeidsuka»). Og: sørg for å være «i rute» ved delinnlevering nr.2 ellers får dere en knallhard avslutning. Generelle krav til obligatoriske arbeider Se: http://www.hig.no/~grprog/obliger#gen_reg (spesielt det åttende punktet) Lykke til! FrodeH 6