Problem z posortowaniem struktury

0

Program pobiera z pliku ilość struktur i je tworzy, ma wypisać 20 z nich i je posortować, mam już wszystko ale nie sortuje mi ich :/

#include "pch.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

struct Struktura
{
int a;
char b;
float c;
};

Struktura** losuj(int N) {

struct Struktura** tab = (struct Struktura**) malloc(N * sizeof(struct Struktura*));
int flag = 0;
for (int i = 0; i < N; i++)
{
tab[i] = (struct Struktura*) malloc(sizeof(struct Struktura));
tab[i]->a = ((rand() % (-1000 - 9000)) + -1000);
tab[i]->b = ((rand() % ('b' - 's')) + 'b');
tab[i]->c = 1000 + (rand() % (1-N));
}
return tab;


}

void toString(Struktura s)
{
cout << s.a << " " << s.b << " " << s.c << endl;

}

void toString(Struktura* s)
{
cout << s->a << " " << s->b << " " << s->c << endl;
}

void toString(Struktura** tab, int N)
{
for (int i = 0; i < N; i++) {
toString(tab[i]);
}
}

void sort(struct Struktura** tab, int N)
{
for (int i = 1; i < N; i++)
{
int flag = 0;
for (int j = 1; j < N ; j++)
{
if (tab[j] > tab[j])
swap(tab[j], tab[j]);
flag = 1;

}


if (flag = 0) break;


}


}

int main()
{
/srand(time(NULL));/

clock_t begin, end;
double time_spent;
begin = clock();
/* here, do your time-consuming job */
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

int N;
char X;
FILE* fp = fopen("inlab01.txt", "r");
if (fp == NULL)
return -1;
fscanf(fp, "%d %c", &N, &X);
fclose(fp);

struct Struktura** tab = (struct Struktura**) malloc(N * sizeof(struct Struktura*));
sort(tab, N);


tab = losuj(N);

sort(tab, N);

toString(tab, 20);



sort(tab, N);


}
1

if (tab[j] > tab[j]) - pomijając fakt że tu porównujesz wskaźniki, jak kompilator ma porównać dwie struktury? możesz przeciążyć operator >

0

To z tab to już pisałem tak z braku pomysłu, Nie wiem w sumie jak to dokładnie już zrobić, jakieś sugestie? Chłop na zajęciach powiedział że noo takie sortowanie jest dobrze:

void sort(struct Struktura** tab, int N)
{
	for (int i = 1; i < N; i++)
	{
		int flag = 0;
		for (int j = 1; j < N - i; j++)
		{
			if (tab[j - 1] > tab[j])
			swap(tab[j - 1], tab[j]);
			flag = 1;
		}

       }  
}
0

Po if'ie otwórz klamerkę, bez tego algorytm się zacina

for (int j = 1; j < N - i; j++)
{
  if (tab[j - 1] > tab[j])
  {
    swap(tab[j - 1], tab[j]);
    changes = true;
  }
}

Miałbym bardzo wiele do stylu.
Między innymi nazwy funkcji kłamią, toString nie robi żadnego toStringa ino drukuje.
Dwie przesilone funkcje jedna powinna korzystać z drugiej, a nie kopia implementacji
Kolejne to takie brzydkie C "ze strumieniami C++", nawet nie C z klasami.
Drukowanie z wewnętrznych części algorytmu (implementacji) a powinno być przez klienta (aby mógł tego nie robić)

0
Krystian Zarzycki napisał(a):

... Nie wiem w sumie jak to dokładnie już zrobić, jakieś sugestie ...

Jak ty nie wiesz w jakiej kolejności mają iść rekordy to skąd my mamy wiedzieć?

0

Powiem ci tak, wiele zwłaszcza te C to po prostu z poradnika jaki dostaliśmy od prowadzącego, po prostu do skopiowania stąd te C, chciałem inaczej zrobić ale patrze, mam coś co działa to biorę :D

1
Krystian Zarzycki napisał(a):

Powiem ci tak, wiele zwłaszcza te C to po prostu z poradnika jaki dostaliśmy od prowadzącego, po prostu do skopiowania stąd te C, chciałem inaczej zrobić ale patrze, mam coś co działa to biorę :D

No tak, copy paste driven development

0

Dobra przebudowałem cały ten syf, i działa dzięki za pomoc i następnym razem będę się starał robić to porządnie, chociaż brak mi jeszcze umiejętności!

0
Krystian Zarzycki napisał(a):

Dobra przebudowałem cały ten syf, i działa dzięki za pomoc i następnym razem będę się starał robić to porządnie, chociaż brak mi jeszcze umiejętności!

Działa? Co działa? Sortowanie wg adresu struktury? Przecież skoro to jedna tablica to adresy będą wzrastająco czyli żadnego sortowania!

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