Ohjelmointi++ 2002/ 25.3

Demo 10


1*.
Kirjoita C++-ohjelma joka tulostaa tiedoston koe.txt:
123456789012345678901234567890123456789012345678901234567890
Kissa istuu puussa
ja ihmettelee
mualiman menoa
sisällön siten, että kunkin rivin alkuun tulee rivinumero ja kustakin rivistä tulostetaan korkeintaan 40 merkkiä:
/* 01 */ 1234567890123456789012345678901234567890
/* 02 */ Kissa istuu puussa
/* 03 */ ja ihmettelee
/* 04 */ mualiman menoa
2.
Kirjoita ohjelma, joka kysyy tiedoston nimen ja tulostaa tiedostosta kaikki ne rivit jotka alkavat **
3*.
Kirjoita ohjelma, joka lukee tiedoston (tietovirtoja käyttäen) ja tulostaa lopuksi kuinka monta kertaa mikäkin aakkosten kirjain esiintyi tiedostossa ('A'='a'). Vihje: Mieti ensin mitä itse tekisit jos joutuisit moisen homman tekemään, eli esimerkiksi kertomaan tästä demopaperista monestiko mikäkin kirjain esiintyi.
4.
Lisää esimerkkeihin laske.cpp, laske2.cpp ja laske3.cpp tarvittavat private copy-construktorit ja sijoitusoperaattorit, jotta mahdolliset vahinko-kopioinnit ja sijoitukset voidaan estää (alla oleva esimerkkiohjelma ei saa tällöin kääntyä). Muuta sitten lisäksi vähintään yhteen em. ohjelmista myös copy-constructori ja sijoitusoperaattori oikeasti toimivaksi niin, että pääohjelmaan voidaan lisätä esim (eli nyt ohjelma kääntyy ja toimii):
  ...
  sanat.tulosta(cout);
  cSanat sanat2(sanat);
  sanat2.tulosta(cout);
  cSanat sanat3;
  sanat3 = sanat;
  sanat3.tulosta(cout);
  return 0;
}
5.
Lisää kaikkiin edellisiin virheiden (mieti ensin mitä kaikkia poikkeuksia voi tulla) käsittely try-catch:illä.
6.
Seuraavana esimerkki linkitetyn listan käytöstä (vrt. luennolla 22.3 tehty muutos taul_d.cpp tietorakenteeseen: linlista.cpp). Piirrä kuva tietorakenteesta pääohjelman suorituksen jälkeen. (Pohja loytyy moniste\demo\c-ohj\aku.cpp)

/* akutie.cpp */
#include <iostream.h>
#include <iomanip.h>
#include <string>
#include "streampr.h"
using namespace std;

class cLuokka;

/****************************************************************************/ class cOppilas { friend cLuokka; string nimi; double keskiarvo; cOppilas *seuraava; public: cOppilas(const string &animi, double arvo = 0 ) : nimi(animi) { keskiarvo = arvo; seuraava = NULL; } ostream &tulosta(ostream &os=cout) const; };

ostream &cOppilas::tulosta(ostream &os) const { cStreamPre pre(os,2,ios::left); os << setw(22) << nimi; os.setf(ios::right); os << " keskiarvo: " << setw(5) << keskiarvo << endl; os << endl; return os; }

/****************************************************************************/ class cLuokka { string luokka; int oppilaita; cOppilas *ensimmainen; cOppilas *viimeinen; public: void alusta() { oppilaita = 0; ensimmainen = NULL; viimeinen = NULL; } cLuokka(const string &aluokka) : luokka(aluokka) { alusta(); } ~cLuokka() { poista_kaikki(); } int lisaa(const cOppilas &oppilas); ostream &tulosta(ostream &os=cout) const; void poista_kaikki(); };

... /****************************************************************************/ int main(void) { cLuokka luokka("1b"); cOppilas aku("Ankka Aku",5.0); cOppilas mikki("Hiiri Mikki",9.0); luokka.lisaa(aku); luokka.lisaa(aku); luokka.lisaa(mikki);

luokka.tulosta();

return 0; }


Seuraavat tehtavät liittyvät tuohon aku.cpp-ohjelmaan:
7*.
Kirjoita metodi cLuokka::lisaa.
8*.
Kirjoita metodi cLuokka::tulosta (käyttää metodia
cOppilas::tulosta)

GURU ja Bonus-tehtävät

Jatkossa Guru tai Bonus-tehtävillä (G tai B) voi vain korvata tavallisia tehtäviä. Eli merkittävien rukisen summa ei voi ylittää 8:aa vaikka olisi tehnyt tavalliset tehtävät+Guru-tehtävät. Tehtävän saa merkitä yhden pisten arvoiseksi vain kun se on luotettavasti koneella toimivaksi testattu.

B1.
Missä kohti aku.cpp:ssä tarvitaan ystävyyttä (friend) ja miten se voitaisiin välttää?

G1-2
Kirjoita aku.cpp:n luokaan cLuokka metodi kaanna, joka kääntää linkitetyn listan päinvastaiseen järjestykseen.