if w pętli for i dwa warunki jednoczesnie

Odpowiedz Nowy wątek
2017-06-09 17:11
0

Pierwsza pętla for programu ma za zadanie sprawdzić czy dana wartość występuje we wspomnianej kolumnie bądź wierszu. Jeśli występuje - wyrzuca komunikat i przepisuje tablice bez zmian - tutaj wszystko działa w porządku, bez zarzutu.
Problem zaczyna się dopiero kiedy dokładam drugi warunek - program zaczyna wariować dla niektórych pól - zwłaszcza dla przypadku gdy pole jest zerem i nie można wpisać w nim liczby wybranej przez użytkownika - mamy wtedy doczynienia z uruchomieniem się dwóch warunków na raz.

Niestety nie jestem w stanie zlokaliozwać błędu, może ktoś, kto rzuciłby na to 'świeżym okiem' byłby w stanie mi pomóc? Z góry dziękuje za pomoc.



    bool koniec = false;
    do {

        printf( "Polecenie: " );
        char polecenie[100];
        fflush(stdout);
        fgets( polecenie, 100, stdin );

        if (strstr( polecenie, "ustaw") == polecenie) {

                int y = polecenie[6];
                int x = polecenie[7];
                int nowa_wartosc = polecenie[9];

for (int k = 0; k<9; ++k)
{
if (sudoku[y-65][k] == nowa_wartosc-48  || sudoku[k][x-49] == nowa_wartosc-48 || sudoku[y-65][x-49] != 0)
{
    cout<<"Nie mozna ustawic takiej wartosci ("<<polecenie;
    for (int y=0;y<9;y++) for (int x=0;x<9;x++)  printf( "%s%d%s", ((x>0)?" ":""), sudoku[y][x], ((x==8)?"\n":"") );
break;
}

}

for (int p = 0; p<9; ++p)
{
 if (sudoku[y-65][p] != nowa_wartosc-48  && sudoku[p][x-49] != nowa_wartosc-48 && sudoku[y-65][x-49] == 0)
{
sudoku[y-65][x-49] = nowa_wartosc-48;
for (int y=0;y<9;y++) for (int x=0;x<9;x++)  printf( "%s%d%s", ((x>0)?" ":""), sudoku[y][x], ((x==8)?"\n":"") );
}
}

    }

}    while (!koniec);

    return EXIT_SUCCESS;
}
2017-06-10 00:20
0

