Forum Dyskusyjne
Zaloguj Rejestracja Szukaj Forum dyskusyjne

Forum dyskusyjne -> Software -> Programowanie :: WWW -> problem z programem w cpp(qsort) :9
Napisz nowy temat  Odpowiedz do tematu
problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 10:08 Odpowiedz bez cytowania Odpowiedz z cytatem
studentka
Bywalec
<tt>Bywalec</tt>
 
Użytkownik #932
Posty: 25


[ Osobista Galeria ]




witam!!
mam do napisania program na lab.(na jutrzejsze popoludnie:() ewentualnie moge oddac za tydzien.,ale bedzie gorsza ocena..siedzialam caly weekend i nic mi nie wychodzi:(
tresc zadania brzmi:zaimplementuj alg w jezyku c/c++.. implementacja ma umozliwiac wczytywanie danych-l.typu calkowitego -z pliku oraz zapisywanie wynikow dzialania do pliku.Chodzi o alg.q sort.Moze ma ktos taki program.. albo moglby poprawic bl.w moim programie , bo ja juz nie mam sily:(.Bede bardzo wdzieczna!!
Kod:
#include <stdio.h>
void main()
{

FILE *we,*wy;
int ile=0,i,j,n,z;
char k;
int *tab;

z=0;
we=fopen("we","r");

do

{
fscanf(we,"%d",&k);
if (k!=32) ile++;
}
while (feof(we));
ile--;
tab = new int[ile];
rewind(we);

for (i=0; i < ile; i++)
{

fscanf(we,"%d",&tab[i]);
printf("%d",tab[i]);

}

void zamien(int u, int v)
{
int temp = tab[u];
tab[u] = tab[v];
int x,i,j;
x = tab[p]
tab[v] = temp;
}
int partition(int p, int r)
{]; //na przyklad; pierwszy element, jesli jest to element "skrajny", to podzielimy b. nierowno
//jesli zawsze bedzie to skrajny, to zlozonosc calego qsorta bedzie O(n^2)
i = p-1;
j = r+1;
while (1)
{
do j--; while (tab[j] > x); //wyszukaj element <= x
do i++; while (tab[i] < x); //wyszukaj element >= x
if (i<j) //kiedy jest sens
zamien(i,j);
else
return j; //koniec "lewej czesci"
}
}
void quicksort(int p, int r) // "dziel i zwyciezaj" - dzielimy przedzial (p,r) na 2 czesci i sortujemy je osobno
{
if (p<r)
//podziel (p,r) na 2 czesci, lewa "mniejsza" od prawej
{
int q = partition(p,r); //q - ostatni element lewej czesci
quicksort(p,q);
quicksort(q+1,r);
}
}
void sortuj()
{
quicksort(0,ile-1);
cout << "Posortowane." << endl;
}


wy=fopen("wynik","w");
void main()
{
for (i=0;i<ile;i++)
printf("%d", tab[i]);
printf("\n%d",z);
qsort(tab,0,n-1);
for (i=0;i<ile;i++)
printf("%d", tab[i]);
printf( "\n%d",z);

delete tab;
fclose(we);
fclose(wy);


getchar();
return 0;
}


pozdrawiam!!!
  
Re: <studentka> problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 13:22 Odpowiedz bez cytowania Odpowiedz z cytatem
Tirinti
Pro uczestnik
<tt>Pro uczestnik</tt>
 
Użytkownik #28
Posty: 1295


[ Osobista Galeria ]




To co ty tam robisz to jest raczej merge-sort a nie quick-sort.
Zakłądam, że operacje na plikach masz prawidłowe. Sam od dawna w ANSI nie programowałem i niezbyt to pamiętam. Tak więc zamieszczam tylko prawidłową funkcję qsort i main pozwalającą na jej przetestowanie.

Kod:

int main(
{
   int *tab;
   int size;


tab=new int[10];
size=10;
tab[0]=71;
tab[1]=45;
tab[2]=93;
tab[3]=67;
tab[4]=34;
tab[5]=79;
tab[6]=36;
tab[7]=13;
tab[8]=68;
tab[9]=49;


   qsort(tab,0,size-1);

   for(int i=0; i<size; i++)
      printf("%i \n",tab[i]);

   return 0;
}

void qsort(int *tab, int l, int r)
{
   int i,j,x,t;

   i=l;
   j=r;
   x=tab[(i+j)/2];

   while(i<j)
   {
      while(tab[i]<x)
         i++;
      while(tab[j]>x)
         j--;
      if(i<=j)
      {
         t=tab[i];
         tab[i]=tab[j];
         tab[j]=t;
         i++;
         j--;
      }
   }
   if(l<j)
      qsort(tab,l,j);
   if(r>i)
      qsort(tab,i,r);
}
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 14:18 Odpowiedz bez cytowania Odpowiedz z cytatem
studentka
Bywalec
<tt>Bywalec</tt>
 
Użytkownik #932
Posty: 25


[ Osobista Galeria ]




zrobilam teraz inaczej..skompilowal sie,aale sie wiesza;/
Kod:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void quicksort(int tablica[], int x, int y)
{
FILE *we, *wy;
int i,j,n,v,temp;

char k;
i=x;
j=y;
v=tablica[div(x+y,2).quot];
do
   {
    {
fscanf(we,"%d",&k);
if(k!=32) n++;
}
while(!feof(we));
n--;
printf("%d\n",n);
int *tablica = new int[n];   //tablica dynamiczna

rewind(we);
for(i=0;i<n;i++) fscanf(we,"%d",&tablica[i]);  //petla pobierajaca elementy z pliku
for(i=0;i<n;i++) printf("%d ",tablica[i]);
printf("\n");

//algorytm sortowania
   while (tablica[i]<v) i++;
   while (v<tablica[j]) j--;
   if (i<=j)
      {
      temp=tablica[i];
      tablica[i]=tablica[j];
      tablica[j]=temp;
      i++;
      j--;
      }
   }
while (i<=j);
if (x<j) quicksort(tablica,x,j);
if (i<y) quicksort(tablica,i,y);
}
void main(void)
{
FILE *we,*wy;
int ile_liczb,i,liczba;
int tablica[i];
clrscr;
printf("Ile liczb chesz posortowac  ? ");
scanf("%i",&ile_liczb);
for(i=0; i<ile_liczb; i++)
     {
   printf("Wprowadz liczbe #%i: ",i+1);
   scanf("%i",&liczba);
   tablica[i]=liczba;
   }
clrscr;
printf("Tablica przed posortowaniem:");
   for(i=0; i<ile_liczb; i++)
     {
   printf("\n%i",tablica[i]);
   }
   we=fopen("wynik", "w");
quicksort(tablica,0, ile_liczb-1);
printf("\nTablica po posortowaniu:");
   for(i=0; i<ile_liczb; i++)
     {
   printf("\n%i",tablica[i]);
   }
   delete tablica;
  fclose(we);
  fclose(wy);



getch();
}

a triniti dzieki:) pokombinuje jeszcze pozniej;)

pozdrawiam!
  
Re: <studentka> problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 16:09 Odpowiedz bez cytowania Odpowiedz z cytatem
Tirinti
Pro uczestnik
<tt>Pro uczestnik</tt>
 
Użytkownik #28
Posty: 1295


[ Osobista Galeria ]




Wiesza się prawdopodobnie przez
while (i<=j);
jeśli warunek jest prawdziwy to to jest nieskończona pętla.
  
Re: <Tirinti> problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 16:24 Odpowiedz bez cytowania Odpowiedz z cytatem
Tirinti
Pro uczestnik
<tt>Pro uczestnik</tt>
 
Użytkownik #28
Posty: 1295


[ Osobista Galeria ]




Przerobiłem wczięcia w twoim kodzie, żeby był bardziej czytelny.
To while jest od do, więc jest OK, ale chy ba brakuje innego do. Co by nie było jest to jakoś dziwnie zrobione.

Kod:

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

void quicksort(int tablica[], int x, int y)
{
   FILE *we, *wy;
   int i,j,n,v,temp;

   char k;
   i=x;
   j=y;
   v=tablica[div(x+y,2).quot];

   do
   {
       {
         fscanf(we,"%d",&k);
         if(k!=32) n++;
      }
      
      while(!feof(we));
         n--;

      printf("%d\n",n);
      int *tablica = new int[n];   //tablica dynamiczna

      rewind(we);
      for(i=0;i<n;i++)
         fscanf(we,"%d",&tablica[i]);  //petla pobierajaca elementy z pliku

      for(i=0;i<n;i++) printf("%d ",tablica[i]);
         printf("\n");

      //algorytm sortowania
      while (tablica[i]<v)
         i++;
         
      while (v<tablica[j])
         j--;
         
      if (i<=j)
      {
         temp=tablica[i];
         tablica[i]=tablica[j];
         tablica[j]=temp;
         i++;
         j--;
      }
   }
   while (i<=j);
   
   if (x<j)
      quicksort(tablica,x,j);
      
   if (i<y)
      quicksort(tablica,i,y);
}

void main(void)
{
   FILE *we,*wy;
   int ile_liczb,i,liczba;
   int tablica[i];

   clrscr;
   printf("Ile liczb chesz posortowac  ? ");
   scanf("%i",&ile_liczb);
   for(i=0; i<ile_liczb; i++)
   {
      printf("Wprowadz liczbe #%i: ",i+1);
      scanf("%i",&liczba);
      tablica[i]=liczba;
   }
   clrscr;
   printf("Tablica przed posortowaniem:");
   for(i=0; i<ile_liczb; i++)
   {
      printf("\n%i",tablica[i]);
   }
   we=fopen("wynik", "w");
   quicksort(tablica,0, ile_liczb-1);
   printf("\nTablica po posortowaniu:");
   for(i=0; i<ile_liczb; i++)
   {
   printf("\n%i",tablica[i]);
   }
   delete tablica;
   fclose(we);
   fclose(wy);

   getch();
}
  
Re: <Tirinti> problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 17:12 Odpowiedz bez cytowania Odpowiedz z cytatem
Tirinti
Pro uczestnik
<tt>Pro uczestnik</tt>
 
Użytkownik #28
Posty: 1295


[ Osobista Galeria ]




Proponuję coś takiego.
Kod:


#include "stdafx.h"

void qsort(int *tab, int l, int r)
{
   int i,j,x,t;

   i=l;
   j=r;
   x=tab[(i+j)/2];

   while(i<j)
   {
      while(tab[i]<x)
         i++;
      while(tab[j]>x)
         j--;
      if(i<=j)
      {
         t=tab[i];
         tab[i]=tab[j];
         tab[j]=t;
         i++;
         j--;
      }
   }
   if(l<j)
      qsort(tab,l,j);
   if(r>i)
      qsort(tab,i,r);
}

int* read(char *filename, int &size)
{
   FILE *file;
   int k, *tab;

   size=0;
   file=fopen(filename,"r");
   if(file==NULL)
      return NULL;

   while(fscanf(file,"%d",&k)!=EOF)
      size++;

   tab=new int[size];
   rewind(file);

   size=0;
   while(fscanf(file,"%d",&k)!=EOF)
      tab[size++]=k;

   fclose(file);
   return tab;
}

void write(char *filename, int *tab, int size)
{
   FILE *file;

   file=fopen(filename,"w");
   if(file==NULL)
      return;

   for(int i=0;i<size;i++)
      fprintf(file,"%d\n",tab[i]);

   fclose(file);
}



int main()
{
   int *tab;
   int size;

   tab=read("wejscie.dat",size);
   if(tab==NULL)
   {
      printf("nie można otworzyć pliku wejsciowego\n");
      return 1;
   }

   if(size<1)
   {
      printf("w pliku wejsciowym nie ma danych\n");
      return 2;
   }

   qsort(tab,0,size-1);

   write("wynik.dat",tab,size);

   return 0;
}

Wczytuje, sortuje i zapisuje.
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 23:34 Odpowiedz bez cytowania Odpowiedz z cytatem
studentka
Bywalec
<tt>Bywalec</tt>
 
Użytkownik #932
Posty: 25


[ Osobista Galeria ]




wielkie dzieki..;****
a co to za biblioteka?? pierwszyraz ja widze;)
pozdrawiam goraco!!
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Poniedziałek, 10 Maj 2004, 23:56 Odpowiedz bez cytowania Odpowiedz z cytatem
ulan
pcandsoft.pl vip
 
Użytkownik #256
Posty: 1291


[ Osobista Galeria ]




studentka @ Poniedziałek, 10 Maj 2004 23:34 @ :

a co to za biblioteka?? pierwszyraz ja widze;)


