nkcc Δημοσ. 28 Σεπτεμβρίου 2012 Δημοσ. 28 Σεπτεμβρίου 2012 Ένα πρόβλημα που βλέπω είναι στο διάβασμα των doubles. Άλλαξε το διάβασμα με την scanf_s σε: >scanf_s("%lf",&yo[i]);
migf1 Δημοσ. 28 Σεπτεμβρίου 2012 Δημοσ. 28 Σεπτεμβρίου 2012 Πάντως δεν χρειάζονται 2 loops... > #include <stdio.h> #include <stdlib.h> #define MAXINPUT 256 /* ------------------------------------------------------- * * ------------------------------------------------------- */ int main( void ) { int i; char input[ MAXINPUT ] = {'\0'}; double yo[5] = {0.0}; double sum=0.0, min=0.0, max=0.0; for (i=0; i < 5; i++) { // read yo[i] printf("Enter average of player %d: ", i+1); fgets(input, MAXINPUT, stdin); // get input as string yo[i] = strtod(input, NULL); // convert input to double (unvalidated) if ( 0 == i ) min = max = yo[i]; else { if ( yo[i] > max ) max = yo[i]; if ( yo[i] < min ) min = yo[i]; } sum += yo[i]; } printf( "min: %g, max: %g, avg: %g (%g/%d)\n", min, max, sum/i, sum,i ); system( "pause" ); // windows only exit( EXIT_SUCCESS ); }
capoelo Δημοσ. 28 Σεπτεμβρίου 2012 Μέλος Δημοσ. 28 Σεπτεμβρίου 2012 Ένα πρόβλημα που βλέπω είναι στο διάβασμα των doubles. Άλλαξε το διάβασμα με την scanf_s σε: >scanf_s("%lf",&yo[i]); Έτρεξε κανονικά.Γιατί όμως είχε πρόβλημα με το f(έβγαζε αποτέλεσμα αλλά εντελώς λανθασμένα νούμερα της μορφής:-968645746700000.00000);f δεν χρησιμοποιεί η scanf για double;
migf1 Δημοσ. 28 Σεπτεμβρίου 2012 Δημοσ. 28 Σεπτεμβρίου 2012 ...Γιατί όμως είχε πρόβλημα με το f(έβγαζε αποτέλεσμα αλλά εντελώς λανθασμένα νούμερα της μορφής:-968645746700000.00000);f δεν χρησιμοποιεί η scanf για double; Τσου, %lf χρησιμοποιεί η scanf() για doubles... %f (%a %e %g) χρησιμοποιεί η pintf() είτε έχεις float είτε double πάντως δεν μπορείς να πεις πως δεν σε έχω προειδοποιήσει γενικότερα για τη χρήση της scanf()
Re4cTiV3 Δημοσ. 29 Σεπτεμβρίου 2012 Δημοσ. 29 Σεπτεμβρίου 2012 Δεν μπορουσε να μετατρεψει το string με την atof() ;
migf1 Δημοσ. 29 Σεπτεμβρίου 2012 Δημοσ. 29 Σεπτεμβρίου 2012 Ναι, απλώς με την atof() και να θέλει δεν μπορεί να κάνει validate αυτό που διάβασε (αν π.χ. περιέχει γράμματα θα του επιστρέψει 0). Με τις strto?() μπορούμε μέσω του 2ου ορίσματος (καθώς και της <errno.h>) να αποκτήσουμε πλήρη έλεγχο στο τι μας περνάει και να ανταποκριθούμε ανάλογα (κάτι που δεν κάνω στον παραπάνω κώδικα, για αυτό περνάω ως NULL το 2ο όρισμα... αν δεις όμως για παράδειγμα τον κώδικα του cc-hexview στη σελίδα μου, είναι γεμάτος από strto?() ) EDIT: Βρήκα πρόχειρα ένα παράδειγμα από τον κώδικα του cc-hexview... > /* file: util.c */ ... /*********************************************************//** * ************************************************************* */ int s_to_BookId( const char *s, int maxid ) { int id; char *cpTail = NULL; if ( !s ) return INVIDX; errno = 0; id = (int) strtol( s, &cpTail, 10 ); if ( cpTail == s || '\0' != *cpTail || ERANGE == errno || id < 0 || id > maxid-1 ) return INVIDX; return id; } Η συγκεκριμένη συνάρτηση μετατρέπει το c-string s σε έγκυρο κωδικό σελιδοδείκτη (bookmark id) χρησιμοποιώντας την strtol() πάνω στo s. Το if που ακολουθεί κάνει validate πως το s περιέχει έγκυρο ακέραιο (+ ότι είναι έγκυρο bookmark-id) αλλιώς επιστρέφει INVIDX... (invalid index, αυτή είναι μια σταθερά που την έχω ορίσει εγώ). Το errno είναι καθολική μεταβλητή που ορίζεται όταν κάνεις #include <errno.h> (όπως και η σταθερά ERANGE).
fonsde Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 char * st="DDDD"; γιατι με το st δεν εχω αccess στο string?
moukoublen Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 char * st="DDDD"; γιατι με το st δεν εχω αccess στο string? Έχεις. Μήπως βγαίνεις εκτός ορίων; π.χ. > #include <stdio.h> int main(int argc, char **argv) { char* str = "ABCDE"; putc(str[2],stdout); return 0; } // EXIT: C
imitheos Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 char * st="DDDD"; γιατι με το st δεν εχω αccess στο string? > #include <stdio.h> int main(void) { int i; char *st = "DDDD"; for (i = 0; st[i]; i++) printf("%c\n", st[i]); return 0; } Έξοδος: D D D D Γιατί κάνεις κάτι λάθος. Αν δώσεις παραπάνω λεπτομέρειες ίσως μπορούμε να σου πούμε τι είναι αυτό.
migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 char * st="DDDD"; γιατι με το st δεν εχω αccess στο string? Αν εννοείς πως δεν έχεις write access, τότε είναι επειδή το ορίζεις ως string-literal, αντί για σκέτο string. Άλλαξε τον ορισμό του σε ... > char str[] = "DDDD"; Read-access έχεις έτσι κι αλλιώς και στις 2 περιπτώσεις.
migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 ο migf1 με καταλαβε, αρα ειναι immutable Απλώς το immutable στην ορολογία της C συνήθως αναφέρεται ως literal.
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 http://knking.com/faq.html εδω και καλα λεει οτι μονο οι καθηγητες της ταξης δικαιουνται να έχουν λυσεις στις ασκησεις? εχω λογο που ρωταω. P.S Ακυρο τωρα ειδα το remaining... αρα οι υπολοιπες θεωρουνται οτι θα λυθουν απο τους καθηγητες της ταξης και οχι απο τον ιδιο. Eχει κανει ενα λαθος σε κάποιον λυμενο κωδικα .... θα τον ποσταρω σε λιγο.
migf1 Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 http://knking.com/faq.html εδω και καλα λεει οτι μονο οι καθηγητες της ταξης δικαιουνται να έχουν λυσεις στις ασκησεις? εχω λογο που ρωταω. P.S Ακυρο τωρα ειδα το remaining... αρα οι υπολοιπες θεωρουνται οτι θα λυθουν απο τους καθηγητες της ταξης και οχι απο τον ιδιο. Περίπου, δεν λέει πως μόνο οι καθηγητές τις δικαιούνται, αλλά ότι μόνο για αυτούς είναι διαθέσιμες.
Star_Light Δημοσ. 6 Οκτωβρίου 2012 Δημοσ. 6 Οκτωβρίου 2012 Περίπου, δεν λέει πως μόνο οι καθηγητές τις δικαιούνται, αλλά ότι μόνο για αυτούς είναι διαθέσιμες. Δηλαδη μονο οι καθηγητες που διδασκουν στο πανεπιστημιο δικαιουνται να εχουν διαθεσιμες λυσεις? και εγω που ασχολουμαι μονος μου πως θα διαβασω ? Απο το FAQ? FEQ- ξε μου και γλιστρησα...
Προτεινόμενες αναρτήσεις