Cześć,
Po pierwsze formatowanie kodu - jak widzisz nikomu nie chce się babrać w tym co zamieściłeś, bo można dostać oczopląsu :P Zamieść kod w znacznikach kodu, sformatuj wcięcia i najlepiej pododawaj komentarze w miejscach, o których wspominasz w poście.
Mówisz, że gdzieś dodajesz drugi warunek? Jaki warunek? Gdzie ten warunek? Który to?
Program zaczyna wariować? Jak? Wykonują się dwa warunki... jednocześnie?? o.O
Polityka forum jest taka, że chcemy pomagać, ale precyzuj pytanie i swój problem - nikt nie będzie zgadywał ani się domyślał :(

Pozostało 580 znaków

2017-06-10 07:25
0

Zajmij się może "powłoką" nie konsolą xP


~~

Pozostało 580 znaków

2017-06-10 09:47
0
Bartosz36 napisał(a):

Cześć,
Po pierwsze formatowanie kodu - jak widzisz nikomu nie chce się babrać w tym co zamieściłeś, bo można dostać oczopląsu :P Zamieść kod w znacznikach kodu, sformatuj wcięcia i najlepiej pododawaj komentarze w miejscach, o których wspominasz w poście.
Mówisz, że gdzieś dodajesz drugi warunek? Jaki warunek? Gdzie ten warunek? Który to?
Program zaczyna wariować? Jak? Wykonują się dwa warunki... jednocześnie?? o.O
Polityka forum jest taka, że chcemy pomagać, ale precyzuj pytanie i swój problem - nikt nie będzie zgadywał ani się domyślał :(

Okej, masz rację, już postaram się poprawić swój błąd.
Zadanie polega na tym aby uzupełnić program zawierający gotowe funkcję o 4 dodatkowe polecenia, tak aby możliwe było rozwiązanie za jego pomocą sudoku. W początkowej fazie program z pliku tekstowego pobiera w połowie rozwiązane sudoku, gdzie puste pola zastępione są zerami. Naszym zadaniem jest dodanie wspomnianych 4 opcji
-ustaw ( w miejscu pustego pola, które wskazuje użytkownik ustawia liczbę wskazaną przez użytkownika - gdy jest to możliwe program umieszcza we wskazanym miejscu wpisaną przez użytkownika liczbe, jeśli nie jest - wyrzuca komunikat zwrotny). Polecenie ustaw przyjmuje dwa parametry: komórkę, w której ma zostać wpisana wartość oraz liczbę do wpisania, np. ustaw A1 8
-podpowiedz (użytkownik wskazuje numer pola, a program dla tego pola wypisuje liczby, które można w nie wstawić). Przyjmuje jeden parametr – komórkę, dla której mają być wyświetlone informacje, np. podpowiedz A1
-wymaż (wymazuje liczbę ze wskazanego pola, ale tylko i wyłącznie te , które zostały wczesniej wpisane przez użytkownika). Polecenie wymaz przyjmuje jeden parametr: komórkę, z której należy usunąć wartość, np. wymaz A1
-koniec (kończy pracę programu)

Mój problem polega na tym, że dla niektórych pól spełniane są dwa warunki jednocześnie - nie wiem dlaczeg, nie mogę dosuzkać się błędu. Dzieję się tak dla przypadku, gdy pole jest zerem i nie da się w nie wpisać chcianej wartości np A1 1. Czy ktoś jest w stanie mi pomóc w znalezieniu błędu, ewentualnie pokazać łatwiejszą drogę do wykonania tego zadania?

Zadanie dla większości z Was prawdopoodbnie wyda się trywialne, niestety - dla mnie - początkującego nie jest to takie oczywiste. Poniżej zamieszczam już poprawnie sformatowany fragment kodu pisamy edytowany przeze mnie wraz z komentarzami. Mam nadzieję, że tym razem wszystko wytłumaczyłem w należyty sposób.


    bool koniec = false;
    do {

        printf( "Polecenie: " );
        char polecenie[100];
        fflush(stdout);
        fgets( polecenie, 100, stdin );

        if (strstr( polecenie, "ustaw") == polecenie) {              //rozpartrujemy przypadek polecenia ustaw

              int y = polecenie[6];                //zapisuje w zmiennej y 6 znak polecenia ustaw - symbol kolumny np A
              int x = polecenie[7];                //zapisuje w zmiennej x 7 znak polecenia ustaw - numer wiersza np 3
              int nowa_wartosc = polecenie[9]; // zapisuje w zmiennej wartość, która uzytkownik chce wstawic we wskazanym polu np 3

for (int k = 0; k<9; ++k) {           // pętla umożliwiająca sprawdzenie warunku po wszystkich kolumnach i wierszach

if (sudoku[y-65][k] == nowa_wartosc-48  || sudoku[k][x-49] == nowa_wartosc-48 || sudoku[y-65][x-49] != 0) { // warunek sprawdzający czy wartość wystepuje w kolumnie/wierszu bądź czy dane pole jest 'puste' tzn czy jest zerem. Jeśli którykolwiek warunek zostanie spełniony wypluje komunikat o tym że nie może ustawić danej wartosci w tym miejscu. Od kolumny y odejmujemy 65 - czyli wartość A z tabliscy ASCII (tak aby zamienic na liczbe np A na 0 ) w przypadku x odejmujemy 49 czyli 1. Od nowej wartości odejmujemy 0.

    cout<<"Nie mozna ustawic takiej wartosci ("<<polecenie;
    for (int y=0;y<9;y++) for (int x=0;x<9;x++)  printf( "%s%d%s", ((x>0)?" ":""), sudoku[y][x], ((x==8)?"\n":"") ); // przepisuje tablice sudoku bez zmian
break;  //(?) kończy pętle w momencie spełnienia warunku jednokrotnie (?)
          }
}

for (int p = 0; p<9; ++p) {   //druga pętla lecąca po wszystkich kolumnach i wierszach - gdy umieszczałem w jednej - pomija pierwszy warunek (?)

 if (sudoku[y-65][p] != nowa_wartosc-48  && sudoku[p][x-49] != nowa_wartosc-48 && sudoku[y-65][x-49] == 0) { // jeśli wartość nie występuje w kolumnie ani w wierszu i do tego pole jest zerem ustawi wskazaną przez użytkownika wartość.

sudoku[y-65][x-49] = nowa_wartosc-48; // nadpisuje we wskazanym miejscu daną wartość, jeśli warunek zostanie spełniony
for (int y=0;y<9;y++) for (int x=0;x<9;x++)  printf( "%s%d%s", ((x>0)?" ":""), sudoku[y][x], ((x==8)?"\n":"") ); //wyrzuca tablice ze zmienioną wartością
}
}

    }

}    while (!koniec);

    return EXIT_SUCCESS;
}

Pozostało 580 znaków

2017-06-10 10:01
0

zająłbym się na serio najpierw wyglądem tego kodu i zrobieniem prawidłowych wcięć. Nie wiem czy w swoim edytorze na komputerze też masz tak chaotycznie to napisane, czy ci się rozwaliło formatowanie przy wklejaniu do posta - ale jeśli robisz sobie wcięcia gdzie popadnie, to potem właśnie dlatego masz problemy ze zrozumieniem co się dzieje w programie (i my mamy problem z czytaniem tego).

(Mówię o pierwszym poście, bo w ostatnim jak rozumiem, dodałeś długie komentarze żeby nam wyjaśnić na forum co się dzieje, stąd to jeszcze gorzej wygląda)


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);
edytowany 1x, ostatnio: LukeJL, 2017-06-10 10:02

