mix@lis Δημοσ. 17 Νοεμβρίου 2005 Δημοσ. 17 Νοεμβρίου 2005 καλησπερα σε ολους!!! εχω το εξης προβλημα.εχω μια δομη(για cd) μεσα στην οποια εχω δηλωσει τα εξης:typedef struct { char title[50]; char artist[30]; int tracks; int year; float price; } compactdisc; ολα δουλευουν μια χαρα αλλα.....οταν εισαγω για artist το ονοματεπωνυμο με κενο αναμεσα στο ονομα και στο επιθετο το προγραμμα δεν δουλευει σωστα!!!το ιδιο συμβαινει και με το title!!!!!!!γιατι???δηλαδη το title και το artist δουλευουν σωστα μονο οταν ειναι μια συνεχομενη λεξη....... (βεβαια σκεφτηκα να να βαλω μεσα στην δομη και αλλες ξεχωριστες μεταβλητες για επιθετο αλλα ο καθηγητης την θελει την δομη ετσι οπως ειναι...!!!)τι να κανω??help!!!
georgemarios Δημοσ. 17 Νοεμβρίου 2005 Δημοσ. 17 Νοεμβρίου 2005 όταν λες δε δουλευει σωστα, τι ακριβως εννοεις; Υπαρχουν καποιες συναρτησεις που θεωρουν τελος του string το κενο. Τι ακριβως θες να κανεις και ισως βρουμε λυση...
mix@lis Δημοσ. 17 Νοεμβρίου 2005 Μέλος Δημοσ. 17 Νοεμβρίου 2005 απλα ο χρηστης εισαγει στην αρχη τον αριθμο των cds που θελει να καταχωρησει,στην συνεχεια τα cd ταξινομουνται με βαση την τιμη τους και στην συνεχεια εμφανιζονται ταξινομημενα σε αυξουσα σειρα(απο αυτο που εχει την μικροτερη τιμη μεχρι αυτο που εχει την μεγαλυτερη,να σημειωσω οτι εμφανιζονται ολα τα στοιχεια του καθε cd και οχι μονο η τιμη)....παραθετω και τον κωδικα.... #include <stdio.h> #include <stdlib.h> int k=1; typedef struct { char title[50]; char artist[30]; int tracks; int year; float price; } compactdisc; int arithmos; compactdisc c[10]; int i,j; int main(int argc, char *argv[]) { char epilogi; do{ printf("thelete na ektelesete to programa n or y?"); scanf("%s",&epilogi); switch (epilogi) { case 'y': eisagogei(); break; case 'n': break; } }while(epilogi!='n' & epilogi!='y'); system("PAUSE"); return 0; } void eisagogei() { printf("posa cd thelete na kataxorisete??"); scanf("%d",&arithmos); if(arithmos>10) { printf("o arithmos den mporei na einai pano apo 10 cd..."); } else { for(i=0;i<arithmos;i++) { printf("dose onoma cd:"); scanf("%s",&(c.title)); printf("dose onoma kalitexni:"); scanf("%s",&(c.artist)); printf("dose arithmo tragoudiwn:"); scanf("%d",&(c.tracks)); printf("dose to etos:"); scanf("%d",&(c.year)); printf("dose thn timi tou cd:"); scanf("%f",&(c.price)); } } printf("-------------------------\n"); for(i=0;i<arithmos-1;i++) { for(j=arithmos-1;j>i;--j) { if(c[j].price<c[j-1].price) { float t; t=c[j].price; c[j].price=c[j-1].price; c[j-1].price=t; } } } for(i=0;i<arithmos;i++) { printf("-----thi is the %do cd you entered-----\n",k); printf("%s\n",c.title); printf("%s\n",c.artist); printf("%d\n",c.tracks); printf("%d\n",c.year); printf("%.2f\n",c.price); printf("\n"); k++; } }
powerfty Δημοσ. 17 Νοεμβρίου 2005 Δημοσ. 17 Νοεμβρίου 2005 File mix@li dokimase tin gets h tin sscanf anti gia scanf. H gets pairnei mia olokliri grammi (mexri na patiseis enter) synepws kai ta kena. Des to programma parakatw gia na katalaveis. #include <stdio.h> #include <stdlib.h> typedef struct { char title[50]; char artist[30]; int tracks; int year; float price; } compactdisc; int main(int argc, char *argv[]) { compactdisc cd; char s[30]; gets(s); strcpy(cd.artist, s); printf("%s\n", cd.artist); system("PAUSE"); return 0; } An exeis kapoia aporia pes mou.
mix@lis Δημοσ. 17 Νοεμβρίου 2005 Μέλος Δημοσ. 17 Νοεμβρίου 2005 ευχαριστω πολυ φιλε powerfty!!!!δουλεψε αυτο που μου ειπες(δηλ οταν καταχωρω ονομα καλιτεχνη με ονομα και επιθετο με κενο το πιανει σωστα) αλλα....οταν μου εμφανιζει τα χαρακτηριστικα απο το cd για να καταχωρησω τιμες,με παει κατευθειαν στην δευτερη επιλογη και οχι στην πρωτη....γιατι????παραθετω και τον κωδικα οπως τον διορθωσα.... #include <stdio.h> #include <stdlib.h> int k=1; char s[30]; typedef struct { char title[50]; char artist[30]; int tracks; int year; float price; } compactdisc; int arithmos; compactdisc c[10]; int i,j; int main(int argc, char *argv[]) { char epilogi; do{ printf("thelete na ektelesete to programa n or y?"); scanf("%s",&epilogi); switch (epilogi) { case 'y': eisagogei(); break; case 'n': break; } }while(epilogi!='n' & epilogi!='y'); system("PAUSE"); return 0; } int eisagogei(){ printf("posa cd thelete na kataxorisete??"); scanf("%d",&arithmos); if(arithmos>10) { printf("o arithmos den mporei na einai pano apo 10 cd..."); } else { for(i=1;i<=arithmos;i++) { printf("dose onoma cd:"); gets(s); strcpy(c.title,s); printf("dose onoma kalitexni:"); gets(s); strcpy(c.artist,s); printf("dose onoma kalitexni:"); gets(s); strcpy(c.artist,s); printf("dose arithmo tragoudiwn:"); scanf("%d",&(c.tracks)); printf("dose to etos:"); scanf("%d",&(c.year)); printf("dose thn timi tou cd:"); scanf("%f",&(c.price)); } } printf("-------------------------\n"); for(i=0;i<arithmos-1;i++) { for(j=arithmos-1;j>i;--j) { if(c[j].price<c[j-1].price) { float t; t=c[j].price; c[j].price=c[j-1].price; c[j-1].price=t; } } } for(i=0;i<arithmos;i++) { printf("-----thi is the %do cd you entered-----\n",k); printf("%s\n",c.title); printf("%s\n",c.artist); printf("%d\n",c.tracks); printf("%d\n",c.year); printf("%.2f\n",c.price); printf("\n"); k++; } }
powerfty Δημοσ. 17 Νοεμβρίου 2005 Δημοσ. 17 Νοεμβρίου 2005 Sto parakatw kommati else { for(i=1;i<=arithmos;i++) { printf("dose onoma cd:"); gets(s); strcpy(c.title,s); printf("dose onoma kalitexni:"); gets(s); strcpy(c.artist,s); printf("dose onoma kalitexni:"); gets(s); strcpy(c.artist,s); printf("dose arithmo tragoudiwn:"); scanf("%d",&(c.tracks)); printf("dose to etos:"); scanf("%d",&(c.year)); printf("dose thn timi tou cd:"); scanf("%f",&(c.price)); } kaneis eisagwgi stoixeiwn apo to deutero cd giati to i ksekinaei apo 1 enw sti C oi pinakes ksekinoun me index 0. Ara prepei na allakseis tin for ws eksis for(i = 0; i < arithmos;i++) Auto prepei na ginei dioti vlepw pws parakatw typwneis ta cd ksekinwntas apo 0.
mix@lis Δημοσ. 17 Νοεμβρίου 2005 Μέλος Δημοσ. 17 Νοεμβρίου 2005 το αλαξα αλλα δυστηχως παλι τα ιδια...ξεκιναει απο το 1 cd αλλα αντι να μου βγαλει πρωτα το μηνυμα για να εισαγω το ονομα του cd με παει κατευθειαν στο ονομα του καλιτεχνη....τι να κανω???sorry αν σε κουρασα... παραθετω και τον κωδικα οπως τον διορθωσα....μπορεις να τον δοκιμασεις και εσυ... #include <stdio.h> #include <stdlib.h> int k=1; char s[30]; typedef struct { char title[50]; char artist[30]; int tracks; int year; float price; } compactdisc; int arithmos; compactdisc c[10]; int i,j; int main(int argc, char *argv[]) { char epilogi; do{ printf("thelete na ektelesete to programa n or y?"); scanf("%s",&epilogi); switch (epilogi) { case 'y': eisagogei(); break; case 'n': break; } }while(epilogi!='n' & epilogi!='y'); system("PAUSE"); return 0; } int eisagogei(){ printf("posa cd thelete na kataxorisete??"); scanf("%d",&arithmos); if(arithmos>10) { printf("o arithmos den mporei na einai pano apo 10 cd..."); } else { for(i=0;i<arithmos;i++) { printf("dose onoma cd:"); gets(s); strcpy(c.title,s); printf("dose onoma kalitexni:"); gets(s); strcpy(c.artist,s); printf("dose arithmo tragoudiwn:"); scanf("%d",&(c.tracks)); printf("dose to etos:"); scanf("%d",&(c.year)); printf("dose thn timi tou cd:"); scanf("%f",&(c.price)); } } printf("-------------------------\n"); for(i=0;i<arithmos-1;i++) { for(j=arithmos-1;j>i;--j) { if(c[j].price<c[j-1].price) { float t; t=c[j].price; c[j].price=c[j-1].price; c[j-1].price=t; } } } for(i=0;i<arithmos;i++) { printf("-----thi is the %do cd you entered-----\n",k); printf("%s\n",c.title); printf("%s\n",c.artist); printf("%d\n",c.tracks); printf("%d\n",c.year); printf("%.2f\n",c.price); printf("\n"); k++; } }
georgemarios Δημοσ. 17 Νοεμβρίου 2005 Δημοσ. 17 Νοεμβρίου 2005 χωρια που ετσι που ειναι, αν βαλεις arithmos=10 θα προσπαθησει να καταχωρησει δεδομενα στο c[10] που δεν υπαρχει (ΜΕΓΑ ΛΑΘΟΣ) [EDIT] ουπς με προλαβες
powerfty Δημοσ. 17 Νοεμβρίου 2005 Δημοσ. 17 Νοεμβρίου 2005 Vale ena gets h scanf prin tin prwti gets sto for mesa. Auto simvainei giati pairnei to enter pou patas apo tin teleutaia scanf pernaei stin gets. Diladi kane to eksis else { for(i=0;i<arithmos;i++) { gets(s); printf("dose onoma cd:"); gets(s); strcpy(c.title,s); printf("dose onoma kalitexni:"); gets(s); strcpy(c.artist,s); printf("dose arithmo tragoudiwn:"); scanf("%d",&(c.tracks)); printf("dose to etos:"); scanf("%d",&(c.year)); printf("dose thn timi tou cd:"); scanf("%f",&(c.price)); } Doulevei alla den m'aresei katholou kai na psaksw na vrw allon tropo.
gerontas Δημοσ. 18 Νοεμβρίου 2005 Δημοσ. 18 Νοεμβρίου 2005 Καταρχήν θερμά συγχαρητήρια και στους τρεις για το επίπεδο του διαλόγου. Ο mix@lis αντί να ψάξει έτοιμες λύσεις το πάλεψε κι έρχεται με συγκεκριμένες απορίες, οι άλλοι δυό απαντούν άμεσα προς τη σωστή κατεύθυνση, χωρίς εξυπνάδες του τύπου "άνοιξε κανένα βιβλίο". Vale ena gets h scanf prin tin prwti gets sto for mesa. Auto simvainei giati pairnei to enter pou patas apo tin teleutaia scanf pernaei stin gets... Η εξήγηση που δίνει ο powerfty είναι σωστή κι έχει να κάνει με το ρημάδι το <Enter> που στέλνει δυό χαρακτήρες ταυτόχρονα, τόσο τον #13 (<Return>) που είχαν στο μυαλό τους οι δημιουργοί της C, όταν έγραφαν τις συναρτήσεις που χειρίζονται streams, όσο και τον #10 (<Line Feed>) που "περισσεύει" στο buffer και δημιουργεί το πρόβλημα. ...Doulevei alla den m'aresei katholou kai na psaksw na vrw allon tropo. Περισσότερο μ' αρέσει η νοοτροπία σου: "Δουλεύει, αλλά η gets δεν είναι φτιαγμένη να κάνει αυτή τη δουλειά, κάτι καλύτερο πρέπει να υπάρχει και θα το ψάξω". Και πάλι συγχαρητήρια, δεν σκέπτονται πολλοί έτσι, σε μια εποχή που ο ωχαδερφισμός τείνει να εξελιχθεί σε κυρίαρχη ιδεολογία. Για να βοηθήσω λίγο, δες αν σε ικανοποιεί η fflush ( stdin ); που είναι γραμμένη ώστε να καθαρίζει το input buffer. @ mix@lis: Από μια πρόχειρη ματιά, ο κώδικας >t=c[j].price; c[j].price=c[j-1].price; c[j-1].price=t; αντιμεταθέτει τις τιμές αγοράς, χωρίς όμως να τις συνοδεύει στις νέες τους θέσεις από τα υπόλοιπα στοιχεία (Τίτλο, όνομα καλλιτέχνη κλπ.) που έχουν εισαχθεί μαζί τους. Αν έχετε διδαχθεί pointers to struct και αντιμετάθεση με bitwise XOR, μάλλον αυτό περιμένει από σας, αν όχι θέλει λίγο χαμαλίκι παραπάνω, ώστε να αντιμετατεθούν και τα υπόλοιπα στοιχεία της δομής. (Hint: Δοκίμασε αυτήν την προσωρινή μεταβλητή t να τη δηλώσεις τύπου compactdisc). Hope it helps.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.