• 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

Object Storage Arubacloud
0 głosów
505 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ź 668 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
+1 głos
2 odpowiedzi 627 wizyt
pytanie zadane 17 listopada 2017 w C i C++ przez Zorineq Nowicjusz (130 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 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!

...