sk8harddiefast Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 Προσπαθω να φτιαξω ενα προγραμματακι σε C που να υπολογιζει Δεικτη Μαζας Σωματος αλλα εχω ενα θεμα. Ενω το βαρος του το δινω int στην scanf αν δεν δωσω 75.0 δεν το δεχεται! Επισεις στο αποτελεσμα μου γυρναει inf! Kαμια ιδεα τι κανω λαθος? Ο κωδικας ειναι αυτος: #include <stdio.h> main() { int weight; float height, bmi; printf ("Give weight: "); scanf ("%d\n",&weight); printf ("Give height: "); scanf ("%f\n",&height); bmi = weight / (height * height); printf ("Your BMI is: %f\n ", bmi); }
gon1332 Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 Αν βάλεις 75 σκέτο πρέπει να το δέχεται. Αν βάλεις 75.0 δε θα το δεχτεί γιατί είναι double literal. Ο λόγος που σου βγάζει inf είναι ότι δίνεις κάποια ασύμβατη τιμή στην πρώτη scanf, πχ 75.0, σταματά η ανάγνωση πριν το '.' και η επόμενη scanf αυτόματα διαβάζει από την τελεία και μετά, άρα ".0", το οποίο είναι ο αριθμός 0 σε double. Αποθηκεύεται στο height και στην συνέχεια κάνεις διαίρεση με 0. Αν έβαζες 75.1 δε θα έκανες διαίρεση με μηδέν. ΟΠΟΤΕ: Γιατί να βάλεις το weight integer; Αφού είναι float στην πραγματικότητα. ΑΝ ντε και καλά τον θες integer, τότε θα εισάγεις integers. Τέλος, έχεις διαίρεση με μεταβλητή που αρχικοποιεί ο χρήστης στον διαιρέτη. Πρέπει να κάνεις έλεγχο πριν κάνεις τη διαίρεση.
imitheos Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 Ενω το βαρος του το δινω int στην scanf αν δεν δωσω 75.0 δεν το δεχεται! scanf ("%d\n",&weight); scanf ("%f\n",&height); Περνάει την πρώτη scanf όχι επειδή δίνεις δεκαδικό 75.0 αλλά επειδή δίνεις σκουπίδια μετά το 75. Και "75 κκ" να έδινες πάλι θα περνούσε την πρώτη scanf. Αυτό γίνεται γιατί έβαλες το \n στην scanf. Αν σβήσεις το \n και από τις δύο scanf, τότε θα σου παίζει κανονικά με το σκέτο 75. Όσον αφορά το inf είναι αυτό που είπε ο gon ότι το περισσευούμενο input το δέχεται η δεύτερη scanf οπότε το height σου γίνεται 0 λόγω του .0 που υπάρχει στο 75.0
gon1332 Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 Παίζει όχι επειδή δίνεις δεκαδικό 75.0 αλλά επειδή δίνεις σκουπίδια μετά το 75. Και "75 κκ" να έδινες πάλι θα περνούσε την πρώτη scanf. Αυτό γίνεται γιατί έβαλες το \n στην scanf. Αν σβήσεις το \n και από τις δύο scanf, τότε θα σου παίζει όπως θέλεις. Έχω την εντύπωση πως δε θα διορθωθεί το πρόβλημα. Τα ίδια.
sk8harddiefast Δημοσ. 23 Σεπτεμβρίου 2015 Μέλος Δημοσ. 23 Σεπτεμβρίου 2015 Και ομως. Χωρις τα \n επαιξε σωστα!!!!! Αλλα γιατι ρε παιδια? Το \n σημαινει new line και υποτιθεται πως μετα το 75 -> enter θα μου εβγαζε την επομενη scanf απο κατω. Τουλαχιστον ετσι μου το εκανε παντα. Τωρα μου παει απο κατω γραμμη χωρις το \n. Λες και το καταλαβαινει απο μονο του.
makisser Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 αντικατεστησε την σειρα bmi = weight / (height * height); με bmi=(float)weigth/(height*height); και τωρα που το βλεπω στην scanf δεν εχει λογικη το "\n" μονο στην printf εχει που εμφανιζει και κατι στη οθονη.. δουλευει σωστα αν δεν βαλεις την λεξη float μπροστα απο την πραξη?
sk8harddiefast Δημοσ. 23 Σεπτεμβρίου 2015 Μέλος Δημοσ. 23 Σεπτεμβρίου 2015 Γιατι ειναι κακο να διαιρεις ακαιρεο με δεκαδικο? Αφου το αποτελεσμα θα ειναι δεκαδικο και το δηλωνω πανω
imitheos Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 (επεξεργασμένο) Έχω την εντύπωση πως δε θα διορθωθεί το πρόβλημα. Τα ίδια. Όταν λες δεν λύθηκε το "πρόβλημα", τι εννοείς ? Edit: τώρα πρόσεξα στο ideone τι εννούσες. Ναι δίνοντας "75.0" εννοείται πως δεν θα παίξει σωστά ακόμη και χωρίς το \n. Αυτό που εννοούσα ήταν ότι θα του παίξει σωστά το σκέτο 75. Και ομως. Χωρις τα \n επαιξε σωστα!!!!! Αλλα γιατι ρε παιδια? Το \n σημαινει new line και υποτιθεται πως μετα το 75 -> enter θα μου εβγαζε την επομενη scanf απο κατω. Τουλαχιστον ετσι μου το εκανε παντα. Τωρα μου παει απο κατω γραμμη χωρις το \n. Λες και το καταλαβαινει απο μονο του.Όχι δεν σου το έκανε έτσι πάντα γιατί το \n δεν σημαίνει newline. Η λειτουργία της scanf διαφέρει από αυτήν της printf. Όταν λες scanf("%d\n", &i) δεν σημαίνει "να περιμένεις ότι θα δώσω ένα ακέραιο τον οποίο θα τελειώσω δίνοντας newline οπότε και θα τον αποθηκεύσεις στην μεταβλητή i" αλλά "θα διαβάσεις μια σειρά χαρακτήρων που στην αρχή θα έχει κάτι που να είναι ακέραιος και μετά θα έχει χαρακτήρες κενών (tab, space, newline, κτλ). Όταν το κάνεις αυτό, τότε αποθήκευσε το κομμάτι που μοιάζει με ακέραιο στην μεταβλητή i". Έτσι, βάζοντας το \n λες στην scanf να συνεχίσει να διαβάζει μέχρι να λάβει κάτι που να μην είναι χαρακτήρας κενού οπότε όσα enter (ή space ή tab) και να πατήσεις, δεν πρόκειται να σταματήσει μέχρι να δώσεις κάτι που να μην είναι κενό. Για αυτό είπα πριν ότι και "75 κκ" να έδινες θα περνούσε την πρώτη scanf (αλλά φυσικά δεν θα έπαιζε σωστά η δεύτερη γιατί το κκ δεν είναι δεκαδικός αριθμός). αντικατεστησε την σειρα bmi = weight / (height * height); με bmi=(float)weigth/(height*height); και τωρα που το βλεπω στην scanf δεν εχει λογικη το "\n" μονο στην printf εχει που εμφανιζει και κατι στη οθονη.. δουλευει σωστα αν δεν βαλεις την λεξη float μπροστα απο την πραξη? Θα γίνει διαίρεση ενός ακεραίου με ένα δεκαδικό άρα θα γίνει δεκαδική διαίρεση ακόμη και αν δεν υπάρχει το float cast. Εννοείται πως δεν κάνει κακό να το βάλει απλά δεν χρειάζεται σε αυτή την περίπτωση. Γιατι ειναι κακο να διαιρεις ακαιρεο με δεκαδικο? Αφου το αποτελεσμα θα ειναι δεκαδικο και το δηλωνω πανω Θα παίξει σωστά έτσι που το έχεις αλλά έχε υπόψην σου ότι δεν παίζει σωστά "επειδή το δηλώνεις δεκαδικό πάνω". Τι είδους διαίρεση θα γίνει εξαρτάται από τους τελεστέους της διαίρεσης και όχι από τι έχεις δηλώσει την μεταβλητή στην οποία θα αποθηκευτεί το αποτέλεσμα της διαίρεσης. float f; int weight; scanf("%d", &weight); f = weight / 2; printf("%f\n", f); Έξοδος: 75 37.0000000 Για να γίνει πιο κατανοητό αυτό που λέω, δες το παραπάνω παράδειγμα. Ενώ δίνω τιμή 75 στο weight και ενώ "δηλώνω πάνω δεκαδικό" το f, παίρνω αποτέλεσμα 37 αντί για 37.5. Επειδή και οι δύο τελεστέοι της διαίρεσης (weight και 2) είναι ακέραιοι, πραγματοποιείται ακέραια διαίρεση και όχι δεκαδική. Εδώ θα πρέπει να χρησιμοποιήσεις το float cast που σου έδειξε ο makisser. Επεξ/σία 23 Σεπτεμβρίου 2015 από imitheos
sk8harddiefast Δημοσ. 23 Σεπτεμβρίου 2015 Μέλος Δημοσ. 23 Σεπτεμβρίου 2015 Ευχαριστω πολυ Το αλλαξα οπως μου ειπες. Καταλαβα την διαφορα Θα προσπαθησω να το επεκτεινω και να βαλλω επιλογη ανδρας η γυναικα για να γυρναει διαφορετικα αποτελεσματα
imitheos Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 Ευχαριστω πολυ Το αλλαξα οπως μου ειπες. Καταλαβα την διαφορα Θα προσπαθησω να το επεκτεινω και να βαλλω επιλογη ανδρας η γυναικα για να γυρναει διαφορετικα αποτελεσματα Χαίρομαι που το κατάλαβες. Για όσους δεν το κατάλαβαν, ας δούμε ένα παράδειγμα με το %c που θα φανεί καλύτερα αυτό που ήθελα να πω. Ας υποθέσουμε ότι έχουμε το παρακάτω αρχείο το οποίο θέλουμε να κάνουμε parse και να διαβάσουμε τα νούμερα. 1 2 3 4 5 6 7 0 Όπως βλέπουμε, το αρχείο έχει κενές γραμμές και tabs ανάμεσα στα νούμερα. Χάριν ευκολίας, ας υποθέσουμε ότι δεν μπορούμε να αλλάξουμε την μορφή του και είμαστε υποχρεωμένοι να το κάνουμε parse έτσι. #include <stdio.h> int main(void) { char c = 1; printf("You gave "); while (c != '0') { scanf("%c",&c); printf("'%c'(%d)\n",c, c); } return 0; } Εδώ έχουμε ένα κώδικα σαν το δικό σου που διαβάζει ένα-ένα τους χαρακτήρες και μας τους εμφανίζει. Η έξοδος που θα πάρουμε είναι η ακόλουθη. % cat myinput | ./a.out You gave '1'(49) ' '(10) ' '(10) '2'(50) ' '(10) ' '(9) '3'(51) ' '(10) '4'(52) ' '(10) ' '(10) '5'(53) ' '(9) ' '(9) '6'(54) ' '(10) ' '(10) '7'(55) ' '(10) ' '(10) '0'(48) Όπως βλέπουμε, μας εμφανίζει και τις newlines (10) και τα tabs (9) οπότε δεν μπορούμε να δουλέψουμε γιατί εμείς θέλουμε μόνο τους αριθμούς. Ας δούμε τώρα το ίδιο με scanf("%c\n"). You gave '1'(49) '2'(50) '3'(51) '4'(52) '5'(53) '6'(54) '7'(55) '0'(48) Λόγω του \n στο format, η scanf διάβασε και αγνόησε όλους τους χαρακτήρες κενού και μας έδωσε μόνο αυτό που θέλαμε. Σημειοτέον ότι το \n δεν σημαίνει newline αλλά όλους τους χαρακτήρες κενού. Μπορείς να δοκιμάσεις με format "%c " και θα πάρεις ακριβώς το ίδιο αποτέλεσμα. Ο λόγος που έγραψα το παράδειγμα με το %c είναι γιατί πιστεύω πως αυτή η συμπεριφορά της scanf είναι και η αιτία που δημιουργείται αυτή η σύγχυση με το \n. Σε όλα τα format πλην του %c, η scanf αγνοεί από μόνη της όλους τους χαρακτήρες κενού που υπάρχουν πριν τον αριθμό οπότε και δεν μπορεί να καταλάβει ο μαθητής τι διαφορά έχει το "%d" με το "%d\n" (ή το "%d " ή το " %d", κτλ).
DDevil Δημοσ. 23 Σεπτεμβρίου 2015 Δημοσ. 23 Σεπτεμβρίου 2015 Υπάρχουν και χαρακτήρες whitespace ομως που δεν ειναι newline αρα απορω πως δουλευει σωστά το scanf("%c\n", &c); πως θα κάνει το matching η scanf με το \n αν βρει χαρακτηρα που δεν ειναι newline , εγω χρησιμοποιώ μεχρι τωρα οταν χρειαστει μονο το scanf(" %c" , &c); ακριβως επειδη ένας newline ανηκει στην κατηγορια των white αλλα οχι το αντιστροφο. Και υπάρχουν και καλυτερες συναρτήσεις απο το να παιδευεσαι με την scanf ουτε στις συμβολοσειρές βοηθάει.
migf1 Δημοσ. 24 Σεπτεμβρίου 2015 Δημοσ. 24 Σεπτεμβρίου 2015 Η δική μου γνώμη είναι να παρατήσεις την scanf() όταν κάνεις interactive-input, και να την αντικαταστήσεις είτε με fgets() + strtoXXX() / sscanf(), είτε αντί για fgets() να φτιάξεις μια δικιά σου εκδοχή της depreciated gets() που να παίρνει σαν όρισμα το μέγιστο μήκος του string και να κάνει και clear/flush to input buffer σε περίπτωση υπερχείλισης.
filippos723 Δημοσ. 28 Σεπτεμβρίου 2015 Δημοσ. 28 Σεπτεμβρίου 2015 υπαρχει κανενας που να εχει γνωσεις για κατασκευη hack σε online παιχνιδι ;; καλη πληρωμη
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα