TeiSerron.gr

Σχολή Μηχανικών => 6ο & 7ο Εξάμηνο (Μηχανικοί Λογισμικού) => Τμήμα Μηχανικών Πληροφορικής, Υπολογιστών & Τηλεπικοινωνιών => Δομές Δεδομένων (πρώην Αλγόριθμοι & Δομές Δεδομένων) => Μήνυμα ξεκίνησε από: kat στις 19 Νοεμβρίου 2012, 12:47

Τίτλος: ΑΣΚΗΣΗ help
Αποστολή από: kat στις 19 Νοεμβρίου 2012, 12:47
Που έχω λάθος; :doubt: Δεν μου βγάζει τα αποτελέσματα στο file1.txt που τα θέλω. 


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

# define N 8

int getUniqueNumber(int p[N], int i);
void straight_select_int(int p[], int n);
void straight_insert_int(int p[], int n);
void bubblesort_int(int p[], int n);
void quicksort_int(int left, int right, int p[]);


main()
{
  int p[N],arr[N];
  int i,x;
  long t0, t1, dt;
  FILE *f1;

   randomize();
      for(i=0; i<N; i++)
          arr=getUniqueNumber(arr,i);
      for(i=0; i<N; i++)
          p = arr;
          time(&t0);
          bubblesort_int(p,N);
          time(&t1);
          dt=t1-t0;
          f1=fopen("File1.txt","w");
      for(i=0;i<N;i++)
          fprintf(f1," %d",dt);
          fclose(f1);
      for(i=0; i<N; i++)
          p = arr;
          time(&t0);
          quicksort_int(0,N-1,p);
          time(&t1);
          dt=t1-t0;
          f1=fopen("File1.txt","w");
      for(i=0;i<N;i++)
          fprintf(f1," %d",dt);
          fclose(f1);
       for(i=0; i<N; i++)
          p = arr;
          time(&t0);
          straight_insert_int(p,N);
          time(&t1);
          dt=t1-t0;
          f1=fopen("File1.txt","w");
      for(i=0;i<N;i++)
          fprintf(f1," %d",dt);
          fclose(f1);
       for(i=0; i<N; i++)
          p = arr;
          time(&t0);
          straight_select_int(p,N);
          time(&t1);
          dt=t1-t0;
          f1=fopen("File1.txt","w");
      for(i=0;i<N;i++)
          fprintf(f1," %d",dt);
          fclose(f1);

 
   getch();
   return 0;
}
...
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: genesis91 στις 19 Νοεμβρίου 2012, 13:03
Είσαι σίγουρη ότι το λάθος σου είναι στην main() ; Γιατί δεν μας δίνεις και τους ορισμούς των συναρτήσεων..
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: kat στις 19 Νοεμβρίου 2012, 13:20
ναι εδω εχω λαθος. ειναι σωστός ο τρόπος για να μου εμφανιζει τα αποτελεσματα στο txt;
να και οι συναρτησεις μου αλλα νομιζω το λαθος ειναι στη main. δοκιμασε να το τρεξεις.

int getUniqueNumber(int p[N], int i)
{
  int x,j, found;

    do
     {
        x = random(30000);
        found = 0;
        j = 0;
        while (j<=i && found == 0)
             {
                if (p[j] == x)
                   found = 1;
                else
                   j++;
             }
       }while (found == 1);
    return x;
}

void bubblesort_int(int p[], int n)
{
    int i,j,temp;

     for (i=1; i<N; i++)
      for (j=N-1; j>=i; j--)
        if (p[j-1] > p[j])
          {
           temp = p[j-1];
           p[j-1] = p[j] ;
           p[j] = temp ;
           }
}

void quicksort_int(int left, int right, int p[])
{
    int i,j,mid,x,temp;

    if (left < right)
       {
         i = left;
         j = right;
          mid = (left+right)/2;
         x = p[mid];
         while (i < j)
          {
             while (p < x)
                  i++;
             while (p[j] > x)
                  j--;
             if (i < j)
              {
                 if (p == p[j])
                   {
                     if (i<mid)
                        i++;
                     if (j>mid)
                        j--;
                   }
                 else
                  {
                    temp = p;
                    p = p[j];
                    p[j] = temp;
                  }
             }
          }
        quicksort_int(left,j-1,p);
        quicksort_int(j+1,right,p);
       }
}

void straight_insert_int(int p[], int n)
{
     int i,x,j;

     for(i=1;i<N;i++)
        {
          x=p;
          j=i-1;
        while ((x<p[j])&&(j>=0))
             {
               p[j+1]=p[j];
               j=j-1;
             }
           p[j+1]=x;
         }
}

void straight_select_int(int p[], int n)
{
    int i,min,k,j;

    for(i=0; i<N-1; i++)
       {
          k = i;
          min = p;
        for (j = i+1; j<N; j++)
            {
              if (p[j] < min)
                 {
                    k = j;
                    min = p[j];
                 }
             }
          p[k] = p;
          p = min;
       }
}

Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: nabz0r στις 19 Νοεμβρίου 2012, 14:01
Το πρόγραμμα αυτό σου τρέχει αλλά δεν σου βγάζει αποτελέσματα στο txt? Γιατί απ'ότι βλέπω (σύμφωνα με αυτά που μας έχεις δώσει) έχεις αρκετά λάθη. πχ
Κώδικας: [Επιλογή]
arr=getUniqueNumber(arr,i);
Η getUniqueNumber επιστρέφει int όμως το σώζεις σε έναν δείκτη (το όνομα ενός πίνακα είναι ένας δείκτης για το 1ο στοιχείο του)
Μάλλον ήθελες να γράψεις
Κώδικας: [Επιλογή]
arr[i]=getUniqueNumber(arr,i);
γιατί το έχεις σε ένα loop

Επίσης έχει κάποια λάθη λογικής. Πχ αυτό που κάνεις παρακάτω
Κώδικας: [Επιλογή]
p=arr;δεν κάνει "backup" του πίνακα. Ότι αλλαγές θα κάνεις στον arr θα γίνονται και στον p μιας και δείχνουν στα ίδια στοιχεία. Υποθέτω οτι αυτό που θες είναι να κρατήσεις τον αρχικό πίνακα για να τον χρησιμοποιήσεις και στις άλλε συναρτήσεις ταξινόμησης. Αυτό που πρέπει να κάνεις είναι να φτιάξεις μια συνάρτηση που αποθηκεύει ένα-ένα όλα τα στοιχεία του πίνακα σε κάποιον άλλον και μετά τα επαναφέρει (δεν είναι δύσκολο, 2 γραμμές κώδικα είναι και οι 2 συναρτήσεις)

Γενικά έχεις αρκετά λάθη με δείκτες (όπως συγκρίσεις μεταξύ δεικτών κλπ). Τι compiler χρησιμοποιείς; Έπρεπε να σου τα βγάζει όλα αυτά.

Τέσπα αν το μόνο σου πρόβλημα είναι η αποθήκευση σε αρχείο, μπορείς αντί για fprintf να χρησιμοποιήσεις μια απλή printf και στο terminal να γράψεις
Κώδικας: [Επιλογή]
out.exe > file1.txt
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: kat στις 19 Νοεμβρίου 2012, 14:17
δεν ξερω γιατι βγηκαν ετσι λαθος εδω περα με την αντιγραφη.δεν τα εχω ετσι . δες

Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: nabz0r στις 19 Νοεμβρίου 2012, 14:58
Στον builder το έκανες ε; Σε μένα έτσι όπως είναι τρέχει αλλά όλα τα αποτελέσματα που βγάζει είναι 0 κάτι που είναι λογικό μιας και η time() επιστρέφει τον χρόνο σε δευτερόλεπτα ενώ όλες οι συναρτήσεις σου μαζί κάνουν λιγότερο απο 1s. Αν θες να δεις σωστά αποτελέσματα ή βάλε ΠΟΛΛΕΣ παραπάνω τιμές ή βρες κάποια συνάρτησει που επιστρέφει τον χρόνο σε τάξεις μικρότερες του second (πχ milliseconds)
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: kat στις 19 Νοεμβρίου 2012, 15:00
[C++ Warning] conio.h(181): W8058 Cannot create pre-compiled header: code in header

Αυτό το μήνυμα βγάζει όταν τρέχει.  :doubt:
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: nabz0r στις 19 Νοεμβρίου 2012, 15:03
[C++ Warning] conio.h(181): W8058 Cannot create pre-compiled header: code in header

Αυτό το μήνυμα βγάζει όταν τρέχει.  :doubt:

μη του δίνεις σημασία... το πρόγραμμά σου έχει τρέξει σωστά. αποθήκευσε το project σου σε έναν φάκελο και ξανα-τρέξ' το απο εκεί για να δεις το αρχείο που δημιουργείται...
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: kat στις 19 Νοεμβρίου 2012, 15:05
χμμμμ ίσως έτσι??
to = return(360000*t.ti_hour+6000*t.ti_min+100*t.ti_sec+t.ti_hund);
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: nabz0r στις 19 Νοεμβρίου 2012, 15:08
χμμμμ ίσως έτσι??
to = return(360000*t.ti_hour+6000*t.ti_min+100*t.ti_sec+t.ti_hund);

δεν ξέρω. δοκίμασέ το (λογικά θα χρειαστεί να βάλεις κενό ανάμεσα στο return και την παρένθεση γιατί αλλιώς θα το πάρει ως συνάρτηση.

και για να μην σου βγάζει αυτό το error, βάλε αυτό πριν την δήλωση των headers
Κώδικας: [Επιλογή]
#pragma hdrstop
Τίτλος: Απ: ΑΣΚΗΣΗ help
Αποστολή από: kat στις 19 Νοεμβρίου 2012, 15:13
θα δοκιμάσω. σ'ευχαριστώ!