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

C ενωση δυο μεταβλητών


aisixtir

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

Δημοσ.

καλησπέρα

ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι.

 

πΧ

χ=3 , y= 5 θέλω η μεταβλητη δ να αποθυκεύει το δ=35...

 

καμια ιδέα ??

  • Απαντ. 31
  • Δημ.
  • Τελ. απάντηση
Δημοσ.
d = x * 10 + y; ????

 

Αν δεν είναι μονοψήφιες οι τιμές των μεταβλητών; Π.χ. "10" + "11"...;

 

Ένας άλλος τρόπος είναι να τις τυπώσεις σε ένα νέο string κολλητά με την sprintf. Και μετά, χρήση της atoi.

Δημοσ.

Εάν το αποτέλεσμα το χρειάζεσαι σαν ακέραιο θα πρότεινα κάτι τέτοιο (ώστε να μην μπλέξεις με strings)

C = A * 10^(1+floor(log10(B))) + B

Δημοσ.
Εάν το αποτέλεσμα το χρειάζεσαι σαν ακέραιο θα πρότεινα κάτι τέτοιο (ώστε να μην μπλέξεις με strings)

C = A * 10^(1+floor(log10(B))) + B

 

Καλύτερα απλά να το κάνεις cast σε int να γλυτώσεις το floor

 

C = A * 10^(1+ (int)log10(B)) + B

Δημοσ.

C6WGMN, πώς μπορώ να σου εκφράσω ότι έγινες κατ' ευθείαν ένα από τα αγαπημένα μου πρόσωπα στο φόρουμ; :P

Δημοσ.
Με πρόλαβε ο parsifal οπότε το post κατεβαίνει (η καλύτερη & κομψότερη λύση btw.) ;)

 

Νομίζω πως είναι πιο ευκολοχώνευτος τρόπος από κάποιον που είναι αρχάριος στη C.

 

Τώρα, αν θέλουμε μία πολύ efficient λύση - π.χ. προγραμματίζουμε κάποιο πολύ μικρό σύστημα - ίσως είναι καλύτερο να γίνει με άλλον τρόπο. Αν και οι επεξεργαστικοί κύκλοι για να γίνουν οι πράξεις στις, κατά τα άλλα σωστές, παραστάσεις που δίνουν τα παιδιά πιο πάνω δε μου φαίνονται με μία πρώτη ματιά και τόσο λίγοι. Ίσως μπορεί να χωθεί ενδιάμεσα κάποιο bitwise operation που να ξαλαφρώνει λίγο τα πράγματα... ;

Δημοσ.

bitwise δεν το βλέπω (δεν συμβαδιζουν δυναμεις του 2 με του 10), αλλα για μικροελενκτες που δεν βολεύει το float ή το char buffer του atoi/itoa:

>
#include <stdio.h>

unsigned combine2n(unsigned a,unsigned {
unsigned 
	b1 = b, 	//προσωρινο αντίγραφο της b 
	moredigits = 1;	//επιτρεπει σε πιθανο μηδενικο αριθμο b να δωσει το "0"
			//το combine2n(50,0) θα δωσει 500
			//το combine2n(50,10) θα δωσει 5010
			//το combine2n(50,100) θα δωσει 50100
while(b1 || moredigits){
	//ο b1 έχει ενα ψηφείο, αρα "φτιάξε χώρο" για να μπεί αυτό:
	a *= 10;		//"σπρώξε" τον πρωτο αριθμό (a) μια θέση προς τα αριστερα
	b1 /= 10;	//αφαιρεσε απο τον δευτερο αριθμό μια θέση
	moredigits = 0;	//χειρηστήκαμε τουλάχιστο 1 ψηφειο απο τη b (σε περίπτωση που ηταν 0)
}
return a + b;	//ενωσε τον αριθμο (a) οπως έχει "σπρωχτεί" για να χωρέσει ο b, με τον b
}

int main(void){
printf("combine(34,56)=%u\n",combine2n(34,56));
printf("combine(34,0)=%u\n",combine2n(34,0));
printf("combine(34,50)=%u\n",combine2n(34,50));
printf("combine(34,100)=%u\n",combine2n(34,100));
}

 

>
αποτέλεσματα:
combine(34,56)=3456
combine(34,0)=340
combine(34,50)=3450
combine(34,100)=34100

Δημοσ.
Νομίζω πως είναι πιο ευκολοχώνευτος τρόπος από κάποιον που είναι αρχάριος στη C.

 

Τώρα, αν θέλουμε μία πολύ efficient λύση - π.χ. προγραμματίζουμε κάποιο πολύ μικρό σύστημα - ίσως είναι καλύτερο να γίνει με άλλον τρόπο. Αν και οι επεξεργαστικοί κύκλοι για να γίνουν οι πράξεις στις, κατά τα άλλα σωστές, παραστάσεις που δίνουν τα παιδιά πιο πάνω δε μου φαίνονται με μία πρώτη ματιά και τόσο λίγοι. Ίσως μπορεί να χωθεί ενδιάμεσα κάποιο bitwise operation που να ξαλαφρώνει λίγο τα πράγματα... ;

 

Προσωπικά θεωρώ ότι το καλύτερο είναι να κρατάς τον κώδικα σου όσο και όπου μπορείς απλό. Οι «ταρζανιές» δεν ωφελούν παρά μόνο πρόσκαιρα και όταν περνά ο καιρός και χρειάζεται να τον αναθεωρήσεις τότε τις βρίσκεις μπροστά σου και αρχίζουν διάφορα προβλήματα. Είμαι οπαδός της αρχής “K.I.S.S.”, ειδικά όταν η αρχιτεκτονική των σημερινών υπολογιστών δεν επιβάλει ιδιαίτερους (ουσιαστικούς) περιορισμούς που ήταν απαραίτητοι πριν 15 ή 20 χρόνια οπότε είμαι έτοιμος να διαπραγματευτώ μεταξύ ενός ευανάγνωστου κώδικα και ενδεχομένως λίγο πιο αργού ή λίγο μεγαλύτερου εκτελέσιμου. Φυσικά ο καθένας μπορεί να έχει διαφορετική θέση επί του θέματος οπότε όλες οι γνώμες δεκτές._

:-)

Δημοσ.
Προσωπικά θεωρώ ότι το καλύτερο είναι να κρατάς τον κώδικα σου όσο και όπου μπορείς απλό. Οι «ταρζανιές» δεν ωφελούν παρά μόνο πρόσκαιρα και όταν περνά ο καιρός και χρειάζεται να τον αναθεωρήσεις τότε τις βρίσκεις μπροστά σου και αρχίζουν διάφορα προβλήματα. Είμαι οπαδός της αρχής “K.I.S.S.”, ειδικά όταν η αρχιτεκτονική των σημερινών υπολογιστών δεν επιβάλει ιδιαίτερους (ουσιαστικούς) περιορισμούς που ήταν απαραίτητοι πριν 15 ή 20 χρόνια οπότε είμαι έτοιμος να διαπραγματευτώ μεταξύ ενός ευανάγνωστου κώδικα και ενδεχομένως λίγο πιο αργού ή λίγο μεγαλύτερου εκτελέσιμου. Φυσικά ο καθένας μπορεί να έχει διαφορετική θέση επί του θέματος οπότε όλες οι γνώμες δεκτές._

:-)

 

Εμένα πάλι μου αρέσει ο κώδικας(μου) να έχει μία κάποια συνέπεια θέλω καθαρές λύσεις. Προσπαθώ να αποφευγω τα quick n dirty, όσο βέβαια μπορώ...

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

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

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