Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++, shuffle na map<string, string> i quiz

Ostatnio zmodyfikowano 2016-01-24 14:39
Autor Wiadomość
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):

C/C++
#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";
    //tmpslowka.swap(slowka);
    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 );
}
P-143891
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.
P-143957
« 1 »
  Strona 1 z 1