A google wylaczyli tongue.gif Czyta i sie uczy
  
Re: <studentka> problem z programem w cpp(qsort) :9
PostWysłano: Wtorek, 11 Maj 2004, 11:22 Odpowiedz bez cytowania Odpowiedz z cytatem
Tirinti
Pro uczestnik
<tt>Pro uczestnik</tt>
 
Użytkownik #28
Posty: 1295


[ Osobista Galeria ]




Zrobiłem copy-paste z Visuala. W ANSI powinno być stdio.h i null małymi literami.
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Wtorek, 11 Maj 2004, 15:40 Odpowiedz bez cytowania Odpowiedz z cytatem
studentka
Bywalec
<tt>Bywalec</tt>
 
Użytkownik #932
Posty: 25


[ Osobista Galeria ]




heh dzieki juz sie domyslilam,teraz wlasnie mam lab.i nastepny algorytm..przez zliczanie;/ a potem kubelki;/
pozdro!
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Środa, 12 Maj 2004, 00:07 Odpowiedz bez cytowania Odpowiedz z cytatem
Tassadar
Kapitan Heh
 
Użytkownik #3
Posty: 246


[ Osobista Galeria ]




kod studentki to tez proba quick sorta - w merge tablice sa scalane.
Oba wg mnie niewydajne. Quicksort powinien miec srednia zlozonosc n*lgn, a te maja najmniej n^2 (nie ma potrzeby zagniezdzac petli).
Moja wersja:
Kod:
void zamien(int *a, int *b){
  int temp=*a;
  *a=*b;
  *b=temp;
}

