1.
Zmienna
i
jest później ponownie deklarowana, więc ta deklaracja będzie zasłonięta i jest niepotrzebna.
2.
Ta zmienna nie jest w ogóle użyta.
3.
Kod: Zaznacz cały
for(int i=1;i<=ile;i++)
{
scanf("%d",&tab[i]);
min=tab[0];
tab[index]=tab[i];
index++;
for(int j=1;j<index;j++)
{
if(tab[j] < min)
{
if(tab[j]%5==0)//<--Mi to nie działa
min = tab[j];
}
}
}
Ten kawałek kodu ma niejasne przeznaczenie. W momencie wykonania instrukcji
tab[index] = tab[i]
zawsze jest
index == i-1
, a w momencie wykonania
for(int j=1;j<index;j++)
jest
index == i
. Twój kod można więc równoważnie zapisać tak:
Kod: Zaznacz cały
for(int i=1;i<=ile;i++)
{
scanf("%d",&tab[i]);
min=tab[0];
tab[i-1]=tab[i];
for(int j=1; j<i; j++)
{
if(tab[j] < min)
{
if(tab[j]%5==0)//<--Mi to nie działa
min = tab[j];
}
}
}
Czyli:
Dla
i = 1, 2, ..., ile
- Wczytaj
tab[i]
- Ustaw
min = tab[0]
- Przepisz
tab[i]
do poprzedniego pola tablicy
- Jeśli wśród
j = 1, 2, ..., i-1
znajdzie się takie, że
tab[j]
jest podzielne przez pięć oraz mniejsze od
min
, to ustaw
min
na najmniejszą z takich
tab[j]
.
Uwagi:
- Przepisywanie wartości o jeden wstecz nie jest potrzebne.
-
min
jest inicjalizowane liczbą
tab[0]
, która nie musi być podzielna przez pięć. W przypadku liczb 4, 5, 7, algorytm zwraca 4, bo najpierw ustawia
min = 4
a potem nie znajduje liczby mniejszej niż 4.
- Nie trzeba po każdym wczytaniu sprawdzać, czy wśród dotąd wczytanych liczb nie ma lepszej. Wystarczy po wczytaniu wszystkich sprawdzić raz. Dla większych wartości
ile
takie rozwiązanie zabiera znacznie mniej czasu.
Proponuję taki poprawiony kod:
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#define N 1000
int main(void)
{
int tab[N] = {};
int ile;
char exit;
int min;
do
{
printf( "Podaj ilosc liczb \n" );
scanf( "%d", &ile );
if( ile == 0 )
{
printf( "Wsrod zera liczb nie ma najmniejszej. \n" );
}
else
{
printf( "Podaj liczby \n" );
// Wczytujemy wszystkie liczby naraz
for( int i = 0; i < ile; ++i )
{
scanf( "%d", &tab[i] );
}
// Początkowo min = -1 aby zaznaczyć, że do tej pory nie napotkano
// jeszcze żadnej liczby podzielnej przez 5.
min = -1;
for( int i = 0; i < ile; ++i )
{
// Warunek konieczny rozważania tab[i].
if( tab[i]%5 == 0 )
{
// Jeśli min == -1 (co oznacza, że tab[i] jest pierwszą napotkaną liczbą podzielną przez 5)
// lub jeśli tab[i] jest mniejsze od aktualnego min,
// to podstaw za min nową wartość.
if( min == -1 || tab[i] < min ) min = tab[i];
}
}
if( min == -1 ) printf( "Wsrod podanych liczb nie ma podzielnej przez 5. \n" );
else printf( "Najmniejsza liczba to: %d \n", min );
}
printf("Czy chcesz kontynuowac?(T/N)\n");
exit = getchar();
scanf( "%c", &exit );
}
while(exit=='T'||exit=='t');
return 0;
}