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

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

Δημοσ.

Δεν έψαξες καλά.

Δες εδώ :

 

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;
}

Δημοσ.
>#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;
}

Δημοσ.

Δεν πρέπει να την χρησιμοποιούμε;

 

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

 

Η getch() είναι για περιβάλλοντα POSIX (unix/linux) μέσω του header file <conio.h> (νομίζω υπάρχει και στη βιβλιοθήκη curses). Υπάρχει και στα Windows συνάρτηση που κάνει αυτή τη δουλειά, αλλά τη λένε αλλιώς (συνήθως _getch(), αλλά διαφέρει από compiler σε compiler). Το σίγουρο είναι πως η standard C δεν περιλαμβάνει τέτοια συνάρτηση.

Δημοσ.

ok κατάλαβα.Πάντως απο windows, με το Dev-Cpp και το <stdio.h> την τρέχει.

 

Επειδή το Dev-Cpp έχει για compiler ένα port του gcc για Windows (mingw)... btw το Dev-Cpp είναι abandonware (παρατημένο)... δες το Code::Blocks

Δημοσ.

με Dev-cpp δουλεύω και εγώ και όλο το τμήμα- το compile δεν το περνάει η getch() πάντως. Πραγματικά δεν μπορώ να καταλάβω γιατί μου βγάζει :

"O arithmos sto dyadiko sistima einai:

0

1

0

0

1

0

1"

 

και όχι στη σειρά... Μπορεί μήπως να το εξηγήσει κανείς?

(Σημ: επίσης πρέπει να πατάω enter για να βγάζει κάθε φορά τον επόμενο διαδοχικά αριθμό (0 ή 1) αν μπορούσα να το αλλάξω και αυτό θα ήταν καλό)

Δημοσ.

Απλά αφαίρεσε τις 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;
   
   
}

Δημοσ.

με 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.

Δημοσ.

Μια μινιμαλιστικη λυση

>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;
}

 

Δημοσ.

Απλά αφαίρεσε τις 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. Πράγματι μινιμαλιστική πάντως :P

  • 4 χρόνια αργότερα...
Δημοσ.

#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

Δημοσ.

Όταν δεν ζητάει επανάληψη σημαίνει ότι θα πρέπει να δώσουμε όρια. Αν έχουμε όρια από 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 με όλο το δυαδικό νούμερο

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

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

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

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

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

Σύνδεση

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

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