Jak posortować strukturę? Algorytm wyboru zajęć.

0

a więc tak mam problem jestem zielony z programowania a muszę napisać program, w którym mam rozwiązać problem wyboru zajęć. udało mi się utworzyć strukturę, wyświetla ją, ale nie potrafię jej posortować względem godzin zakończenia wykładu i nie wiem jak rozwiaząć problem ;( pomożecie?
mój kod :

#include <stdio.h>
#include <stdlib.h>

//-----------------------------

typedef struct zajecia
{    
        int indeks;
        int godz;
        int p;
        int k;
        
}zajecia;

//-----------------------------

zajecia init_stud(int indeks, int godz, int p, int k)
{
          zajecia s;
          s.indeks=indeks;
          s.godz=godz;
          s.p=p;
          s.k=k;
          
          return s;
}

//-----------------------------

void print_stud(zajecia *s)
{
     
     printf("indeks=%d ",s->indeks);
     printf("godz=%d ",s->godz);
     printf("poczatek=%d ",s->p);
     printf("koniec=%d\n",s->k);     
}


//-----------------------------


int main(int argc, char *argv[])
{
	
int i;

  for (i=0;i<50;i++)
  {
  	int b=rand()%5 + 2;
    int c=rand()%11 +8;
    int d=c+b;
  	zajecia p;
  	p=init_stud(i,b,c,d);
  	print_stud(&p);
  }
  
 

  system("PAUSE");	
  return 0;
}
0

http://pl.wikipedia.org/wiki/Sortowanie_bąbelkowe chociażby
No ale przecież szukałeś w internecie i nic tam nie było napisane...

0

no tak tyle jak to przypisac strukturze ?

0

Żeby coś posortować, to musisz mieć co sortować, w Twoim kodzie tworzysz 50 razy strukturę, ale nigdzie sobie tego nie zapisujesz. Po wyjściu z bloku for Twoja zmienna p przestaje istnieć. Musisz wsadzić sobie to do jakiejś tablicy. Np.
zajecia b[50]; Teraz przejść for'em po tej tablicy inicjalizując wartości Twoją funkcją init_stud. Możesz od razu wypisywać, później posortować, później jeszcze raz sobie wypisać, żeby zobaczyć czy uzyskałeś efekt, który chciałeś uzyskać. Do sortowania możesz użyć funkcji qsort:
http://pl.wikibooks.org/wiki/C/qsort

1
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
typedef struct zajecia { unsigned p,k; } zajecia;

void init_stud(zajecia *s,unsigned godz,unsigned p)
  {
   s->p=p;
   s->k=p+godz;
  }
 
void print_stud(unsigned indeks,zajecia *s)
  {
   printf
     (
      "indeks=%d godz=%d poczatek=%d koniec=%d\n",
      indeks,s->k-s->p,s->p,s->k
     );
  }
 
 int cmp_stud(const void *A,const void *B)
   {
   	unsigned a,b;
   	a=((zajecia *)A)->k;
   	b=((zajecia *)B)->k;
   	return (b<a)-(a<b);
   }

int main()
  {
   unsigned i;
   zajecia tb[9];
   srand(time(NULL));
   for(i=0;i<sizeof(tb)/sizeof(*tb);++i) init_stud(tb+i,2+rand()%5,8+rand()%11);
   for(i=0;i<sizeof(tb)/sizeof(*tb);++i) print_stud(i,tb+i);
   printf("-----------------------------------\n");
   qsort(tb,sizeof(tb)/sizeof(*tb),sizeof(zajecia),cmp_stud);
   for(i=0;i<sizeof(tb)/sizeof(*tb);++i) print_stud(i,tb+i);
   return 0;
  }
0

_13th_Dragon o to mi chodziło xD, tyle że ten program tak różni się od mojego, że teraz nie wiem jak zastosować algorytm wyboru zajęć tzn gdzie i jak go wstawić ;(

1

@zielony384 mam dzisiaj zły dzień, ale może to Ci pomoże zrozumieć
http://ideone.com/3rZeIn

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	char *name;
	float start_time;
} subject_t;

subject_t *subject_init(const char *name, float start_time) {
	subject_t *s = malloc(sizeof(subject_t));
	s->name = strdup(name);
	s->start_time = start_time;
	return s;
}

/* funkcja porownujaca */
int cmp_subject(const void *a, const void *b) {
	subject_t *aa = *(subject_t**)a;
	subject_t *bb = *(subject_t**)b;
	float as = aa->start_time;
	float ab = bb->start_time;
	return (as > ab) - (as < ab);
}

void subject_print(const subject_t *s) {
	printf("%s begins at %.2f\n",s->name,s->start_time);
}

void subject_free(subject_t *s) {
	free(s->name);
	free(s);
}

int main(void) {
	size_t i, nof_subjects = 3;

	/* tablica
	 * alokujemy pamiec dla nof_subjects przedmiotow */
	subject_t **subjects = malloc(nof_subjects * sizeof(subject_t*));

	printf("[Nazwa przedmiotu] [Godzina rozpoczecia]\n");
	/* wpisujemy kazdy przedmiot */
	for(i=0;i<nof_subjects;++i) {
		char input[32];
		float start_time;
		scanf("%31s",&input);
		scanf("%f",&start_time);
		subjects[i] = subject_init(input,start_time);
	}

	/* sortujemy tablice przedmiotow */
	qsort(subjects,nof_subjects,sizeof(subject_t*),cmp_subject);

	/* wypisujemy posortowane przedmioty z tablicy */
	for(i=0;i<nof_subjects;++i)
		subject_print(subjects[i]);

	/* zwalniamy po sobie pamiec */
	while(nof_subjects--)
		subject_free(subjects[nof_subjects]);
	free(subjects);

	return 0;
}

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