ANSI C/Tablice- znajdowanie liczb parzystych, sortowanie bąbelkowe

0

Cześć,
jestem adeptką, dopiero zaczynam bawić się w języku C. Robiąc teoretycznie błahe ćwiczenie, natknęłam na problem z którym nie mogę sobie poradzić. Mam nadzieję że mi pomożecie.

Zadanie brzmi:
Napisz program który na wejściu poprosi użytkownika o podanie 10 liczb całkowitych, po czym wyświetli spośród nich:

  1. tylko parzyste
  2. tylko parzyste (posortowane)

Oto mój kod. Starałam się dodac komentarze, by uzmysłowić Wam co miałam na myśli.

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

// zwykla implementacja sortowania babelkowego

void babelek(int tablica[], int rozmiar)
{
  int i, j, temp;
 
  for (i = (rozmiar - 1); i > 0; i--)
  {
    for (j = 1; j <= i; j++)
    {
      if (tablica[j-1] > tablica[j])
      {
        temp = tablica[j-1];
        tablica[j-1] = tablica[j];
        tablica[j] = temp;
      }
    }
  }
}

int main()
{

	int j,n=10, k=0; // k wprowadzilam jako licznik liczb parzystych
	int tab[n], tab1[n];
	for(int i=1; i<=10; i++)
	{
		printf("Podaj liczbe nr: %d\n", i);
		scanf("%d", &j); 
		tab[i]=j; 
	}
	// 10 liczb wczytanych do tablicy "tab"
	printf("Liczby parzyste to: \n");
	
	printf("****SPRAWDZMY ILE WYNOSI K PRZED INKREMENTACJA****: %d\n", k); 

	for(int i=1; i<=10; i++)
	{
		if(tab[i]%2==0) // jesli element tablicy jest parzysty to
		{
		k++; // zwieksz licznik liczb parzystych o 1
		printf("%d\n", tab[i]); // wyswietl ja
		tab[i]=tab1[k]; // dodaj ja to tablicy liczb parzystych tab1 w miejsce o indeksie
		//poczawszy od 0, bo na poczatku nie mamy zadnych liczb parzystych, jak jakas znajdzie 
		//to zwiekszy ja o 1, nastepnie o 1 i tak do konca, tj. do ilosci liczb parzystych ktora
		//bedzie jednoczesnie rozmiarem tablicy. Jako ze "przesuwamy" sie o jeden, to elementy 
		//tablicy beda "uporzadkowane", jeden obok drugiego.
	
		}
	}
	
	printf("****I PO INKREMENTACJI*****: %d\n",k );
	
	babelek(tab1,k); // wywolanie funkcji, sortuje tablice zawierajaca liczby parzyste o rozmiare k 
	//ktora definiuje ile liczb parzystych zostalo "odnalezionych" w tablicy "tab"
	
	for(int i=1; i<=k; i++)
		printf("%d\n",tab1[i]);
	
	
	getch(); 
	return 0; 

}

Program się kompiluje, przynajmniej pod Dev C++. Działa poprawnie do momentu w którym ma wyświetlić posortowane liczby parzyste. Poprawnie prosi 10-krotnie o podanie liczb, wczytuje je do tablicy, wypisuje parzyste liczby jednak przy sortowaniu wypluwa jakieś śmieci ;/

Zaznaczę tylko że nie chciała bym by ktoś za mnie napisał ten program, tj. wrzucił swoją wersję, bo nie pozwoli mi to na zrozumieniu własnego błędu w tak wydawało by się latwym programie.

Dzięki wielkie za pomoc :)

0

tab[i]=j; tablice iterowane są od zera, a pętle masz od 1.
Poza tym lepiej pozbądź się Dev-C++, a pobierz cokolwiek lepszego.

0

