iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 Καλησπέρα αγόρια και κορίτσια, είμαι κανούργιος σε αυτό το forum που μου φάνηκε πολύ ενδιαφέρον και για να κάνω την αρχή μου ξεκινάω με απορία ... Αρχικά να πω οτι σπουδάζω πληροφορική στο πανεπιστήμιο Κέρκυρας και η απορία που θα παραθέσω αφορά μια άσκηση... Λοιπόν, μας είχε βάλει ο καθηγητής μια άσκηση με λίστες στην οποία διαβάζαμε τα δεδομένα και δημιουργούσαμε τους κόμβους κτλ... Είχε και άλλα πράγματα που ήθελε άλλα δεν είναι ανάγκη να τα πω... Η απορία τώρα, εγώ σκέφτηκα και το έλυσα διαβάζοντας 1-1 τα στοιχεία με μια scanf και ύστερα με μια συνάρτηση τα δημιουργούσα των κόμβο και έβαζα μέσα το δεδομένο που έδωσε ο χρήστης... Ο βαθμός που πήρα ήταν 9 για το λόγο οτι ο χρήστης έδινε τα δεδομένα ένα ένα και όταν το ρώτησα πως θα μπορούσα όταν δίνει ο χρήστης όλα μαζί και να τα πέρνω μου λέει: "Υπάχου πολύ τρόποι, π.χ. να διάβαζες πόσα κενά είχε η scanf..." Ο τύπος με μπέρδεψε και δεν μου έρχεται πως θα μπορούσα να το κάνω... Το έβαλα στο google αλλά δεν μπορώ να βρω ένα αξιόλογο παράδειγμα για να καταλάβει λίγο την λογική για αυτό ρωτάω μήπως μου δώσετε καμιά ιδέα... Δεν είμαι και τόσο καλός στον προγραμματισμό, τώρα μαθαίνω να προγραμματίζω καλά... Να τονίσω ότι δεν ζητάω λύση στην άσκηση που έχω διότι έχει παραδωθεί και βαθμολογηθεί... Το συγκεκριμένω post γίνεται μόνο και μόνο για να αναπτύξω τις γνώσεις μου με την βοήθεια σας... Ευχαριστώ εκ των προτέρον για τις απαντήσεις σας...
virxen75 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 στείλε την άσκηση να δούμε τι έκανες μπας και βγάλουμε άκρη
iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Μέλος Δημοσ. 24 Φεβρουαρίου 2012 στείλε την άσκηση να δούμε τι έκανες μπας και βγάλουμε άκρη Δεν ξέρω εάν θα βοηθήσει αυτό που έχω κάνει γιατί όπως λέω το έχω κάνει διαφορετικά απο αυτό που ρωτάω τώρα... Παρόλαυτα άμα το θεωρείς χρήσιμο παραθέτω την συνάρτηση που βάζω τα δεδομένα στην λίστα... >void insert (nodeptr *sptr,int value) { nodeptr newptr,previousptr,currentptr; // Dilosi dikton pou tha xriastoun gia na prostethei to stoixeio stin sosti thesi. newptr = malloc( sizeof (node)); // Dinamiki katanomi mnimis pou tha xriastei gia tin dimiourgia neou komvou stin lista. if (newptr!=NULL){ // Sinthiki pou dilonei ean egine epitiximena i desmeysi mnimis. newptr->data=value; // Prosthiki tou neou stoixeiou ston kainourgio komvo; newptr->next=NULL; /* Deiktes gia tin eyresi tin sosti thesi pou prepei na mpei o komvos */ previousptr = NULL; currentptr = *sptr; /* Arxi epanalipsis gia na vroume tin sosti thesi pou prepei na mpei o komvos */ while (currentptr != NULL && value>=currentptr->data){ previousptr = currentptr; currentptr = currentptr->next; } /* Ean o previousptr = NULL tote to stoixeio pou periexei o komvos einai to mikrotero se timi kai prepei na mpei stin arxi tis listas */ if (previousptr == NULL){ newptr->next = *sptr; *sptr=newptr; } // Allios tha mpei anamesa ston previousptr kai ston currenptr else{ previousptr->next=newptr; newptr->next=currentptr; } } // Minima se periptosi apotiximenis prospatheias desmeysi mnimis. else { printf ("\nDen yparxei diathesimi mnimi gia eisagogi allou stoixeiou stin lista."); } } Το σχόλια είναι τόσο αναλυτικά για τον καθηγητή... Αυτή η συνάρτηση πέρνει το value που είναι το δεδομένο και το sptr που είναι δείκτης στην αρχή της λίστας και δημιουργεί τον νέο κόμβο και τον βάζει στη σωστή θέση για να είναι η λίστα ταξινομημένη σε αύξουσα σειρά. Στην main() απλά υπάρχει κάπου μέσα στον κώδικα: > printf ("Dose ena stoixeio gia tin lista:"); scanf ("%d",&item); insert (&startptr, item);
virxen75 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 printf ("Dose ena stoixeio gia tin lista:"); scanf ("%d",&item); insert (&startptr, item); αυτό βρίσκεται μέσα σε κάποιο for ή while?
iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Μέλος Δημοσ. 24 Φεβρουαρίου 2012 αυτό βρίσκεται μέσα σε κάποιο for ή while? Ναι φίλε μου... Είναι μέσα σε μία while...
virxen75 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 > #include <stdio.h> #include <stdlib.h> int main(){ int item=1; while (item>0){ scanf("%d",&item); printf("%d----->",item); } system("pause"); getchar(); } βάλε σαν είσοδο 1 2 3 4 5 6 7 8 9 10 και πάτα εντερ αυτό εννοεί?
iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Μέλος Δημοσ. 24 Φεβρουαρίου 2012 > #include <stdio.h> #include <stdlib.h> int main(){ int item=1; while (item>0){ scanf("%d",&item); printf("%d----->",item); } system("pause"); getchar(); } βάλε σαν είσοδο 1 2 3 4 5 6 7 8 9 10 και πάτα εντερ αυτό εννοεί? Ναι... Να δώσει ο χρήστης 331 42 1124 Και να μπει στο πρώτο, δεύτερο και τρίτο κόμβο το 331,42,1124 αντίστοιχα...
virxen75 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 βάλε την είσοδο αυτή στο πρόγραμμα σου να δεις ότι γίνεται ήδη αυτό με τον κώδικα που έχεις!
iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Μέλος Δημοσ. 24 Φεβρουαρίου 2012 βάλε την είσοδο αυτή στο πρόγραμμα σου να δεις ότι γίνεται ήδη αυτό με τον κώδικα που έχεις! Τα έβαλα και μου εμφάνισε παρακάτω κώδικα σαν να παίρνει τον επόμενο αριθμό σαν μια από τις διαθέσιμες επιλογές που έχει ο χρήστης... Επιπλέον βάζει στην λίστα τον πρώτο αριθμό...
virxen75 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 στείλε όλη την main να δω τι έχεις κάνει.
imitheos Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 Ναι... Να δώσει ο χρήστης 331 42 1124 Και να μπει στο πρώτο, δεύτερο και τρίτο κόμβο το 331,42,1124 αντίστοιχα... Ο κώδικας σου ταξινομημένα δεν τα εισάγει ? 42, 331, 1124 δεν θα έπρεπε να μπουν ? Τέλος πάντων δεν είναι αυτό το θέμα μας Όπως σου είπε ο virxen75, αν δώσεις παραπάνω στοιχεία τότε θα διαβαστούν από τις επόμενες scanf. Ίσως να εννοούσε αυτό ο καθηγητής, αλλά με αυτό τον τρόπο τυπικά έχουμε και πάλι μία scanf και μία insert σε κάθε εκτέλεση του loop οπότε δεν αλλάζει κάτι. Το "να διάβαζες πόσα κενά είχε η scanf" εγώ το ερμηνεύω ως να διαβάσεις όλο το input σε ένα string και έπειτα με βάση τα κενά θα ξέρεις πόσους int έδωσε ο χρήστης (δεδομένου ότι τα δεδομένα είναι σωστά και δεν έγραψε "30 10 γηξγηγ 9") οπότε μπορείς να δημιουργήσεις τους κόμβους με τη μία χωρίς η insert να χρειάζεται σε κάθε εκτέλεσή της να ξεκινά από την αρχή της λίστας και να ψάχνει. Φυσικά μπορεί να το ερμηνεύω λάθος.
iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Μέλος Δημοσ. 24 Φεβρουαρίου 2012 στείλε όλη την main να δω τι έχεις κάνει. Ο κώδικας σου ταξινομημένα δεν τα εισάγει ? 42, 331, 1124 δεν θα έπρεπε να μπουν ? Τέλος πάντων δεν είναι αυτό το θέμα μας Όπως σου είπε ο virxen75, αν δώσεις παραπάνω στοιχεία τότε θα διαβαστούν από τις επόμενες scanf. Ίσως να εννοούσε αυτό ο καθηγητής, αλλά με αυτό τον τρόπο τυπικά έχουμε και πάλι μία scanf και μία insert σε κάθε εκτέλεση του loop οπότε δεν αλλάζει κάτι. Το "να διάβαζες πόσα κενά είχε η scanf" εγώ το ερμηνεύω ως να διαβάσεις όλο το input σε ένα string και έπειτα με βάση τα κενά θα ξέρεις πόσους int έδωσε ο χρήστης (δεδομένου ότι τα δεδομένα είναι σωστά και δεν έγραψε "30 10 γηξγηγ 9") οπότε μπορείς να δημιουργήσεις τους κόμβους με τη μία χωρίς η insert να χρειάζεται σε κάθε εκτέλεσή της να ξεκινά από την αρχή της λίστας και να ψάχνει. Φυσικά μπορεί να το ερμηνεύω λάθος. Μαλακία μου παίδες σόρρυ... Δεν το καταλαβαίνεται γιατί δεν έχω δώσει την main... Ορίστε η μαιν: >#include <stdio.h> #include <stdlib.h> typedef struct nd node; // Sinonimo tou struct nd /* Aytoanaferomeni domi */ struct nd{ int data; node *next; }; typedef node *nodeptr; // Sinonimo tou node* // Oi sinartiseis ginontai me Call By Reference ektos apo tin printlist,elegxos. void menuepilogon (); // Sinartisi pou tha provalei tis diathesimes epiloges tou xristi. void printlist (nodeptr currentptr); // Sinartisi pou tha emfanizei tin lista. void insert (nodeptr *sptr, int value); // Sinartisi pou prostheti ena stoixeio stin lista. void freeMemory (nodeptr *sptr); // Sinartisi pou svinei tin lista kai apeleytheronei tin mnimi pou xriastike. void deletesame (nodeptr *sptr); // Sinartisi pou svinei ta idia stoixeia pou iparxoun stin lista. char elegxos(char *choice); // Sinartisi gia ton elegxo egkirotitas tis epilogis. char epilogi; // Metavliti gia apothikeysei tis epilogis tou xristi. char choice[2]={'0','\0'}; // Dilosi pinaka pou tha apothikeyei ta 2 prota psifia apo tin simvoloseira pou tha dinei o xristis. int item; // Diloseis metavliton. int main (int argc, char *argv[]) { nodeptr startptr = NULL; // Diktis pou tha dixnei stin arxi tis listas. menuepilogon (); printf ("Doste tin epilogi sas:"); scanf ("%2s",choice); // Apothikeysi sto string mono ta 2 prota psifia apo ayto pou tha pliktrologisi o xristis. fflush(stdin); epilogi=elegxos(choice); while (epilogi != '4'){ // Ean dothei i epilogi 4 ginete eksodos apo to programma. // Analoga me tin epilogi ektelite kai i katalili diadikasia. switch (epilogi){ case '0': // Epilogi 0: Emfanisi tou menou epilogon. menuepilogon (); break; case '1': // Epilogi 1: Diavasma tou stoixeiou kai prosthiki stin lista me tin voitheia tis sinartisis insert. printf ("Dose ena stoixeio gia tin lista:"); scanf ("%d",&item); insert (&startptr, item); break; case '2':// Epilogi 2: Emfanisi tis listas. printlist (startptr); break; case '3': // Epilogi 3: Diagrafi ton idion stoixeion tis listas kai emfanisei tis ananeomenis listas. deletesame (&startptr); printlist(startptr); break; } // Diavasma tis epomenis epilogis. printf ("\nDoste san epilogi to 0 gia na emfanistei o katalagos me tis epiloges sas."); printf ("\nDoste tin epilogi sas:"); scanf ("%2s",choice); fflush(stdin); epilogi=elegxos(choice); } freeMemory (&startptr); // Apeleytherosi tis desmeymenis mnimis return 0; }
virxen75 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 άρα αυτό που τον ενόχλησε είναι ότι για να βάλεις ένα στοιχείο στην λίστα πρέπει να επιλέγεις συνέχεια 1 από το μενού για κάθε στοιχείο που θες να εισάγεις στην λίστα.
iPantelis Δημοσ. 24 Φεβρουαρίου 2012 Μέλος Δημοσ. 24 Φεβρουαρίου 2012 άρα αυτό που τον ενόχλησε είναι ότι για να βάλεις ένα στοιχείο στην λίστα πρέπει να επιλέγεις συνέχεια 1 από το μενού για κάθε στοιχείο που θες να εισάγεις στην λίστα. Ακριβώς... Βέβαια η εκφώνηση δεν έλεγε τον τρόπο που θα τα δέχεται τα στοιχεία αλλά τελικά μου έκοψε μια μονάδα...
migf1 Δημοσ. 24 Φεβρουαρίου 2012 Δημοσ. 24 Φεβρουαρίου 2012 Δεν μπορώ να κοιτάξω αυτή τη στιγμή τον κώδικά σου, ούτε έχω καταλάβει ακριβώς τι θέλεις να κάνεις, αλλά σε γενικές γραμμές απέφευγε την scanf(), αν κάνεις αναζήτηση στο φόρουμ θα βρεις πάαρα πολλά μηνύματα με εξήγηση και με τρόπους επίλυσης. Εν τάχει, διάβαζε μονοκόμματα τη γραμμή της εισόδου σε ένα μεγάλο c-string με fgets() και κατόπιν πάρε ότι θέλεις από εκεί, είτε με sscanf(), είτε με strtok() και την οικογένεια strto??() στην stdlib.h EDIT: Ακριβώς... Βέβαια η εκφώνηση δεν έλεγε τον τρόπο που θα τα δέχεται τα στοιχεία αλλά τελικά μου έκοψε μια μονάδα... Αχά! Οπότε άκυρο το προηγούμενο ποστ μου για το συγκεκριμένο νήμα. ΥΓ. Παρεμπιπτόντως, καλώς όρισες
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα