Skompresowanie kodu. Switch na coś innego.

0

Witam,
Otóż mam tak w moim kodzie:

case 1: if((tab[0][0])==1)||(tab[0][0])==2)) return 1; else return 0; break;

I tak dla dziewięciu liczb od 1 do 9 oraz dla tablicy od [0][0] do [3][3]. Wydaje mi się to bezsensu, ponieważ ciągle piszę to samo oprócz liczb. Czy jest jakaś możliwość zapisania tego w przyjemniejszej wersji?

0

A mozesz pokazać więcej przypadków? Bo z jednego przypadku, bez napisania CO właściwie tu sprawdzasz, to raczej ciężko wydedukować cokolwiek.

0

Wybór przechowuje wartość od 49 do 57, tab[][] - przechowuje wartości 2,1 i 0, MAXSTAN - const, który równa się 3.
Ogólnie, funkcja ma sprawdzać, czy użytkownik może zapisać do tablicy o danych wartościach. Naciska 1, chce zapisać do tab[0][0]. Może zapisać jeśli w tym tab jest liczba 0. Wtedy ma przerwać pętlę while, która jest poza funkcją.
Już widzę, że mogę odchudzić funkcję tworząc warunek odwrotny, tzn: if(tab[0][0]==0) return 0; else return 1;
A pytanie do was, czy mogę to zapisać w inny sposób? W mniejszej ilości linijek?

 
bool czymozesz(short int wybor, short int tab[MAXSTAN][MAXSTAN])
{
 switch(wybor)
 {
  case 49: if ((tab[0][0]==1)||(tab[0][0]==2)) return 1; else return 0; break;
  case 50: if ((tab[0][1]==1)||(tab[0][1]==2)) return 1; else return 0; break;
  case 51: if ((tab[0][2]==1)||(tab[0][2]==2)) return 1; else return 0; break;
  case 52: if ((tab[1][0]==1)||(tab[1][0]==2)) return 1; else return 0; break;
  case 53: if ((tab[1][1]==1)||(tab[1][1]==2)) return 1; else return 0; break;
  case 54: if ((tab[1][2]==1)||(tab[1][2]==2)) return 1; else return 0; break;
  case 55: if ((tab[2][0]==1)||(tab[2][0]==2)) return 1; else return 0; break;
  case 56: if ((tab[2][1]==1)||(tab[2][1]==2)) return 1; else return 0; break;
  case 57: if ((tab[2][2]==1)||(tab[2][2]==2)) return 1; else return 0; break;
 }
}
1

Da sie to skrócić, ale ja bym jednak zmienił design większej części tego kodu bo już sam fakt że masz jakąś zmienną sterującą o wartości 49 czy 57 znaczy że ten kod nadaje się tylko do skasowania i napisania od nowa.
A skrócenie kodu:

value = wybor - 49;
row = value%3;
column = value/3;
if((tab[column][row]==1)||(tab[column][row]==2)){
  return 1;
}
return 0;
2
wybor-=49;
return (tab[wybor/3][wybor%3]==1 || tab[wybor/3][wybor%3]==2);

//trochę się spóźniłem

0

Dziękuje za aż tyle odp. : >

Shalom napisał(a):

Da sie to skrócić, ale ja bym jednak zmienił design większej części tego kodu bo już sam fakt że masz jakąś zmienną sterującą o wartości 49 czy 57 znaczy że ten kod nadaje się tylko do skasowania i napisania od nowa.

De facto, ta cześć + pętla jest próbą obrony przed nadpisywaniem zmiennej w tablicy. Tzn jeśli jest już zajęte miejsce w tablicy to masz zwrócić true do while, który to da ponowne wczytanie znaku.

row = value%3;
column = value/3;

Dlaczego tak? Mimo, że widzę rozwiązanie widzę, to nie rozumiem jego. Z ciekawości także zapytam. Skąd wy te pomysły bierzecie?

1

Nie rozumiem twojego pytania. Przespałeś wszystkie lekcje matematyki? o_O Liczba rzędów odlicza ci się 0,1,2,0,1,2 co oznacza że na dobrą sprawę to jest po prostu zwykłe odliczanie modulo 3 (reszta z dzielenia licznika przez 3). Kolumny lecą ci 0,0,0,1,1,1,2,2,2... co oznacza że jest to zwykłe dzielenie całkowitoliczbowe licznika przez 3.
Takie pomysły bierze się zwykle z głowy...

0

Dziękuje za odpowiedź. Na żadnej nie spałem. Po prostu nikt takiej nas zależności nie uczył. : >

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