w pętli gdzie sprawdzasz parzystość liczb najpierw zwiększasz k, a później używasz go jako indeksu przez co tak naprawdę wpisywanie nie jest od 0 tylko od 1 i możesz wyjść poza zakres tablicy (zobacz co się stanie jak podasz same parzyste liczby), no i warunek w ostatnim forze też jest błędny, zamiast i <= k, powinno być i < k, bo jeśli k to ilość liczb czyli np. k = 5, to ostatnim indeksem w tablicy będzie k - 1 = 4. Mam nadzieję, że da się zrozumieć to co napisałem :P

EDIT: No tak, teraz widzę, że wszędzie indeksujesz od 1 nie tylko tam gdzie jest k, czyżby pozostałość po nauce Pascala? ;)

0

Ok, zmieniłam wszędzie gdzie się dało iterację zaczynając od 0, jedynkę wprowadziłam tam tylko po to by przy wyświetlaniu komunikatu "Podaj liczbę nr" nie było "Podaj liczbę nr 0", miało być w założeniu "1-szą". Jakoś tak ładniej wyglądało (:
Oczywiście pomyślałam też o tym żeby zmienić drugi koniec, tj. prawą stronę for-ów.

Ale nadal to nie rozwiązało mojego problemu. Program kompiluje się tak jak wcześniej, tj. poprawnie, wczytuje liczby oraz wyświetla te parzyste, poprawnie wyświetla wartość zmiennej k, która wskazuje na liczbę znalezionych liczb parzystych w danym ciągu (oczywiście za drugim wywołaniem), ale nadal przy sortowaniu wyrzuca śmieci ;/

Rozumiem że takie problemy pojawiają się gdy wychodzi poza zakres tablicy, ale już tyle razy się bawiłam w "jeżdżenie" po niej że to wprost nie możliwe żebym ani razu nie trafiała w jej zakres. **Gdybym wyszła z pętlą o jeden indeks za daleko to powinno wypluć śmieci tylko w miejscu tego indeksu poza zakresem, prawda ? A nie w miejsce każdego elementu tablicy :( **

Program wydawał się tak błahy... próbowałam już wszystkiego, nawet zmieniałam sortowanie bąbelkowe na QuickSort i nadal nic. Nadal identyczne rezultaty ;(

Jeśli ktoś mógłby dokładnie przyjrzeć się mojemu kodowi i wskazać gdzie dokładnie tkwi problem, była bym wdzięczna.

0

Tutaj masz błąd:

 
k++;
...
tab[i]=tab1[k]; 

Zamien na:

 
tab1[k]=tab[i]; 
k++;

k powinnas inkrementować po przypisaniu(ponieważ zaczynasz przypisywac liczby do tablicy tab1 od 1 elementu).

0
#include <stdio.h>

void babelek(int tablica[],unsigned rozmiar) // ma być unsigned no chyba że spodziewasz się ujemnego rozmiaru tablicy
  {
   unsigned i, j;
   int temp;
   for(i=rozmiar;i>1;--i)
     {
      for(j=1;j<i;++j)
        {
         if(tablica[j-1]>tablica[j])
           {
            temp=tablica[j-1];
            tablica[j-1]=tablica[j];
            tablica[j]=temp;
           }
        }
     }
  }
}
 
int main()
  {
   unsigned i,k; // k wprowadzilam jako licznik liczb parzystych
   int tab[10];
   for(i=0;i<10;++i)
     {
      printf("Podaj liczbe nr: %d\n",i+1);
      scanf("%d",tab+i); 
     }
   printf("Liczby parzyste to: \n");
   for(i=k=0;i<10;++i)
     {
      if(!(tab[i]%2)) // jesli element tablicy jest parzysty to
        {
         printf("%d\n",tab[i]); // wyswietl ja
         tab[k++]=tab[i]; // zwieksz licznik liczb parzystych o 1, dodaj ja to tablicy liczb parzystych tab1 w miejsce o indeksie
        }
     }
   babelek(tab,k); // wywolanie funkcji, sortuje tablice zawierajaca liczby parzyste o rozmiare k 
   for(i=0;i<k;++i) printf("%d\n",tab[i]);
   while(getchar()!='\n') {}
   getchar();
   return 0; 
  }

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