Sortowanie Tablicy struktur po kilku kryteriach

0

Witam, mam do wykonania prosta tabele ligowa dla 8 drużyn (ustawiłem póki co rozmiar tablicy struktur na 3 żeby łatwiej się testowało działania poszczególnych funkcji bez zbędnego wpisywania dużej ilości danych). Chodzi o posortowanie tabeli względem punktów, jeżeli równe punkty to po ilości strzelonych, jeśli to i to równe po ilości straconych, jeżeli wszystkie 3 warunki są równe to nie zostaje tak jak jest. Póki co nazwę drużyny traktuję jako int bo miałem drobne problemy z wypisaniem tablicy znaków ale doczytałem o wskaźnikach i alokacji pamięci i myślę że to łatwo rozwiążę. Problemem jest bubblesort po kilku warunkach. Jeżeli sortuję tylko po punktach działa algorytm bez zarzutu ale jeżeli chcę dodać kolejne warunki sortowania to nic się nie dzieje w sortowaniu. Byłbym wdzięczny za uwagi co do całego kodu a szczególnie za jakąś wskazówkę gdzie popełniam błąd w rozumowaniu przy sortowaniu. Z góry dziękuję za komentarze

#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
typedef struct {
	int* nazwa_druzyny;
	int* punkty;
	int* strzelone;
	int* stracone;
} struktura;
int pobierz() {
	int* nazwa;
	printf("podaj nazwe druzyny:\n");
	scanf_s("%d", &nazwa);
	return nazwa;
}
int pobierz_punkty() {
	int* liczba;
	printf("Podaj liczbe zdobytych punktow\n");
	scanf_s("%d", &liczba);
	return liczba;
}
int pobierz_strzelone() {
	int* liczba;
	printf("Podaj liczbe zdobtych goli \n");
	scanf_s("%d", &liczba);
	return liczba;
}
int pobierz_stracone() {
	int* liczba;
	printf("Podaj liczbe straconych goli \n");
	scanf_s("%d", &liczba);
	return liczba;
}
int wypisz_naglowek() {
	printf("Nazwa druzyny \t punkty \t strzelone \t stracone \n");
}
int wypisz(int* wynik) {

	printf("%d \t \t ", *wynik);
}
char wypisznazwe(char* wynik[10]) {

	printf("%s \t \t ", wynik);
}

int main() {
	struktura druzyna[3];
	for (int i = 0; i < 3; i++) {
		druzyna[i].nazwa_druzyny = pobierz();
		druzyna[i].punkty = pobierz_punkty();
		druzyna[i].strzelone = pobierz_strzelone();
		druzyna[i].stracone = pobierz_stracone();
	}
	wypisz_naglowek();
	
	for (int i = 0; i < 3; i++) {

		wypisz(&druzyna[i].nazwa_druzyny);
		wypisz(&druzyna[i].punkty);
		wypisz(&druzyna[i].strzelone);
		wypisz(&druzyna[i].stracone);
		printf("\n");
	}
	int tmp1=0;
	int tmp2 = 0;
	int tmp3 = 0;
	int tmp4 = 0;
	
	// bubblesort po punktach
	for ( int i=0; i<3; i++){
		for (int j = 0; j < 3 - i - 1; j++) {
			if (druzyna[j].punkty <druzyna[j + 1].punkty)
			{
				tmp1=druzyna[j].nazwa_druzyny;
				druzyna[j].nazwa_druzyny=druzyna[j + 1].nazwa_druzyny;
				druzyna[j + 1].nazwa_druzyny=tmp1;
	
				tmp2 = druzyna[j].punkty;
				druzyna[j].punkty = druzyna[j + 1].punkty;
				druzyna[j + 1].punkty=tmp2; 
				
				tmp3 = druzyna[j].strzelone;
				druzyna[j].strzelone = druzyna[j + 1].strzelone;
				druzyna[j + 1].strzelone = tmp3;
				
				tmp4 = druzyna[j].strzelone;
				druzyna[j].strzelone = druzyna[j + 1].strzelone;
				druzyna[j + 1].strzelone = tmp4;
			}
			else if (druzyna[j].punkty == druzyna[j + 1].punkty && druzyna[j].strzelone < druzyna[j + 1].strzelone)
			{
				tmp1 = druzyna[j].nazwa_druzyny;
				druzyna[j].nazwa_druzyny = druzyna[j + 1].nazwa_druzyny;
				druzyna[j + 1].nazwa_druzyny = tmp1;

				tmp2 = druzyna[j].punkty;
				druzyna[j].punkty = druzyna[j + 1].punkty;
				druzyna[j + 1].punkty = tmp2;

				tmp3 = druzyna[j].strzelone;
				druzyna[j].strzelone = druzyna[j + 1].strzelone;
				druzyna[j + 1].strzelone = tmp3;

				tmp4 = druzyna[j].strzelone;
				druzyna[j].strzelone = druzyna[j + 1].strzelone;
				druzyna[j + 1].strzelone = tmp4;
			}
			else if (druzyna[j].punkty == druzyna[j + 1].punkty && druzyna[j].strzelone < druzyna[j + 1].strzelone && druzyna[j].stracone>druzyna[j + 1].stracone)
			{
				tmp1 = druzyna[j].nazwa_druzyny;
				druzyna[j].nazwa_druzyny = druzyna[j + 1].nazwa_druzyny;
				druzyna[j + 1].nazwa_druzyny = tmp1;

				tmp2 = druzyna[j].punkty;
				druzyna[j].punkty = druzyna[j + 1].punkty;
				druzyna[j + 1].punkty = tmp2;

				tmp3 = druzyna[j].strzelone;
				druzyna[j].strzelone = druzyna[j + 1].strzelone;
				druzyna[j + 1].strzelone = tmp3;

				tmp4 = druzyna[j].strzelone;
				druzyna[j].strzelone = druzyna[j + 1].strzelone;
				druzyna[j + 1].strzelone = tmp4;
			}
			
			
		}
	}
	
	printf("Po sortowaniu wyglada to tak \n");
	printf("\n");
	wypisz_naglowek();

	for (int i = 0; i < 3; i++) {

		wypisz(&druzyna[i].nazwa_druzyny);
		wypisz(&druzyna[i].punkty);
		wypisz(&druzyna[i].strzelone);
		wypisz(&druzyna[i].stracone);
		printf("\n");
	}
	return 0;
}
1
  • Bezsensowne nazwy
  • Polskojęzyczne nazewnictwo (ma być angielski)
  • http://forum.4programmers.net/1101404
  • int* nazwa_druzyny; doprawdy? I jak ty w dynamiczną tablicę liczb nazwę wpiszesz?
  • int* punkty; to ile tych różnych punktów dla jednej drużyny?
typedef struct
{
    const char *name;
    int points.shot,lost;
} team;

int compare_int(int a,int b) { return (a>b)-(a<b); }

int compare(const team *a,const team *b)
{
    int ret;
    if(!(ret=compare_int(a->points,b->points))) return ret;
    if(!(ret=compare_int(a->shot,b->shot))) return ret;
    if(!(ret=compare_int(a->lost,b->lost))) return ret;
    return strcmp(a->name,b->name);
}

void swap(const team *a,const team *b)
{
    team tmp=*a;
    *a=*b;
    *b=tmp;
}

team tb[3];
if(compare(tb+0,tb+1)>0) swap(tb+0,tb+1);
1

...

  • kolosalna funkcja == kolosalne problemy, cytując Linus'a Torvalds'a:
  • Jeśli potrzebujesz więcej niż trzech poziomów wcięcia, twój kod i tak jest schrzaniony i powinieneś go poprawić.
  • If you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.
    Źródło:Dokumentacja stylu kodowania Linuksa

Jak chcesz robić swoje sortowanie to tak:

void SortTeams(team* t, int n, int (*cmp)(const team *a,const team *b))
{
    .....
}
2

Patologiczna gospodarka zmiennymi.

int pobierz() {
    int* nazwa;
    printf("podaj nazwe druzyny:\n");
    scanf_s("%d", &nazwa);
    return nazwa;
}

Kompilator tu aż wyje od ostrzeżeń.

NIC w tym kodzie nie gra, nawet nie ma sensu komentować szczegółowo
Kod wygląda, jakby autor nigdy nie widział podręcznika do języka, a uważał, że da radę z tematem

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