Pozostało 580 znaków

2017-06-10 10:07
0
LukeJL napisał(a):

zająłbym się na serio najpierw wyglądem tego kodu i zrobieniem prawidłowych wcięć. Nie wiem czy w swoim edytorze na komputerze też masz tak chaotycznie to napisane, czy ci się rozwaliło formatowanie przy wklejaniu do posta - ale jeśli robisz sobie wcięcia gdzie popadnie, to potem właśnie dlatego masz problemy ze zrozumieniem co się dzieje w programie (i my mamy problem z czytaniem tego).

(Mówię o pierwszym poście, bo w ostatnim jak rozumiem, dodałeś długie komentarze żeby nam wyjaśnić na forum co się dzieje, stąd to jeszcze gorzej wygląda)

Komentarze dodałem długie, żeby możliwie jak najlepiej wytłumaczyć to co starałem się zrobić. mam świadomość tego, że nie jest to zbyt przejrzyste niestety, u mnie w kompilatorze wyglada nieco lepiej...

Pozostało 580 znaków

2017-06-10 12:54
0
int j = 0;
int nowa_tablica[10];
int liczby[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

for (int i =0;i < 9;i++) {
    if (sudoku[y][i] != 0){
            nowa_tablica[j] = sudoku[y][i];
            j++;

    }
}
    for (int k=0; k<9; k++){
        if (sudoku[k][x] != 0){
            nowa_tablica[j] = sudoku[k][x];
            j++;
        }
    }

Do nowa_tablica zapisuje liczby różne od zera znajdujące się w kolumnie y i wierszu x. Jak zaimplementować pętle, która wypisze mi wartości RÓŻNE od liczb znajdujących się w nowa_tablica z zakresu 1-9 ?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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