Program w ogóle nie wykonuje się w pętli while

0

Nie rozumiem dlaczego program nie chce wykonać wnętrza pętli while i od razu przechodzi do komunikatu końcowego.
Wpisuję np. 300, i od razu widzę komunikat końca programu. Wszystko inne w tym programie mi działa.
Czy ktoś ma może jakiś pomysł?

 
while ((ResztaDoWyplaty > 0) && (i<nominaly.GetLength(0)))
                {
                            ilosc_nominalow = ResztaDoWyplaty / nominaly[i, 1];
                            if (ilosc_nominalow > nominaly[i, 0])
                            {
                                ilosc_nominalow = nominaly[i, 0];
                                nominaly[i, 0] = 0;
                            }
                            else
                            //{ 
                                nominaly[i, 0] = nominaly[i, 0] - ilosc_nominalow;

                           // }
                            if (ilosc_nominalow > 0)
                            {
                                Console.WriteLine("Wypłata {0} nominałów o wartości {1}", ilosc_nominalow, nominaly[i, 1]);
                                ResztaDoWyplaty = ResztaDoWyplaty - ilosc_nominalow * nominaly[i, 1];
                            }
                        i++;
                }
Console.Writeln("Koniec programu");
Console.readkey();
0

Warunek na pewno masz dobry? Poza tym nie wiem do jakiej zmiennej to 300 wpisujesz, co to są "nominały" i gdzie są dodawane. Poza tym polecam skorzystać z debugera i przejrzeć wykonanie się kodu linia po linii patrząc jakie wartości są w zmiennych.

0

Deklaracja zmiennych:

int[,] nominaly = new int[8, 2];
            int ResztaDoWyplaty;
            int ilosc_nominalow;
            nominaly[0, 1] = 200;
            nominaly[1, 1] = 100;
            nominaly[2, 1] = 50;
            nominaly[3, 1] = 20;
            nominaly[4, 1] = 10;
            nominaly[5, 1] = 5;
            nominaly[6, 1] = 2;
            nominaly[7, 1] = 1;
 

Ja ten kod cały czas debaguję, ale kłopot w tym, że gdy odpalam debagowanie, to nawet nie ma szans bym zobaczył jak program zachowuje się w pętli while, bo od razu mi z niej wyskakuje.

0

a co z i ?

0

To w takim razie nie wchodzi do tej pętli i masz coś nie tak z warunkiem.

0

"i" jest zadeklarowane w ten sposób:

int i =0;

Przed pętlą while jest coś takiego:

ResztaDoWyplaty = KwotaDoWyplaty;

Sory, że nie napisałem nic o "KwotaDoWyplaty".
Jeszcze jedno: chcecie bym wrzucił tu cały kod? W sumie nie jest aż taki duży, a może będzie łatwiej.

0

Podaj cały kod aby dało się na to spojrzeć lub zgłoś się na forum wróżbitów.

0
int[,] nominaly = new int[8, 2];
            int i = 0;
            int j = 0;
            int min = 1;
            int max = 5;
            int bs_KwotaDoWyplaty;
            int bs_ResztaDoWyplaty;
            int ilosc_nominalow;
            ConsoleKeyInfo klawisz;
            nominaly[0, 1] = 200;
            nominaly[1, 1] = 100;
            nominaly[2, 1] = 50;
            nominaly[3, 1] = 20;
            nominaly[4, 1] = 10;
            nominaly[5, 1] = 5;
            nominaly[6, 1] = 2;
            nominaly[7, 1] = 1;

Random rnd1 = new Random();
            do
            {
                for (i = 0; i < nominaly.GetLength(0); i++)
                {
                    for (j = 0; j < nominaly.GetLength(1); j++)
                    {
                        ilosc_nominalow = rnd1.Next(min, max);
                        
                        
                        if (j == 0)
                        {
                            j = j + 1;
                        }
                        else
                        {
                            j = 1;
                        }
                        Console.Write("Ilość nominałów: {0} - {1} \n", ilosc_nominalow, nominaly[i, j]);
                    }   
                }
                do
                {
                    Console.Write("Podaj kwotę do wypłaty: ");
                    while (!int.TryParse(Console.ReadLine(), out bs_KwotaDoWyplaty))
                    {
                        Console.WriteLine("ERROR!!! Wpisałeś niedozwolony znak");
                        Console.Write("Podaj kwotę do wyplaty jeszcze raz: ");
                    }
                    if (bs_KwotaDoWyplaty <= 0)
                    {
                        Console.WriteLine("ERROR!!! Kwota do wyplaty nie moze być mniejsza od zera");
                        Console.Write("Podaj kwotę jeszcze raz: ");
                    }
                    
                } while (bs_KwotaDoWyplaty <= 0);

                bs_ResztaDoWyplaty = bs_KwotaDoWyplaty;
                i = 0;
                while ((bs_ResztaDoWyplaty > 0) && (i<nominaly.GetLength(0)))
                {
                            ilosc_nominalow = bs_ResztaDoWyplaty / nominaly[i, 1];
                            if (ilosc_nominalow > nominaly[i, 0])
                            {
                                ilosc_nominalow = nominaly[i, 0];
                                nominaly[i, 0] = 0;
                            }
                            else
                             nominaly[i, 0] = nominaly[i, 0] - ilosc_nominalow;
                              if (ilosc_nominalow > 0)
                            {
                                Console.WriteLine("Wypłata {0} nominałów o wartości {1}", ilosc_nominalow, nominaly[i, 1]);
                                bs_ResztaDoWyplaty = bs_ResztaDoWyplaty - ilosc_nominalow * nominaly[i, 1];
                            }
                 i++;
                }
                     Console.WriteLine("Czy chcesz zakończyć wypłacanie? (t/n)");
                klawisz = Console.ReadKey();
            } while (klawisz.Key != ConsoleKey.T);
            Console.WriteLine("Miłego dnia;-) Naciśnij ENTER!!");
            Console.ReadKey();
 
