Program do sprawdzania powtórzeń losowań lotto

0

Witam, program jakoś genialnie napisany nie jest, przyjdzie czas na poprawę, jednak chce aby najpierw to działało. Problem z programem jest taki ze w momencie sprawdzenia ilości powtórzeń, program zawsze pokazuje że ani razu dana liczba nie wystąpiła, nie ważne co wpisze.

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <vector>
#include <algorithm>

using namespace std;

void zapis()
{
    string linia;
    int nr_linii = 1;
    int noweLiczby[6];

    fstream plik;
    plik.open("LiczbyLosowania.txt", ios::in);
    if (plik.good() == false)
    {
        cout << "Nie można otworzyć pliku.";
        exit(0);
    }

    while (getline(plik, linia))
    {
        nr_linii++;
        cout << linia << endl;
    }
    plik.close();

    plik.open("LiczbyLosowania.txt", ios::out | ios::app);
    for (int i = 0; i < 6; i++)
    {
        cin >> noweLiczby[i];
        plik << noweLiczby[i] << ",";
    }
    plik << endl;

    plik.close();
}

void wczytanie()
{
    string linia;
    int nr_linii = 1;
    fstream plik;
    plik.open("LiczbyLosowania.txt", ios::in);
    if (plik.good() == false)
    {
        cout << "Nie można otworzyć pliku.";
        exit(0);
    }

    while (getline(plik, linia))
    {
        nr_linii++;
        cout << linia << endl;
    }
    plik.close();
}

void sprawdzenie()
{
    int tablica[6];
    string linia;
    int nr_linii = 1;
    fstream plik;
    plik.open("LiczbyLosowania.txt", ios::in);
    if (plik.good() == false)
    {
        cout << "Nie można otworzyć pliku.";
        exit(0);
    }
    while (getline(plik, linia))
    {
        nr_linii++;
        cout << linia << endl;
    }
    vector < string > tab;
    for (int i = 0; i < 10; i++)
    {
        tab.push_back(linia);
    }
    for (int i = 0; i < tab.size(); i++)
    {
        cout << tab[i] << endl;
    }
    cout << "Podaj liczby do sprawdzenia: ";
    for (int i = 0; i < 6; i++)
    {
        cin >> tablica[i];
        vector < int > tab;
        int mycount = count(tab.begin(), tab.end(), tablica[i]);
        cout << tablica[i] << " Powtarza sie: " << mycount << " razy.";
     
    }
   
    plik.close();
}

int main()
{
    for (;;)
    {
        cout << "MENU GLOWNE" << endl;
        cout << "-------------" << endl;
        cout << "1.Zapisz nowe liczby" << endl;
        cout << "2.Zobacz liczby losowan" << endl;
        cout << "3.Sprawdz swoje liczby" << endl;
        cout << "4.wyjscie" << endl;

        char wybor;
        wybor = _getch();
        switch (wybor)
        {
        case '1': zapis(); break;
        case '2': wczytanie(); break;
        case '3': sprawdzenie(); break;
        case '4':exit(0);  break;
        default: cout << "Nie ma takiej opcji!!";  break;
        }
        getchar(); getchar();
        system("cls");
    }
    return 0;
}



0

Widzę, że problem z funkcją sprawdzenie(), która zawsze pokazuje, że dana liczba nie występuje, wynika z kilku błędów w kodzie. Oto kilka sugestii, jak to naprawić:

Po odczytaniu zawartości pliku, warto przepisać dane do wektora, żeby łatwiej nimi operować:

while (getline(plik, linia))
{
    stringstream ss(linia);
    string liczba;
    while (getline(ss, liczba, ','))
    {
        liczby.push_back(stoi(liczba));
    }
}

W pętli, gdzie wczytujemy liczby do sprawdzenia, definiujemy nowy wektor tab, co powoduje, że na pewno nie będzie tam wczytanych żadnych liczb z pliku. Warto nazwać go inaczej (np. liczbyDoSprawdzenia), a do sprawdzenia ilości wystąpień użyć wektora liczby.

Warto dodać informację, jeśli wczytana liczba nie znajduje się w pliku, żeby użytkownik wiedział, co się dzieje.

Zmodyfikowana funkcja sprawdzenie() wyglądałaby mniej więcej tak:

{
    int tablica[6];
    fstream plik;
    plik.open("LiczbyLosowania.txt", ios::in);
    if (plik.good() == false)
    {
        cout << "Nie można otworzyć pliku.";
        exit(0);
    }
    vector<int> liczby;
    string linia;
    while (getline(plik, linia))
    {
        stringstream ss(linia);
        string liczba;
        while (getline(ss, liczba, ','))
        {
            liczby.push_back(stoi(liczba));
        }
    }
    cout << "Podaj liczby do sprawdzenia: ";
    for (int i = 0; i < 6; i++)
    {
        cin >> tablica[i];
        int mycount = count(liczby.begin(), liczby.end(), tablica[i]);
        if (mycount == 0)
        {
            cout << tablica[i] << " nie wystepuje w pliku." << endl;
        }
        else
        {
            cout << tablica[i] << " Powtarza sie: " << mycount << " razy." << endl;
        }
    }
   
    plik.close();
}
0

@Dzwoniec:

Niekonsekwentne to jest
Wiele powtórzeń wczytaj / coś zrób /zamknij plik

4

Spróbuj struktur danych typu hashmap lub set, one służą do bardzo szybkiego sprawdzania czy element istnieje, dodajesz element i sprawdzasz czy istnieje i to jest bardzo szybkie, powinno wystarczyć ci na początek, logarytmiczna wydajność względem ilości danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1