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

Pętle do while, for, while wszystkie działają tylko jeden raz

0 głosów
955 wizyt
pytanie zadane 1 kwietnia 2020 w C# przez Antoni2 Nowicjusz (160 p.)
edycja 1 kwietnia 2020 przez Antoni2

Napisałem krótki program który powinien utworzyć tablice o liczbach wierszy i kolumn, które będą podane przez użytkownika. A także zapisuje do tej tablicy podane przez użytkownika liczby. I potem wyświetla zapisane liczby wraz z adresem komórki tej tablicy. Problem polega na tym że z jakiegoś powodu pętle zewnętrzne w programie działają tylko jeden raz, natomiast wewnętrzne działają bez problemowo. Próbowałem zamieniaći ich na pętle for, while, do while, lecz nadal działają tylko jeden raz. Kompilator Visual Studio 2019 nie wyświetla rzadnych błędów

using System;

namespace ConsoleApp9._2TabliceWielowymiarowe
{
    class Program
    {
        static void Main(string[] args)
        {
            int x, y, a = 0, i = 0, b = 0, c = 0;
            Console.WriteLine("Tablice wielowymiarowe");
            Console.WriteLine("Podaj liczbe wierszy tablicy");
            x = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Podaj liczbe kolumn tablicy");
            y = Convert.ToInt32(Console.ReadLine());
            int[,] tablica2d = new int[x,y];
            do
            {
                while (a < x)
                {
                    Console.WriteLine("Podaj liczbe ktora bedzie zapisana w kolumnie {0} w wierszu {1}", i, a);
                    tablica2d[a, i] = Convert.ToInt32(Console.ReadLine());
                    a++;
                }
                i++;
            }
            while (i < y);

            do
            {
                while (c < x)
                {
                    Console.WriteLine("W kolumnie {0} wiersza {1} jest liczba", b, c);
                    Console.WriteLine(tablica2d[c, b]);
                    c++;
                }

                b++;
            }
            while (b < y);
            Console.ReadKey();
        }
    }
}

1 odpowiedź

0 głosów
odpowiedź 1 kwietnia 2020 przez DlaFrajdy Nowicjusz (200 p.)

Zmienne b i c są niepotrzebne - lepiej wyzerować zmienne a i b bo służą do tego samego (jako licznik pętli) a później do niczego nie są potrzebne w tym przypadku.

 

Lekko poprawiłem Twój kod - jak porównasz kod sam dojdziesz do wniosku i lepiej zrozumiesz. Jak dalej będzie mętlik w głowie - wyjaśnię.

ps. użytkownikowi lepiej wyliczać od 1, czyli np. "Podaj liczbe ktora bedzie zapisana w kolumnie 1 w wierszu 1",  mimo, że będzie ona zapisana w tablica2d[0,0]. Edit: Przepraszam, doczytałem dopiero, że celowo prosisz i drukujesz adres komórki. Nie było tematu. :)

Pozdr.

int x, y, a = 0, i = 0;
            Console.WriteLine("Tablice wielowymiarowe");
            Console.WriteLine("Podaj liczbe wierszy tablicy");
            x = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Podaj liczbe kolumn tablicy");
            y = Convert.ToInt32(Console.ReadLine());
            int[,] tablica2d = new int[x, y];
            do
            {
                while (a < x)
                {
                    Console.WriteLine("Podaj liczbe ktora bedzie zapisana w kolumnie {0} w wierszu {1}", i, a);
                    tablica2d[a, i] = Convert.ToInt32(Console.ReadLine());
                    a++;
                }
                i++;
                a = 0;
            }
            while (i < y);

            i = 0;
            a = 0;
            do
            {
                while (a < x)
                {
                    Console.WriteLine("W kolumnie {0} wiersza {1} jest liczba", i, a);
                    Console.WriteLine(tablica2d[a, i]);
                    a++;
                }
                i++;
                a = 0;
            }
            while (i < y);

            Console.ReadKey();

 

komentarz 2 kwietnia 2020 przez Antoni2 Nowicjusz (160 p.)
Naprawdę, ogromne dzięki. Nawet nie chcę się zastanawiać, ile czasu mi by zeszło żeby wpaść na to rozwiązanie. Jedynie to trochaj ciężko zrozumieć dla czego warto tyle razy zerować "a" I dla czego właśnie w tym był problem? Bo dwie pętle, które mieli w warunkach "a" działali dobrze.  Jak byś mi tylko powiedział dla czego tak jest. Kiedyś jak uczyłem się C++ tam można było tylko jeden raz wyzerować i pętla wewnętrzna nie działała bez pętli zewnętrznej.
komentarz 2 kwietnia 2020 przez DlaFrajdy Nowicjusz (200 p.)

Po prostu jeżeli nie ma potrzeby tworzenia zbędnych zmiennych to staramy się ich nie tworzyć, ale to nie było powodem niedziałającej drugiej pętli. 

Nie wyzerowałeś licznika a w pierwszej pętli.

Spójrz na ten kod:

            do
            {
                while (a < x)
                {
                    Console.WriteLine("Podaj liczbe ktora bedzie zapisana w kolumnie {0} w wierszu {1}", i, a);
                    tablica2d[a, i] = Convert.ToInt32(Console.ReadLine());
                    a++;
                }
                i++;
            }
            while (i < y);

po wykonaniu wewnętrznej pętli while wartość a nie jest zerowana czyli np. user określił liczbę wierszy i kolumn jako 3 oraz chciał wpisać takie wartości:

5-7-9

6-2-4

2-3-4

W swoim przypadku zmienna a po wpisaniu przez usera liczby 9 nie jest zerowana.

czyli Twój warunek "while (a < x)" nie jest już spełniony dla kolejnego wiersza, dlatego pętla jest przerwana. 

Tutaj poprawna pętla. Wystarczyłoby dopisać nieszczęsne "a = 0;" :)

do
            {
                while (a < x)
                {
                    Console.WriteLine("Podaj liczbe ktora bedzie zapisana w kolumnie {0} w wierszu {1}", i, a);
                    tablica2d[a, i] = Convert.ToInt32(Console.ReadLine());
                    a++;
                }
                i++;
                a = 0;
            }
            while (i < y);

 

Z drugą pętlą służącą do wypisywania tekstu musisz postąpić analogicznie.

komentarz 3 kwietnia 2020 przez Antoni2 Nowicjusz (160 p.)
Aha, Dzięki jeszcze raz już rozumiem

Podobne pytania

0 głosów
1 odpowiedź 1,013 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
+1 głos
2 odpowiedzi 979 wizyt
pytanie zadane 17 listopada 2017 w C i C++ przez Zorineq Nowicjusz (130 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,326 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...