0

Pierwsze co się rzuca w oczy to:

                            else
                              if (ilosc_nominalow > 0)

to else bruździ.

Zmień pętle na:

                for(i=0;(bs_ResztaDoWyplaty > 0) && (i<nominaly.GetLength(0));++i)
                {
                            ilosc_nominalow=Math.Min(bs_ResztaDoWyplaty/nominaly[i,1],nominaly[i,0]);
                            if(ilosc_nominalow>0)
                            {
                                        nominaly[i,0]-=ilosc_nominalow;
                                        bs_ResztaDoWyplaty-=ilosc_nominalow*nominaly[i,1];
                                        Console.WriteLine("Wypłata {0} nominałów o wartości {1}", ilosc_nominalow, nominaly[i,1]);
                            }
                }
0

Sprawdź pod debuggerem co siedzi w tych zmiennych ((ResztaDoWyplaty > 0) && (i<nominaly.GetLength(0))) będziesz wiedział czemu nie wchodzi do pętli.
Nie wiem czy komuś będzie się chciało rozkminiać działanie tego kodu.

0

Więc wypisz przed pętlą bs_ResztaDoWyplaty oraz nominaly.GetLength(0) oraz wklej poprawiony kod.

0

Zrobiłem tak. Pod zmienną "bs_ResztaDoWyplaty" gdy wpisuję 700, to wypisuje 700, a nominaly.getlength wypisuje 8. Cały czas program przechodzi do zakończenia.

 
                Console.WriteLine(bs_ResztaDoWyplaty);
                Console.WriteLine(nominaly.GetLength(0));
                for (i = 0; (bs_ResztaDoWyplaty > 0) && (i < nominaly.GetLength(0));++i)
                {
                    ilosc_nominalow = Math.Min(bs_ResztaDoWyplaty / nominaly[i, 1],nominaly[i,0]);
                    if (ilosc_nominalow > 0)
                    {
                        nominaly[i, 0] -= ilosc_nominalow;
                        bs_ResztaDoWyplaty-=ilosc_nominalow*nominaly[i,1];
                        Console.WriteLine("Wypłata {0} nominałów o wartości {1}", ilosc_nominalow, nominaly[i, 1]);
                    }
                 }
0

To wypisz jeszcze przed pętlą całą tablice nominaly obie kolumny

0

Czekaj, nie rozumiem...wyskoczył mi teraz taki błąd:"Index was outside the bounds of the array". Mam przeczucie, że chcesz mnie na coś naprowadzić, ale mój mózg już dzisiaj...po prostu już kodu nie widzę.

0

Tak, jak chciałeś...

 
Console.WriteLine(bs_ResztaDoWyplaty);
                Console.WriteLine(nominaly.GetLength(0));
                Console.WriteLine(nominaly[i, j]);
                for (i = 0; (bs_ResztaDoWyplaty > 0) && (i < nominaly.GetLength(0));++i)
                {
                    ilosc_nominalow = Math.Min(bs_ResztaDoWyplaty / nominaly[i, 1],nominaly[i,0]);
                    if (ilosc_nominalow > 0)
                    {
                        nominaly[i, 0] -= ilosc_nominalow;
                        bs_ResztaDoWyplaty-=ilosc_nominalow*nominaly[i,1];
                        Console.WriteLine("Wypłata {0} nominałów o wartości {1}", ilosc_nominalow, nominaly[i, 1]);
                    }
                 }
0

Mówiłem wrzucać kod tak aby można było wkleić na ideone - czy używam zbyt trudnych słów?
Może odłóż to na dziś bo coś ci się już miesza:

for(i=0;i<nominaly.GetLength(0);++i) Console.WriteLine("{0} - {1}",nominaly[i,0],nominaly[i,1]);
0

Dobra, na dziś koniec, choć ta ostatnia twoja linijka też nic nie zmienia. Jedna rzecz, którą zauważyłem to to, że przy początku pętli pod zmienną "i" pokazuje mi od razu 8. Czemu? Nie wiem;-)))

Na dziś koniec. Dobrej nocy wszystkim;-)

1

Pętla się wykonuje, tylko nie ma czego wypłacać. Losujesz te nominały, wypisujesz, ale nie zapamiętujesz. W rezultacie masz pustą kasę :P

EDIT:
Zresztą ta pętla wewnętrzna nie ma sensu.

                    for (j = 0; j < nominaly.GetLength(1); j++)
                    {
                        ilosc_nominalow = rnd1.Next(min, max);
 
 
                        if (j == 0)
                        {
                            j = j + 1;
                        }
                        else
                        {
                            j = 1;
                        }
                        Console.Write("Ilość nominałów: {0} - {1} \n", ilosc_nominalow, nominaly[i, j]);
                    } 

j przyjmuje 0, potem w środku pętli zwiększasz o 1, a następnie j++ zwiększa o jeszcze jeden. Przy następnym przebiegu j ma wartość 2 i pętla (wewnętrzna) się kończy. Jaki to ma sens? Tablica rozmiarów nie zmieni, więc ta pętla zawsze wykona się raz.

Pytanie:
Po co Ci pętla, która wykonuje się raz?

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