Created
September 5, 2012 14:50
-
-
Save snorrewb/3637769 to your computer and use it in GitHub Desktop.
IMT1031 Grunnleggende Programmering - Obligatorisk oppgave 5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Program for å administrere telefonnumre (og adresser) for ulike | |
// kontakter/familie/venner. | |
// INCLUDE: | |
#include <fstream> // ifstream | |
#include <iostream> // cout, cin | |
#include <cctype> // toupper | |
#include <cstring> // strcmp, strlen | |
using namespace std; | |
// CONST: | |
const int STRLEN = 60; // Max.lengde for en tekststreng. | |
const int MAXTLF = 200; // Max.antall i kartoteket. | |
// KLASSE: | |
class Telefonnr { | |
private: | |
int num; //individuelle variabler for hver kontakt | |
char name[STRLEN], address[STRLEN], postal[STRLEN]; | |
// Oppgave 3a: Deklarer data-innmaten | |
public: // Lag innmaten til disse ifm: | |
void les_data(); // Oppgave 3c | |
void skriv_data(int n); // Oppgave 3d | |
bool lik_navn(char nvn[]); // Oppgave 3f | |
int hent_telefonnummer(); // Oppgave 3f | |
void les_fra_fil(istream * inn, int nr); // Oppgave 3g | |
}; | |
void skriv_meny(); // DEKLARASJON AV FUNKSJONER: | |
void les(char & ch); | |
void les(char txt[], char txt2[]); | |
void ny(); | |
void oversikt(); | |
bool slett(int n); | |
int finn(char nvn[]); | |
void les_fra_fil(); | |
Telefonnr tlflist[MAXTLF]; //lager en array med kontakter | |
int listlength = 0; //setter lengden til 0 da den er tom | |
// Oppgave 3a: Definer datastrukturen | |
int main() { // HOVEDPROGRAMMET: | |
char kommando; // Brukerens valg/ønske/kommando. | |
int nr; // Indeksen som skal slettes (se case 'S'). | |
int nummer; // Indeksen til funnet telefonnumer (se case 'F'). | |
char navnet[STRLEN]; // Navnet tilhørende ønsket tlf.nr. (se case 'F'). | |
les_fra_fil(); // Oppgave 3g | |
skriv_meny(); | |
les(kommando); // Leser brukerens valg/ønske/kommando. | |
while (kommando != 'Q') { // Så lenge ikke avslutte (quit): | |
switch(kommando) { | |
case 'N': ny(); break; // Oppgave 3c | |
case 'O': oversikt(); break; // Oppgave 3d | |
case 'S': cout << "\tHvilken indeks vil du slette: "; cin >> nr; | |
if (slett(nr)) // Oppgave 3e | |
cout << "\n\tDenne indeksen er nå slettet."; | |
else | |
cout << "\n\tIndeksen utenfor relevant område!"; break; | |
case 'F': les("Navn", navnet); // Oppgave 3b | |
nummer = finn(navnet); // Oppgave 3f | |
if (nummer != 0) | |
cout << "\n\tTelefonnummeret er: " << nummer; | |
else | |
cout << "\n\tIngen i kartoteket har dette navnet!"; break; | |
default: skriv_meny(); | |
} | |
les(kommando); | |
} | |
// Burde ha skrevet datastrukturen tilbake til fil. | |
// skriv_til_fil(); // Men dette er ikke en del av denne eksamensoppgaven. | |
return 0; | |
} | |
// DEFINISJON AV KLASSE-FUNKSJONER: | |
void Telefonnr :: les_data() { //bruker les-funksjonen for å sette nye verdier | |
les("Skriv navnet", name); | |
cout << "Skriv nummeret: "; | |
do { //nummeret er en int, så tar den med en do | |
cin >> num; | |
} while (num < 10000000 || num > 99999999); | |
les("adressen", address); | |
les("poststedet", postal); | |
} | |
void Telefonnr :: skriv_data(int n) { //skriver ut data i påkrevd format | |
cout << n << ", " << num << ", " << name << "\n"; | |
cout << address << ", " << postal << "\n"; | |
} | |
bool Telefonnr :: lik_navn(char nvn[]) { //bruker strcmp() for å sammenligne | |
if (!strcmp(nvn, name)) { //returnerer en bool | |
return true; | |
} else { | |
return false; | |
} | |
} | |
int Telefonnr :: hent_telefonnummer() { //returnerer telefonnummeret | |
return num; | |
} | |
void Telefonnr :: les_fra_fil(istream * inn, int nr) { //leser inn en person fra | |
num = nr; //fra fil | |
(*inn).ignore(); | |
(*inn).getline(name, STRLEN); | |
(*inn).getline(address, STRLEN); | |
(*inn).getline(postal, STRLEN); | |
} | |
// DEFINISJON AV FUNKSJONER: | |
void skriv_meny() { | |
cout << "\n\nFølgende kommandoer er lovlige:" | |
<< "\n\tN - Nytt telefonnummer inn i kartoteket." | |
<< "\n\tO - Oversikt over hele kartoteket skrives til skjermen." | |
<< "\n\tS - Slette alt på en gitt indeks i kartoteket." | |
<< "\n\tF - Finn telefonnummeret for en gitt person." | |
<< "\n\tQ - Quit/avslutt."; | |
} | |
// Oppdaterer direkte den 'ch' er et alias for | |
void les(char & ch) { // (da denne er referanseoverført). | |
cout << "\n\nKommando: "; | |
cin >> ch; // Leser brukerens valg/ønske/kommando. | |
ch = toupper(ch); // Gjør 'ch' om til STOR bokstav. | |
cin.ignore(); // Forkaster neste tegn ('\n'). | |
} | |
void les(char txt[], char txt2[]) { //bruker getline for å ta inn en hel linje | |
do { | |
cout << txt << ": "; | |
cin.getline(txt2, STRLEN); | |
} while (strlen(txt2) == 0); // Looper så lenge kun ENTER/CR. | |
} | |
void ny() { //sjekker at det er plass til fler kontakter, og setter i gang | |
if (listlength == 200) { //les_data() om det er plass | |
cout << "Kartoteket er fullt!"; | |
} else { | |
tlflist[listlength].les_data(); | |
listlength++; | |
} | |
} | |
void oversikt() { //sjekker at det er noe å skrive ut, og starter evt hvert | |
if (listlength == 0) { //objekt sin skriv_data() | |
cout << "Kartoteket er tomt!"; | |
} else { | |
for (int i = 0; i < listlength; i++) { | |
tlflist[i].skriv_data(i+1); | |
} | |
} | |
} | |
bool slett(int n) { //overskriver et objekt med siste objekt i lista, og | |
cout << n; //reduserer lengde-variablen med 1 | |
cout << "\n" << listlength << "\n"; | |
if (n <= listlength) { | |
tlflist[n] = tlflist[listlength]; | |
listlength--; | |
return true; | |
} else { | |
cout << "Ingen data her!"; | |
return false; | |
} | |
} | |
int finn(char nvn[]) { //går gjennom lista og starter vert objekt sin | |
for (int i = 0; i < listlength; i++) { //lik_navn() | |
if (tlflist[i].lik_navn(nvn)) { | |
return tlflist[i].hent_telefonnummer(); | |
} | |
} | |
return 0; | |
} | |
void les_fra_fil() { //setter igang fillesing, og får hvert objekt til å | |
ifstream infile("KARTOTEK.DTA"); //bruke les_fra_fil() | |
int temptlf; | |
if (infile) { | |
while (!infile.eof() && listlength < MAXTLF) { | |
infile >> temptlf; | |
tlflist[listlength].les_fra_fil(& infile, temptlf); | |
listlength ++; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment