Skip to content

Instantly share code, notes, and snippets.

@snorrewb
Created September 5, 2012 14:50
Show Gist options
  • Save snorrewb/3637769 to your computer and use it in GitHub Desktop.
Save snorrewb/3637769 to your computer and use it in GitHub Desktop.
IMT1031 Grunnleggende Programmering - Obligatorisk oppgave 5
// 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