Προς το περιεχόμενο

Tαξινομηση πινακα με string


I@n15

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια και χαρα σε ολους τους φιλους και Χριστος Ανεστη.Το αγιο πνευμα των ημερων μαλλον δεν με εκανε πιο σοφο απ οτι φαινεται γι αυτο και ανατρεχω παλι στην πολυτιμη βοηθεια σας.

Λοιπον προσφατα εμαθα πως γινεται η ταξιμομηση ενος πινακα με αριθμους απο τον μεγαλυτερο αριθμο στον μικροτερο και το αντιστροφο.

1)Δινω π.χ εναν πινακα με ονοματα(strings)

2)Δινω την ημερομηνια γεννησης για καθε ατομο(π.χ 1971)σ εναν πινακα με ακεραιους.

4)Χρησιμοποιω τον αλγοριθμο ταξινομησης buble sort για να ταξιμομησω τον πινακα με τις ηλικιες απο την μεγαλυτερη στην μικροτερη.Μεχρι εδω ολα καλα.Το προβλημα ειναι οτι θα θελα να εμφανισω τον πινακα με τα ονοματα αναλογα με αυτον που εχει την μεγαλυτερη ηλικια.Πρεπει να ειμαι και 2 μερες εδω πανω :-)με τιποτα δεν μπορω να το καταφερω αυτο,ισως να ειναι κατι που δεν γνωριζω..

 

 

>
[color="Green"]#include[/color] <[color="DarkOrange"]stdio.h>[/color]
[color="Green"]#include[/color] <[color="DarkOrange"]stdlib.h[/color]>

[color="DarkGreen"]#define[/color] [color="Cyan"]ROWS[/color] 3
[color="DarkGreen"]#define [/color][color="Cyan"]COLS[/color] 3


[color="Blue"]struct [/color]mystruct{

   [color="Blue"]char [/color]ch[20];
   [color="Blue"]int [/color] Num[[color="Cyan"]ROWS[/color]];
};



[color="Blue"]void[/color] [color="Black"]func1[/color]([color="Blue"]struct[/color] mystruct *ptr1)
{
  [color="Blue"] int[/color] rows = 0;

[color="Blue"]    for[/color](; rows <= [color="Cyan"]ROWS[/color]-1; rows++)
   {
       printf("[color="DarkOrange"]dose tin %i imerominia geniseos:\n[/color]",rows+1);
       scanf("%i",&ptr1->Num[rows]);

       printf("[color="DarkOrange"]dose to %io onoma:\n[/color]",rows+1);
       scanf("%s",(ptr1+rows)->ch);
   }
}

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

[color="Blue"]void [/color]func2([color="Blue"]struct [/color]mystruct *ptr2)
{
   func1(ptr2);

   [color="Blue"]int[/color] rows = 0; 
   [color="Blue"]int[/color] cols = 0;
  [color="Blue"] int [/color]temp = 0;

  [color="Blue"] for[/color](; rows <= [color="Cyan"]ROWS[/color]-1; rows++)
   {
       [color="Blue"]for[/color](; cols <= [color="Cyan"]COLS[/color]-1; cols++)
       {
           [color="Blue"]if[/color](ptr2->Num[cols] > ptr2->Num[rows])
           {
               temp = ptr2->Num[rows];
               ptr2->Num[rows] = ptr2->Num[cols];
               ptr2->Num[cols] = temp;
           }
       }
   }
}
//------------------------------------------------------------------------------

int main()
{
  [color="Blue"] struct [/color]mystruct *ptr;
   [color="Blue"]struct[/color] mystruct data[[color="Cyan"]ROWS[/color]];
   ptr = data;

   func2(ptr);
}

Δημοσ.

Βασικά αυτό που θέλετε μάλλον είναι να κάνετε sort τα nodes αντί να κάνετε sort το data σας. Αν και δεν είναι και τόσο ξεκάθαρο τι γράφετε.

 

>
   struct mystruct *ptr;
   struct mystruct data[ROWS];
   ptr = data;

   func2(ptr);

Θα ήταν καλύτερα να το γράψετε

>
   struct mystruct data[ROWS];
   func2(data);

 

Για πολλούς λόγους.

 

Από κει και πέρα δεν μπορώ να φανταστώ, για αυτό που φαντάζομαι ότι κανετε, γιατι χρειάζεστε nested loop και γιατί τέλως πάντων είναι εντελώς ασσύμετρη η πρόσβαση σους πίνακς.

 

Κάτι άλλο. Θα βοήθούσς να δώσετε καλύτερα ονόματα στα fields από ch και num...

 

edit τώρα που το κοιτάζω καλύτερα μάλλον απλά πρέπει όποτε κάνετε swap τις ηλικίες να κάνετε swap καί τα onomata (ή καλύτερα όλη τη δομή)

Δημοσ.

Καλησπερα σας και σας ευχαριστω πολυ για το χρονο σας και την βοηθεια.

 

απλά πρέπει όποτε κάνετε swap τις ηλικίες να κάνετε swap καί τα onomata (ή καλύτερα όλη τη δομή

 

Αυτο αντιλαμβανομαι κ εγω οτι πρεπει να γινουν ταυτοχρονα απλα αδυνατω να το κανω με κωδικα,κατι δεν κανω σωστα προφανως.

Δημοσ.

Θα ελέγχετε τις ηλικίες και όπου θέλει swap θα κάνετε κάτι σαν.

>
struct mystruct temp,structarr[2];

---φτάνουμε στο σημείο για το swap---

temp = structarr[0];
stuctarr[0] = structarr[1];
structarr[1] =  temp;

Δημοσ.

Αυτό σίγουρα πρέπει να είναι έτσι;

>
struct mystruct{

   char ch[20];
   int  Num[ROWS];
};

Δεν βοηθούν βέβαια τα ονόματα των πεδίων (όπως είπε και ο ippo00) να καταλάβω τι θέλεις να κάνεις' date=' αλλά αν Num είναι έτος γέννησης, μου φαίνεται δύσκολο ο κάθε ένας

data[i'] να έχει ένα όνομα, αλλά να έχει γεννηθεί ROWS φορές.

 

Μήπως θέλεις να γράψεις

>
struct mystruct{
   char ch[20];
   int  Num;
};

;

 

Εκτός αν δεν κατάλαβα καλά:-)

Δημοσ.

Ζητω συγνωμη αν ειναι λιγο χαλια η διατυπωση μου.Θα προσπαθησω να γινω πιο σαφης.Θελω να δωσω τα ονοματα 3 ανθρωπων,τις ημερομηνιες γεννησης και να εμφανισω τον πινακα με τα ονοματα αυτων απο τον πιο μεγαλο σε ηλικια μεχρι τον μικροτερο.

Δημοσ.

Αρα δεν θέλεις COLS, αλλα μόνο το ROWS.

 

>
#define ROWS 3
struct mystruct {
          char name[20];
          int   byear;
};
....
struct mystruct data[ROWS];
.....
ανάγνωση δεδομένων μέσω scanf
          scanf("%s",data[i].name);
          scanf("%d",&data[i].byear);

Το scanf για την data.name δεν ειναι ασφαλές και ίσως να μην είναι και λειτουργικό.

π.χ. Τι θα κάνει αν δώσεις ΝΙΚΟΣ ΠΑΠΑΔΟΠΟΥΛΟΣ για όνομα; Θα διαβάσει μόνο το ΝΙΚΟΣ και το ΠΑΠΑΔΟΠΟΥΛΟΣ θα προσπαθήσει να το ερμηνεύσει σαν έτος γέννησης.

Τι θα κάνει αν πληκτρολογήσεις ΣΠΑΝΟΒΑΓΓΕΛΟΔΗΜΗΤΡΑΚΟΜΑΝΟΛΟΠΟΥΛΟΣ;

Θα σκάσει (υπέρβαση μνήμης της name).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...