Cześć
Mam takie zadanie z sortowania bąbelkowego:
Napisz funkcję do posortowania tablicy liczb całkowitych rosnąco, wykorzystując algorytm sortowania bąbelkowego. Funkcja ma wyświetlać elementy tablicy po każdym kroku sortowania, aż do momentu, kiedy tablica nie zostanie w pełni posortowana (po każdym kroku największa wartość z nieposortowanej części tablicy powinna znajdować się na skrajnej prawej pozycji). Funkcja powinna zakończyć działanie w momencie kiedy cała tablica zostanie posortowana rosnąco. W przypadku podania błędnych danych funkcja powinna zwrócić wartość 1, w pozostałych przypadkach 0. Funkcja powinna mieć następujący prototyp:
int bubble_sort(int tab[], int size);
Napisz program, który pobierze od użytkownika tablicę (nie więcej niż 150 elementów, zakończone 0), a następnie posortuje jej elementy rosnąco wykorzystując powyższą funkcję. Na koniec program ma wyświetlić posortowaną tablicę. W przypadku wprowadzenia błędnych danych program ma wyświetlić komunikat Incorrect input i niezwłocznie zakończyć działanie z kodem błędu 1, a w przypadku podania zbyt małej liczby danych komunikat Not enough data available oraz niezwłocznie zakończyć działanie z kodem błędu 3.
Uwaga! Do pobrania elementów tablicy od użytkownika oraz do wyświetlania tablicy wykorzystaj funkcje z zadania 8.22. Deklaracje funkcji read_vector i display_vector mają zostać umieszczone w pliku vector_utils.h, a ich definicje w pliku vector_utils.c.
Uwaga! W funkcjach nie wolno deklarować dodatkowych tablic.
Przykładowe wejście:
Podaj wektor:
10 1 4 1 -2 7 4 -9 0
Przykładowe wyjście:
1 4 1 -2 7 4 -9 10
1 1 -2 4 4 -9 7 10
1 -2 1 4 -9 4 7 10
-2 1 1 -9 4 4 7 10
-2 1 -9 1 4 4 7 10
-2 -9 1 1 4 4 7 10
-9 -2 1 1 4 4 7 10
-9 -2 1 1 4 4 7 10
Jak coś podaję swój kod z:
-pliku main:
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int bubble_sort(int tab[], int size);
int main(int argc, char *argv[])
{
int stop_value=0;
int vec1[150]={0};
int size=150;
int newsize;
//printf("Twoj pierwszy dzialajacy projekt.\n Wprowadz dane swojej tablicy\n UWAGA! Pamietaj, ze tablica zakonczy wczytywanie danych przy wprowadzeniu zera!\n");
printf("Podaj wektor:\n");
newsize=read_vector(vec1,size,stop_value);
if(newsize==-2)
{
printf("Incorrect input");
return 1;
}
if(newsize==-1 && vec1[0]==0)
{
printf("Not enough data available");
return 3;
}
bubble_sort(vec1,newsize);
return 0;
}
int bubble_sort(int tab[], int size)
{
int i,j;
int zm_tym;
if(size==-2 || size==-1 || size<1)
{
return 1;
}
if(tab[1]==0)
{
printf("%d ",tab[0]);
return 0;
}
for(i=0;i<size-1;i++)
{
for(j=0;j<size-1;j++)
{
if(tab[j]>tab[j+1])
{
zm_tym=tab[j];
tab[j]=tab[j+1];
tab[j+1]=zm_tym;
}
printf("%d ",tab[j]);
if(j==size-2)
{
printf("%d ",tab[j+1]);
}
}
printf("\n");
}
return 0;
}
-pliku vector_utils.h:
#ifndef vector_utils
#define vector_utils
int read_vector(int vec[], int size, int stop_value);
void display_vector(const int vec[], int size);
#endif
-pliku vector_utils.c
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"
int read_vector(int vec[], int size, int stop_value)
{
int i=0;
int newsize=0;
if(size<1)
{
return -1;
}
for(i=0;i<size;i++)
{
if(scanf("%d",&vec[i])!=1)
{
return -2;
}
if(i==0 && vec[i]==stop_value)
{
return -1;
}
if(vec[i]==stop_value)
{
break;
}
newsize++;
}
char zmienna_tymczasowa_ciuralla='a';
do
{
scanf("%c",&zmienna_tymczasowa_ciuralla);
}
while(zmienna_tymczasowa_ciuralla != '\n');
return newsize;
}
void display_vector(const int vec[], int size)
{
int i=0;
for(i=0;i<size;i++)
{
if(size<1)
{
break;
}
printf("%d ",vec[i]);
if(i==size-1)
{
printf("\n");
}
}
O ile program przechodzi przez testy funkcyjne to wysypuje się jednak już na testach głównego programu.
Oto główny przykład:
81 -37 69 -48 -78 39 -3 -96 56 49 -98 -66 -4 41 -77 26 0⏎
-37 69 -48 -78 39 -3 -96 56 49 -98 -66 -4 41 -77 26 81 ⏎
-37 -48 -78 39 -3 -96 56 49 -98 -66 -4 41 -77 26 69 81 ⏎
-48 -78 -37 -3 -96 39 49 -98 -66 -4 41 -77 26 56 69 81 ⏎
-78 -48 -37 -96 -3 39 -98 -66 -4 41 -77 26 49 56 69 81 ⏎
-78 -48 -96 -37 -3 -98 -66 -4 39 -77 26 41 49 56 69 81 ⏎
-78 -96 -48 -37 -98 -66 -4 -3 -77 26 39 41 49 56 69 81 ⏎
-96 -78 -48 -98 -66 -37 -4 -77 -3 26 39 41 49 56 69 81 ⏎
-96 -78 -98 -66 -48 -37 -77 -4 -3 26 39 41 49 56 69 81 ⏎
-96 -98 -78 -66 -48 -77 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -66 -77 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -77 -66 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -77 -66 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -77 -66 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -77 -66 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -77 -66 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
-98 -96 -78 -77 -66 -48 -37 -4 -3 26 39 41 49 56 69 81 ⏎
Program zakończony; kod błędu=0 (Ok)
Test został przerwany; Liczba linii wyświetlanych przez program jest niewłaściwa; powinno być 12 a jest 16
Gdzie popełniłem błąd? :(
EDIT
Mój ostatni kod z main-a:
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int bubble_sort(int tab[], int size);
int main(int argc, char *argv[])
{
int stop_value=0;
int vec1[150]={0};
int size=150;
int newsize;
//printf("Twoj pierwszy dzialajacy projekt.\n Wprowadz dane swojej tablicy\n UWAGA! Pamietaj, ze tablica zakonczy wczytywanie danych przy wprowadzeniu zera!\n");
printf("Podaj wektor:\n");
newsize=read_vector(vec1,size,stop_value);
if(newsize==-2)
{
printf("Incorrect input");
return 1;
}
if(newsize==-1 && vec1[0]==0)
{
printf("Not enough data available");
return 3;
}
bubble_sort(vec1,newsize);
return 0;
}
int bubble_sort(int tab[], int size)
{
int i=0,j=0;
int zm_tym;
if(size==-2 || size==-1 || size<1)
{
return 1;
}
if(tab[1]==0)
{
printf("%d ",tab[0]);
return 0;
}
int kontrola=0;
for(i=0;i<size;i++)
{
for(j=0;j<size-1;j++)
{
if(tab[j]<tab[j+1])
{
kontrola++;
}
if(tab[j]>tab[j+1])
{
zm_tym=tab[j];
tab[j]=tab[j+1];
tab[j+1]=zm_tym;
}
printf("%d ",tab[j]);
if(j==size-2)
{
printf("%d ",tab[j+1]);
}
if(j==size-2 && kontrola == (size-1) )
{
return 0;
}
if(j==size-2 && kontrola != size-1)
{
kontrola=0;
}
}
printf("\n");
}
return 0;
}