Fawkes Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Δεν έψαξες καλά. Δες εδώ : http://www.insomnia.gr/topic/340849-decimal-to-binary-in-c/page__hl__%ce%b4%ce%b5%ce%ba%ce%b1%ce%b4%ce%b9%ce%ba%ce%bf Και υπάρχουν κι άλλα. Χώρια που με μια αναζήτηση στο google θα βρεις αμέσως αμέτρητα... - δεν με βοηθάει γιατί εγώ θέλω την άσκηση χωρίς επανάληψη. Το ίδιο ισχύει και για τα αμέτρητα αποτελέσματα του google. Η ουσία είναι πως δεν γίνεται χωρίς επανάληψη (ή τουλάχιστον δεν έχω συναντήσει εγώ ποτέ αλγόριθμο χωρίς επανάληψη). το πιο πιθανό είναι αυτό, οπότε ο καθηγητής θα φάει το κράξιμο... edit: λοιπόν αποφάσισα να βάλω ένα while (ε, το μάθαμε στο λύκειο). Δουλεύει μεν (νομίζω) άλλα μου βγάζει τον έναν αριθμό κάτω από τον άλλον χωρίς να έχω βάλει "\n". Γιατί συμβαίνει αυτό και πώς θα μπορέσω να τα εμφανίσω το ένα δίπλα στο άλλο? >#include <stdio.h> int main () { int a,b; printf("Dose enan thetiko arithmo\n"); scanf("%d",&a); getchar(); printf("O arithmos %d sto duadiko sistima einai:\n",a); while (a!=0) { b=a; b=b%2; a=a/2; if (b==1) { printf("1"); getchar(); } else { printf ("0"); getchar(); } b=a; } return 0; }
Leuteris Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 >#include <stdio.h> int main () { int a,b; printf("Dose enan thetiko arithmo\n"); scanf("%d",&a); getchar(); printf("O arithmos %d sto duadiko sistima einai:\n",a); while (a!=0) { b=a; b=b%2; a=a/2; if (b==1) { printf("1"); getch(); // getch αντί getchar. } else { printf ("0"); getch(); } b=a; } return 0; }
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 > ... getch(); // getch αντί getchar. ... Η getch() φίλε Λευτέρη, δεν ανήκει στις στάνταρ συναρτπησεις της γλώσσας: http://c-faq.com/osdep/cbreak.html
Leuteris Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Η getch() φίλε Λευτέρη, δεν ανήκει στις στάνταρ συναρτπησεις της γλώσσας: http://c-faq.com/osdep/cbreak.html Δεν πρέπει να την χρησιμοποιούμε;
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Δεν πρέπει να την χρησιμοποιούμε; Δεν υπάρχει πρέπει ή δεν πρέπει σε αυτές τις περιπτώσεις, απλά να ξέρεις πως δεν θα κάνει compile σε όλες τις πλατφόρμες το πρόγραμμά σου. Η getch() είναι για περιβάλλοντα POSIX (unix/linux) μέσω του header file <conio.h> (νομίζω υπάρχει και στη βιβλιοθήκη curses). Υπάρχει και στα Windows συνάρτηση που κάνει αυτή τη δουλειά, αλλά τη λένε αλλιώς (συνήθως _getch(), αλλά διαφέρει από compiler σε compiler). Το σίγουρο είναι πως η standard C δεν περιλαμβάνει τέτοια συνάρτηση.
Leuteris Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 ok κατάλαβα.Πάντως απο windows, με το Dev-Cpp και το <stdio.h> την τρέχει.
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 ok κατάλαβα.Πάντως απο windows, με το Dev-Cpp και το <stdio.h> την τρέχει. Επειδή το Dev-Cpp έχει για compiler ένα port του gcc για Windows (mingw)... btw το Dev-Cpp είναι abandonware (παρατημένο)... δες το Code::Blocks
Fawkes Δημοσ. 30 Οκτωβρίου 2011 Μέλος Δημοσ. 30 Οκτωβρίου 2011 με Dev-cpp δουλεύω και εγώ και όλο το τμήμα- το compile δεν το περνάει η getch() πάντως. Πραγματικά δεν μπορώ να καταλάβω γιατί μου βγάζει : "O arithmos sto dyadiko sistima einai: 0 1 0 0 1 0 1" και όχι στη σειρά... Μπορεί μήπως να το εξηγήσει κανείς? (Σημ: επίσης πρέπει να πατάω enter για να βγάζει κάθε φορά τον επόμενο διαδοχικά αριθμό (0 ή 1) αν μπορούσα να το αλλάξω και αυτό θα ήταν καλό)
Leuteris Δημοσ. 30 Οκτωβρίου 2011 Δημοσ. 30 Οκτωβρίου 2011 Απλά αφαίρεσε τις getchar... >#include <stdio.h> int main () { int a,b; printf("Dose enan thetiko arithmo\n"); scanf("%d",&a); getchar(); printf("O arithmos %d sto duadiko sistima einai:\n",a); while (a!=0) { b=a; b=b%2; a=a/2; if (b==1) { printf("1"); } else { printf ("0"); } b=a; } getchar(); return 0; }
migf1 Δημοσ. 30 Οκτωβρίου 2011 Δημοσ. 30 Οκτωβρίου 2011 με Dev-cpp δουλεύω και εγώ και όλο το τμήμα- το compile δεν το περνάει η getch() πάντως. Πραγματικά δεν μπορώ να καταλάβω γιατί μου βγάζει : "O arithmos sto dyadiko sistima einai: 0 1 0 0 1 0 1" και όχι στη σειρά... Μπορεί μήπως να το εξηγήσει κανείς? (Σημ: επίσης πρέπει να πατάω enter για να βγάζει κάθε φορά τον επόμενο διαδοχικά αριθμό (0 ή 1) αν μπορούσα να το αλλάξω και αυτό θα ήταν καλό) Το θέμα με τα ENTER λύνεται όπως σου υπέδειξε ο φίλος Λευτέρης, παραμένει όμως το πρόβλημα του ότι ο δυαδικός αριθμός σου τυπώνεται αντίστροφα. Π.χ. το (dec) 2 τυπώνεται ως (bin) 01 ενώ πρέπει να τυπωθεί ως (bin) 10. Με άλλα λόγια, πρέπει να το αντιστρέψεις πριν το τυπώσεις. Αυτό προϋποθέτει είτε πως έχετε ήδη μάθει πίνακες (οπότε μέσα στο loop αποθηκεύεις το κάθε δυαδικό ψηφίο σε συνεχόμενες θέσεις του πίνακα και στο τέλος τον τυπώνεις ανάποδα) είτε πως έχετε μάθει συναρτήσεις και αναδρομή, οπότε μπορείς να το υλοποιήσεις κάπως έτσι... > /* * Μετατροπή δεκαδικού ακεραίου σε δυαδική μορφή. * * Τα δυαδικά ψηφία οποιουδήποτε δεκαδικού ακεραίου προκύπτουν από τα * υπόλοιπα συνεχόμενων διαιρέσεών του με το 2, μέχρι να μηδενιστεί. * * Η σειρά των δυαδικών ψηφίων που προκύπτουν, πρέπει να αντιστραφεί * πριν τυπωθεί στην οθόνη, κάτι που επιτυγχάνεται με την αναδρομική * συνάρτηση: print_dec2bin() */ #include <stdio.h> /* --------------------------------------------------------- */ void print_dec2bin( int dec ) { if ( dec == 0 ) return; print_dec2bin( dec / 2 ); printf("%d", dec % 2 ); } /* --------------------------------------------------------- */ int main( void ) { int dec = 0; printf("Dose enan thetiko akeraio: "); scanf("%d", &dec); printf("(dec) %d = (bin) ", dec ); print_dec2bin( dec ); putchar('\n'); return 0; } Αν έχετε κάνει πίνακες, δοκίμασε να γράψεις μόνος σου τον σχετικό κώδικα. Όσο αναφορά την υλοποίηση που έχεις ποστάρει, που τυπώνει τον δυαδικό ανάποδα δηλαδή, μια συνεπτυγμένη παραλλαγή της χωρίς περιττές κινήσεις (μεταβλητές, αναθέσεις, κλπ) είναι η παρακάτω... > /* * Μετατροπή δεκαδικού ακεραίου σε δυαδική μορφή. * * Τα δυαδικά ψηφία οποιουδήποτε δεκαδικού ακεραίου προκύπτουν από τα * υπόλοιπα συνεχόμενων διαιρέσεών του με το 2, μέχρι να μηδενιστεί. * * Η σειρά των δυαδικών ψηφίων που προκύπτουν, πρέπει να αντιστραφεί * πριν τυπωθεί στην οθόνη (κάτι που δεν κάνει αυτό το πρόγραμμα) * */ #include <stdio.h> int main( void ) { int dec = 0; printf("Dose enan thetiko arithmo: "); scanf("%d", &dec); printf("(dec) %d = (bin) ", dec ); while ( dec != 0 ) { printf("%d", dec % 2 ); dec /= 2; } putchar('\n'); return 0; } ΥΓ. Η μετατροπή επισπεύδεται σημαντικά αν αντί για πηλίκα και υπόλοιπα χρησιμοποιήσεις bit-operators και bit-shifting.
παπι Δημοσ. 30 Οκτωβρίου 2011 Δημοσ. 30 Οκτωβρίου 2011 Μια μινιμαλιστικη λυση >int main(int ,char**) { int hey = 3,i; for(i = 0;i < sizeof(int) * 8; ++i, hey <<= 1) printf("%d",(hey >> sizeof(int) * 8 - 1) & 1 ); return 0; }
Fawkes Δημοσ. 30 Οκτωβρίου 2011 Μέλος Δημοσ. 30 Οκτωβρίου 2011 Απλά αφαίρεσε τις getchar... ευχαριστώ πολύ! Το θέμα με τα ENTER λύνεται όπως σου υπέδειξε ο φίλος Λευτέρης, παραμένει όμως το πρόβλημα του ότι ο δυαδικός αριθμός σου τυπώνεται αντίστροφα. Π.χ. το (dec) 2 τυπώνεται ως (bin) 01 ενώ πρέπει να τυπωθεί ως (bin) 10. Με άλλα λόγια, πρέπει να το αντιστρέψεις πριν το τυπώσεις. Αυτό προϋποθέτει είτε πως έχετε ήδη μάθει πίνακες (οπότε μέσα στο loop αποθηκεύεις το κάθε δυαδικό ψηφίο σε συνεχόμενες θέσεις του πίνακα και στο τέλος τον τυπώνεις ανάποδα) είτε πως έχετε μάθει συναρτήσεις και αναδρομή, οπότε μπορείς να το υλοποιήσεις κάπως έτσι... ΥΓ. Η μετατροπή επισπεύδεται σημαντικά αν αντί για πηλίκα και υπόλοιπα χρησιμοποιήσεις bit-operators και bit-shifting. ναι μας είχε προειδοποιήσει γι αυτήν την αναποδιά και σε πρώτη φάση δεν έχει πρόβλημα.Α, και δεν έχουμε κάνει ούτε πίνακες ακόμα... Με τα λίγα που ξέρω πήγα να το κάνω με το \b άλλα απέτυχα. Γιατί? Μετακινώντας τον κέρσορα μία θέση πίσω σβήνει αυτά που έχει ήδη εμφανίσει? για bit operators και bit shifting δεν ξέρω, αλλά θα τα ψάξω, ευχαριστώ πολύ Μια μινιμαλιστικη λυση >int main(int ,char**) { int hey = 3,i; for(i = 0;i < sizeof(int) * 8; ++i, hey <<= 1) printf("%d",(hey >> sizeof(int) * 8 - 1) & 1 ); return 0; } μακάρι να είχαμε μάθει το for i. Πράγματι μινιμαλιστική πάντως
konstadinos123 Δημοσ. 31 Δεκεμβρίου 2015 Δημοσ. 31 Δεκεμβρίου 2015 #include<stdio.h> int main() { int a,thesi=1,k,i,j,thesi_1; printf("Doste ton akereo:"); scanf("%d", &a); k=a; while(a/2!=0) { thesi++; a=a/2; } a=k; thesi_1=thesi; for(i=0;i<thesi;i++) { k=a; for(j=0;j<thesi_1-1;j++) { k=k/2; } printf("%d", k%2); thesi_1--; } return 0; } oriste kai apo mena o parapano programma etsi na iparxei.bebea einai me epanalipsi alla kalitera auto apo to tipota
gon1332 Δημοσ. 31 Δεκεμβρίου 2015 Δημοσ. 31 Δεκεμβρίου 2015 Βάλ'το σε code tags με σωστή στοίχιση για να φαίνεται. Είναι άχρηστο έτσι.
M2000 Δημοσ. 31 Δεκεμβρίου 2015 Δημοσ. 31 Δεκεμβρίου 2015 Όταν δεν ζητάει επανάληψη σημαίνει ότι θα πρέπει να δώσουμε όρια. Αν έχουμε όρια από 0 έως 256 τότε έχουμε 8 if then else (τα γράφω όπως στη Basic γιατί έτσι με βολεύουν) και σε κάθε ένα κοιτάμε το bit το οποίο το κάνουμε με απλό τρόπο. Ας υποθέσουμε πως το & είναι ο bitwise operator And (θα υποθέσουμε ότι ο αριθμός είναι unsign), τότε θα έχουμε τεστ: if αρ & 1 =0 Then c="0" else c="1" if αρ & 2 =0 Then c="0"+c else c="1"+c if αρ & 4 =0 Then c="0+c" else c=1"+c ....... if αρ & 128 =0 Then c="0+c" else c=1"+c '' to 8o bit είναι το 128 στο τέλος θα δώσει ένα C με όλο το δυαδικό νούμερο
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα