Seuraavaksi kirjoitamme ohjelman, jossa tulee esiin varsin yleinen ongelma: tietueen etsiminen joukosta. Kirjoitamme edellisiä esimerkkejä vastaavan ohjelman, jossa tavallisen tulostuksen sijasta tulostetaan kunkin tuoteluokan yhteistilanne.
// luetrek.cpp c
/*
Ohjelma lukee tiedostoa tuotteet.dat, joka on muotoa:
Volvo | 12300 | 1
Audi | 55700 | 2
Saab | 1500 | 4
Volvo | 123400 | 1
Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden
yhteishinnat ja kappalemäärät sekä koko varaston yhteishinnan
ja kappalemäärän. Eli em. tiedostosta tulostetaan:
-------------------------------------------
Volvo 135700 2
Audi 111400 2
Saab 6000 4
-------------------------------------------
Yhteensä 253100 8
-------------------------------------------
Vesa Lappalainen 15.3.1996
Muutettu 30.12.2001/vl : enemmän C++-maiseksi
Projektiin: luetrek.cpp,ALI\mjonot.c
*/
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include "mjonotpp.h"
#include "dosout.h"
using namespace std;
//---------------------------------------------------------------------------
class cTuote {
string nimike;
double hinta;
int kpl;
void alusta() { nimike=""; hinta=0.0; kpl=0; }
public:
cTuote() { alusta(); }
cTuote(string &st) { setAsString(st); }
cTuote(const string &s) { setAsString(s); }
cTuote(const char *s) { setAsString(s); }
int setAsString(string &st) {
string pala;
alusta();
nimike = erota(st,'|'); poista_tyhjat(nimike); if ( nimike == "" ) return 1;
pala = erota(st,'|'); if ( !luvuksi(pala,hinta) ) return 1;
pala = erota(st,'|'); if ( !luvuksi(pala,kpl) ) return 1;
return 0;
}
int setAsString(const string &s) { string st(s); return setAsString(st); }
int setAsString(const char *s) { string st(s); return setAsString(st); }
ostream &tulosta(ostream &os) const {
ios::fmtflags oldf = os.setf(ios::left);
os << setw(20) << nimike << " " << setiosflags(ios::right)
<< setw(7) << hinta << " "
<< setw(4) << kpl;
os.flags(oldf);
return os;
}
void ynnaa(const cTuote &tuote) {
hinta += tuote.hinta * tuote.kpl;
kpl += tuote.kpl;
}
cTuote &operator+=(const cTuote &tuote) { ynnaa(tuote); return *this; }
const string &Nimike() const { return nimike; }
};
ostream &operator<<(ostream &os,const cTuote &tuote)
{ return tuote.tulosta(os); }
//---------------------------------------------------------------------------
const int MAX_TUOTTEITA = 10;
class cTuotteet {
string nimi;
int tuotteita;
cTuote tuotteet[MAX_TUOTTEITA];
cTuote yhteensa;
public:
cTuotteet(const char *n) : nimi(n), yhteensa("Yhteensä") { tuotteita = 0; }
ostream &tulosta(ostream &os) const;
int etsi(const string &tnimi) const;
int lisaa(const string &tnimi);
int ynnaa(const cTuote &tuote);
int lue(const string &s);
int lue() { return lue(""); }
};
int cTuotteet::etsi(const string &tnimi) const
{
for (int i=0; i<tuotteita; i++)
if ( tuotteet[i].Nimike() == tnimi ) return i;
return -1;
}
int cTuotteet::lisaa(const string &tnimi)
{
if ( tuotteita >= MAX_TUOTTEITA ) return -1;
tuotteet[tuotteita].setAsString(tnimi);
return tuotteita++;
}
int cTuotteet::ynnaa(const cTuote &tuote)
{
if ( tuote.Nimike() == "" ) return 1;
int i = etsi(tuote.Nimike());
if ( i < 0 ) i = lisaa(tuote.Nimike());
if ( i < 0 ) return 1;
tuotteet[i] += tuote;
yhteensa += tuote;
return 0;
}
int cTuotteet::lue(const string &s)
{
string rivi;
if ( s != "" ) nimi = s;
ifstream f(nimi.c_str()); if ( !f ) return 1;
while ( getline(f,rivi) ) {
cTuote tuote(rivi);
if ( ynnaa(tuote) )
cout << "Rivillä \"" << rivi << "\" jotain pielessä!" << endl;
}
return 0;
}
ostream &cTuotteet::tulosta(ostream &os) const
{
int i;
os << "\n\n\n";
os << "-------------------------------------------\n";
for (i=0; i<tuotteita; i++)
os << tuotteet[i] << "\n";
os << "-------------------------------------------\n";
os << yhteensa << "\n";
os << "-------------------------------------------\n";
os << "\n\n" << endl;
return os;
}
int main(void)
{
cTuotteet varasto("tuotteet.dat");
if ( varasto.lue() ) {
cout << "Tuotteita ei saada luetuksi!" << endl;;
return 1;
}
varasto.tulosta(cout);
return 0;
}
|
|
|
|
... Mittakaava ja matka>1:10000 10 cm[RET] Matka maastossa on 1.00 km. Mittakaava ja matka>1:200000 20[RET] Matka maastossa on 4.00 km. Mittakaava ja matka>loppu[RET] Kiitos!
... Mittakaava ja matka>1:10000 10 cm[RET] Matka maastossa on 1.00 km. Mittakaava ja matka>0.20 dm[RET] Matka maastossa on 0.20 km. Mittakaava ja matka>loppu[RET] Kiitos!