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

Διατάξεις αλφαριθμητικών στη C


capoelo

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

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

Δηλαδή το τεστάρισες και διαπίστωσες πως λειτουργεί σωστά η συνθήκη if του κώδικα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 63
  • Δημ.
  • Τελ. απάντηση

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

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

errors δεν βγάζει,warnings δεν βγάζει,ο κώδικας τρέχει κανονικά και το μόνο πρόβλημα είναι αυτό που ανέφερα παραπάνω.

Φίλε capoelo γνωρίζεις πως βοηθάω όσο μπορώ & ξέρω στο φόρουμ. Έχω απαντήσει πολλές φορές και σε δικές σου απορίες. Όμως από ένα σημείο και μετά θα πρέπει να προσπαθείς και μόνος σου, αλλιώς ούτε πρόκειται να μάθεις αλλά κυρίως προδιαθέτεις αρνητικά και τον άλλον να σε βοηθήσει όταν διαπιστώνει πως δεν ασχολείσαι να βρεις ούτε τα πλέον εύκολα bugs.

 

Σου πρότεινα ήδη να κάνεις debug τον κώδικα, σου υπέδειξα κιόλας κι ένα οφθαλμοφανές σημείο του που έχει πρόβλημα (ενδεχομένως να έχει κι αλλού, γιατί -no offense- δεν κάθομαι να κάνω trace κώδικα που χρησιμοποιεί goto αντί για loop).

 

Αν δεν ξέρεις τι είναι ο debugger, είναι μια 1ης τάξεως ευκαιρία να μάθεις και να αρχίσεις να τον χρησιμοποιείς. Αν βαριέσαι να ασχοληθείς μόνος σου, είναι εξαιρετικά απίθανο να βρεις άλλους να σου κάνουν μονίμως debug τους κώδικές σου. Μπορεί να το κάνουν 2-3 φορές, αλλά μετά δεν ασχολούνται (και με το δίκιο τους).

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σου πρότεινα ήδη να κάνεις debug τον κώδικα, σου υπέδειξα κιόλας κι ένα οφθαλμοφανές σημείο του που έχει πρόβλημα.

 

Ότι το πρόγραμμα είναι πολύ άσχημα γραμμένο (no offense επίσης) συμφωνώ. Αλλά με το if δε βλέπω κάποιο τεχνικό πρόβλημα. Μήπως φταίει που δεν έχω πιει καφέ ακόμα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ότι το πρόγραμμα είναι πολύ άσχημα γραμμένο (no offense επίσης) συμφωνώ. Αλλά με το if δε βλέπω κάποιο τεχνικό πρόβλημα. Μήπως φταίει που δεν έχω πιει καφέ ακόμα;

 

Καλημέρα,

 

τώρα που το λες και το βλέπω, όντως δεν έχει τεχνικό πρόβλημα το if... αν και νομίζω πως δεν έχει γίνει συνειδητά η σύγκριση των διευθύνσεων αντί για σύγκριση των περιεχομένων των strings (δουλεύει either way επειδή είναι ορισμένα ως string-literals). Θα φτιάξω (άλλο) ένα καφεδάκι κι εγώ και θα κοιτάξω όλο τον κώδικα.

 

EDIT:

 

Βασικά, η λογική του να κάνεις map το μήκος του string εισόδου σε ένα από τα 3 string literals και κατόπιν να το συγκρίνεις με το p[2] ποια είναι;

 

Τι ακριβώς είπαμε θέλει να κάνει αυτός ο κώδικας;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, σαφώς και είναι "ποντιακή" μέθοδος και πιθανότατα όπως λες δεν έγινε συνειδητά (και αν κανείς το κάνει αυτό συνειδητά να του καεί το πληκτρολόγιο και για replacement να του δώσουν Wii Remote :P). Και πάλι όμως, θα έπρεπε να δουλεύει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, σαφώς και είναι "ποντιακή" μέθοδος και πιθανότατα όπως λες δεν έγινε συνειδητά (και αν κανείς το κάνει αυτό συνειδητά να του καεί το πληκτρολόγιο και για replacement να του δώσουν Wii Remote :P). Και πάλι όμως, θα έπρεπε να δουλεύει.

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

 

>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void )
{
char	*cp = NULL, *p[]={ "Yes", "No", "Maybe.Rephrase the question" };
char	q[80] = {'\0'};

printf("rwta me");
do {
	printf(": ");
	fgets( q, 80, stdin );
	cp = p[ strlen(q) % 3];
	puts( cp );
} while (cp == p[2] );

system("pause");

exit(0);
}

 

EDIT:

 

Ξέχασα να πω γιατί θα τον έγραφα έτσι: για να είναι πιο εμφανές ότι συγκρίνω διευθύνσεις και όχι περιεχόμενα (και φυσικά για να μη έχω goto).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>char    q[80] = {'\0'};

 

Φλύαρε... :-D

 

Σε πιο σοβαρό επίπεδο, εγώ θα έμπαινα και στον κόπο να ξηλώσω όλα τα magic και να δουλεύω παντού με sizeof.

Δεν είναι μόνο θέμα φλυαρίας αυτό ρε συ, είναι κυρίως θέμα ασφάλειας σε συνδυασμό με το 79 στην fgets(). Σε περίπτωση που μου δώσει >79 chars στην είσοδο θέλω να σιγουρέψω πως θα είναι null-terminated το string της εισόδου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ήμουν πολύ λακωνικός και δεν το έπιασες:

 

>char    q[80] = { 0 };

Αααα......... :lol:

 

Τελικά ούτε το ένα χρειάζεται, ούτε το άλλο... και η fgets() πρέπει να γραφτεί με 80 μέσα της. Μπέρδεψα την συμπεριφορά της fgets() με της strncpy() :P

 

EDIT: μόλις διόρθωσα και τον κώδικα ανάλογα. Για τα magic συμφωνούμε, μόνο που εγώ προτιμώ να τα "επιλύω" χρησιμοποιώντας #define για αυτά, κυρίως επειδή το sizeof() έχει πρόβλημα μέσα σε συναρτήσεις όταν εφαρμόζεται σε ορίσματα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε capoelo γνωρίζεις πως βοηθάω όσο μπορώ & ξέρω στο φόρουμ. Έχω απαντήσει πολλές φορές και σε δικές σου απορίες. Όμως από ένα σημείο και μετά θα πρέπει να προσπαθείς και μόνος σου, αλλιώς ούτε πρόκειται να μάθεις αλλά κυρίως προδιαθέτεις αρνητικά και τον άλλον να σε βοηθήσει όταν διαπιστώνει πως δεν ασχολείσαι να βρεις ούτε τα πλέον εύκολα bugs.

 

Αγαπητέ migf1(no offense όπως λες κι εσύ για αυτά που θα διαβάσεις παρακάτω)αλλά μήπως-λέω μήπως-μπήκες καθόλου στον κόπο να σκεφτείς ότι δεν έχω φτάσει ακόμα στο επίπεδο στο οποίο νομίζεις ότι βρίσκομαι και μου τσαμπουνάς όλα αυτά με τα macros,τα magic κλπ. κλπ.Just for the record,ναι ξέρω τι είναι ο debugger και ναι τον έχω χρησιμοποιήσει άπειρες φορές ΚΑΙ ΠΡΙΝ ΦΤΑΣΩ ΣΤΟ ΣΗΜΕΙΟ ΝΑ ΓΡΑΨΩ ΜΙΑ ΑΠΟΡΙΑ ΣΤΟ ΦΟΡΟΥΜ ΤΗΝ ΕΧΩ ΤΣΕΚΑΡΕΙ ΜΟΝΟΣ ΜΟΥ ΚΑΜΙΑ 500ΑΡΙΑ(κ λίγες λέω)ΦΟΡΕΣ.Απλά υπάρχουν και άνθρωποι που τώρα ξεκινάνε ουσιαστικά την ενασχόληση τους με τη C και δεν έχουν γίνει ακόμα οι τοπ προγραμματιστές.Και για να τελειώνω,στο βιβλίο που χρησιμοποιώ(Οδηγός της C του Herbert Schildt)δεν αναφέρει πουθενά(μέχρι το σημείο που έχω φτάσει ότι "αν κάτι μπορεί να υλοποιηθεί με loop,το υλοποιώ με loop και όχι με goto".

 

Η ίδια ακριβώς απάντηση ισχύει και για τον φίλο defacer(φιλικά πάντα-δεν ανοίγω πόλεμο).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@capoelo:

 

Ξεκινάω με το δίκιο σου: αν βρίσκεις το ύφος μας άσχημο έχεις κάθε δικαίωμα να μας το επισημάνεις (συμβαίνει και στις καλύτερες οικογένειες ακόμα και χωρίς να υπάρχει πρόθεση). Ιδιαίτερα αν είσαι σίγουρος πως υπάρχει και πρόθεση έχεις κάθε δικαίωμα να μας κράξεις.

 

Νομίζω ότι μπορείς εύκολα να καταλάβεις ότι και εγώ και ο mig μπορούμε με τη σειρά μας εύκολα να καταλάβουμε πως είσαι αρχάριος (με όποια σημασία δίνει στη λέξη ο καθένας απο μας). Όπως δε θα μπορούσες βέβαια να μαντέψεις αλλά τώρα στο λέω καλή τη πίστει: δεν τη βρίσκουμε με το να τη λέμε σε αρχάριους και γι' αυτό δεν το κάνουμε κιόλας.

 

Μην παίρνεις τα σχόλιά μας προσωπικά. Το να πούμε ότι το πρόγραμμά σου είναι χάλια και το να πούμε ότι εσύ σαν προγραμματιστής είσαι χάλια είναι δύο τελείως διαφορετικά πράγματᆆ. Δες την κριτική μας σαν αυτό που είναι: ευκαιρία ("χάλια; γιατί; δηλαδή πώς θα μπορούσε να είναι καλύτερο; και με τι κριτήρια αποφαίνεται κανείς πως έτσι είναι καλύτερο;"), όχι επίθεση.

 

Peace.

 

ΥΓ: Τελικά αφού εμάς μας φαίνεται ότι το πρόγραμμα δουλεύει όπως αναμένεται, είσαι σίγουρος ότι έκανες copy/paste ακριβώς τον ίδιο κώδικα που έκανες compile?

 

 

Βεβαίως όλοι είμαστε άνθρωποι, μπορεί είτε εμείς να στραβοπατήσουμε είτε κάποιος σχετικά πιο "μαζεμένος" να το βλέπει διαφορετικά.

 

†† Για άλλη μια φορά χαλιέμαι που δεν είναι ευρέως γνωστή η λέξη μαζέττας, για να μπορούμε να τη χρησιμοποιούμε όταν θέλουμε να χώσουμε κι έτσι να απενοχοποιηθούν άλλες εκφράσεις όπως "χάλια", "άσχετος" κλπ. Ο χάλια και ο άσχετος έχουν τη δυνατότητα να βελτιωθούν, και όταν γεννηθήκαμε όλοι είμασταν άσχετοι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αγαπητέ migf1(no offense όπως λες κι εσύ για αυτά που θα διαβάσεις παρακάτω)...

No offense taken :)

 

