• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ sprawdzanie poprawności danych

Object Storage Arubacloud
0 głosów
1,261 wizyt
pytanie zadane 13 października 2019 w C i C++ przez dudduss76 Początkujący (280 p.)
edycja 13 października 2019 przez dudduss76

Witam mam taki problem i nie mam już pomysłu jak go rozwiązać.

Gra to kółko i krzyżyk i do jej zakończenia potrzebuję zrobić walidację danych tak aby użytkownik nie mógł wyjść poza zakres tablicy, wprowadzić litery, czy trafić na już zajęte miejsca. Pozostało mi do zrobienia sprawdzanie czy użytkownik nie wprowadził litery co mniej więcej już działa lecz przechodzą a nie powinny dane typu "1a", "3b" itd. Próbowałem to też robić na char lecz tam też występuje problem przy wprowadzaniu danych typu "1a" i jest to czytane jako 1 na wierszu, a litera "a" na kolumnie a nie powinno tak być ponieważ dane są wprowadzane ciągiem np. 0 0 1 0 0 1 1 1 0 2, a gdy wprowadzę np. 0 0a 1 0 0 1 1 1 0 2 to nie zgadza sie ilość danych ponieważ 0a jest traktowane jako wprowadzenie dwóch danych. Oto cały kod.
 

#include<iostream>

using namespace std;

bool remis(char table[3][3], int size);
bool wygrana(char table[3][3], int size, char znak);

int main()
{
    char plansza[3][3] = {'\0'};
    char znak = 'O';
    int wiersz, kolumna;

    do {
        bool flag;
        do{
                cout<<"tutej"<<endl;
            flag = false;
            if(!(cin>>wiersz)) {
                flag = true;
                cin.clear();
                cin.sync();
            }
            if(!(cin>>kolumna)) {
                flag = true;
                cin.clear();
                cin.sync();
            }
            cout<<wiersz<<" "<<kolumna<<endl;
        }while((plansza[wiersz][kolumna] != '\0') || (wiersz > 2) || (kolumna > 2) || flag);
        cout<<"tutej2"<<endl;
        plansza[wiersz][kolumna] = znak;

        if(wygrana(plansza, 3, znak)) {
            break;
        }

        if(znak == 'O') {
            znak = 'X';
        } else {
            znak = 'O';
        }

    }while(remis(plansza, 3) == false);

    if(remis(plansza, 3)){
        cout<<0;
    } else if(wygrana(plansza, 3, znak) && (znak == 'O')) {
        cout<<1;
    } else {
        cout<<-1;
    }

    return 0;
}

bool remis(char table[3][3], int size) {
    int ile = 0;
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            if(table[i][j] != '\0') {
                ile++;
            }
        }
    }
    if(ile == size*size) {
        return true;
    }
    return false;
}

bool wygrana(char table[3][3], int size, char znak){

    for(int i = 0; i < 3; i++) {
        if((table[i][0] == znak) && (table[i][1] == znak) && (table[i][2] == znak)) {
            return true;
        }
    }

    for(int j = 0; j < 3; j++) {
        if((table[0][j] == znak) && (table[1][j] == znak) && (table[2][j] == znak)) {
            return true;
        }
    }

    if((table[0][0] == znak) && (table[1][1] == znak) && (table[2][2] == znak)) {
        return true;
    }
    if((table[0][2] == znak) && (table[1][1] == znak) && (table[2][0] == znak)) {
        return true;
    }
    return false;
}

 

komentarz 13 października 2019 przez k222 Nałogowiec (30,150 p.)
Chętnie bym pomógł, ale szczerze powiedziawszy nie rozumiem co to ma robić i co próbujesz osiągnąć. Spróbuj może jakoś jaśniej opisać swój problem i najlepiej wrzucić cały kod
komentarz 13 października 2019 przez dudduss76 Początkujący (280 p.)

Edytowałem moje pytanie laugh

1 odpowiedź

0 głosów
odpowiedź 13 października 2019 przez jared Gaduła (3,600 p.)
Co oznaczają te zera i jedynki?

Musiałbyś zrobić funkcję, która pobiera numer wiersza i numer kolumny. Jeżeli którykolwiek numer wychodzi poza zakres wtedy ponownie pytaj. Jeżeli dana para wiersz i kolumna jest już wykorzystana to tak samo pytasz ponownie. Musiałbyś mieć coś co by zapamiętywało wykorzystane pary wiersz i kolumna.

Musiałbyś mieć jeszcze funkcję która pobiera i waliduje znak od użytkownika. Jeżeli będzie to inny znak niż 'x' lub 'o' wtedy musiałbyś ponownie pytać o podanie znaku.

Napisałbym więcej ale nie mam za bardzo możliwości.
komentarz 13 października 2019 przez dudduss76 Początkujący (280 p.)
0 i 1 to są dane które wprowadzam i 0 oznacza wiersz a 1 oznacza kolumnę itd. To co napisałeś to już działa. Ja mam jedynie problem z tym że jak wprowadzę przykładowo 1a to mi traktuje to jakbym wprowadził wiersz = 1, a kolumne = 0, i jak sprawić aby nie wprowadzało mi tego do tych dwóch zmiennych tylko do jednej np wiersz = 1a, a kolumnę wprowadzona zostaje w następnym kroku.
komentarz 13 października 2019 przez jared Gaduła (3,600 p.)
Za bardzo nie rozumiem, ale jeżeli miałbyś pobierać pojedynczą daną za pomocą zapisu: cin >> zmienna to co się dzieje jak wpiszesz 1a? Zmienna ma wartość 1, bo w końcu jest typu int prawda? To dlaczego druga zmienna (kolumna) ma wartość 0 skoro do niej musisz również podać wartość?

Co do par wiersz i kolumna, możesz utworzyć chociażby strukturę, która zawiera zmienne wiersz i kolumna. Do tego musiałbyś mieć gdzieś zmienną przechowującą wykorzystane pary. Może być to tablica lub vector.

Tak na sucho piszę jakby co :)

Podobne pytania

0 głosów
0 odpowiedzi 518 wizyt
pytanie zadane 21 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
2 odpowiedzi 5,063 wizyt
pytanie zadane 8 grudnia 2015 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...