Do napisania tego tekstu zainspirowały mnie wołania o pomoc na forum. To co tutaj piszę, nie koniecznie musi być w 100% z prawdą, więc najlepiej, jak sprawdzisz to w innym, bardziej miarodajnym źródle. Jednocześnie z góry przepraszam, że sam tego nie zrobiłem, ale wtedy, musiałbyś jeszcze długo czekać, lub ten tekst nigdy by nie powstał. Jednocześnie, chciałbym zaznaczyć, że ja też jeszcze niedawno miałem problemy i też pisałem z błędami podobnymi do tych błędów, popełnianych przez wołających.
Dlatego, faktu że cytuję błędny kod proszącego o pomoc uzera, proszę nie odbierać personalnie,:
[bbone=c,2310] scanf("%c",&kierunek);
if((sytuacja_x!=0)||(sytuacja_y!=0)) {
if((kierunek=='N')&&(sytuacja_y>0)) {
sytuacja_y--;
}
else if((kierunek=='S')&&(sytuacja_y<0)) {
sytuacja_y++;
}
else if((kierunek=='E')&&(sytuacja_x>0)) {
sytuacja_x--;
}
else if(sytuacja_x<0) {
sytuacja_x++;
}
}
if((sytuacja_x==0)&&(sytuacja_y==0)&&(doplynal==false)) {
printf("%d\n",i+1);
doplynal=true;
}[/bbone]
Jest w zasadzie tylko jeden mały błąd logiczny, ale może, gdy kod został napisany z pomocą switch, nie byłoby problemu? Takim błędem, jest nie przewidzenie wszystkich możliwych sytuacji i zostawienie "domyślnej" ostatniej opcji else if, z domyślnym kierunkiem 'W', a może być, np =='N' ale niezgodna z potrzebną sytuacją. Jeżeli nie jesteśmy pewni, lepiej nie korzystać z opcji default - jeżeli wszystkie inne przypadki wydaje się nam, że uwzględniliśmy, bo może jednak nie uwzględniliśmy, Czyli ostatnia opcja powinna [mogłaby] wyglądać tak:
[bbone=c,2311]else if (kierunek == 'W' && sytuacja_x < 0) ++sytuacja_x;
[/bbone]
Przy okazji pozbyłem się zbędnych nadmiarowych ozdobników, alee oczywiście, nie spowoduje to nagłego przyśpieszenia i z powodu "słabo" napisanego pozostałego kodu będzie tle.
Jakie są zalety stosowania if else lub swich oprócz względów czysto estetycznych, które są zupełnie subiektywne.
Czasami dobrze napisane if else jest szybsze od swich(){ case ' ':
W if else, programista decyduje, o kolejności przetwarzania warunków, w swich to kompilator ją ustala po swojemu - więc defalt równie dobrze można umieścić na początku.
W if else łatwiej operować zakresami.
Przykład, określenie [podział na grupy] wczytywanych znaków ASCI [warto wcześniej poznać tabelę kodów]:
[bbone=cpp,2316]
char c;
while (cin >> c){
if (c < ' ') cout << "kod sterujący\n";
if else (c < '0') cout << "kod z grupy: !\"#$%&'()*+,-./ \n";
if else (c <= '9') cout << "cyfra \n";
if else (c < 'A') cout << "kod z grupy: :;<=>?@ \n";
if else (c <= 'Z') cout << "duza litera \n";
if else (c < 'a') cout << "kod z grupy: [\\]^_` \n";
if else (c <= 'z') cout << "mala litera \n";
if else (c <= '~') cout << "kod z grupy: {|}~ \n";
else cout << "I don't know ;-( Go to the SPOJ/froum and ask! \n";
[/bbone]
To samo z pomocą switch, dla kilku cyfr:
[bbone=c,2317]switch(c){
default: // nie musi byc na koncu - ale to lepiej sprawdz
cout << "I don't know ;-( Go to the SPOJ/froum and ask! \n";
break;
case '0':
case '9':
case '1':
case '8':
case '2':
case '7':
/// i tak dalej pozostale cyfry, kolejnosc bez znaczenia
case '5':
cout << "cyfra \n";
break;
}[/bbone]
Gdzieś, przeczytałem informację, że w nowszych kompilatorach, można używać już też zakresów w instrukcji switch :
[bbone=c,2318]switch(c){
case '0' .. '9' : // ale to tez sprawdz na swoim kompilatorz
// i czy nalezy uzyc dwie czy moze trzy kropki
// a takze dla swojego, innego niz c/c++ jezyka.
}[/bbone]
created
last reply
- 5
replies
- 1.6k
views
- 3
users
- 1
link