PaniC_GR Δημοσ. 3 Ιουνίου 2005 Δημοσ. 3 Ιουνίου 2005 kalhspera k palli paides epestrexa ayth tin fora me ton telaiytaio mou project... loipon exw ena progr pou tha parakolouthw ta cd pou exw sth diskothikh mou Για κάθε CD θα πρέπει να αποθηκεύετε τον τίτλο του, τα ονόματα των καλλιτεχνών (μέχρι δύο), το έτος κυκλοφορίας του CD, το είδος της μουσικής και την προσωπική σας βαθμολογία για το CD στην κλίμακα 1-10. Το λογισμικό θα πρέπει με τη χρήση ενός μενού να δίνει τις εξής δυνατότητες: 1. Προσθήκη καταχώρησης 2. Διαγραφή καταχώρησης 3. Τροποποίηση καταχώρησης 4. Αναζήτηση καταχωρήσεων με βάση τον τίτλο του CD 5. Αναζήτηση καταχωρήσεων με βάση τον καλλιτέχνη 6. Ταξινόμηση των εγγραφών κατά το πεδίο «τίτλο» ή «βαθμολογία» και ανάλογα με τη φορά (αύξουσα ή φθίνουσα) που θα ορίζει ο χρήστης. 7. Τύπωμα της πλήρους λίστας 8. Επαναδιαμόρφωση λίστας μετά από τυχαίες διαγραφές loipon ayto me liga logia... #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> #define MAX 200 int menu (void); void emfanisi(int i); void anazitisi_kallitexni(void); void anazitisi_titlou(void); void kataxwrisi(void); void diagrafi(void); struct diskothiki { char onoma[80]; char titlos[80]; char eidos_mousikis[80]; unsigned kukloforia; unsigned vathmologia; } diskothiki [MAX]; int top=0; int main (void) { int epilogi; clrscr(); do { epilogi=menu(); switch(epilogi) { case 1:kataxwrisi(); break; case 2:anazitisi_kallitexni(); break; case 3:anazitisi_titlou(); break; case 4:diagrafi(); } } while(epilogi!=5); return 0; } menu (void) { int i; char str[80]; printf("Epilogi Xristi:\n"); printf("1.Kataxwrisi\n"); printf("2.Anazitisi ana kallitexni\n"); printf("3.Anazitisi ana titlo\n"); printf("4.Diagrafi kataxwrisis\n"); printf("5.Exodos\n"); do { printf("Epelexe: "); gets(str); i=atoi(str); printf("\n"); } while(i<1||i>5); return i; } void kataxwrisi(void) { int i; char temp[80]; for(i=top;i<MAX;i++) { printf("Dose to onoma tou kallitexni(patiste enter gia exodo): "); gets(diskothiki.onoma); if (!*diskothiki.onoma)break; printf("Dose titlo cd: "); gets(diskothiki.titlos); printf("Dose to etos kukloforias tou cd: "); gets(temp); diskothiki.kukloforia = (unsigned) atoi(temp); printf("Dose to eidos tis mousikis: "); gets(diskothiki.eidos_mousikis); printf("Dose vathmologia gia to cd: "); gets(temp); diskothiki.vathmologia = (unsigned char) atoi(temp); } top=i; } void anazitisi_kallitexni(void) { char onoma[80]; int i,vrethikan; printf("Onoma: "); gets(onoma); vrethikan=0; for(i=0;i<top;i++) if(!strcmp(onoma,diskothiki.onoma)) { emfanisi (i); vrethikan=1; printf("\n"); } if(!vrethikan) printf("Den vrethikan \n"); } void anazitisi_titlou(void) { char titlos[80]; int i,vrethikan; printf("titlos: "); gets(titlos); vrethikan=0; for(i=0;i<top;i++) if(!strcmp(titlos,diskothiki.titlos)) { emfanisi (i); vrethikan=1; printf("\n"); } if(!vrethikan) printf("Den vrethikan \n"); } void emfanisi(int i) { printf("Titlos cd: %s \n",diskothiki.titlos); printf("Kallitexnis: %s \n",diskothiki.onoma); printf("Eidos mousikis: %s \n",diskothiki.eidos_mousikis); printf("Kukloforise to: %u \n",diskothiki.kukloforia); printf("Vathmologia cd: %u \n",diskothiki.vathmologia); } void diagrafi(void) { printf("H kataxwrisi diegrafi"); } mexri edw to exw ftasei ta provlhmata polla twra sthn katastash pou einai trexei kanonika XWRIS ta erwtimata 2,3,6,7,8 dld sxedon to miso tha ithela mia mikrh help gia tis epiplewn sinartiseis pou xreiazwde...pls helpppppp!!!
PaniC_GR Δημοσ. 3 Ιουνίου 2005 Μέλος Δημοσ. 3 Ιουνίου 2005 akoma gia na ginw pio katanwitos stis arxikes epiloges tou progr loipon i diagrafi kapias kataxwriseis i tropopoihsh tis,i emfanisei olwn twn egrafwn kati san enan megalo pinaka,i taxinomisei k telos i epanadiamorfosi meta apo kapies tixwn diagrafes pou mporoun na ginoun dld Πριν την επαναδιαμόρφωση Εγγρ. 1 Κενή Εγγρ. 2 Κενή Κενή Εγγρ. 3 Εγγρ. 4 ... Μετά την επαναδιαμόρφωση Εγγρ. 1 Εγγρ. 2 Εγγρ. 3 Εγγρ. 4 Κενή Κενή Κενή ...
PaniC_GR Δημοσ. 4 Ιουνίου 2005 Μέλος Δημοσ. 4 Ιουνίου 2005 kamia help ((( vasika ithela na pw pws to upoprogramma tis diagrafis ston kwdika mou den einai swsto (mono mia printf exw ) skeftika na ginei me tin remove alla den xerw akrivos tin sindaxh k den xerw kata poso kolaei.. int diagr(void) { char diagrafi[80]; printf("dwse ton titlo tou cd gia thn diagrafh: "); gets(diagrafi); printf("eiste sigouros ? (Y/N) "); if (toupper(getchar())=='Y') remove (diagrafi); return menu(); } ti lete?
Directx Δημοσ. 5 Ιουνίου 2005 Δημοσ. 5 Ιουνίου 2005 Όταν κάποτε σχεδίαζα μια μικρή δικιά μου Β.Δ. είχα βρεθεί σε ένα παρόμοιο δίλημμα.. Υπάρχουν πολύ τρόποι για να διαγράψεις ένα συγκεκριμένο struct από το struct array της diskothiki. Για παράδειγμα, μπορείς.. 1ον)Να εντοπίσεις πιο struct (ή καλύτερα εγγραφή) από το σύνολο των structs array diskothiki θέλει να διαγράψει ο χρήστης. 2ον)Να βρεις την διεύθυνση μνήμης αυτού του συγκεκριμένου struct. 3ον)Να αντιγράψεις το αμέσως επόμενο struct που ακολουθεί επάνω του συνεχίζοντας ως το τέλος του struct array. 4ον)Τέλος να θέσεις το τελικό struct του struct array σε μηδέν καθώς όλα τα struct από το προς διαγραφή και μετά έχουν γραφθεί μια θέση πιο πίσω. Με απλά λόγια αν θέλουμε να διαγράψουμε την 5 εγγραφή απλά αντιγράφουμε σε αυτή την 6 εγγραφή ενώ στην 6 την 7 κτλ. ως την τελευταία struct της diskothiki (199 εγγραφή αφού στην C μετράμε πάντα από το μηδέν οπότε 199 = 200). Καταρχήν θεωρούμε πως η diagrafi θα λαμβάνει ένα integer (nRecordToDelete) με τον αριθμό του struct που θέλουμε να διαγράψουμε, μετρώντας από το μηδέν (για το 1 struct 0, για το 2 struct 1 κτλ). Ένας πολύ γρήγορος τρόπος για να γίνει αυτό είναι να κάνεις: memcpy(&diskothiki[nRecordToDelete],&diskothiki[nRecordToDelete+1], sizeof(diskothiki)-(sizeof(diskothiki[0])*(nRecordToDelete+1))); memset(&diskothiki[MAX-1],0,sizeof(diskothiki[0])); Το &diskothiki[nRecordToDelete] υποδεικνύει την διεύθυνση όπου βρίσκεται το struct που θέλουμε να διαγράψουμε. Το &diskothiki[nRecordToDelete+1] υποδεικνύει την διεύθυνση του αμέσως επόμενου struct το οποίο και θα γράψουμε στην διεύθυνση του προς διαγραφή struct. Το sizeof(diskothiki)-(sizeof(diskothiki[0])*(nRecordToDelete+1)) υποδεικνύει το μέγεθος των στοιχείων (bytes) που θα γράψουμε από την διεύθυνση &diskothiki[nRecordToDelete] και που ισούται με το συνολικό μέγεθος που έχει το diskothiki struct πλην το μέγεθος των struct που προηγούνται του nRecordToDelete και +1 για το αμέσως επόμενο struct του με το οποίο και θα το αντικαταστήσουμε. Προσοχή: Το ότι υπολογίζουμε ως nRecordToDelete+1 την διεύθυνση που ακολουθεί το προς διαγραφή struct εκ πρώτης όψεως είναι υπόλογο για σφάλμα διαχείρισης μνήμης καθώς εάν θέλουμε να διαγράψουμε το 199 struct που είναι το τελευταίο της structs array diskothikis (εφ’ όσον MAX = 200) τότε ξεφεύγουμε κατά +1 struct => 200. Εντούτοις όμως κάτι τέτοιο δεν πρόκειται να συμβεί καθώς η φόρμουλα υπολογισμού του προς αντιγραφή μεγέθους μνήμης μας, επιστρέφει μηδέν οπότε ουσιαστικά η memcpy δεν προβαίνει σε καμία ενέργεια! ..εδώ παίζει ρόλο και ο compiler στον τρόπο που υλοποιεί την memcpy βέβαια ;-) Η memset απλά διαγράφει (μηδενίζει) το τελευταίο (199 | MAX = 200 – 1 = 199 αλλά εφ’ όσον έχουμε diskothiki[0] -> 199 = 200) struct της diskothikis καθώς όλες οι εγγραφές μετά το προς διαγραφή struct έχουν μετακινηθεί -1 θέση. Εάν ο χρήστης διαγράφει το τελευταίο struct (και αφού η memcpy σε αυτή την περίπτωση δεν κάνει τίποτε όπως προανέφερα) το memset διαγράφει το 199 struct κατευθείαν. Παρακάτω, παραθέτω την ρουτίνα σε αυτή την μορφή μαζί με κώδικα για testing (δημιουργεί 199 ή εφ’ όσων μετράμε από το 0, 200 εγγραφές στο diskothiki) εφαρμόζει τα παραπάνω και παρουσιάζει τα αποτελέσματα στην οθόνη (πρέπει να αλλάξεις και την αρχική δήλωση |prototype| της diagrafi στην έναρξη του source σου). > #define _DEBUG_DIAGRAFI_SAMPLES #define _DEBUG_DIAGRAFI_RESULTS void diagrafi(int nRecordToDelete) { int nRecord_Index; char szSample[15]; #ifdef _DEBUG_DIAGRAFI_SAMPLES // DEBUG ~ Fill up to 5 diskothiki records with sample data for(nRecord_Index=0;nRecord_Index!=MAX;nRecord_Index++) { sprintf(szSample,"ONOMA #%d",nRecord_Index); strcpy(diskothiki[nRecord_Index].onoma ,szSample); sprintf(szSample,"TITLOS #%d",nRecord_Index); strcpy(diskothiki[nRecord_Index].titlos ,szSample); sprintf(szSample,"ROCK #%d",nRecord_Index); strcpy(diskothiki[nRecord_Index].eidos_mousikis ,szSample); diskothiki[nRecord_Index].kukloforia = 1990+nRecord_Index; diskothiki[nRecord_Index].vathmologia = nRecord_Index; } #endif /* Move onto the record for deletion the immediate next record up to struct end, also calculate the memory length of the entire transfer. */ memcpy(&diskothiki[nRecordToDelete],&diskothiki[nRecordToDelete+1], sizeof(diskothiki)-(sizeof(diskothiki[0])*(nRecordToDelete+1))); memset(&diskothiki[MAX-1],0,sizeof(diskothiki[0])); #ifdef _DEBUG_DIAGRAFI_RESULTS // DEBUG ~ Print new diskothiki records.. for(nRecord_Index=0;nRecord_Index!=MAX;nRecord_Index++) { printf(" %.2d] NAME = %s\n",nRecord_Index,diskothiki[nRecord_Index].onoma); printf(" TITLE = %s\n",diskothiki[nRecord_Index].titlos); printf(" MOUSIK = %s\n",diskothiki[nRecord_Index].eidos_mousikis); printf(" KUKLOF = %d\n",diskothiki[nRecord_Index].kukloforia); printf(" VATHMO = %d\n",diskothiki[nRecord_Index].vathmologia); getch(); } printf("\n Hit a key to quit \n"); getch(); #endif } Ο κώδικας αναπτύχθηκε σε C/C++ Builder 6.0 ως καθαρό C project, ύστερα δοκιμάσθηκε σε Turbo C 3.0 for DOS και φαίνεται να λειτουργεί ικανοποιητικά, παρ’ όλα αυτά δεν αποκλείω το ενδεχόμενο να υπάρχουν λάθει. Καλή συνέχεια!
nodreams.ct Δημοσ. 5 Ιουνίου 2005 Δημοσ. 5 Ιουνίου 2005 Μην τα αποθηκεύεις σε array αλλά σε linked list. H διαγραφή γίνεται σε Ο(1).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.