Jump to content



Βοηθεια με C


painkiller44

Recommended Posts

Καλησπέρα ,

Μια απορία πχ εχω ενα αλφαριθμητικό το 54 και θέλω να το κάνω integer πως μπορω να χωρισω το 5 και το 4 και να τα βάλω σε μια μεταβλητη χωριστα αλλα το αποτελεσμα να είναι παλι 54 ? :D

Link to comment
Share on other sites

λοιπον εχω πχ ενα αλφαριθμητικο ας πουμε το 54 το οποιο στην C εκχωρείτε ως 54\0 αφαιρώ το \0 και γίνεται 54 απλα επειδη ολο αυτο γίνεται μεσα σε for θελω να εντάξω ενα ενα τα στοιχεία του αλφαριθμητικού χωρις το μηδεν δηλαδη το 5 και το 4 χωριστά σε μια μεταβλητη σχηματίζοντας το 54 παλι αλλα σε τυπο integer

Link to comment
Share on other sites

Κάντο cast (μετατροπή) κατευθείαν σε integer.

Type Casting - C++ Documentation

ή χρησιμοποίησε την συνάρτηση atoi

atoi - C++ Reference

Αν επιμένεις να το κάνεις ανα ψηφίο πχ το 54 θα πρέπει αφού το "σπάσεις" σε 5 και 4 (2 μεταβλητές τύπου int) αρχικά να πολλαπλασιάζεις πρώτα το 5*10 και στο αποτέλεσμα να προσθέτεις το 4.Αν είχες τρία ψηφία πχ 546 τότε θέλεις 3 μεταβλητές και 5*100 + 4*10 + 6 για να βρεις το αποτέλεσμα σε int.

Δεν μπορείς να κάνεις "συνένωση" integers.

Link to comment
Share on other sites

Διάβασε για τα Bitwise Operations στην γλώσσα πρoγραμματισμού C (Bitwise operation - Wikipedia, the free encyclopedia)

Έχει να κάνει με το πώς αποθηκεύονται στην μνήμη οι μεταβλητές στο δυαδικό σύστημα.

Ας με διορθώσει ο [MENTION=23132]inetus3r[/MENTION] αλλά από ότι λίγα που σκαμπάζω στην C η παραπάνω συνάρτηση παίρνει σαν όρισμα ένα πίνακα από δείκτες σε chars (call me string) και για κάθε ένα:

- Αφαιρεί το char '0' άρα παίρνει την τιμή ASCII του char και αφαιρεί την ASCII τιμή '0' παίρνοντας σαν αποτέλεσμα την τιμή που αναπαρηστά σε integer.

- Σε κάθε επανάληψη η val παίρνει νέα τιμή που υπολογίζεται σε δυαδικό σύστημα

Το κομμάτι του κώδικα:

(val<<3 + val<<1) είναι σαν να πολλαπλασιάζεις το δεκαδικό χ επί 10 όταν αναπαρίστανται σε δυαδικό σύστημα οι αριθμοί.

Αυτό που θα σε βοηθήσει στο συγκεκριμένο παράδειγμα είναι να θυμάσαι:

Κάθε μετατόπιση (shift) είναι σαν να πολλαπλασιάζεις το νούμερο με το 2.

Αν πάρεις ένα παράδειγμα ίσως είναι πιο εύκολο:

Δοκίμασε να έχεις τον πίνακα χαρακτήρων "54" στην μεταβλητή char * input και δοκίμασε το πάνω στην συνάρτηση. Να θυμάσαι, η μετατόπιση γίνεται στο δυαδικό σύστημα.

Link to comment
Share on other sites

Αν κατάλαβα αυτό που ζητάς, τότε χρειάζεσαι αυτό:

int myfunction(const char *p) {

int val = 0;

while(*p) {

val = (val<<3) + (val<<1) + (*p - '0');

p++;

}

return val;

}

Επίσης πάνω στο ίδιο θέμα η παραπάνω συνάρτηση είναι απίστευτα unsafe! Αν δεν του δώσεις νούμερα σαν string και του δώσεις κάτι άλλο, π.χ. "54a" δεν θα βγάλει μήνυμα λάθους. Θα συνεχίσει και θα κάνει τις πράξεις σαν να ήταν αριθμός το "a" (Μετατροπή σε ASCII κλπ..)

Και αν μιλάμε για performance καλύτερα να χρησιμοποιούμε:


++p;

αντί για


p++;

Link to comment
Share on other sites

[MENTION=1215]nucleus[/MENTION] κατάλαβα ότι θέλει να γράψει "πρωτογενή" κώδικα και όχι να χρησιμοποιήσει συναρτήσεις βιβλιοθήκης.

[MENTION=4568]Inglor[/MENTION] το "p++" στο συγκεκριμένο σημείο που χρησιμοπιήθηκε δεν έχει καμία διαφορά από το "++p".

Αντίθετα έχω δει να δημιουργούνται ευτράπελα, και από την χρήση του παραπάνω optimization αλλά και από την υλοποίηση του κάθε compiler.

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

EDIT: Προφανώς ο κώδικας είναι η βάση για την function που ζητήθηκε. Το error-checking αφήνεται σαν εργασία για τον ενδιαφερόμενο.

Link to comment
Share on other sites

το εχω θεσει λαθος κινουμαστε λαθος .λοιπον αλλη μια :/ εστω σε μια for καθε φορα παιρνω ενα ενα ψηφιο και θελω να το εκχωρησω παλι μεσα στην for σε μια μεταβλητη .τα αλφαριθμητικα μου εχουν μονο αριθμους αλλα ειναι αλφαριθμητικα .δηλαδη για το 54 θα εχουμε 3 επαναληψεις την πρωτη φορα θα βρω το 5 και θελω να το εκχωρησω σε μια μεταβλητη την δευτερη λουπα θα βρω το 4 και θελω να το εκχωρησω στην μεταβλητη που εβαλα το 5 χωρις ομως να βγει αποτελεσμα διαφορο του 54 η τριτη λουπα θα ειναι αυτη που δεν μας ενδιαφερει αφου αναφερεται στο \0

Link to comment
Share on other sites

το εχω θεσει λαθος κινουμαστε λαθος .λοιπον αλλη μια :/ εστω σε μια for καθε φορα παιρνω ενα ενα ψηφιο και θελω να το εκχωρησω παλι μεσα στην for σε μια μεταβλητη .τα αλφαριθμητικα μου εχουν μονο αριθμους αλλα ειναι αλφαριθμητικα .δηλαδη για το 54 θα εχουμε 3 επαναληψεις την πρωτη φορα θα βρω το 5 και θελω να το εκχωρησω σε μια μεταβλητη την δευτερη λουπα θα βρω το 4 και θελω να το εκχωρησω στην μεταβλητη που εβαλα το 5 χωρις ομως να βγει αποτελεσμα διαφορο του 54 η τριτη λουπα θα ειναι αυτη που δεν μας ενδιαφερει αφου αναφερεται στο \0

Άμα το θέλεις με for, δεν θα σου χαλάσουμε το χατήρι :bigsmile:

int myfunction(const char *p) {

int len = strlen(p);

int val = 0;

int i;

for (i = 0; i < len - 1; i++) {

val = (val<<3) + (val<<1) + (*(p + i) - '0');

}

return val;

}

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.