• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
741 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ź 908 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
+1 głos
2 odpowiedzi 784 wizyt
pytanie zadane 17 listopada 2017 w C i C++ przez Zorineq Nowicjusz (130 p.)

93,187 zapytań

142,201 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2127p. - dia-Chann
  2. 2092p. - Łukasz Piwowar
  3. 2079p. - Łukasz Eckert
  4. 2037p. - Tomasz Bielak
  5. 2006p. - Michal Drewniak
  6. 2006p. - rucin93
  7. 2005p. - Łukasz Siedlecki
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...