Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Znajdowanie największego elementu zbioru, czyli iteracja i kłopoty z typem variant...
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002
Znajdowanie największego elementu zbioru, czyli iteracja i kłopoty z typem variant...

Mam taki kłopot-napisałem sobie programik szukający największej liczby spośród ośmiu podanych. Wykorzystałem pętle, a więc:

Private Sub Command1_Click()
Dim max As Integer
max = Text1(1).Text
For i = 1 To 8
If max < Text1(i).Text Then max = Text1(i).Text
Next i
MsgBox "Największa liczba to " & max
End Sub

Na formie mam command button'a i 8 textboxów o różnych indexach. Kiedy deklaruję zmienną max jako INTEGER wszystko jest ok, natomiast, gdy zadeklaruję ją jako VARIANT, to gdy któraś z liczb przekroczy 100, to program pokazuje, że największą liczbą jest ta ostatnia przed 100. Myślę, że ma to związek z zakresem zmiennych, ale nie wiem na jakiej zasadzie, bo przecież Variant jest nadrzędny do INTEGER...
Powiem tylko, że zrobiłem prosty test-w tym samym progsie dodałem nowego command button'a i kod:

Private Sub Command2_Click()
If Text1(1).Text < Text1(2).Text Then
MsgBox "Mniejsza jest liczba w polu 1"
End If
End Sub

Jeżeli w pierwszym polu jest 1, a w drugim 100, to jest ok, jak nie (tzn. pierwsza liczba jest większa niż 1 lub druga większa od 100), to msgbox się niw wyświetla, a powinien .

Bardzo proszę o pomoc.


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


06-09-2003 17:44
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
busio
busio




Typ: neutral
Postów: 98
Zarejestrowany: Sep 2002

A skąd kompilator ma wiedzieć iz w text(1).text jest liczba ?
przecież mozesz napiszć
if "aa" > "ab" then ....
i pójdzie

podobnie jest w twoim przypadku
jeśli musisz użyc variant (lepiej sie nad tym zastanowić gdyż nie jest to dobra praktyka) to zastąp:

Text1(1).Text
przez

val(Text1(1).Text)

i na pewno zadziała

Pozdrawiam busio

07-09-2003 20:37
Pokaż profil busio  Wyślij email do busio   Odwiedź stronę busio  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Dzięki-właśnie tak zrobiłem i zadziałało-wszedłem na forum, żeby to dopisać, że znalazłem, i zobaczyłem Twojego posta . Niemniej wielkie dzięki, bo teraz mam pewność. A skoro już jesteśmy przy VARIANT, to ja potrzebuję, żeby user mógł wpisywać też duże liczby, a z tego co wiem, tylko typ VARIANT to umożliwia. Czy dobrze rozumuję?
Teraz nasepne dwie sprawy, których nie rozmumiem. To dlaczego jak dałem:
Dim max as integer
max=text1(1).text

to kompilator wiedział, że to liczba??? Przecież w textoboksie był string. Wg mnie powinien mi dać błąd, a tego nie zrobił. Czy wiesz czemu?

Teraz druga sprawa. Przeczytałem w pliku pomocy do VB5, że jak porównywane są dwa stringi, to wykonywane jest porównywanie znakowe i stąd moje kłopoty (tzn, że 7>100, ale 7<99 już jest ok, ok jest też 10<100). Czy mógłbyś mi wytłumaczyć czemu VB wtedy tak porównuje te liczby i co to jest to porównanie znakowe??

Z góry dzięki i sorry, że pytam o takie głupotki .


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


07-09-2003 22:36
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
busio
busio




Typ: neutral
Postów: 98
Zarejestrowany: Sep 2002

1. Jest to tzw. niejawna konwersja czyli w momencie deklaracji

dim max as integer

informujesz kompilator iz oczekujesz w polu tekstowym liczby i jezeli konwersja jest możliwa (a to już twoje zmartwienie) to jej dokunuje.
Jeżeli deklarujesz jako variant to konwersja nie jest potrzebna i w zmiennej max dostajesz stringa.

2. Porównywanie znakowe działa w ten sposób iz porównywane są kolejne znaki w ciągach tzn.

7 > 100 jest porównywane jako 7 > 1 i dalej nieważńe bo nie ma co porównywać i tak wynik jest pozytywny,
natomiast 7 > 99 jest sprawdzane jako 7 > 9 co da wynik negatywny i dalej nie ma co sprawdzać.