/* dzieli tablice zgodnie z quicksortem (mniejsze na lewo, wieksze na prawo)
parametry: wskaznik na tablice, lewy index podtablicy, prawy index podtablicy */
int part(int *T, int l, int p){
  int x=T[p];
  int j,i=l;
  while(T[i]<=x && i<=p)
    i++;
  for(j=i+1;j<=p;j++)
    if(T[j]<=x)
      zamien(&T[j],&T[i++]);
  return i-1;
}

/* sortuje tablice
parametry: wskaznik na tablice, lewy index podtablicy, prawy index podtablicy */
void quick(int *T, int l, int p){
  int srodek;
  if(l<p){
    srodek=part(T,l,p); /*dzielimy...*/
    quick(T,l,srodek-1);
    quick(T,srodek+1,p);   
  }
}


wywolujemy quick(T,0,max-1);
  
Re: <Tassadar> problem z programem w cpp(qsort) :9
PostWysłano: Środa, 12 Maj 2004, 10:22 Odpowiedz bez cytowania Odpowiedz z cytatem
Tirinti
Pro uczestnik
<tt>Pro uczestnik</tt>
 
Użytkownik #28
Posty: 1295


[ Osobista Galeria ]




Złożoność jest ta sama. Zauważ, że to nie jest zagnieżdżenie pętli n przebiegów w pętli n przebiegów. Zewnętrzna pętla tylko sprawdza, czy wewnętzna przeszła n elementów, jak tak to koniec, jak nie to wewnętżna kontynuuje.
Twoja wersja ma szansę działać sybciej, bo ma mniej instrukcji warunkowych. Ale to będzie tylko liniowy przyrost prędkości.
Natomiast nie widzę potrzeby dzielenia na 3 funkcje, skoro part i zamień są wywoływane tylko w jednym miejscu.

