Ĺadny brzuch
mam zadanie na zaliczenie przedmiotu.
treść zadania:
dane wejsciowe x, y. w macierzy x na y równej wielkości komórek wypełnic jednym z trzech kolorów (czerwony, zielony, niebieski), dopuszczalne jest nadpisywanie. Wybór komórki ma byc losowy w granicach macierzy, należy go powtarzać aż zapełniona będzie dowolna kolumna kolorem czerwonym. Podać liczbe iteracji. Operację powtórzyc 10 krotnie wynik uśrednic.
napisałem coś takiego
Sub macierz() Range(Cells(1, 1), Cells(100, 100)).Interior.ColorIndex = 0 Range(Cells(1, 1), Cells(100, 100)).Value = " " kol = InputBox("podaj liczbe kolumn") wier = InputBox("podaj liczbe wierszy") a = 0 Do While a < 10 sprawdzam = 0 krok = 0 'zobaczcie te linijke pod spodem, a głównie ten kawałek "-1+1" Do While sprawdzam < wier - 1 + 1 krok = krok + 1 x = Int((kol * Rnd) + 1) y = Int((wier * Rnd) + 1) kolor = Int((3 * Rnd) + 3) Cells(x, y + a * (kol + 1)).Interior.ColorIndex = kolor For i = 1 To kol liczba = 0 For j = 1 To wier If Cells(j, i + a * (kol + 1)).Interior.ColorIndex = 3 Then liczba = liczba + 1 End If Next j If sprawdzam < liczba Then sprawdzam = liczba End If Next i Loop Cells(wier + 1, kol + a * (kol + 1)).Value = krok a = a + 1 Loop End Sub
zobaczcie tą druga petle do while srawdzam < wier -1+1, gdybym nie dodal tego -1+1 to petla sie nie zatrzyma (na to -1+1 wpadłem jakoś przypadkiem). jestem kompletnie zielony z VBA, żeby to napisac przeczytałem kilka kursów ale o takim czymś nigdzie nie pisało. drugi problem z programem to taki ze druga petla sie nie zatrzyma jak liczba kolumn jest większa od liczby wierszy, a błędne wyniki pokazuje jak liczba kolumn jest mniejsza od liczby wierszy. możecie sami sprawdzić.
nie ma tam uśrednienia wyniku (to zrobie puźniej)
nauczyciel powiedział, że to nie jest błąd VBA tylko błąd algorytmu (chodzi o te -1+1)
Dobra, usiłuje ten kod analizowac i nie moge zrozumieć jednego: po jakiego grzyba tam jest -1+1 ??? Najpierw inkrementujesz potem dekrementujesz, so tell me: jaki jest tego sens ???
chyba dokładnie nie czytałeś. pisałem że jak nie zastosuje -1+1 to petla sie nie zatrzyma i jezcze jak liczba kolumn bedzie wieększa od liczby wierszy.
wklej ten kod do makra w excelu i uruchom to makro dla 3 kolum i 3 wierszy, a potem usuń to -1+1 uruchom ponownie i sprawdź czy sie petla zatrzyma. o to sie przecież pytałem, czemu tak jest?
W pierwszej linijce od góry modułu, w którym masz zawarta tę procedurę dopisz linijkę:Option Explicit
Potem ponownie uruchom procedurę, popoprawiaj błędy i sprawdź, czy nadal musi być z "-1+1"
pozdrawiaMM
dzięki marcin_miga, ta część problemu jest rozwiązana. program działa bez tego -1+1 tylko ze dla różnej liczby kolumn i wierszy dalej albo pokazuje złe wyniki albo petla sie nie zatrzymóje. wiem że kod jest poprawny, to musi być cos ze zmiennymi w VBA tak jak to było z tym -1+1.
ponizej zamieszczam poprawny kod dla tylu samo kolumn co wierszy
Option Explicit Dim kol, a, srednia, sprawdzam, krok, i, j, kolor, x, y, liczba, wier As Integer Sub macierz() Range(Cells(1, 1), Cells(100, 100)).Interior.ColorIndex = 0 Range(Cells(1, 1), Cells(100, 100)).Value = " " kol = InputBox("podaj liczbe kolumn") wier = InputBox("podaj liczbe wierszy") a = 0 srednia = 0 Do While a < 10 sprawdzam = 0 krok = 0 Do While sprawdzam < wier krok = krok + 1 srednia = srednia + 1 x = Int((kol * Rnd) + 1) y = Int((wier * Rnd) + 1) kolor = Int((3 * Rnd) + 3) Cells(x, y + a * (kol + 1)).Interior.ColorIndex = kolor For i = 1 To kol liczba = 0 For j = 1 To wier If Cells(j, i + a * (kol + 1)).Interior.ColorIndex = 3 Then liczba = liczba + 1 End If Next j If sprawdzam < liczba Then sprawdzam = liczba End If Next i Loop Cells(wier + 1, kol + a * (kol + 1)).Value = krok a = a + 1 Loop MsgBox ("Wykonano łącznie kroków: " & srednia) & Chr(13) & ("Średnio: " & srednia / 10) & (" na jedną macierz") End Sub
Nadal masz złą definicję zmiennych: Dim kol, a, srednia, sprawdzam, krok, i, j, kolor, x, y, liczba, wier As Integer definiuje ci tylko zmienną wier jako Integer, a pozostałe jako Variant. Czyli mogące pomieścić również Stringa. I tak akurat tu jest. Poza tym dla tego rodzaju danych Integer to za mało.Option Explicit Sub macierz() Dim kol As Long, a As Long, srednia As Double, sprawdzam As Long, krok As Long, i As Long, j As Long, kolor As Integer, x As Integer, y As Integer, liczba As Long, wier As Long '... End Sub
Jak widzisz wciągnąłem zmienne do środka (na zewnątrz nie są potrzebne) oraz nadałem im poprawne typy.
pozdrawiaMM
dzieki za te korekte. poprawiłem i nie działało dla macierzy nie kwadratowej. ale znalazłem błąd, mianowicie losowanie robiłem w macierzy x na y a sprawdzałem macierz y na x. a w tej niektóre pola zawsze pozostawały puste. ale w końcu działa, jeszcze raz dzięki za pomoc Marcin Miga.
pozdrawiam
//EOT
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
treść zadania:
dane wejsciowe x, y. w macierzy x na y równej wielkości komórek wypełnic jednym z trzech kolorów (czerwony, zielony, niebieski), dopuszczalne jest nadpisywanie. Wybór komórki ma byc losowy w granicach macierzy, należy go powtarzać aż zapełniona będzie dowolna kolumna kolorem czerwonym. Podać liczbe iteracji. Operację powtórzyc 10 krotnie wynik uśrednic.
napisałem coś takiego
Sub macierz() Range(Cells(1, 1), Cells(100, 100)).Interior.ColorIndex = 0 Range(Cells(1, 1), Cells(100, 100)).Value = " " kol = InputBox("podaj liczbe kolumn") wier = InputBox("podaj liczbe wierszy") a = 0 Do While a < 10 sprawdzam = 0 krok = 0 'zobaczcie te linijke pod spodem, a głównie ten kawałek "-1+1" Do While sprawdzam < wier - 1 + 1 krok = krok + 1 x = Int((kol * Rnd) + 1) y = Int((wier * Rnd) + 1) kolor = Int((3 * Rnd) + 3) Cells(x, y + a * (kol + 1)).Interior.ColorIndex = kolor For i = 1 To kol liczba = 0 For j = 1 To wier If Cells(j, i + a * (kol + 1)).Interior.ColorIndex = 3 Then liczba = liczba + 1 End If Next j If sprawdzam < liczba Then sprawdzam = liczba End If Next i Loop Cells(wier + 1, kol + a * (kol + 1)).Value = krok a = a + 1 Loop End Sub
zobaczcie tą druga petle do while srawdzam < wier -1+1, gdybym nie dodal tego -1+1 to petla sie nie zatrzyma (na to -1+1 wpadłem jakoś przypadkiem). jestem kompletnie zielony z VBA, żeby to napisac przeczytałem kilka kursów ale o takim czymś nigdzie nie pisało. drugi problem z programem to taki ze druga petla sie nie zatrzyma jak liczba kolumn jest większa od liczby wierszy, a błędne wyniki pokazuje jak liczba kolumn jest mniejsza od liczby wierszy. możecie sami sprawdzić.
nie ma tam uśrednienia wyniku (to zrobie puźniej)
nauczyciel powiedział, że to nie jest błąd VBA tylko błąd algorytmu (chodzi o te -1+1)
Dobra, usiłuje ten kod analizowac i nie moge zrozumieć jednego: po jakiego grzyba tam jest -1+1 ??? Najpierw inkrementujesz potem dekrementujesz, so tell me: jaki jest tego sens ???
chyba dokładnie nie czytałeś. pisałem że jak nie zastosuje -1+1 to petla sie nie zatrzyma i jezcze jak liczba kolumn bedzie wieększa od liczby wierszy.
wklej ten kod do makra w excelu i uruchom to makro dla 3 kolum i 3 wierszy, a potem usuń to -1+1 uruchom ponownie i sprawdź czy sie petla zatrzyma. o to sie przecież pytałem, czemu tak jest?
W pierwszej linijce od góry modułu, w którym masz zawarta tę procedurę dopisz linijkę:Option Explicit
Potem ponownie uruchom procedurę, popoprawiaj błędy i sprawdź, czy nadal musi być z "-1+1"
pozdrawiaMM
dzięki marcin_miga, ta część problemu jest rozwiązana. program działa bez tego -1+1 tylko ze dla różnej liczby kolumn i wierszy dalej albo pokazuje złe wyniki albo petla sie nie zatrzymóje. wiem że kod jest poprawny, to musi być cos ze zmiennymi w VBA tak jak to było z tym -1+1.
ponizej zamieszczam poprawny kod dla tylu samo kolumn co wierszy
Option Explicit Dim kol, a, srednia, sprawdzam, krok, i, j, kolor, x, y, liczba, wier As Integer Sub macierz() Range(Cells(1, 1), Cells(100, 100)).Interior.ColorIndex = 0 Range(Cells(1, 1), Cells(100, 100)).Value = " " kol = InputBox("podaj liczbe kolumn") wier = InputBox("podaj liczbe wierszy") a = 0 srednia = 0 Do While a < 10 sprawdzam = 0 krok = 0 Do While sprawdzam < wier krok = krok + 1 srednia = srednia + 1 x = Int((kol * Rnd) + 1) y = Int((wier * Rnd) + 1) kolor = Int((3 * Rnd) + 3) Cells(x, y + a * (kol + 1)).Interior.ColorIndex = kolor For i = 1 To kol liczba = 0 For j = 1 To wier If Cells(j, i + a * (kol + 1)).Interior.ColorIndex = 3 Then liczba = liczba + 1 End If Next j If sprawdzam < liczba Then sprawdzam = liczba End If Next i Loop Cells(wier + 1, kol + a * (kol + 1)).Value = krok a = a + 1 Loop MsgBox ("Wykonano łącznie kroków: " & srednia) & Chr(13) & ("Średnio: " & srednia / 10) & (" na jedną macierz") End Sub
Nadal masz złą definicję zmiennych: Dim kol, a, srednia, sprawdzam, krok, i, j, kolor, x, y, liczba, wier As Integer definiuje ci tylko zmienną wier jako Integer, a pozostałe jako Variant. Czyli mogące pomieścić również Stringa. I tak akurat tu jest. Poza tym dla tego rodzaju danych Integer to za mało.Option Explicit Sub macierz() Dim kol As Long, a As Long, srednia As Double, sprawdzam As Long, krok As Long, i As Long, j As Long, kolor As Integer, x As Integer, y As Integer, liczba As Long, wier As Long '... End Sub
Jak widzisz wciągnąłem zmienne do środka (na zewnątrz nie są potrzebne) oraz nadałem im poprawne typy.
pozdrawiaMM
dzieki za te korekte. poprawiłem i nie działało dla macierzy nie kwadratowej. ale znalazłem błąd, mianowicie losowanie robiłem w macierzy x na y a sprawdzałem macierz y na x. a w tej niektóre pola zawsze pozostawały puste. ale w końcu działa, jeszcze raz dzięki za pomoc Marcin Miga.
pozdrawiam
//EOT