Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Το παρακάτω πρόγραμμα πρέπει να δέχεται ενα αριθμό με δεκαδικά ψηφία και να τον εμφανίζει σαν δύο ακέραιους.

 

>
#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>

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() στα νούμερα που θες να στρογγυλοποιήσεις.

Δημοσ.

Μπορει γενικότερα καποιος που ψαχνει τα λογικα σφάλματα

στον κωδικα του να βάζει μετα απο εντολές (τμήματα ή μεμονομένες)

μια printf("") για να βλέπει που ακριβως υπάρχει το σκάλωμα.

Δημοσ.

Αν είναι για πάρτη σου, είναι πολύ πιο εύκολο να το κάνεις ως εξής:

 

>
#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("") για να βλέπει που ακριβως υπάρχει το σκάλωμα.

 

Συμφωνώ αλλα τώρα ξέρω που υπάρχει το σκάλωμα να το ξεσκαλώσω θέλω...

Δημοσ.

Είναι άσκηση απο την σχολή απλός για εξάσκηση.

 

Μήπως υπάρχει αλλος τρόπος να το κάνουμε; γιατι υποτίθετε οτι δεν έχουμε μάθει τις συναρτήσεις που αναφέρεις.Για να μας την βάλει θα πρέπει να λύνεται και χωρίς αυτες..[..]

 

Αν και η λύση που έδωσε ο φίλος 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..

Δημοσ.

τα "λάθος αποτελέσματα" οφείλονται στο ότι "χάνεις ακρίβεια" στις πράξεις.

 

αν διδαχθείτε αριθμητική ανάλυση θα καταλάβεις τι παίζει με την ακρίβεια στους υπολογισμούς.

 

ουσιαστικά δεν πρέπει να μετατρέπεις σε ακέραιο παρά μόνο "την τελευταία στιγμή":

 

>
     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);

 

φαντάζομαι μπορείς να το προσαρμόσεις για "άπειρα" ψηφία. Καλή επιτυχία. ;)

Δημοσ.

AMIOX και ουτε θα τις μάθετε τις συναρτήσεις που αναφέρει ο migf1 :D

δεν γινεται να μάθεις μεσα σε ενα εξάμηνο ολοκληρο το API μιας γλώσσας

ο καθηγητης θα κοιταξει να σου δειξει τα βασικα και μετα θα πορευτεις μονος σου.

 

Δικια μου γνωμη ειναι να βαλεις τις συναρτησεις που προτεινε ο migf1 δειχνοντας ετσι

οτι εχεις ψαχθει γενικοτερα και μονος σου με την C. ΔΗλαδη αμα καποιος ασχολιοταν απο

το γυμνασιο και ξερει καλα την γλώσσα και τις περισσοτερες συναρτήσεις της θα πρεπει

ξαφνικα να τις ξεχάσει επειδη δεν εχει προλαβει να τις διδαξει ακομη ο καθηγητης? :D

 

Εγω δεν πιστευω οτι θα υπαρξει προβλημα. Εκτος και αν σου αναφερει στην εκφωνηση τον τροπο

με τον οποιο πρεπει ακριβως να κινηθεις για να λυσεις την ασκηση. Τον αναφερει?

Δημοσ.

έχει νόημα να παρουσιάσει χακιά με string

όταν η άσκηση τους προβληματίζει ως προς int και float;

 

>
#define MAXINPUT (255+1)

 

γιατί 255+1;

Δημοσ.

έχει νόημα να παρουσιάσει χακιά με string

όταν η άσκηση τους προβληματίζει ως προς int και float;

Δεν είναι χακιά. Σε επαγγελματικό περιβάλλον κανείς δεν χρησιμοποιεί την scanf για να διαβάσει input. Στην συντριπτική πλειοψηφία των περιπτώσεων το input διαβάζεται ως string και κατόπιν μετατρέπεται σε ότι χρειάζεται η εφαρμογή.

 

Εφόσον όμως είναι άσκηση, και υποθέτοντας πως την έχουν βάλει επί τούτου, μάλλον δεν είναι καλή ιδέα να το κάνει έτσι (όμως κατά την προσωπική άποψη πάντα, είναι από εκείνες τις περιπτώσεις που δεν έχουν καμία πρακτική εφαρμογή).

Δημοσ.

AMIOX και ουτε θα τις μάθετε τις συναρτήσεις που αναφέρει ο migf1 :D

δεν γινεται να μάθεις μεσα σε ενα εξάμηνο ολοκληρο το API μιας γλώσσας

ο καθηγητης θα κοιταξει να σου δειξει τα βασικα και μετα θα πορευτεις μονος σου.

 

Δικια μου γνωμη ειναι να βαλεις τις συναρτησεις που προτεινε ο migf1 δειχνοντας ετσι

οτι εχεις ψαχθει γενικοτερα και μονος σου με την C. ΔΗλαδη αμα καποιος ασχολιοταν απο

το γυμνασιο και ξερει καλα την γλώσσα και τις περισσοτερες συναρτήσεις της θα πρεπει

ξαφνικα να τις ξεχάσει επειδη δεν εχει προλαβει να τις διδαξει ακομη ο καθηγητης? :D

 

Εγω δεν πιστευω οτι θα υπαρξει προβλημα. Εκτος και αν σου αναφερει στην εκφωνηση τον τροπο

με τον οποιο πρεπει ακριβως να κινηθεις για να λυσεις την ασκηση. Τον αναφερει?

 

:-)

 

Τις ξέρω τις συναρτήσης που πρότεινε ο migf1 δεν είναι τίποτα ούτε θα παραδόσουμε την άσκηση απλά ήθελα να δώ έναν τρόπο που έχει σκεφτεί ο καθηγητής πως θα το κάνουμε χωρίς έτοιμες συναρτήσεις.Επίσεις ξέρω πως δεν θα τις δούμε εισαγωγή στον προγραμματισμό κάνουμε δεν μαθαίνουμε C.

 

Το πρόβλημα λύθηκε σας ευχαριστώ.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...