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

ερωτηση για ενα προγραμμα στην C


Aggeluska

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

καλησπερα , 

 

 

εφτιαχνα ενα προγραμ στν C το οποιο να κανει λογικεσ και Bitwise  πραξεις. οι πιθανες επιλογες ειναι οι εξης:

 

&&

||

~

&

|

!

 

λοιπον, εφτιαξα το προγραμμα με switch  , δηλαδη να δινεις ποια πραξη θες , π.χ & ή || , και να σε πηγαινει στην αντιστοιχη case ,  και να κανει εκει την πραξη . Το προβλημα αρχικα ποθ αντημετωπισα ειναι οτι , οταν παταγα σαν operator το && ή ||  με πεταγε στην case & και |. οποτε σκεφτηκα οτι ειναι λογικο διοτι στο τυπο μεταβλητης char χωραει μονο μια τιμη , οποτε σκεφτικα να το κανω αλλιως. π.χ . 

 

operator = scanf("%c %c", &a, &B)

 

ετσι ωστε να δινω δυο χαρακτηρες π.χ & και & και να αποθηκευονται αντιστοιχα σε a και b και μετα και οι δυο μαζι στην μεταβλητη operator . Δυστυχως ομως δεν λειτουργει η "πατεντα" αυτη . μπορειτε να μου πειτε τι μπορω να κανω για να "xωρεσω" δυο χαρακτηρες σε μια μεταβλητη τυπου char?

 

 

ευχαριστω 

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

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

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

Δημοφιλείς Ημέρες

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

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

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

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

 

Κοίτα το παρακάτω παράδειγμα. (είναι σε c++ αλλά δώσε βάση στην DoMenu() συνάρτηση)

 

http://www.eyrhka.gr/rec.cpp

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

ναι το ξερω αυτο θα ηταν η ευκολη λυση , αλλα ο καθηγητης μου το θελει ετσι :P

 

Τοτε θέλεις μια συνάρτηση η οποία διαβάζει παραπάνω απο έναν χαρακτήρες και σταματά μολις πατήσεις το ENTER. Δεν μου ερχεται κατι άλλο στο μυαλό.

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

Κάτι της μορφής;

 

scanf("%s", &str)

 

a = str[0];

b = str[1]; //εαν είναι 1 μόνο χαρακτήρας αυτό θα είναι \0 ή \n

 

switch(a){

 

case '&':

    if(b == '&')

        //make operation &&

    else

        //make operation &

    break;

 

case '|':

 

    if(b == '|')

        //make operation ||

    else

        //make operation |

    break;

 

}

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

Mπορεις να χρησιμοποιήσεις επισης εναν πίνακα ο οποίος θα έχει σύνολο μέγιστο 3 στοιχεια. Μαζι με τον '\0'. Ουσιαστικα θα χειριστεις το && σαν string -> '&' , '&' , '\0'. Μετα θα ελεγχεις το δευτερο στοιχειο οπως σου εγραψε ο lion πιο πάνω. Καμια υποδειξη δινει ο καθηγητης?

 

ΥΓ. Το δευτερο στοιχείο οτι και αν γινει ή θα ειναι κενό ή θα έχει εναν χαρακτήρα. Θέσε εξαρχης το symbols_arr[2] = '\0' ή αρχικοποιησε ολα τα στοιχεια του με symbols_arr[MAX_LEN] = {'\0'}.  Πιο πριν ξές #define MAX_LEN 2 + 1

 

Aν σας έχει μαθει συμβολοσειρές αυτη ειναι η λυση που θα θέλει να δει. 

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

ναι το ξερω αυτο θα ηταν η ευκολη λυση , αλλα ο καθηγητης μου το θελει ετσι :P

 

Τι εννοείς εδώ; Δηλαδή ο καθηγητής σου σας έχει πει να αποθηκεύετε 2 char σε έναν; Δεν γίνεται, οπότε αποκλείεται να σας έχει πει τέτοιο πράγμα!

 

Μπορεί όμως να σας έχει πει να αποθηκεύετε 2 char σε έναν int, το οποίο γίνεται, αλλά πολύ αμφιβάλλω ότι σας έχει ζητήσει κάτι τέτοιο. Αν όντως σας το έχει ζητήσει, ο ευκολότερος τρόπος είναι να χρησιμοποιήσεις τα fixed size data types της C99/C11 και πιο συγκεκριμένα να αποθηκεύεις τον ένα char στο low byte ενός int16_t και τον άλλο char στο high byte του int16_t.

 

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

 

Ξαναλέω όμως πως αμφιβάλλω έντονα ότι σας έχει ζητηθεί κάτι τέτοιο. Το πιθανότερο είναι να σας έχει ζητηθεί να διαβάζετε τους operators ως strings και κατόπιν αντί για switch που έχεις βάλει να έχετε μια σειρά από if-else με χρήση της συνάρτησης strcmp().

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

 

Τι εννοείς εδώ; Δηλαδή ο καθηγητής σου σας έχει πει να αποθηκεύετε 2 char σε έναν; Δεν γίνεται, οπότε αποκλείεται να σας έχει πει τέτοιο πράγμα!

 

Μπορεί όμως να σας έχει πει να αποθηκεύετε 2 char σε έναν int, το οποίο γίνεται, αλλά πολύ αμφιβάλλω ότι σας έχει ζητήσει κάτι τέτοιο. Αν όντως σας το έχει ζητήσει, ο ευκολότερος τρόπος είναι να χρησιμοποιήσεις τα fixed size data types της C99/C11 και πιο συγκεκριμένα να αποθηκεύεις τον ένα char στο low byte ενός int16_t και τον άλλο char στο high byte του int16_t.

 

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

 

Ξαναλέω όμως πως αμφιβάλλω έντονα ότι σας έχει ζητηθεί κάτι τέτοιο. Το πιθανότερο είναι να σας έχει ζητηθεί να διαβάζετε τους operators ως strings και κατόπιν αντί για switch που έχεις βάλει να έχετε μια σειρά από if-else με χρήση της συνάρτησης strcmp().

οχι εννοω οτι ο καθηγητης μας μας ζητησε το μενου να μην ειναι αριθμητικο αλλα να περιγιησαι στο μενου με & && | || ! ~, και οχι με 1 2 3 4 5 6

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

Το άλλο που μπορώ να φανταστώ (the long way) είναι να πάρεις τις/την τιμή του χρήστη ως integers και να κάνεις τις συγκρίσεις ανάλογα με τον αριθμό που έχουνε στον ascii table.

 

Του lion2486 είναι ότι πρέπει μάλλον.

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

οχι εννοω οτι ο καθηγητης μας μας ζητησε το μενου να μην ειναι αριθμητικο αλλα να περιγιησαι στο μενου με & && | || ! ~, και οχι με 1 2 3 4 5 6

Α οκ, οπότε το πιο εύκολο είναι να διαβάζεις τον τελεστή ως string, και κατόπιν να χρησιμοποιείς σε if-else την strcmp() για να συγκρίνεις την τιμή του τελεστή με την εκάστοτε επιθυμητή.

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

Το άλλο που μπορώ να φανταστώ (the long way) είναι να πάρεις τις/την τιμή του χρήστη ως integers και να κάνεις τις συγκρίσεις ανάλογα με τον αριθμό που έχουνε στον ascii table.

 

Του lion2486 είναι ότι πρέπει μάλλον.

 

Κατι τέτοιο ειναι εντελώς λάθος διοτι διαφορετικα υπολογιστικά συστηματα μπορει να χρησιμοποιούν διαφορετικά σύνολα χαρακτήρων.

οκ παιδια το βρηκα , χρησιμοποιησα το fflush(stdin);  και το εκανα σε if statement τελικα . 

 

<script src="http://pastebin.com/embed_js.php?i=JkaHWJ6h"></script>

 

Ναι αλλα 100 γραμμες κώδικα για κάτι τέτοιο? πολλες μου φαινονται δες τι σου έχει πει και ο migf1 σας έχει μιλησει για συμβολοσειρες ο καθηγητης σας? το λογικοτερο ολων ειναι ενω σας έχει μιλησει για συμβολοσειρες να θέλει υλοποιηση βασισμένη σε C-strings. Εγκυρες συμβολοσειρες της C δηλαδη που ειναι ουσιαστικα πινακες χαρακτηρων με το τέλος τους να ειναι ο '\0' στο τελευταιο στοιχειο του πίνακα.

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

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

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

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

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

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

Σύνδεση

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

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