AMIOX? Δημοσ. 22 Ιανουαρίου 2012 Δημοσ. 22 Ιανουαρίου 2012 Το παρακάτω πρόγραμμα πρέπει να δέχεται ενα αριθμό με δεκαδικά ψηφία και να τον εμφανίζει σαν δύο ακέραιους. > #include<stdio.h> #include<stdlib.h> int main(void) { float num,flo; int inte,in; printf("Dwste enan pragmatiko arithmo"); scanf("%f",&num); inte=(int)num; flo=num-inte; do { flo*=10; in=(int)flo; printf("%d",in); flo-=in; }while(flo!=0); printf(" %d",inte); system("PAUSE"); return(0); } Όταν δίνω 4.8 εμφανίζει: 80000019073486328125 4 ή 4.7 εμφανίζει: 69999980926513671875 4
Anubis13 Δημοσ. 22 Ιανουαρίου 2012 Δημοσ. 22 Ιανουαρίου 2012 Καλα βλακειες γραφω...Θα το φτιαξω τωρα..
migf1 Δημοσ. 22 Ιανουαρίου 2012 Δημοσ. 22 Ιανουαρίου 2012 Το παρακάτω πρόγραμμα πρέπει να δέχεται ενα αριθμό με δεκαδικά ψηφία και να τον εμφανίζει σαν δύο ακέραιους. > #include<stdio.h> #include<stdlib.h> int main(void) { float num,flo; int inte,in; printf("Dwste enan pragmatiko arithmo"); scanf("%f",&num); inte=(int)num; flo=num-inte; do { flo*=10; in=(int)flo; printf("%d",in); flo-=in; }while(flo!=0); printf(" %d",inte); system("PAUSE"); return(0); } Όταν δίνω 4.8 εμφανίζει: 80000019073486328125 4 ή 4.7 εμφανίζει: 69999980926513671875 4 Αν είναι για πάρτη σου, είναι πολύ πιο εύκολο να το κάνεις ως εξής: > #include <stdio.h> #include <stdlib.h> #define MAXINPUT (255+1) int main( void ) { long intpart = 0, fractpart = 0; char input[ MAXINPUT ] = {'\0'}, *tail = NULL; printf("Dwste enan pragmatiko arithmo: "); fgets( input, MAXINPUT, stdin ); intpart = strtol( input, &tail, 10 ); fractpart = atol( ++tail ); printf( "%ld %ld\n", intpart, fractpart ); system("PAUSE"); return 0; } Βάλε αν θες και σχετικούς ελέγχους για τις περιπτώσεις αποτυχίας της strtol()... δες την τεκμηρίωσή της. Αν είναι για άσκηση/εργασία... μπορείς να παίξεις με τις συναρτήσεις: fmodf() ή/και modff()... κι έτσι όπως το έχεις, δοκίμασε την round() στα νούμερα που θες να στρογγυλοποιήσεις.
Star_Light Δημοσ. 22 Ιανουαρίου 2012 Δημοσ. 22 Ιανουαρίου 2012 Μπορει γενικότερα καποιος που ψαχνει τα λογικα σφάλματα στον κωδικα του να βάζει μετα απο εντολές (τμήματα ή μεμονομένες) μια printf("") για να βλέπει που ακριβως υπάρχει το σκάλωμα.
AMIOX? Δημοσ. 23 Ιανουαρίου 2012 Μέλος Δημοσ. 23 Ιανουαρίου 2012 Αν είναι για πάρτη σου, είναι πολύ πιο εύκολο να το κάνεις ως εξής: > #include <stdio.h> #include <stdlib.h> #define MAXINPUT (255+1) int main( void ) { long intpart = 0, fractpart = 0; char input[ MAXINPUT ] = {'\0'}, *tail = NULL; printf("Dwste enan pragmatiko arithmo: "); fgets( input, MAXINPUT, stdin ); intpart = strtol( input, &tail, 10 ); fractpart = atol( ++tail ); printf( "%ld %ld\n", intpart, fractpart ); system("PAUSE"); return 0; } Βάλε αν θες και σχετικούς ελέγχους για τις περιπτώσεις αποτυχίας της strtol()... δες την τεκμηρίωσή της. Αν είναι για άσκηση/εργασία... μπορείς να παίξεις με τις συναρτήσεις: fmodf() ή/και modff()... κι έτσι όπως το έχεις, δοκίμασε την round() στα νούμερα που θες να στρογγυλοποιήσεις. Είναι άσκηση απο την σχολή απλός για εξάσκηση. Μήπως υπάρχει αλλος τρόπος να το κάνουμε; γιατι υποτίθετε οτι δεν έχουμε μάθει τις συναρτήσεις που αναφέρεις.Για να μας την βάλει θα πρέπει να λύνεται και χωρίς αυτες.. Μπορει γενικότερα καποιος που ψαχνει τα λογικα σφάλματα στον κωδικα του να βάζει μετα απο εντολές (τμήματα ή μεμονομένες) μια printf("") για να βλέπει που ακριβως υπάρχει το σκάλωμα. Συμφωνώ αλλα τώρα ξέρω που υπάρχει το σκάλωμα να το ξεσκαλώσω θέλω...
Directx Δημοσ. 23 Ιανουαρίου 2012 Δημοσ. 23 Ιανουαρίου 2012 Είναι άσκηση απο την σχολή απλός για εξάσκηση. Μήπως υπάρχει αλλος τρόπος να το κάνουμε; γιατι υποτίθετε οτι δεν έχουμε μάθει τις συναρτήσεις που αναφέρεις.Για να μας την βάλει θα πρέπει να λύνεται και χωρίς αυτες..[..] Αν και η λύση που έδωσε ο φίλος migf1 είναι η ενδεδειγμένη. Θα μπορούσες να το κάνεις με την βοήθεια της sscanf (ελπίζω να την έχετε διδαχθεί). Σε αυτή την περίπτωση προϋποθέτω ότι η υποδιαστολή είναι είτε τύπου '.' ή ',' ως: > /* Split real using sscanf, xdir. */ #include <stdio.h> int main(void) { char szInput[bUFSIZ]; printf("Dwste enan pragmatiko arithmo:"); if(!fgets(szInput, BUFSIZ, stdin)) printf(" Error: Invalid input!\n"); else { int A = 0, B = 0; char S = 0; /* Read real number using sscanf into A & B integers, S will be the separator */ if(!sscanf(szInput, "%d%c%d", &A, &S, & || (S != '.' && S != ',')) printf(" Error: Bad input!\n"); else printf(" = %d %d\n", A, ; } printf("Press Enter to exit.."); getchar(); return 0; } ΕΞΟΔΟΣ: > Dwste enan pragmatiko arithmo:10.20 = 10 20 Press Enter to exit..
twiner Δημοσ. 23 Ιανουαρίου 2012 Δημοσ. 23 Ιανουαρίου 2012 τα "λάθος αποτελέσματα" οφείλονται στο ότι "χάνεις ακρίβεια" στις πράξεις. αν διδαχθείτε αριθμητική ανάλυση θα καταλάβεις τι παίζει με την ακρίβεια στους υπολογισμούς. ουσιαστικά δεν πρέπει να μετατρέπεις σε ακέραιο παρά μόνο "την τελευταία στιγμή": > float num,flo; int int1, int2, int3; printf("Dwste enan pragmatiko arithmo"); scanf("%f",&num); int1=num; //μετατροπή σε ακέραιο printf(" %d\n",int1); flo = num*10; //πράξη με ακρίβεια int2 = flo; //μετατροπή σε ακέραιο int2-=int1*10; printf(" %d\n",int2); flo = num*100; //πράξη με ακρίβεια int3 = flo; //μετατροπή σε ακέραιο int3-=int1*100 + int2*10; printf(" %d\n",int3); φαντάζομαι μπορείς να το προσαρμόσεις για "άπειρα" ψηφία. Καλή επιτυχία.
Star_Light Δημοσ. 23 Ιανουαρίου 2012 Δημοσ. 23 Ιανουαρίου 2012 AMIOX και ουτε θα τις μάθετε τις συναρτήσεις που αναφέρει ο migf1 δεν γινεται να μάθεις μεσα σε ενα εξάμηνο ολοκληρο το API μιας γλώσσας ο καθηγητης θα κοιταξει να σου δειξει τα βασικα και μετα θα πορευτεις μονος σου. Δικια μου γνωμη ειναι να βαλεις τις συναρτησεις που προτεινε ο migf1 δειχνοντας ετσι οτι εχεις ψαχθει γενικοτερα και μονος σου με την C. ΔΗλαδη αμα καποιος ασχολιοταν απο το γυμνασιο και ξερει καλα την γλώσσα και τις περισσοτερες συναρτήσεις της θα πρεπει ξαφνικα να τις ξεχάσει επειδη δεν εχει προλαβει να τις διδαξει ακομη ο καθηγητης? Εγω δεν πιστευω οτι θα υπαρξει προβλημα. Εκτος και αν σου αναφερει στην εκφωνηση τον τροπο με τον οποιο πρεπει ακριβως να κινηθεις για να λυσεις την ασκηση. Τον αναφερει?
twiner Δημοσ. 24 Ιανουαρίου 2012 Δημοσ. 24 Ιανουαρίου 2012 έχει νόημα να παρουσιάσει χακιά με string όταν η άσκηση τους προβληματίζει ως προς int και float; > #define MAXINPUT (255+1) γιατί 255+1;
migf1 Δημοσ. 24 Ιανουαρίου 2012 Δημοσ. 24 Ιανουαρίου 2012 έχει νόημα να παρουσιάσει χακιά με string όταν η άσκηση τους προβληματίζει ως προς int και float; Δεν είναι χακιά. Σε επαγγελματικό περιβάλλον κανείς δεν χρησιμοποιεί την scanf για να διαβάσει input. Στην συντριπτική πλειοψηφία των περιπτώσεων το input διαβάζεται ως string και κατόπιν μετατρέπεται σε ότι χρειάζεται η εφαρμογή. Εφόσον όμως είναι άσκηση, και υποθέτοντας πως την έχουν βάλει επί τούτου, μάλλον δεν είναι καλή ιδέα να το κάνει έτσι (όμως κατά την προσωπική άποψη πάντα, είναι από εκείνες τις περιπτώσεις που δεν έχουν καμία πρακτική εφαρμογή).
AMIOX? Δημοσ. 24 Ιανουαρίου 2012 Μέλος Δημοσ. 24 Ιανουαρίου 2012 AMIOX και ουτε θα τις μάθετε τις συναρτήσεις που αναφέρει ο migf1 δεν γινεται να μάθεις μεσα σε ενα εξάμηνο ολοκληρο το API μιας γλώσσας ο καθηγητης θα κοιταξει να σου δειξει τα βασικα και μετα θα πορευτεις μονος σου. Δικια μου γνωμη ειναι να βαλεις τις συναρτησεις που προτεινε ο migf1 δειχνοντας ετσι οτι εχεις ψαχθει γενικοτερα και μονος σου με την C. ΔΗλαδη αμα καποιος ασχολιοταν απο το γυμνασιο και ξερει καλα την γλώσσα και τις περισσοτερες συναρτήσεις της θα πρεπει ξαφνικα να τις ξεχάσει επειδη δεν εχει προλαβει να τις διδαξει ακομη ο καθηγητης? Εγω δεν πιστευω οτι θα υπαρξει προβλημα. Εκτος και αν σου αναφερει στην εκφωνηση τον τροπο με τον οποιο πρεπει ακριβως να κινηθεις για να λυσεις την ασκηση. Τον αναφερει? Τις ξέρω τις συναρτήσης που πρότεινε ο migf1 δεν είναι τίποτα ούτε θα παραδόσουμε την άσκηση απλά ήθελα να δώ έναν τρόπο που έχει σκεφτεί ο καθηγητής πως θα το κάνουμε χωρίς έτοιμες συναρτήσεις.Επίσεις ξέρω πως δεν θα τις δούμε εισαγωγή στον προγραμματισμό κάνουμε δεν μαθαίνουμε C. Το πρόβλημα λύθηκε σας ευχαριστώ.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα