// tytpoi.cpp - esimerkki tietueiden hyödystä // // Vesa Lappalainen 8.2.1999 // #include #include #include #include #ifdef __TURBOC__ # define GETCH /* Sy”tt” Turbo-C:n mukaisesti. */ # include #endif #define MERKKI_ISOKSI 1 #define MYOS_PIENET 0 char lue_merkki(void) { /* Seuraava toimii mm. Turbo C:ss„: */ #ifdef GETCH int c; while ( 1 ) { /* Korjataan funktion„pp„in-vika */ c = getch(); if ( c != 0 ) return (char)c; c = getch(); } #else /* Seuraava on standardin mukainen: */ char s[50]; fgets(s,50,stdin); return s[0]; #endif } char isoksi(char c) { if ( c<'a' ) return c; if ( c>'z' ) return c; return (char)(c-('a'-'A')); } char odota_nappain(const char *kelpaavat, char oletus, int isot) { char painettu; do { while ( (painettu=lue_merkki()) == 0 ); /* HUOM! korjaus! */ if (isot) painettu = isoksi(painettu); if ( oletus && ((painettu=='\n') || (painettu=='\r')) ) return oletus; } while ( kelpaavat && !strchr(kelpaavat,painettu) ); return painettu; } //------------------------------------------------------------------------- int jatketaan(void) { char c; cout << "Jatketaanko (K/e):" << flush; c = odota_nappain("KE",'K',MERKKI_ISOKSI); cout << c; return ( c == 'K' ); } //------------------------------------------------------------------------- struct tVaihtoehto { char valinta; const char *teksti; int lkm; }; //------------------------------------------------------------------------- void aanesysvalinta(const string &kysymys, const tVaihtoehto vaihtoehdot[]) { cout << "\n\n"; cout << kysymys << '\n'; cout << "\n"; cout << "Valitse:\n"; for (int i=0; vaihtoehdot[i].teksti; i++) cout << " " << vaihtoehdot[i].valinta << " = " << vaihtoehdot[i].teksti << '\n'; cout << " :" << flush; } //------------------------------------------------------------------------- char odota_valinta(const tVaihtoehto vaihtoehdot[]) { string kelpaavat; char c; int i; for (i=0; vaihtoehdot[i].teksti; i++) kelpaavat += vaihtoehdot[i].valinta; c = odota_nappain(kelpaavat.c_str(),vaihtoehdot[i].valinta,MERKKI_ISOKSI); cout << c << "\n"; return c; } //------------------------------------------------------------------------- void tulosta_ja_laske_valinta(char c, const string &viesti, tVaihtoehto vaihtoehdot[]) { cout << viesti; for (int i=0; vaihtoehdot[i].teksti; i++) if ( vaihtoehdot[i].valinta == c ) { cout << vaihtoehdot[i].teksti << endl; vaihtoehdot[i].lkm++; } } //------------------------------------------------------------------------- void tulosta_jakauma(const string &viesti, const tVaihtoehto vaihtoehdot[]) { cout << viesti << '\n'; for (int i=0; vaihtoehdot[i].teksti; i++) cout << " " << vaihtoehdot[i].teksti << setw(3) << vaihtoehdot[i].lkm << '\n'; cout << endl; } //------------------------------------------------------------------------- int main(void) { tVaihtoehto vaihtoehdot[] = { { 'T',"Tytto ", 0 }, { 'P',"Poika ", 0 }, { 'N',"Nainen", 0 }, { 'M',"Mies ", 0 }, { 'N',NULL , 0 } // Lopetusalkio ja samalla oletus }; char painettu; do { aanesysvalinta("Mikas olet?",vaihtoehdot); painettu = odota_valinta(vaihtoehdot); tulosta_ja_laske_valinta(painettu,"Olet siis ",vaihtoehdot); } while ( jatketaan() ); cout << "\n"; tulosta_jakauma("Jakauma:",vaihtoehdot); cout << "Kiitos vastauksista! Hei hei!\n"; return 0; }