21 czerwca 2020

Modyfikacja zmiennej pętli for

Wyczytałem chyba na wazniak.mimuw.edu.pl, że zmiana zmiennej sterującej pętli for świadczy o nieumiejętności programowania.
I tak pętla:
for( int k=0; k<liczba; k++ ) {
   ...
   k++; 
}
może być traktowana jak napisana przez bardzo niedoświadczonego, gdyż można użyć
for( int k=0; k<liczba; k=k+2 ) {
   ...
}

A teraz podam przykład, w którym jednak taka konstrukcja się przydaje.
Mam tablicę do 8 różnych obiektów. Należy ją zainicjować. Obiekty są różne, nie mogą się powtarzać. Ich krotność jest losowa od 1 do 8.
Np. sud szpitalny. Pacjent ma do 8 różnych chorób, które należy zainicjować. Każda choroba ma moc będącą liczbą losową od 1 do 100.
Losujemy chorobę, wstawiamy ją do tablicy, o ile się nie powtarza. Kiedy się powtórzy, powtarzamy losowanie. Ale niedoświadczony lekarz zna zaledwie dwie choroby. Czyli i tak musimy siłowo zmniejszyć krotność chorób z 8 do co najwyżej 2!
Zastosowane rozwiązanie: illnes = tablica chorób, jest ich ILLNESES, pacjent ma wylosowane możliwych k różnych chorób
1. for( int i=0; i<k; i++ ) {
2.   illnes[i] = 1+rand()% (ILLNESES-1); // losowana choroba z puli
3.   for( int j=0; j<i; j++ )
4.      if( illnes[j] == illnes[i] ) {  // choroba juz wystapila
5.         i--;
6.         k--;
7,      }
8.   ... // ustawienie parametrow chorob
9. }
10. for( int i=k; i<8; i++) illnes[i]=-1;  // nie ma dalszych chorob

Warunek w linii 4 sprawdza, czy choroba została już wylosowana, gdy tak, ignoruje ten wybór pozwalając nadpisać powtarzajacą się chorobę, zmniejszając zarazem ich krotność. Nadpisanie to następuje albo w linii 8, albo w 10.

Nie wyobrażam sobie, jak bardzo skomplikowany byłby kod sprawdzania możliwych dostępnych chorób bez tej modyfikacji...

Brak komentarzy: