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

ένα αινιγματάκι στη C


saavedra29

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

Δημοσ.

Γειά σας παιδιά!

Πριν από λίγες μέρες αποφάσισα να μάθω προγραμματισμό. Έτσι πήρα το βιβλίο C προγραμματισμός και ξεκίνησα.

Σε μία άσκηση έχω ένα προβληματάκι που με έχει παιδέψει αρκετά. Ιδού:

 

>/*εισαγωγή τριών αριθμών και προβολή
αθροίσματος, μέσου όρου, γινομένου, ελάχιστου και μέγιστου*/
#include <stdio.h>

int main()
{
int num1 , num2 , num3  ;

printf ( "εισάγετε 3 ακέραιους\n" );
scanf ( "%d%d%d", &num1 , &num2 , &num3);
  printf ("το άθροισμα είναι %d\n" , num1 + num2 + num3 );

printf ( "ο μέσος όρος είναι %d\n" , ( num1 + num2 + num3 ) / 3);

printf ( "το γινόμενο είναι %d\n" , num1 * num2 * num3 );


if ( num1 > num2 , num1 > num3 ) 
printf ( "το μέγιστο είναι το %d\n" , num1 );

if ( num2 > num1 , num2 > num3 )
printf ( "το μέγιστο είναι το %d\n" , num2 );

if ( num3 > num1 , num3 > num2 )
printf ( "το μέγιστο είναι το %d\n" , num3 );

  
  if ( num1 < num2 , num1 < num3 ) 
printf ( "το ελάχιστο είναι το %d\n" , num1 );

if ( num2 < num1 , num2 < num3 )
printf ( "το ελάχιστο είναι το %d\n" , num2 );

if ( num3 < num1 , num3 < num2 )
printf ( "το ελάχιστο είναι το %d\n" , num3 );


  return 0;

  
}

 

και το αποτέλεσμα;

 

>aris@saavedra29:~/προγράμματα c/mine$ ./pro4
εισάγετε 3 ακέραιους
2
5
9
το άθροισμα είναι 16
ο μέσος όρος είναι 5
το γινόμενο είναι 90
το μέγιστο είναι το 9
το ελάχιστο είναι το 2
το ελάχιστο είναι το 5
aris@saavedra29:~/προγράμματα c/mine$ 

 

την τελευταία γραμμή (το ελάχιστο είναι το 5) γιατί μου τη βγάζει;

Δε μπορώ να καταλάβω:confused:

Δημοσ.

if(a , B) δεν σημαίνει "αν άλφα και βήτα", σημαίνει υπολόγισε την τιμή του alfa, υπολόγισε την τιμή του βήτα και γύρισε την τιμή του βήτα". Δηλαδή a, b == b για οποιοδήποτε a και b (εξού και η λάθος έξοδος του προγράμματος).

 

Δοκίμασε αυτό:

 

>
if(a < b && b < c) {
   // c einai maximum, a είναι minimum
}

 

Εγώ θα έγγραφα έτσι το πρόγραμμα:

>
#include <stdio.h>
                                        
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#define MIN(x, y) ((x) > (y) ? (y) : (x))

int main(void) {                                                                          
 int a, b, c;                                                                                                                                                                        
 if(scanf("%d%d%d", &a, &b, &c) == 3) {                                                  
   printf("a8roisma: %d", a + b + c);                                                                                                                                                
   printf("ginomeno: %d", a * b * c);                                                                                                                                                
   printf(" megisto: %d", MAX(a, MAX(b, c)));                                                                                                                                        
   printf(" minimum: %d", MIN(a, MIN(b, c)));                                                                                                                                        
 }                                                                                       
 return 0;                                                                                                                                                                           
}

Δημοσ.

@C6WGMN

 

ΣΥΓΝΩΜΜΗ ΡΕ ΦΙΛΕ, ο αλλος σου λεει οτι πηρε Intro βιβλιο για C και εσυ του δειχνεις κωδικα με εντολη preprocessor και συντομογραφια If statement?

παλι καλα που δεν του εγραψες κωδικα με pthreads για να εκτυπωνει τα αποτελεσματα

 

απλη βοηθεια ζητησε ο φιλος στον υπάρχον κωδικα

Δημοσ.

όντως αυτά που μου πρότεινες c6wgmn δεν τα καταλαβαίνω καθόλου!

Πάντως το πρόβλημα λύθηκε με αυτό που πρότεινε ο teo64x.

Δεν είχα συναντήσει το && στο βιβλίο.Σημαντική παράλειψή του απο τη στιγμή που μου βάζει ένα τέτοιο πρόβλημα.

Σας ευχαριστώ για τη βοήθεια:-)

Δημοσ.

Αφού θες με pthread...

>
#include <stdio.h>  
#include <pthread.h>
                         
struct s { int x, y, z; };

void *myadd(void *s) {
 struct s *p = s;          
 p->x = p->x + p->y + p->z;
 return s;
}                     
void *mymul(void *s) {
 struct s *p = s;          
 p->x = p->x * p->y * p->z;
 return s;
}                     
void *mymin(void *s) {
 struct s *p = s;                         
 #define MIN(x, y) ((x) > (y) ? (y) : (x))
 p->x = MIN(p->x, MIN(p->y, p->z));
 #undef MIN
 return s;
}                     
void *mymax(void *s) {
 struct s *p = s;                         
 #define MAX(x, y) ((x) > (y) ? (x) : (y))
 p->x = MAX(p->x, MAX(p->y, p->z));
 #undef MAX
 return s;
}

int main(void) {
 struct s s;                                         
 const char *msgs[] = {"a8roisma", "pollaplasiasmos",
                       "megalutero", "mikrotero"};
 void *(*f[])(void *) = { myadd, mymul, mymax, mymin };
 pthread_t pt;
 size_t i;
 int v, tmp;
 void *q;                                  
 if(scanf("%d%d%d", &s.x, &s.y, &s.z) != 3)
   return 0;             
 for(i = 0, tmp = s.x; i < 4; i++, s.x = tmp) {                  
   v = pthread_create(&pt, NULL, f[i], &s);
   if(!v && pthread_join(pt, &q) == 0)
     printf("%s: %d\n", msgs[i], s.x);
 }
 return 0;
}

(και αφού φαίνεται ότι χρειάζεται να αιτιολογηθώ):

 

Πρώτον και κύριον εγώ εξήγησα το λάθος του φίλου μας από εδώ. Χρησιμοποίησε το κόμμα αντί για το διπλό ampersant. Έχουνε διαφορετικό νόημα στην γλώσσα και έτσι δεν μπορεί κανεις να περιμένει τα ίδια αποτελέσματα.

 

Δεύτερον, η λογική του να βρείς τον μέγιστο αριθμό από τους τρεις χρησιμοποιώντας μια συναρτήσει που σου δίνει τον μεγαλύτερο από τους δυο είναι λογική και βασική -- πολύ καλύτερη λύση από οποιοδήποτε nested control flow statement. Αν επεκτείνουμε το πρόβλημα σε vectors από αριθμούς, είναι φυσικά ένα take(sort(array, >), 1), σε psevdoalgorithmo, για να βρούμε τον μέγιστο.

 

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

 

Στην τελική, εγώ δεν πληρώνομαι και δεν κατάλαβα, μήπως πρέπει να ζητήσω και συγγνώμη από κανέναν?

Δημοσ.

Νομίζω ότι ο C6WGMN τα είπε μια χαρά στο πρώτο ποστ του, αφού και πού ήταν το πρόβλημα είπε και ποια ήταν η σωστή εναλλακτική.

 

Τώρα για τον κώδικα που έδωσε στο τέλος εκείνου του ποστ του, όντως δε θα είναι κατανοητός στον topic starter για αρχή, αλλά θα αποτελεί ένα καλό παράδειγμα όταν μάθει τι κάνει η #define και τα αδερφάκια της. Δεν είναι της ώρας να εξηγήσω πόσο σημαντικό είναι όχι μόνο να μάθεις (κάποια στιγμή) όλα τα στοιχεία μιας γλώσσας, αλλά να εξασκηθείς και στο να σκέφτεσαι με τέτοιο τρόπο ώστε να εκμεταλλεύεσαι αυτά τα στοιχεία για πιο έξυπνες λύσεις (κάτι που δε γίνεται χωρίς κατάλληλα παραδείγματα). Προσωπικά πιστεύω ότι αν γυρίσει σε δυο εβδομάδες ή ένα μήνα ο topic starter και κοιτάξει εκείνο τον κώδικα, θα κερδίσει κάτι.

Δημοσ.

Δεν είχα συναντήσει το && στο βιβλίο.Σημαντική παράλειψή του απο τη στιγμή που μου βάζει ένα τέτοιο πρόβλημα.

 

Ενδεχομένως τότε το άλλο που μπορεί να θέλεις να χρησιμοποιήσεις είναι το OR

Δηλαδή if(a || B) (|=αυτό που είναι δίπλα στο κεντρικό enter...)

Δημοσ.
καλη συνεχεια φιλε, οπου τα βρεις δυσκολα μην πεις τα παραταω... γραφε εδω για βοηθεια ;)

 

Dark_Sage εννοείται ότι δεν πρόκειται να τα παρατήσω:-)

Ξέρεις τί είναι αυτό που με κέρδισε στον προγραμματισμό; Η τετράγωνη λογική του! Είμαι ορθολογιστής μέχρι αηδίας και μου αρέσει το ότι ο προγραμματισμός βάζει το μυαλό μου να λειτουργεί σε με έναν τρόπο που φαίνεται πολύπλοκος αλλά στην ουσία πιστέυω πως είναι άκρως απλός.Κάτι σαν το σκάκι.

Επίσης μου αρέσει που με βάζει συνέχεια να λύνω προβλήματα που η λύση είναι μπροστά στα μάτια μου και δεν τη βλέπω!

Βέβαια έχω ελάχιστη εμπειρία και μπορεί να κρίνω λάθος.Αλλά αυτή είναι η πρώτη (και πολύ καλή) εντύπωση που μου άφησε.

Δημοσ.
(και αφού φαίνεται ότι χρειάζεται να αιτιολογηθώ):

καλο ειναι να βοηθαμε οχι να κανουμε τους ξερολες

μας ζητησε βοηθεια πανω στον κωδικα του

ελεος... το παιδι τωρα ξεκινησε

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

τουλαχιστον δεν μπηκες ΚΑΝ στον κοπο να του εξηγησεις τι και που κανει αυτος ο εναλλακτικος κωδικας....

 

κανε τωρα τον κωδικα και με sockets

Δημοσ.

ελεος... το παιδι τωρα ξεκινησε

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

τουλαχιστον δεν μπηκες ΚΑΝ στον κοπο να του εξηγησεις τι και που κανει αυτος ο εναλλακτικος κωδικας....

ρε φίλε, μην τρελένεσε.

Και του εξήγησε το λάθος

if(a , B) δεν σημαίνει "αν άλφα και βήτα"
και του είπε τη λύση με το &&
>if(a < b && b < c) {
   // c einai maximum, a είναι minimum
}

Και μετά έβαλε και τα define (που στο K&R είναι απο τα πρώτα παραδείγματα).

 

Πράγματι δεν εξήγησε τα defines, αλλα δεν ήταν και υποχρεωμένος. Δεν πληρώνεται κανένας για το χρόνο που χαλά εδω μέσα...

 

Γι'αυτο.... χαλαράαααα παιδιά, μην εκνευριζόμαστε:-)

Δημοσ.
Νομίζω ότι ο C6WGMN τα είπε μια χαρά στο πρώτο ποστ του, αφού και πού ήταν το πρόβλημα είπε και ποια ήταν η σωστή εναλλακτική.

 

Εγω δεν το νομιζω. Ο C6WGMN τα ειπε μια χαρα._

Λεει που ειναι το λαθος, εξηγει γιατι ειναι λαθος και σου δινει μια εναλλακτικη*(συν τη διορθωση). Ολα αυτα ΤΖΑΜΠΑ!

 

 

* Στην οποια ενας ανθρωπος με κεφι θα κανει το copy paste στο google.

 

 

ΥΓ: καλα ρε xenos, στο μυαλο μου εισαι?

Αρχειοθετημένο

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

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