prwtaris Δημοσ. 5 Δεκεμβρίου 2013 Δημοσ. 5 Δεκεμβρίου 2013 #include <stdio.h> #include <stdlib.h> int main(void) { int i,j; float ma,kma,f,fo,kmao; char onoma[40]; fo=0; kmao=0; for(i=1;i<=3;i++) { printf("dwse to onomateponimo tou upalilou\n"); scanf("%s",onoma); do { printf("dwse to miniaio poso apodoxwn tou upalilou pliktrologontas apo 0 ews 3000 euro\n"); scanf("%f",&ma); }while(ma>=3000); if(ma<=700) { f=0*ma; kma=ma-f; printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } else if(ma<=1000) { f=0.15*ma; kma=ma-f; printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } else if(ma>1000) { f=0.03*ma; kma=ma-f; printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } fo=fo+f; kmao=kmao+kma; j=j=1; } printf("to sunoliko poso twn forwn olwn einai %.2f kai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao); system("PAUSE"); return 0; }
arc Δημοσ. 5 Δεκεμβρίου 2013 Δημοσ. 5 Δεκεμβρίου 2013 Βάζεις διπλή μεταβλητή εντός του scanf Δες και τρεξε το παρακατω. Επισης οταν βαζεις κωδικα στο forum, βαζε το σε code tag int main() { int i,j; float ma,kma,f,fo,kmao; char onoma[40],eponimo[40]; fo=0; kmao=0; for(i=1;i<=3;i++) { printf("dwse to onomateponimo tou upalilou %d : ",i); scanf("%s%s",&onoma,&eponimo); do { printf("\ndwse to miniaio poso apodoxwn tou upalilou (0-3000) : "); scanf("%f",&ma); }while(ma>=3000); if(ma<=700) { f=0*ma; kma=ma-f; printf("\no %s %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,eponimo,ma,f,kma); } else if(ma<=1000) { f=0.15*ma; kma=ma-f; printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } else if(ma>1000) { f=0.03*ma; kma=ma-f; printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } fo=fo+f; kmao=kmao+kma; j=j=1; printf("\n=================================================\n"); } printf("to sunoliko poso twn forwn olwn einai %.2f \nkai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao); system("PAUSE"); return 0; } 1
lektikos Δημοσ. 6 Δεκεμβρίου 2013 Δημοσ. 6 Δεκεμβρίου 2013 int main() { int i,j; float ma,kma,f,fo,kmao; char onoma[40],eponimo[40]; fo=0; kmao=0; for(i=1;i<=3;i++) { printf("dwse to onomateponimo tou upalilou %d : ",i); scanf("%s%s",&onoma,&eponimo); do { printf("\ndwse to miniaio poso apodoxwn tou upalilou (0-3000) : "); scanf("%f",&ma); }while(ma>=3000); if(ma<=700) { f=0*ma; kma=ma-f; printf("\no %s %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,eponimo,ma,f,kma); } else if(ma<=1000) { f=0.15*ma; kma=ma-f; printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } else if(ma>1000) { f=0.03*ma; kma=ma-f; printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } fo=fo+f; kmao=kmao+kma; j=j=1; printf("\n=================================================\n"); } printf("to sunoliko poso twn forwn olwn einai %.2f \nkai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao); system("PAUSE"); return 0; }
imitheos Δημοσ. 6 Δεκεμβρίου 2013 Δημοσ. 6 Δεκεμβρίου 2013 Δεν μπορώ να καταλάβω γιατί κανείς δεν διαβάζει ποτέ τη σύνταξη των συναρτήσεων. s Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null byte ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first Δηλαδή όταν χρησιμοποιείς το format %s του λες να διαβάζει μέχρι το πρώτο κενό. Η βοήθεια επίσης περιέχει παρακάτω [ Matches a nonempty sequence of characters from the specified set of accepted characters; ..... The string is to be made up of characters in (or not in) a particular set; the set is defined by the characters between the open bracket [ character and a close bracket ] character. The set excludes those charac‐ ters if the first character after the open bracket is a circum‐ flex (^). Δηλαδή με την αγκύλη ορίζουμε ένα σετ χαρακτήρων που θέλουμε να διαβάζει η scanf οπότε αν χρησιμοποιήσουμε για παράδειγμα "%[^\n]" (ή κάποια από τις πολλές παραλλαγές που δίνει το google στην ερώτηση "scanf string spaces" το οποίο προφανώς δεν έκανες) θα διαβάζει τα πάντα εκτός από τον "χαρακτήρα" αλλαγής γραμμής οπότε θα διαβάζει ολόκληρο το string που έχει δώσει ο χρήστης μαζί με τα κενά, tabs, οτιδήποτε. Σημειωτέον πως, όπως και το %s, αυτό που έγραψα δεν λαμβάνει μέτρα για να μην ξεπεράσει το μέγεθος 40 του πίνακα. 1
prwtaris Δημοσ. 12 Δεκεμβρίου 2013 Μέλος Δημοσ. 12 Δεκεμβρίου 2013 ευχαριστώ πολύ για τις απαντήσεις.....imithee έκανα αναζήτηση αλλά προφανώς δεν ήταν σωστή και αν σου ήταν τόσο δύσκολο ας μην είχες σχολιάσει σε ευχαριστώ πάντως για την χρήσιμη βοήθεια σου αν και νομίζω ότι δεν είσαι πολύ σωστός γιατί δεν δουλεύει με αυτόν τον τρόπο ενώ με του arc τρέχει.....
sonyxp Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 .... Δηλαδή με την αγκύλη ορίζουμε ένα σετ χαρακτήρων που θέλουμε να διαβάζει η scanf οπότε αν χρησιμοποιήσουμε για παράδειγμα "%[^\n]" (ή κάποια από τις πολλές παραλλαγές που δίνει το google στην ερώτηση "scanf string spaces" το οποίο προφανώς δεν έκανες) θα διαβάζει τα πάντα εκτός από τον "χαρακτήρα" αλλαγής γραμμής οπότε θα διαβάζει ολόκληρο το string που έχει δώσει ο χρήστης μαζί με τα κενά, tabs, οτιδήποτε. Σημειωτέον πως, όπως και το %s, αυτό που έγραψα δεν λαμβάνει μέτρα για να μην ξεπεράσει το μέγεθος 40 του πίνακα. Δεν έχω ασχοληθεί με Regex στην C/C++, οπότε αυτό που δείχνεις μπορούμε να πούμε ότι είναι κάτι σαν Expression. Γενικά η scanf(...) βλέπω ότι έχει μεγάλη δύναμη σε αντίθεση με την Console.Read() στην C# εκτός αν και η Console.Read() έχει κάτι αντίστοιχο (δεν το έχω ψάξει)...
Timonkaipumpa Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 ευχαριστώ πολύ για τις απαντήσεις.....imithee έκανα αναζήτηση αλλά προφανώς δεν ήταν σωστή και αν σου ήταν τόσο δύσκολο ας μην είχες σχολιάσει σε ευχαριστώ πάντως για την χρήσιμη βοήθεια σου αν και νομίζω ότι δεν είσαι πολύ σωστός γιατί δεν δουλεύει με αυτόν τον τρόπο ενώ με του arc τρέχει..... Τι εννοείς δεν δουλεύει με αυτό τον τρόπο; Με τον τρόπο που λέει η function ότι δουλεύει (και παραθέτει ο imetheos) τελικά δεν δουλεύει; Μας κοροϊδεύει η function και το help της; Και το ανακάλυψες εσύ, πού ούτε την σύνταξή δεν παλεύεις καλά καλά, ένα βράδυ στο insomnia;
imitheos Δημοσ. 13 Δεκεμβρίου 2013 Δημοσ. 13 Δεκεμβρίου 2013 ευχαριστώ πολύ για τις απαντήσεις.....imithee έκανα αναζήτηση αλλά προφανώς δεν ήταν σωστή και αν σου ήταν τόσο δύσκολο ας μην είχες σχολιάσει σε ευχαριστώ πάντως για την χρήσιμη βοήθεια σου αν και νομίζω ότι δεν είσαι πολύ σωστός γιατί δεν δουλεύει με αυτόν τον τρόπο ενώ με του arc τρέχει..... Γενικά, εννοείται ότι κάτι που θα γράψω μπορεί να είναι λάθος (αν και προσέχω όσο μπορώ να μην είναι). Το συγκεκριμένο όμως κομμάτι που παρέθεσα ήταν από την τεκμηρίωση του προτύπου για την συνάρτηση (ή για να είμαι πιο σωστός από την manpage στο linux αλλά αμφιβάλλω αν κάτι τόσο βασικό διαφέρει από το πρότυπο) οπότε είναι εξ ορισμού σωστό. Τώρα γιατί δεν σου δούλεψε εξαρτάται από το πώς χρησιμοποίησες αυτό που έγραψα σε συνδυασμό με το πώς έδωσες την είσοδο και αυτό είναι και το βασικό πρόβλημα της scanf και παρόμοιων συναρτήσεων. Όταν δίνεις ένα format στην scanf, πρέπει η είσοδος να δοθεί σύμφωνα με αυτό το format. Δεν έχω ασχοληθεί με Regex στην C/C++, οπότε αυτό που δείχνεις μπορούμε να πούμε ότι είναι κάτι σαν Expression. Γενικά η scanf(...) βλέπω ότι έχει μεγάλη δύναμη σε αντίθεση με την Console.Read() στην C# εκτός αν και η Console.Read() έχει κάτι αντίστοιχο (δεν το έχω ψάξει)... Βλέποντας το από μακρυά, ίσως και αυτό να μπορούμε να το πούμε regular expression αλλά είναι το βασικό σύνολο που υποστηρίζουν οι *scanf συναρτήσεις. Αν θέλεις να κάνεις κάτι σοβαρό με regular expressions υπάρχουν άλλες συναρτήσεις. Όπως και στο shell και παντού χρησιμοποιούμε τις αγκύλες για να δηλώσουμε ένα σύνολο πχ [a-z] έτσι χρησιμοποιείται και εδώ απλά με το ^ στην αρχή για να αντιστρέψουμε το σύνολο. Το %[^\n] σημαίνει διάβασε όσους χαρακτήρες βρίσκονται στο παραπάνω σύνολο δηλαδή όλους εκτός από την newline οπότε θα διαβάσει ολόκληρη την γραμμή. Θα μπορούσαμε μπακάλικα να πούμε ότι το %s είναι συντομογραφία για το %[^ ] δηλαδή διάβασε τα πάντα μέχρι την space. Δεν έχω ασχοληθεί με C# οπότε δεν ξέρω την Console.Read αλλά εφόσον υπάρχει τέτοια υποδομή στην C του 1920 σίγουρα θα υπάρχει κάτι αντίστοιχο (και ίσως απείρως πιο δυνατό) στην C# 1
prwtaris Δημοσ. 14 Δεκεμβρίου 2013 Μέλος Δημοσ. 14 Δεκεμβρίου 2013 ευχαριστώ και πάλι το πρόβλημα τελικά λύθηκε απλά ήθελε και μια fflush(stdin) πριν την scanf() το παραθέτω παρακάτω: #include <stdio.h> #include <stdlib.h> int main(void) { int i,j; float ma,kma,f,fo,kmao; char onoma[40]; fo=0; kmao=0; for(i=1;i<=3;i++) { printf("dwse to onomateponimo tou upalilou\n"); fflush(stdin); scanf("%[^\n]",onoma); do { printf("dwse to miniaio poso apodoxwn tou upalilou pliktrologontas apo 0 ews 3000 euro\n"); scanf("%f",&ma); }while(ma>=3000); if(ma<=700) { f=0*ma; kma=ma-f; printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } else if(ma<=1000) { f=0.15*ma; kma=ma-f; printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } else if(ma>1000) { f=0.03*ma; kma=ma-f; printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma); } fo=fo+f; kmao=kmao+kma; j=j=1; } printf("to sunoliko poso twn forwn olwn einai %.2f kai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao); system("PAUSE"); return 0; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα