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

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

Δημοσ.

Στην scanf τι format έχεις ? Επίσης έχει νόημα η συνάρτηση akeraioi όταν της πετάς int δηλαδή ακεραίους ? Μπορείς να ζητήσεις double από την scanf και εννοείται να είναι double και οι μεταβλητές που της δίνεις για να αποθηκεύσει τις τιμές.

στην scanf εχω %d,δηλαδη για ακεραιους.μαλλον δεν εχει νοημα η συναρτηση οπως λες κι εσυ..την επομενη προταση σου ομως δεν την καταλαβα μπορω να πω..βοηθα με λιγο να καταλαβω τι θελεις να πεις..να διαβαζω double τυπο και ετσι να ελεγχο αν ειναι ακεραιος εννοεις?

 

το διαβασμα συγκεκριμενα γινεται ετσι

>
   scanf("%d",&a);
   scanf("%d",&;

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Περα απο την διορθωση που θα πρεπει να γινει για να δουλεψει ο κώδικας... μπορεις να βελτιώσεις τον τροπο ποπυ γράφεις την συνάρτηση δηλώνοντας την με bool επιστρεφομενο τύπο και καταργόντας την αναγκη του if.

 

>
bool is_integer(int a , int b )
{
return (fmod(a, 1) != 0 || fmod(b, 1) != 0) ? true : false ;
}

Η ίδια παρατήρηση που έκανα πριν. Τι νόημα έχει να τρέξεις την fmod όταν έχεις ακέραια ορίσματα (int a, int B) ?

 

Δημοσ.

Η ίδια παρατήρηση που έκανα πριν. Τι νόημα έχει να τρέξεις την fmod όταν έχεις ακέραια ορίσματα (int a, int B) ?

ααα καταλαβα τι θελεις να πεις,ενταξει!

Δημοσ.

Η ίδια παρατήρηση που έκανα πριν. Τι νόημα έχει να τρέξεις την fmod όταν έχεις ακέραια ορίσματα (int a, int B) ?

 

Δεν εχω καν ιδεα απο που προέρχεται η συνάρτηση fmod και τι κανει ακριβως. Εγω του ειπα απλα να μην βαλει if και να χρησιμοποιησει τον τριαδικο τελεστη για να πάρει bool τιμη... αλλωστε το return του θελει να επιστρεψει ή false ή true . Τα αλλα δεν τα εχω δει.

Δημοσ.

...να διαβαζω double τυπο και ετσι να ελεγχο αν ειναι ακεραιος εννοεις?

...

 

Ναι. Μπορείς να τα διαβάζεις ως doube και κατόπιν να τα περνάς ως τέτοια στην συνάρτηση που ελέγχει αν έχουν δεκαδικά ψηφία (που με τη σειρά της θα τα περνάει σωστά ως double δηλαδή στην fmod.

 

Μια άλλη εναλλακτική είναι να τα διαβάζεις ως strings και να τα μετατρέπεις σε double με την strtod().

Δημοσ.

 

στην scanf εχω %d,δηλαδη για ακεραιους.μαλλον δεν εχει νοημα η συναρτηση οπως λες κι εσυ..την επομενη προταση σου ομως δεν την καταλαβα μπορω να πω..βοηθα με λιγο να καταλαβω τι θελεις να πεις..να διαβαζω double τυπο και ετσι να ελεγχο αν ειναι ακεραιος εννοεις?

 

το διαβασμα συγκεκριμενα γινεται ετσι

>
   scanf("%d",&a);
   scanf("%d",&;

 

Εννοώ να μην διαβάζεις int (δηλαδή με %d) γιατί έτσι η scanf δεν θα διαβάσει σωστά το 2.1 αλλά να βάλεις format για double όπως στο παράδειγμα που έδωσα. Επίσης εννοείται πως θα πρέπει και τα a, b να είναι double.

 

Ίσως το γνωρίζεις ήδη αλλά στην scanf δεν γίνεται το promotion float->double όπως στην printf οπότε πρέπει να βάλεις %lf για double. Επίσης αν δεν σου είναι απαραίτητη η χρήση float για κάποιο λόγο, τότε να χρησιμοποιείς παντού double.

Δημοσ.

Ελα τωρα ρε που χεις χασει την μπάλα με την C# προγραμματιστης άνθρωπος. :P

 

υ.γ ΠΟλυ ωραια η προηγουμενη υλοποιηση σου.... αναιρει και την αναγκη για 2 loop .

 

EDIT: Για να κρατήσεις ολους τους πιθανους χαρακτηρες χρειαζεσαι μια μεταβλητη τυπου char . Για να κρατησεις ομως ολους τους πιθανους + τον EOF δεν θες εναν μεγαλυτερο τυπο δεδομενων ... ο int για παραδειγμα? Ειναι ιδιο με το θεμα που ειχε προκυψει στον επιστρεφομενο τυπο της getchar().

 

http://faq.cprogramm...0&id=1043284351

 

Ναι. Πρόσθεσε ένα (int) cast μπροστά από το *cp στα σημεία που το συγκρίνει με EOF.

 

Ναι. Πρόσθεσε ένα (int) cast μπροστά από το *cp στα σημεία που το συγκρίνει με EOF.

 

Το οποίο βέβαια είναι άχρηστο αν στον compiler σου τα char είναι από default ορισμένα ως unsigned. Σε αυτή την περίπτωση μπορούμε είτε να πούμε στον compiler να χρησιμοποιεί πάντα τον τύπο char ως signed char, είτε να ορίσουμε εξαρχής τον πίνακα input (όπως και το cp) με τύπο int.

 

 

 

Ελα τωρα ρε που χεις χασει την μπάλα με την C# προγραμματιστης άνθρωπος. :P

...

 

Χάνει η μάνα το παιδί και το παιδί τη μάνα με τις στάνταρ βιβλιοθήκες της γλώσσας, μιλάμε για μυριάδες (μη σου πω ότι τις κόβω περισσότερες ακόμα κι από της Java :lol:)

 

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

 

Μαζεύω απορίες και θα τις ποστάρω όλες μαζί εν ευθέτω χρόνο, μαζί με κώδικα προς εντοπισμό κακών πρακτικών, λαθών, κλπ από τους έμπειρους στη γλώσσα).

 

 

 

  • Like 1
Δημοσ.

@migf1 δώσε ενα παραδειγμα με αυτο που λες γιατι κολλαω στο πως θα εκτυπωνω το string εφοσον ειναι int ο τυπος του δεικτη.

 

Π.χ. όπως το κάνει η prompt_for(): http://x-karagiannis.gr/prog/libs/content/misc/other/prompt_for/doc/html/prompt__for_8c_source.html#l00664 (αν κι εκεί το κάνω με fgets() & sscanf() ).

 

Με strtod() χωρίς ελέγχους εγκυρότητας μπορεί να γίνει κάπως έτσι...

 

>

...
#define MAXINPUT  (255+1)
...
   double a;
   char input[MAXINPUT] = {'\0'}
   fgets(input, MAXINPUT, stdin);
   a = strod(input, NULL);

 

Για ελέγχους εγκυρότητας της περνάς τη διεύθυνση έναν char pointer στο 2ο όρισμά της, και κατόπιν εξετάζεις το string που σου επιστρέφει εκεί (δες την τεκμηρίωση της συνάρτησης για λεπτομέρειες).

Δημοσ.

 

 

Π.χ. όπως το κάνει η prompt_for(): http://x-karagiannis.gr/prog/libs/content/misc/other/prompt_for/doc/html/prompt__for_8c_source.html#l00664 (αν κι εκεί το κάνω με fgets() & sscanf() ).

 

Με strtod() χωρίς ελέγχους εγκυρότητας μπορεί να γίνει κάπως έτσι...

 

>

...
#define MAXINPUT  (255+1)
...
   double a;
   char input[MAXINPUT] = {'\0'}
   fgets(input, MAXINPUT, stdin);
   a = strod(input, NULL);

 

Για ελέγχους εγκυρότητας της περνάς τη διεύθυνση έναν char pointer στο 2ο όρισμά της, και κατόπιν εξετάζεις το string που σου επιστρέφει εκεί (δες την τεκμηρίωση της συνάρτησης για λεπτομέρειες).

 

Καλά, ότι να ΄ναι. Σόρρυ ρε συ Κώστα, νόμιζα πως ρώταγες πως να διαβάσεις ως string έναν double :lol:

 

Οπότε, on-topic αυτή τη φορά, για portable παντού όρισε απευθείας τα input[] και *cp explicitly ως: signed char και βάλε (int) cast στο *cp όταν το συγκρίνεις με EOF.

 

Δημοσ.

Ok migf1 .

 

Βασικα αντικατέστησα και την puts με την printf επειδη η πρωτη μου βγαε warning οτι παιρνει const char * σαν παραμετρο.

 

>

#include <stdio.h>
#define MAXINPUT	    (255+1)

int main( void )
{
    signed char input[MAXINPUT] = {'\0'};
    signed char *cp = input + MAXINPUT-2;

    printf("%s", "Enter a message : ");
    while ( '\n' != (*cp = getchar()) && EOF != (int) *cp && cp != input )   // (*)
		    cp--;

    printf( "%s" , ('\n' == *cp || EOF == (int) *cp) ? ++cp : cp );

    return 0;
}

 

Οποτε αυτο εδω διασφαλιζει οτι ο τυπος char μπορει να κρατησει και την τιμή -1 (αν ειναι ορισμενη ετσι η τιμη του EOF) γιατι απο οτι ξερω ειναι system dependent. Το ιδιο θα μπορουσε να κανει κάποιος και για την επιστρεφομενη τιμή της getchar() ????

Δημοσ. (επεξεργασμένο)

Η getchar() από όσο θυμάμαι γυρίζει πάντα int.

 

Αναφορικά με την puts(), αν σε χαλάνε τα warning, μπορείς να κάνεις cast τον cp σε (const char *) ...

 

>
puts( ('\n' == *cp || EOF == (int)*cp) ? (const char *)(++cp) : (const char *)cp );

 

EDIT:

 

Αλλαγή του cast, σε σωστό αυτή τη φορά :lol:

Επεξ/σία από migf1
  • Like 1
Δημοσ.

Το είχα λάθος το cast Κώστα, το διόρθωσα

 

ΥΓ. Δεν μου βγαίνει η τραμπάλα μεταξύ αυτού του νήματος και εκείνου της C# :lol:

 

 

κανα tutorial πανω σε multithreading / mutexes / condition variables . Παραδειγματα κτλπ για design techniques

εχει κανεις?

 

Η τεκμηρίωση του gcc μου έρχεται πρόχειρα στο μυαλό.

Δημοσ.

Οπότε, on-topic αυτή τη φορά, για portable παντού όρισε απευθείας τα input[] και *cp explicitly ως: signed char και βάλε (int) cast στο *cp όταν το συγκρίνεις με EOF.

 

Και τι θα κερδίσει με το (int) cast ?

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...