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

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

Δημοσ.
  Στις 14/11/2012 στις 2:57 ΜΜ, imitheos είπε

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

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

 

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

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

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

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

Δημοσ.
  Στις 14/11/2012 στις 3:01 ΜΜ, Star_Light είπε

Περα απο την διορθωση που θα πρεπει να γινει για να δουλεψει ο κώδικας... μπορεις να βελτιώσεις τον τροπο ποπυ γράφεις την συνάρτηση δηλώνοντας την με 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) ?

 

Δημοσ.
  Στις 14/11/2012 στις 3:10 ΜΜ, imitheos είπε

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

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

Δημοσ.
  Στις 14/11/2012 στις 3:10 ΜΜ, imitheos είπε

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

 

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

Δημοσ.
  Στις 14/11/2012 στις 3:07 ΜΜ, koslibpro είπε

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

...

 

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

 

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

Δημοσ.
  Στις 14/11/2012 στις 3:07 ΜΜ, koslibpro είπε

 

στην 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.

Δημοσ.
  Στις 14/11/2012 στις 10:29 ΠΜ, Star_Light είπε

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

 

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

 

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

 

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

 

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

 

  Στις 14/11/2012 στις 3:22 ΜΜ, migf1 είπε

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

 

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

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

  • Like 1
Δημοσ.
  Στις 14/11/2012 στις 5:32 ΜΜ, Star_Light είπε

@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 που σου επιστρέφει εκεί (δες την τεκμηρίωση της συνάρτησης για λεπτομέρειες).

Δημοσ.
  Στις 14/11/2012 στις 6:21 ΜΜ, migf1 είπε

 

 

Π.χ. όπως το κάνει η 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:

 

 

  Στις 14/11/2012 στις 9:23 ΜΜ, fonsde είπε

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

εχει κανεις?

 

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

Δημοσ.
  Στις 14/11/2012 στις 8:35 ΜΜ, migf1 είπε

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

 

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

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

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