αλλά μήπως-λέω μήπως-μπήκες καθόλου στον κόπο να σκεφτείς ότι δεν έχω φτάσει ακόμα στο επίπεδο στο οποίο νομίζεις ότι βρίσκομαι και μου τσαμπουνάς όλα αυτά με τα macros,τα magic κλπ. κλπ.Just for the record,ναι ξέρω τι είναι ο debugger και ναι τον έχω χρησιμοποιήσει άπειρες φορές ΚΑΙ ΠΡΙΝ ΦΤΑΣΩ ΣΤΟ ΣΗΜΕΙΟ ΝΑ ΓΡΑΨΩ ΜΙΑ ΑΠΟΡΙΑ ΣΤΟ ΦΟΡΟΥΜ ΤΗΝ ΕΧΩ ΤΣΕΚΑΡΕΙ ΜΟΝΟΣ ΜΟΥ ΚΑΜΙΑ 500ΑΡΙΑ(κ λίγες λέω)ΦΟΡΕΣ.Απλά υπάρχουν και άνθρωποι που τώρα ξεκινάνε ουσιαστικά την ενασχόληση τους με τη C και δεν έχουν γίνει ακόμα οι τοπ προγραμματιστές.Και για να τελειώνω,στο βιβλίο που χρησιμοποιώ(Οδηγός της C του Herbert Schildt)δεν αναφέρει πουθενά(μέχρι το σημείο που έχω φτάσει ότι "αν κάτι μπορεί να υλοποιηθεί με loop,το υλοποιώ με loop και όχι με goto".

 

Η ίδια ακριβώς απάντηση ισχύει και για τον φίλο defacer(φιλικά πάντα-δεν ανοίγω πόλεμο).

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

 

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

 

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

 

Ότι σου έχω απαντήσει λοιπόν μέχρι στιγμής εμπίπτει στο επίπεδο "αρχάριος". Σε καμία (μα καμία) περίπτωση δεν προσπαθώ να σε μειώσω ή οτιδήποτε άλλο τέτοιο. Όλοι αρχάριοι ξεκινήσαμε!

 

Άλλοτε απαντάω δίνοντας κώδικα και άλλοτε όχι. Όταν δεν απαντάω με κώδικα φροντίζω να δίνω πάντα κατευθύνσεις (όταν ξέρω εννοείται) οι οποίες περιέχουν τις απαντήσεις της απορίας. Που με τη σειρά του σημαίνει πως σύμφωνα με την άποψή μου όποιος ενδιαφέρεται να λύσει τις απορίες που εκφράζει στο φόρουμ θα τις λύσει ακολουθώντας αυτές τις κατευθύνσεις, και ταυτόχρονα θα μάθει και 1-2 πράγματα επιπλέον ... (μιλώντας πάντα για το επίπεδο στο οποίο κυμαίνεται η απορία του).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και με την ευκαιρία, η δική μου εκδοχή για το πώς περίπου πρέπει να είναι γραμμένο το συγκεκριμένο πρόγραμμα:

 

>int main( void )
{
       char *answers[]={ "Yes", "No", "Maybe.Rephrase the question" };
       char question[80];
       const int answerCount = sizeof(answers) / sizeof(answers[0]);
       int answerIndex;

       printf("rwta me");
       do {
               printf(": ");
               fgets(question, sizeof(question), stdin);
               answerIndex = strlen(question) % answerCount;
               puts(answers[answerIndex]);
       } while (answerIndex == answerCount - 1);

       exit(0);
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

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