C++, shuffle na map<string, string> i quiz
Ostatnio zmodyfikowano 2016-01-24 14:39
młotek Temat założony przez niniejszego użytkownika |
C++, shuffle na map<string, string> i quiz » 2016-01-22 17:35:19 Mam zrobiony program, mam w nim map<string, string> zawierający słowa po polsku i ich tłumaczenie na angielski (mój program to słownik). Potrzebuję zrobić quiz (test), jednak nie wiem jak zrobić aby losowało mi słowa z map a później jeszcze sprawdzało czy podane tłumaczenie zgadza się z tym co mam. Proszę o pomoc. Tutaj kod całego programu (u siebie mam rozbite klasy na osobne pliki): #include "stdafx.h" #include <iostream> #include <string> #include <fstream> #include <map> #include <Windows.h> #include <algorithm> #include <vector>
using namespace std;
fstream plik; string szukane, nazwa_slownika, pl, en, autozapis; char odpowiedz;
class slownik { public: map < string, string > slowka; map < string, string > tmpslowka; map < string, string >::iterator it; void dodaj(); void pokaz_zawartosc(); void szukajplen(); void szukajenpl(); void zapisz( const string & nazwa_slownika ); void otworz( const string & nazwa_slownika ); void kasuj( const string & nazwa_slownika ); void czysc_slowka(); void tasuj(); };
void slownik::dodaj() { cout << "Podaj slowo po polsku: "; cin >> pl; cout << "Podaj slowo po angielsku: "; cin >> en; slowka[ pl ] = en; cout << "Slowo zostalo wprowadzone"; tmpslowka[ en ] = pl; cin.sync(); cin.get(); }
void slownik::pokaz_zawartosc() { for( map < string, string >::iterator ii = slowka.begin(); ii != slowka.end(); ++ii ) { cout <<( * ii ).first << " - " <<( * ii ).second << endl; } cin.sync(); cin.get(); }
void slownik::szukajplen() { cout << "Podaj slowo: \n"; cout << "POL: "; cin >> szukane; it = slowka.find( szukane ); if( it != slowka.end() ) cout << "ENG: " << it->second << "\n"; else { cout << "Podanego wyrazu nie ma w slowniku.\n"; } system( "pause" ); }
void slownik::szukajenpl() { slowka.swap( tmpslowka ); cout << "Podaj slowo: \n"; cout << "ENG: "; cin >> szukane; it = slowka.find( szukane ); if( it != slowka.end() ) cout << "POL: " << it->second << "\n"; else cout << "Podanego wyrazu nie ma w slowniku.\n"; system( "pause" ); }
void slownik::zapisz( const string & nazwa_slownika ) { fstream plik; plik.open( nazwa_slownika, std::ios::in | std::ios::out | std::ios::app ); for( auto it = slowka.begin(); it != slowka.end(); ++it ) plik << it->first << '\t' << it->second << '\n'; }
void slownik::kasuj( const string & nazwa_slownika ) { remove( nazwa_slownika.c_str() ); }
void slownik::otworz( const string & nazwa_slownika ) { std::fstream plik; plik.open( nazwa_slownika, std::ios::in | std::ios::out | std::ios::app ); while( !plik.eof() ) { plik >> pl >> en; slowka[ pl ] = en; tmpslowka[ en ] = pl; } }
void slownik::czysc_slowka() { slowka.clear(); tmpslowka.clear(); }
class test : public slownik { public: typedef pair < string, string > zawartosc; typedef vector < zawartosc > table; void tasuj(); };
void test::tasuj() { table tab( slowka.begin(), slowka.end() ); for( auto & x: tab ) cout << x.first << ' '; cout << endl; for( auto & x: tab ) cout << x.second << ' '; cout << endl; random_shuffle( tab.begin(), tab.end() ); for( auto & x: tab ) cout << x.first << ' '; cout << endl; for( auto & x: tab ) cout << x.second << ' '; cout << endl; }
int main() { slownik slownik; test test; system( "cls" ); cout << " \t \t \t SLOWNIK\n"; cout << " \t \t Polsko-Angielski\n"; cout << " \t \t Angielsko-Polski\n"; cout << "\n\n\n\n\n"; bool wyjdz = false; do { system( "cls" ); cout << " \t \t \t SLOWNIK\n"; cout << " \t \t Polsko-Angielski\n"; cout << " \t \t Angielsko-Polski\n"; cout << "\n\n\n\n\n"; cout << "1. Dodaj nowe slowo\n"; cout << "2. Pokaz wszystkie slowa\n"; cout << "3. Wyszukaj tlumaczenie POL->ENG\n"; cout << "4. Wyszukaj tlumaczenie ENG->POL\n"; cout << "5. Wykonaj test ze snajomosci slowek\n"; cout << "6. Wczytaj slownik\n"; cout << "7. Zapisz slownik\n"; cout << "8. Zamknij slownik\n"; cout << "0. Wyjdz z programu\n"; int znak; cin >> znak; switch( znak ) { case 1: { slownik.dodaj(); break; } case 2: { cout << "Polski - Angielski\n"; slownik.pokaz_zawartosc(); break; } case 3: { slownik.szukajplen(); break; } case 4: { slownik.szukajenpl(); break; } case 5: { test.tasuj(); system( "pause" ); break; } case 6: { cout << "Podaj nazwe slownika ktory chcesz wczytac\n"; cin.clear(); cin >> nazwa_slownika; slownik.otworz( nazwa_slownika ); break; } case 7: { cout << "Podaj nazwe slownika: \n"; nazwa_slownika.clear(); cin >> nazwa_slownika; remove( nazwa_slownika.c_str() ); slownik.zapisz( nazwa_slownika ); break; case 8: { slownik.czysc_slowka(); break; } } default: { cout << "Nieprawidlowa opcja!\n"; break; } case 0: wyjdz = true; break; } } while( !wyjdz ); system( "cls" ); cout << "Nastpi wyjscie z programu...\n\n\n"; cout << "Czy chcesz zapisac slownik?\n"; cout << "Zapis jest konieczny, chyba ze wykonalismy zapis recznie (uzylismy opcji 7)\n\n"; cout << "Y - TAK\n"; cout << "N - NIE\n"; wyjdz = false; do { cin >> odpowiedz; switch( odpowiedz ) { case( 'y' ) : case( 'Y' ) : { cout << "Podaj nazwe slownika: \n"; cin >> nazwa_slownika; slownik.zapisz( nazwa_slownika ); slownik.czysc_slowka(); wyjdz = true; break; } case( 'n' ) : case( 'N' ) : { slownik.czysc_slowka(); wyjdz = true; break; } default: { cout << "Nieprawidlowa opcja!\n"; break; } } } while( !wyjdz ); plik.close(); exit( 0 ); }
|
|
pekfos |
» 2016-01-24 14:39:18 Skopiuj do wektora par i użyj std::shuffle(). Jeśli chcesz wylosować tylko jeden element, możesz wylosować indeks i użyć std::advance() /std::next() na iteratorze mapy. |
|
« 1 » |