Ale switch też nie jest idealna (ale jak dla mnie- początkującego - jest cudowna)
mam w tym numericUpDown 20 liczb. i dla każdej z nich robione ejst coś innego.
W switch 1 np. dodaje 2 liczby.
w swhitch 20 dodaje już 20 liczb
Kod trochę długi i sporo się powtarza ale tylko tak potrafię…
P.S
Mój program działa tak. jest to NumericUpdown i 20 textBox. w textBox należy wpisać liczbę. Jeżeli w NumericUpdown wybraliśmy 7 należy zapełnić 7 TextBox’ów, następnie Po naciśnięciu przycisku program dodaje te liczby i dzieli przez ich ilość (oblicza średnią).
Pewnie są jakieś sposoby na skrócenie kodu i nie robienie 20 switchów itp ale to nie dla mnie. Jak widać ledwo doszedłem do tego sposobu.
[*:1lvj4olh]Pamiętaj że case bez break wpada do następnej opcji, czyli:
case 20: Sum+=PobierzZ(Edit20);19: Sum+=PobierzZ(Edit19);18: Sum+=PobierzZ(Edit18);Zauważ że przy każdym case obsługujesz tylko jeden TextBox, jak w tym NumericUpdown będzie liczba 3 to wpadnie do case 3: ale po jego wykonaniu wpadnie również do case 2: itd[:1lvj4olh]To może rozważ użycie StringGrid’a, lub ListView zamiast TextBox, wtedy będzie prościej za pomocą while.[:1lvj4olh]Można zrobić tablicę: TextBox *Tb[20]={Edit01,Edit02,Edit03, … ,Edit20}; dalej chyba rozumiesz
Są jeszcze inne warianty zastąpienia switch’a ale niezbyt pasują do tego o czym mówisz.
Powiedzmy że część rozumiem a część nie. W końcu ja dopiero zaczynam.
Mam tylko pewien problem. Jak wybiorę np. 10 a zapełnię tylko 9 pól to wyskakuje błąd jakiś. Chciałem zrobić tak że gdy zajdzie taka sytuacja wyskakiwało okienko z napisem “uzupełnij wszystkie potrzebne pola”
Mam takie coś:
case 2 :
{
int jeden;
int dwa;
double wynik = 0;
jeden = Convert::ToInt16 (TXB1->Text);
dwa = Convert::ToInt16 (TXB2->Text);
wynik = ((double)jeden+(double)dwa)/2;
if (TXB1 && TXB2 ->Text)
{
MessageBox::Show (Convert::ToString (wynik),"Wynik");
} else {
MessageBox::Show ("Wpisz dane");
};
}
break;
I jakoś to nie działa. Nadal jak nie uzupełnię to wywala błąd. Co robię źle ??
Przepraszam bardzo - a po co tu jakikolwiek switch i wybieranie liczby TextBoxów?
Nie lepiej po naciśnięciu przycisku przelecieć w pętli po wszystkich TextBoxach, pobierając ich wartości, jeśli są liczbowe i wyliczyć z nich średnią, a te które są puste zwyczajnie pominąć?
Hmm może to i lepsze ale nie do końca wiem jak to uczynić. Robiłem takim sposobem jaki mi pierwszy przyszedł do głowy.
Ale w twoim sposobie. Jeżeli uzupełniłem od 1-5 to pętla przeleci te 5 i zakończy działanie. A co jeśli uzupełniłem 1-10 ale przypadkowo zapomniałem uzupełnić 7. Wtedy pętla doleci do 6 i tu zakończy swoje działanie. Czy może nie ?
Jestem przekonany, że można sprawdzić, czy w TextBoxie jest coś wpisane, czy nie, a jeśli jest, to czy jest to liczba, czy nie i w zależności od tego sterować działaniem programu.
Nie wiem co się dzieje ale nadal coś się wali. Ten sam błąd do tego Length.
No mam program z NumericUpDown, 20 TextBox, Button1 oraz kilka Label żeby pisało co gdzie należy wpisać.
NumericUpDown1 zmieniłem nazwę na wybor , TextBoxy z kolei mają nazwy TXB1,TXB2,TXB3 … TXB18, TXB19, TXB 20
W Button1 wstawiłem ten kod:
bool Dobrze=true;
double wynik=0;
switch(Convert::ToByte (wybor->Value))
{
case 20: if(TXB20->Text.Length>0) wynik+=Convert::ToInt16 (TXB20->Text);
case 19: if(TXB19->Text.Length>0) wynik+=Convert::ToInt16 (TXB19->Text);
case 18: if(TXB18->Text.Length>0) wynik+=Convert::ToInt16 (TXB18->Text);
case 17: if(TXB17->Text.Length>0) wynik+=Convert::ToInt16 (TXB17->Text);
case 16: if(TXB16->Text.Length>0) wynik+=Convert::ToInt16 (TXB16->Text);
case 15: if(TXB15->Text.Length>0) wynik+=Convert::ToInt16 (TXB15->Text);
case 14: if(TXB14->Text.Length>0) wynik+=Convert::ToInt16 (TXB14->Text);
case 13: if(TXB13->Text.Length>0) wynik+=Convert::ToInt16 (TXB13->Text);
case 12: if(TXB12->Text.Length>0) wynik+=Convert::ToInt16 (TXB12->Text);
case 11: if(TXB11->Text.Length>0) wynik+=Convert::ToInt16 (TXB11->Text);
case 10: if(TXB10->Text.Length>0) wynik+=Convert::ToInt16 (TXB10->Text);
case 9: if(TXB9->Text.Length>0) wynik+=Convert::ToInt16 (TXB9->Text);
case 8: if(TXB8->Text.Length>0) wynik+=Convert::ToInt16 (TXB8->Text);
case 7: if(TXB7->Text.Length>0) wynik+=Convert::ToInt16 (TXB7->Text);
case 6: if(TXB6->Text.Length>0) wynik+=Convert::ToInt16 (TXB6->Text);
case 5: if(TXB5->Text.Length>0) wynik+=Convert::ToInt16 (TXB5->Text);
case 4: if(TXB4->Text.Length>0) wynik+=Convert::ToInt16 (TXB4->Text);
case 3: if(TXB3->Text.Length>0) wynik+=Convert::ToInt16 (TXB3->Text);
case 2: if(TXB5->Text.Length>0) wynik+=Convert::ToInt16 (TXB2->Text);
case 1: if(TXB1->Text.Length>0) wynik+=Convert::ToInt16 (TXB1->Text);
}
if(Dobrze) MessageBox::Show (Convert::ToString (wynik),"Wynik");
else MessageBox::Show("Wpisz dane");
I wywala 20 błędów w każdej z tych linijek:
1>c:\users\użytkownik\documents\visual studio 2008\projects\srednia\srednia\Form1.h(732) : error C2228: left of '.Length' must have class/struct/union
1> type is 'System::String ^'
1> did you intend to use '->' instead?
Jak na razie działa tylko ten mój sposób ze Switch w którym to w każdym switch jest osobny kod. W każdym kolejnym coraz dłuższy. w case 2 np deklaruje 2 zmienne potem je dodaje i dziele przez 2 i wyświetlam wynik. W switch 20 deklaruje się już 20 zmiennych, wszystkie dodaje i dzieli przez 20. bardzo dużo pisana, długi kod ale działa.