A wogóle to najlepiej zrezygnować z rekurencji, bo przy durzej ilości elementów przepełni się stos.
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Środa, 12 Maj 2004, 11:53 Odpowiedz bez cytowania Odpowiedz z cytatem
Tassadar
Kapitan Heh
 
Użytkownik #3
Posty: 246


[ Osobista Galeria ]




racja, ta sama zlozonosc

rodzielenie jest raczej wolniejsze ale bardziej eleganckie i powoduje ze na stosie nie beda trzymane zmienne (ktorych w part jest duzo a w qsort malo) z pierwszych wowolan rekurencyjnych.
  
Re: problem z programem w cpp(qsort) :9
PostWysłano: Środa, 12 Maj 2004, 15:05 Odpowiedz bez cytowania Odpowiedz z cytatem
studentka
Bywalec
<tt>Bywalec</tt>
 
Użytkownik #932
Posty: 25


[ Osobista Galeria ]




dziekuje jeszcze raz! teraz mamy kolejne algorytmy// a ja juz normalnie wysiadam;/
pozdrawiam!
  
problem z programem w cpp(qsort) :9
Forum dyskusyjne -> Software -> Programowanie :: WWW

Strona 1 z 1  
  
  
 Napisz nowy temat  Odpowiedz do tematu  
Polecam Panią dermatolog w Szczecinie www.medicanova.szczecin.pl Przyjmuje tylko prywatnie na Pomorzanach. Warto bo ma nosa do chorób skóry twarzy.
Kopiowanie i rozpowszechnianie materiałów w całości lub części jest niedozwolone. Wszelkie informacje zawarte w tym miejscu są chronione prawem autorskim.



Forum dyskusyjne Heh.pl © 2002-2010