• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie bąbelkowe

Object Storage Arubacloud
0 głosów
1,182 wizyt
pytanie zadane 26 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
edycja 27 grudnia 2019 przez Hubertius

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;
}

 

komentarz 26 grudnia 2019 przez MsMaciek123 Pasjonat (24,760 p.)
-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 ⏎

Chodzi o te linie, one są takie same i powodują błąd (powinna być jedna taka linia). Jeszcze nie wczytałem się w twój kod, lecz możesz sprawdzić czy następna linia jaką program chce wypisać nie jest przypadkiem taka sama jak poprzednia i wtedy anulować tą linię.

komentarz 26 grudnia 2019 przez Hubertius Bywalec (2,970 p.)

@MsMaciek123

	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(kontrola == (size-1) ) 
			{
				return 0;
			}
	
		}
		kontrola=0;
		printf("\n");
	}

Stworzyłem zmienną kontrolną, która sprawdza, czy elementy są posortowane prawidłowo. Jeśli tak i wartość zmiennej kontrola jest równa size-1 ( czyli wtedy, gdy i przedostatni element tablicy jest mniejszy od ostatniego)  funkcja powinna zwrócić wartość zero i tym samym zakończyć działanie. Jeśli elementy tablicy wciąż są nie posortowane, po zakończeniu węwnętrznej pętli zeruje kontrolę, by wszystko zaczęło się od początku.  Jednak tak się nie dzieje. W kilku rozpatrywanych przed chwilą przypadkach wygląda to tak, jakby w ogóle w żadnym momencie nie została wykonana ta instrukcja warunkowa.   :(

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 8 stycznia 2023 w C i C++ przez Zuzan Początkujący (390 p.)
0 głosów
1 odpowiedź 544 wizyt
pytanie zadane 24 października 2021 w C i C++ przez pita Nowicjusz (180 p.)
0 głosów
1 odpowiedź 809 wizyt
pytanie zadane 2 lutego 2021 w C i C++ przez Kamirru9 Początkujący (300 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...