Czy podwojny licznik iteracji jest dozwolony?

0

Tak jak w temacie,mam program który tworzy tablice liczb a nastepnie wybiera z niej ta najwieksza.

Kod:

 #include <stdio.h>
#define ROZM 10
int main()
{
	
int tab[ROZM],max,i;

for(i=0;i<ROZM;i++)   //Budujemy przypadkowa tablice
{
tab[i]=rand()%100;
printf("%5d",tab[i]);
}

max=tab[i];

for(i=0;i<ROZM;i++) max=(max>tab[i+1])?max:tab[i+1];  //Wybieramy najwieksza liczbe

printf("\n\nNajwieksza liczba to %d",max);

getch();
return 0;


}

I teraz pytanie:
Wiem ,że można to zrobić w jednej pętli bez takich kombinacji,ale interesuje mnie sam problem,mianowicie
-Czy można do dwóch różnych pętli używać tego samego oznaczenia dla licznika iteracji?
Czy to jest zgodne z ogólnymi,zasadami,etyką,rozumowaniem itp.
No bo jak na moją głowę,pętle wykonują się niezależnie jedna po drugiej i licznik zostaje po prostu w odpwoiednim momencie wyzerowany i użyty od nowa-no bo po co zaśmiecać pamięć dwoma zmiennymi,jak można jedną?

Mam rację?

0

po co zaśmiecać pamięć dwoma zmiennymi,jak można jedną

Kompilatory od kilkudziesięciu lat starają się optymalizować kod wynikowy i zarówno różnica w wydajności jak i zajętości pamięci powinna wynosić dokładnie zero. Natomiast czytelność spada.

Ja zawsze staram się ustawiać zmienne tak, by miały jak najmniejszy zasięgi i były używane tylko w jednym celu. Może sporadycznie się wyłamuję, ale to naprawdę sporadycznie.

1

Czy w ogóle spróbowałeś skompilować i uruchomić ten kod? Nie sądzę.

  1. Po pierwszej pętli, i ma wartość ROZM, więc taka instrukcja
max=tab[i];

to undefined behaviour.

  1. Analogiczna sytuacja w drugiej pętli, gdy odwołujesz się do tab[i+1].

  2. Żeby wywołać rand() trzeba dołączyć odpowiedni nagłówek. To samo dotyczy funkcji getch(), której już nie powinno się używać.

0

i,j,k to oznaczenia z matematyki i trzeba je stosować analogicznie.

W C możesz swobodnie je wykorzystywać wielokrotnie (nawet zalecałbym zawsze stosowanie tych samych nazw dla iteratorów) z tym, że w normalnym kodzie miałbyś te pętle osobno (w dwóch funkcjach: init_array, find_max).

W C++ masz więcej możliwości / funkcji / styli programowania.

Czego nie powinieneś w tym kodzie wielokrotnie wykorzystywać?
max - powinno zawsze określać jeden rodzaj maksa
ROZM - powinno zawsze określać rozmiar tablicy roboczej (a nie np. rozmiar fonta czy port do wysłania rządania RPC - proszę się nie śmiać - nie dla każdego oczywiste).

0

Nie ma takich reguł że nie możesz używać zmiennej kilkukrotnie, masz kierować się zdrowym rozsądkiem tak żeby przede wszystkim było to czytelne.

0

Kompilator może bezproblemowo to sobie zoptymalizować (przykład: http://goo.gl/ZiDB8E ), a zawsze domyślnie powinieneś optymalizować kod pod kątem jego czytelności (jak najmniejszy zakres zmiennych np.), chyba że prawdziwy benchmark Ci mówi, że w danym miejscu wydajność jest bardziej istotna (przy czym w opisywanym tutaj przypadku nie ma to znaczenia, bo kompilator potrafi zauważyć gdzie jaka zmienna jest użyta).

0

Dzięki wszystkim za cenne uwagi,na pewno je wszystkie przeanalizuje :)

DRK

Zawsze kompiluję i uruchamiam program przed jego udostępnieniem gdzie kolwiek-również z tym taak postąpiłem i wszystko działało (widocznie akurat siadały te dobre argumenty).Niemniej jednak masz faktycznie rację i program posiada parę błędów logicznych,które przeoczyłem.
Nie rozumiem tylko o co chodzi z funkcją getch(),czemu nie powinno się jej używać?

0

Pomijając poprawność algorytmu, radzę nie używać inline ifa, bo jest mało czytelny. Poza tym, użyłeś go w takim miejscu, że już nawet zapis ze zwykłym ifem byłby krótszy.

0
Krwawy Kaczor napisał(a):

Nie rozumiem tylko o co chodzi z funkcją getch(),czemu nie powinno się jej używać?

Pewnie chodzi o jej nieprzenośność.
Jest kilka sposobów na czekanie na reakcję użytkownika, tu jest lista:

http://www.cplusplus.com/articles/iw6AC542/

0

Tyle ,że jak patrzę na te sposoby to i tak korzystają one z getch() albo getchar() (swoją drogą czym te funkcje się różnią od siebie?).Więc co to za róznica czy wykorzystamy je inwidualnie,czy zostaną wplecione w jakąś funkcję?

Np tu:

#include <stdio.h>

void PressEnterToContinue()
  {
  int c;
  printf( "Press ENTER to continue... " );
  fflush( stdout );
  do c = **getchar**(); while ((c != '\n') && (c != EOF));
  } 

i tu:

#include <conio.h>
#include <stdio.h>

void PressAKeyToContinue()
{
int c;
printf( "\nPress a key to continue..." );
c = getch();
if (c == 0 || c == 224) getch();
}

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