Jeśli chodzi o te duże liczby to nie wiem po co ci one są bo operacje arytmetyczne wykonuje komputer na liczbach (najwiekszy jest double a nie variant) i nic nie zyskasz wpisując 1000 cyfr do zmiennej variant.  Jeśli się nie zmieścisz w double to i tk dostaniesz przepełnienie lub obcięcie liczby.

Proponuję Ci trzy wyjścia

1. Przemyśl temat i znajdź inne rozwiązanie(niewiele jest sytuacji gdy trzeba użyć variantu-o ile w ogóle są).

2. Zbuduj własną klasę do obsługi operacji arytmetycznych na długich ciągach znakowych (nie liczbach), ale tu kłania się algorytmika...

3. Opisz problem to wspólnie znajdziemy rozwiązanie.

Pozdrawiam busio

08-09-2003 09:49
Pokaż profil busio  Wyślij email do busio   Odwiedź stronę busio  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Dzięki-wszystko rozumiem z wyjątkiem:
-czemu mówisz,że double jest największa??? Przecież double ma 8 bajtów na liczby, a variant 16?
-Dzięki za wytłumaczenie porównania znakowego, tylko w takim razie czemu 10<100 daj wynik prawdziwy? Przecież 1 nie jest mniejsze od 1 ???

Co do klasy, to może rzeczywiście opiszę Ci problem. Ćwiczę sobie algorytm MAX, wyszukujący iteracją największy element w zbiorze liczb (jest to opisane w mojej książce do matmy, jak działa, nie ma natomiast opisanego jak go wykonać, gdyż książka zkłada, że nie znamy żadnego języka programowania). I teraz tak-chciałbym po prostu, żeby program obsługiwał mi też bardzo duże liczby np. tryliony, kwintyliony itd. Czy wiesz w jaki sposób, go to tego zmusić?

Dzięki za pomoc .


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


08-09-2003 11:53
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
busio
busio




Typ: neutral
Postów: 98
Zarejestrowany: Sep 2002

1. Sam sobie odpowiedziałeś "8 bajtów na liczby" variant prrzechowuje obiekty i stąd potrzeba mu więcej (tak podejrzewam...)

2. pierwsze znaki są najbardziej znaczące więc jeśli program jest w stanie określic wynik operacji po porównaniu pierwszych znaków to sprawa jest jasna , ale jeśli się nie uda to porównuje następne itd a sam przyznasz że bajtowo drugie "0" ze "100" to wiecej niz nic  (3 znak z "20"...

3. Wpisz w wyszukiwarkę 'algorytmy' a znajdziesz napewno interesujące metody ale dla znalezienia największego elementu nic nie wymyślono poza iteracją(Taniej się nie da).

4. Aby robić porównania arytmetyczne dużych stringów to po prostu dodaj na początku zera

"010" < "100"
aby oba stringi miały taką samą długość i zadziała ci napewno

5. na liczbach tego nigdy nie zrobisz bo zawsze znajdzie się liczba której nie obsłuży komputer(nawet na 16 bajtach) a którą uzytkownik wprowadzi aby pokazac ci ze jest to mozliwe, a string oblługuje setki tysięcy znaków i znajdz człowieka co zechce mu sie tyle wklepać..


Pozdrawiam busio

08-09-2003 15:44
Pokaż profil busio  Wyślij email do busio   Odwiedź stronę busio  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Nie-przecież napisałem, że Variant ma cytuę z książki o VB: "16 bajtów (dla danych liczbowych)". Co do stringów, to pewnie masz rację . Co do algorytmów-poszukam. Jeszcze raz dzięki .


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


09-09-2003 11:22
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
kicaj




Typ: neutral
Postów: 271
Zarejestrowany: Aug 2003

A ja to tak rozumien typ variant ma dlatego 16 bo zawiera w sobie wszytskie wlasnosci innychy typow. Variant moze byc albo tekstem albo liczba albo (true -fals) i dlatego ma 16 bajtow. Wiec variant jest wygonym typem do nie trzeba dla zmiennej nic wiecej okreslac, ale z drugiej strony lepiej z gory okreslic jakiego ma byc typu zmienna

10-09-2003 21:38
Pokaż profil kicaj  Wyślij email do kicaj        3914568
Wszystkich odpowiedzi: 7 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1