Avatar billede jonasr Nybegynder
21. august 2004 - 23:12 Der er 28 kommentarer og
1 løsning

binært til hex og decimal

ja jeg ved jo at fuktionerne hex og decimal og octav for den sags skyld er bygget ind i enten stdio.h eller conio.h... men det er binært desværre ikke... jeg skal bruge en funktion der kan omregne binært til hex og dec (og som skal kunne komme med en fejlmeddelelse hvis man skriver 3-4-5-6-7-8-9-bogstaver-tegn)

men jeg kunne også godt tænke mig at forstå funktionerne til fulde... så det ville være godt med en forklaring til udtrykkene... :D på forhånd tak!
Avatar billede jonasr Nybegynder
21. august 2004 - 23:15 #1
hm iøvrigt... det skal helst være delt op i 2 funktioner da jeg skal bruge dem under hver deres case
Avatar billede bufferzone Praktikant
21. august 2004 - 23:15 #2
er det en menneske forklaring på hvordan du omregner mellem de forskellige talsystemer du søger? eller har jeg ikke helt forstået hvad du beder om
Avatar billede arne_v Ekspert
21. august 2004 - 23:15 #3
Jeg lavede engang dette lille eksempel:

#include <stdio.h>

int indec()
{
  int res;
  printf("Enter decimal: ");
  scanf("%d",&res);
  return res;
}

int inhex()
{
  int res;
  printf("Enter hexadecimal: ");
  scanf("%X",&res);
  return res;
}

int inbin()
{
  int res,ix;
  char line[34];
  printf("Enter binary: ");
  scanf("%s",line),
  ix=0;
  res = 0;
  while(line[ix]!='\0')
  {
    res = res * 2 + (line[ix]=='1' ? 1 : 0);
    ix++;
  }
  return res;
}

void outdec(int v)
{
  printf("decimal = %d\n",v);
}

void outhex(int v)
{
  printf("hexadecimal = %X\n",v);
}

void outbin(int v)
{
  int i;
  printf("binary = ");
  for(i=0;i<sizeof(int)*8;i++)
  {
      printf("%d",(v >> (sizeof(int)*8 - i - 1)) & 1);
  }
  printf("\n");
}

int main()
{
  int v;
  v = indec();
  outdec(v);
  outhex(v);
  outbin(v);
  v = inhex();
  outdec(v);
  outhex(v);
  outbin(v);
  v = inbin();
  outdec(v);
  outhex(v);
  outbin(v);
  return 0;
}
Avatar billede arne_v Ekspert
21. august 2004 - 23:16 #4
En af pointerne er at man ved at splitte op i inxxx og outxxx kan nøjes med
3+3 funktioner i.s.f. 3*3 (eller hvis man vil have oktaler med 4+4 i.s.f. 4*4).
Avatar billede arne_v Ekspert
21. august 2004 - 23:18 #5
Det vil være ret nemt at modificere inbin til at skrive fejl ud:

int inbin()
{
  int res,ix;
  char line[34];
  printf("Enter binary: ");
  scanf("%s",line),
  ix=0;
  res = 0;
  while(line[ix]!='\0')
  {
    if(line[ix]!='0' && line[ix]!='1')
    {
      /* fortæl at han er et fjols */
    }
    res = res * 2 + (line[ix]=='1' ? 1 : 0);
    ix++;
  }
  return res;
}
Avatar billede arne_v Ekspert
21. august 2004 - 23:20 #6
En anden måde er følgende:

  char *s;
  char *ep;
  int v;
  v = strtol(s, &ep, 10);
  if(ep > s)
  {
      /* OK */
  }
  else
  {
      /* ups */
  }
Avatar billede arne_v Ekspert
21. august 2004 - 23:22 #7
Vrøvl.

  char *s;  /* indeholder streng der skal læses */
  char *ep;
  int v; /* indeholder værdi læst */
  v = strtol(s, &ep, 2);
  if(ep >= (s + strlen(s)))
  {
      /* OK */
  }
  else
  {
      /* ups */
  }
Avatar billede arne_v Ekspert
21. august 2004 - 23:36 #8
Her er et lettere modficeret eksempel som viser begge metoder:

#include <stdio.h>
#include <string.h>

void outdec(int v)
{
  printf("decimal = %d\n",v);
}

void outhex(int v)
{
  printf("hexadecimal = %X\n",v);
}

int inbin_1(char *s)
{
  int res,ix;
  ix=0;
  res = 0;
  while(s[ix]!='\0')
  {
    if(s[ix]!='1' && s[ix]!='0') return -1;
    res = res * 2 + (s[ix]=='1' ? 1 : 0);
    ix++;
  }
  return res;
}

int inbin_2(char *s)
{
  char *ep;
  int v;
  v = strtol(s, &ep, 2);
  if(ep >= (s+strlen(s)))
  {
      return v;
  }
  else
  {
      return -1;
  }
}

void test(char *s)
{
  int v;
  printf("testing %s\n",s);
  v = inbin_1(s);
  if(v >=0)
  {
      outdec(v);
      outhex(v);
  }
  else
  {
      printf("fejl\n");
  }
  v = inbin_2(s);
  if(v >=0)
  {
      outdec(v);
      outhex(v);
  }
  else
  {
      printf("fejl\n");
  }
}


int main()
{
  test("1100");
  test("123");
  return 0;
}

output:

testing 1100
decimal = 12
hexadecimal = C
decimal = 12
hexadecimal = C
testing 123
fejl
fejl
Avatar billede arne_v Ekspert
21. august 2004 - 23:38 #9
int inbin_1(char *s)
{
  int res,ix;
  ix=0;
  res = 0;
  /* så længe der er tegn i strengen */
  while(s[ix]!='\0')
  {
    /* returner -1 hvis ikke 1 eller 0 */
    if(s[ix]!='1' && s[ix]!='0') return -1;
    /* akkumuler binært ciffer i resultat */
    res = res * 2 + (s[ix]=='1' ? 1 : 0);
    ix++;
  }
  return res;
}

int inbin_2(char *s)
{
  char *ep;
  int v;
  /* konverter streng til tal med radix 2 (binært) */
  v = strtol(s, &ep, 2);
  /* test om det første tal som ikke overholder radix ligger i enden af strenge */
  if(ep >= (s+strlen(s)))
  {
      return v;
  }
  else
  {
      return -1;
  }
}
Avatar billede bertelbrander Novice
21. august 2004 - 23:40 #10
Jeg kan også:

int GetBin(void)
{
  int idx = 0, n;
  unsigned int result = 0;
  char buf[32];
  char ch;
  do
  {
      do
      {
        ch = getch();
      }
      while(ch != '0' && ch != '1' && ch != '\r');
      if(ch != '\r')
      {
        buf[idx++] = ch;
        putchar(ch);
      }
  }
  while(ch != '\r' && idx < 32);

  for(n = 0; n < idx; n++)
  {
      result <<= 1;
      result |= buf[n] - '0';
  }
  putchar('\n');
  return result;
}
Avatar billede jonasr Nybegynder
22. august 2004 - 17:08 #11
jeg kan godt lide arne_v's 23:36:04 program men jeg kan ikke lige få det til at virke... det er for mig nemt overskueligt at forstå kodningen i det... feedback? :)
Avatar billede arne_v Ekspert
22. august 2004 - 17:22 #12
Hvad er det du ikke kan få til at virke ?

compiler det ikke ?

Eller kan du ikke fitte det ind i din sammenhæng ?
Avatar billede bertelbrander Novice
22. august 2004 - 19:58 #13
Der mangler en prototype for strtol, så man skal/bør tilføje følgende i toppen:

#include <stdlib.h>
Avatar billede jonasr Nybegynder
22. august 2004 - 21:02 #14
det prøvede jeg inden jeg skrev den besked der 17:08:09... men så kommer den med noget med at der er en fejl... finder lige hvor den er :)

/* Del af Arne_v's kode */

int main()
{
  test("1100");
  test("123");
  return 0;
}

output:  // declaration syntax error

testing 1100
decimal = 12
hexadecimal = C
decimal = 12
hexadecimal = C
testing 123
fejl
fejl

/* Slut på arne_v's kode */

det med at flette den ind i sammenhængen tror jeg ikke bliver så svær da den er med voids... har haft en del problemer med at flette int baserede dele ind i mit void program....
Avatar billede arne_v Ekspert
22. august 2004 - 21:04 #15
Den her del:

output:

testing 1100
decimal = 12
hexadecimal = C
decimal = 12
hexadecimal = C
testing 123
fejl
fejl

er ikke en del af programmet, men output når man kører programmet !
Avatar billede arne_v Ekspert
22. august 2004 - 21:04 #16
Den manglende stdlib.h skyldes at min stdio.h tilsyneladende inkluderer stdlib.h
Avatar billede jonasr Nybegynder
22. august 2004 - 21:40 #17
nu har jeg fået den til at virke.... men er lidt smadret lige nu... :P for at gøre det overskueligt... hvordan får jeg skrevet mit eget tal? og sådan noget...
Avatar billede arne_v Ekspert
22. august 2004 - 21:47 #18
Du læser en streng ind i et char array og kalder inbin.

C

char line[1000];
fgets(line,sizeof(line),stdin);

C++

char line[1000];
cin.getline(line,sizeof(line));
Avatar billede jonasr Nybegynder
22. august 2004 - 21:50 #19
jeg afprøver lige i morgen.... den står på standby men jeg er sikker på du har ret :) så betragt pointene som dine...
Avatar billede jonasr Nybegynder
22. august 2004 - 21:51 #20
ja altså hjernen der står på standby :)
Avatar billede jonasr Nybegynder
23. august 2004 - 08:29 #21
jeg kan ikke lige finde ud af hvor jeg skal putte de ting der ind henne.... for at denne dig et overblik over hvor det burde sidde har jeg lige lagt mit program so far her:

/* Håber det gør det nemmere... */
/* START */

#include <conio.h>
#include <stdio.h>

void dectobin();
void dectohex();
void bintodec();
void menuet();
void ramme();
void menuto();
void logo();

char decibina;
int i;
int a;
int l;
int b;
int hex;

int ac;
int ad;
int ae;
int af;
int ag;
int ah;
int ai;
int aj;

unsigned dec;
unsigned bin;
unsigned bum;
unsigned ciffer;
unsigned bit;

int main(void)
{

char cont;
do
{
clrscr();
ramme();
logo();
menuet();
menuto();
gotoxy(22,18);
cprintf("Vil du afslutte? J/N\n");
do
{
cont = getch();
}
    while(cont != 'j' && cont !=  'J' && cont != 'n' && cont != 'N');
  }
  while(cont == 'n' || cont == 'N');
  return 0;

}


void logo()
{
     
      for(int i=21;i<58;i++)
      {
      gotoxy(i,42);
      cprintf("%c",205);
      }

      for(int a=30;a<42;a++)
      {
      gotoxy(20,a);
      cprintf("%c",186);
      }

      for(int l=21;l<58;l++)
      {

      gotoxy(l,30);
      cprintf("%c",205);
      }

      for(int b=30;b<42;b++)
      {
      gotoxy(58,b+1);
      cprintf("%c",186);
      }
      gotoxy(20,30);
      cprintf("%c",201);

      gotoxy(20,42);
      cprintf("%c",200);

      gotoxy(58,30);
      cprintf("%c",187);

      gotoxy(58,42);
      cprintf("%c",188);

      for(int ac=22;ac<25;ac++)
      {
      gotoxy(ac+1,32);
      cprintf("%c",205);
      }

      gotoxy(26,32);
      cprintf("%c",187);

      for(int ad=32;ad<36;ad++)
      {
      gotoxy(26,ad+1);
      cprintf("%c",186);
      }

      gotoxy(26,37);
      cprintf("%c",188);

      for(int ae=23;ae<25;ae++)
      {
      gotoxy(ae+1,37);
      cprintf("%c",205);
      }

      gotoxy(23,37);
      cprintf("%c",200);

      gotoxy(23,36);
      cprintf("%c",186);

      gotoxy(23,35);
      cprintf("%c",201);

      for(int af=32;af<36;af++)
      {
      gotoxy(28,af+1);
      cprintf("%c",186);
      }

      gotoxy(28,32);
      cprintf("%c",201);

      for(int ag=28;ag<30;ag++)
      {
      gotoxy(ag+1,32);
      cprintf("%c",205);
      }

      gotoxy(31,32);
      cprintf("%c",187);

      for(int ah=32;ah<34;ah++)
      {
      gotoxy(31,ah+1);
      cprintf("%c",186);
      }

      for(int ai=28;ai<31;ai++)
      {
      gotoxy(ai+1,35);
      cprintf("%c",205);
      }

      gotoxy(31,35);
      cprintf("%c",202);

      gotoxy(28,35);
      cprintf("%c",204);

      gotoxy(32,35);
      cprintf("%c",187);

      for(int aj=35;aj<36;aj++)
      {
      gotoxy(32,aj+1);
      cprintf("%c",186);
      }

      gotoxy(28,37);
      cprintf("%c",200);

      gotoxy(32,37);
      cprintf("%c",188);

      gotoxy(23,32);
      cprintf("%c",201);
      }


void ramme()
{

_setcursortype(_NOCURSOR);
textbackground(WHITE);
textcolor(561);

      clrscr();
      logo();
     
      for(int i=21;i<58;i++)
      {
      gotoxy(i,5);
      cprintf("%c",205);
      }

      for(int a=6;a<21;a++)
      {
      gotoxy(20,a);
      cprintf("%c",186);
      }

      for(int l=21;l<58;l++)
      {
      gotoxy(l,21);
      cprintf("%c",205);
      }

      for(int b=5;b<21;b++)
      {
      gotoxy(58,b+1);
      cprintf("%c",186);
      }

      gotoxy(20,5);
      cprintf("%c",201);

      gotoxy(20,21);
      cprintf("%c",200);

      gotoxy(58,5);
      cprintf("%c",187);

      gotoxy(58,21);
      cprintf("%c",188);
      }


void menuet()
{

gotoxy(22,6);
cprintf("Tryk 1 for at regne Dec til Bin");
gotoxy(22,7);
cprintf("Tryk 2 for at regne Dec til Hex");
gotoxy(22,8);
cprintf("Tryk 3 for at regne Hex til Dec");
}


void menuto()
{


  decibina=getch();
  switch(decibina)

      {
      case '1':

      clrscr();
      ramme();

    gotoxy(22,6);
    cprintf("Dec til Bin: ");
    gotoxy(35,6);
    cscanf("%u",&dec);

        gotoxy(22,8);
        cprintf("Dit tal i Bin: ");
        dectobin();
        break;

      case '2':

      clrscr();
      ramme();

    gotoxy(22,6);
    cprintf("Dec til Hex: ");
    cscanf("%u",&hex);

        gotoxy(22,8);
        cprintf("Dit tal i Hex: %X",hex);
        getch();
        break;

      case '3':

      clrscr();
      ramme();

    gotoxy(22,6);
    cprintf("hex til dec: ");
    cscanf("%X",&dec);

        gotoxy(22,8);
        cprintf("dit tal i dec: %d",dec);
        getch();
        break;
}
}

void dectobin()
{

bit=0x8000;

  gotoxy(36,8);
  for(bum = 0; bum < 16; bum++)
  {
  ciffer = (bit & dec) ?1:0;
  cprintf("%u",ciffer);
  bit /= 2;
  }
  getch();
  }

/* END */
Avatar billede arne_v Ekspert
23. august 2004 - 11:37 #22
Du putter det ind som case '4' og
læser ind med:

char num[33];
cscanf("%s",num);
int v = inbin(num);
cprintf("%d",v);

eller

cprintf("%X",v);
Avatar billede jonasr Nybegynder
23. august 2004 - 22:53 #23
jeg har nu lavet:

dec to bin
dec to hex
hex to bin
hex to dec

mangler nu:

bin to dec
bin to hex

kan ikke få det du har lavet til at funke arne! men du ved jo jeg er noob... forklar mig lige så alle kan forstå...
Avatar billede arne_v Ekspert
23. august 2004 - 23:05 #24
Prøv:

/* Håber det gør det nemmere... */
/* START */

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void dectobin();
void dectohex();
int inbin(char *);
void bintodec();
void menuet();
void ramme();
void menuto();
void logo();

char decibina;
int i;
int a;
int l;
int b;
int hex;

int ac;
int ad;
int ae;
int af;
int ag;
int ah;
int ai;
int aj;

unsigned dec;
unsigned bin;
unsigned bum;
unsigned ciffer;
unsigned bit;

int main(void)
{

char cont;
do
{
clrscr();
ramme();
logo();
menuet();
menuto();
gotoxy(22,18);
cprintf("Vil du afslutte? J/N\n");
do
{
cont = getch();
}
    while(cont != 'j' && cont !=  'J' && cont != 'n' && cont != 'N');
  }
  while(cont == 'n' || cont == 'N');
  return 0;

}


void logo()
{
   
      for(int i=21;i<58;i++)
      {
      gotoxy(i,42);
      cprintf("%c",205);
      }

      for(int a=30;a<42;a++)
      {
      gotoxy(20,a);
      cprintf("%c",186);
      }

      for(int l=21;l<58;l++)
      {

      gotoxy(l,30);
      cprintf("%c",205);
      }

      for(int b=30;b<42;b++)
      {
      gotoxy(58,b+1);
      cprintf("%c",186);
      }
      gotoxy(20,30);
      cprintf("%c",201);

      gotoxy(20,42);
      cprintf("%c",200);

      gotoxy(58,30);
      cprintf("%c",187);

      gotoxy(58,42);
      cprintf("%c",188);

      for(int ac=22;ac<25;ac++)
      {
      gotoxy(ac+1,32);
      cprintf("%c",205);
      }

      gotoxy(26,32);
      cprintf("%c",187);

      for(int ad=32;ad<36;ad++)
      {
      gotoxy(26,ad+1);
      cprintf("%c",186);
      }

      gotoxy(26,37);
      cprintf("%c",188);

      for(int ae=23;ae<25;ae++)
      {
      gotoxy(ae+1,37);
      cprintf("%c",205);
      }

      gotoxy(23,37);
      cprintf("%c",200);

      gotoxy(23,36);
      cprintf("%c",186);

      gotoxy(23,35);
      cprintf("%c",201);

      for(int af=32;af<36;af++)
      {
      gotoxy(28,af+1);
      cprintf("%c",186);
      }

      gotoxy(28,32);
      cprintf("%c",201);

      for(int ag=28;ag<30;ag++)
      {
      gotoxy(ag+1,32);
      cprintf("%c",205);
      }

      gotoxy(31,32);
      cprintf("%c",187);

      for(int ah=32;ah<34;ah++)
      {
      gotoxy(31,ah+1);
      cprintf("%c",186);
      }

      for(int ai=28;ai<31;ai++)
      {
      gotoxy(ai+1,35);
      cprintf("%c",205);
      }

      gotoxy(31,35);
      cprintf("%c",202);

      gotoxy(28,35);
      cprintf("%c",204);

      gotoxy(32,35);
      cprintf("%c",187);

      for(int aj=35;aj<36;aj++)
      {
      gotoxy(32,aj+1);
      cprintf("%c",186);
      }

      gotoxy(28,37);
      cprintf("%c",200);

      gotoxy(32,37);
      cprintf("%c",188);

      gotoxy(23,32);
      cprintf("%c",201);
      }


void ramme()
{

_setcursortype(_NOCURSOR);
textbackground(WHITE);
textcolor(561);

      clrscr();
      logo();
   
      for(int i=21;i<58;i++)
      {
      gotoxy(i,5);
      cprintf("%c",205);
      }

      for(int a=6;a<21;a++)
      {
      gotoxy(20,a);
      cprintf("%c",186);
      }

      for(int l=21;l<58;l++)
      {
      gotoxy(l,21);
      cprintf("%c",205);
      }

      for(int b=5;b<21;b++)
      {
      gotoxy(58,b+1);
      cprintf("%c",186);
      }

      gotoxy(20,5);
      cprintf("%c",201);

      gotoxy(20,21);
      cprintf("%c",200);

      gotoxy(58,5);
      cprintf("%c",187);

      gotoxy(58,21);
      cprintf("%c",188);
      }


void menuet()
{

gotoxy(22,6);
cprintf("Tryk 1 for at regne Dec til Bin");
gotoxy(22,7);
cprintf("Tryk 2 for at regne Dec til Hex");
gotoxy(22,8);
cprintf("Tryk 3 for at regne Hex til Dec");
gotoxy(22,10);
cprintf("Tryk 5 for at regne Bin til Dec");
}


void menuto()
{


  decibina=getch();
  switch(decibina)

      {
      case '1':

      clrscr();
      ramme();

    gotoxy(22,6);
    cprintf("Dec til Bin: ");
    gotoxy(35,6);
    cscanf("%u",&dec);

        gotoxy(22,8);
        cprintf("Dit tal i Bin: ");
        dectobin();
        break;

      case '2':

      clrscr();
      ramme();

    gotoxy(22,6);
    cprintf("Dec til Hex: ");
    cscanf("%u",&hex);

        gotoxy(22,8);
        cprintf("Dit tal i Hex: %X",hex);
        getch();
        break;

      case '3':

      clrscr();
      ramme();

    gotoxy(22,6);
    cprintf("hex til dec: ");
    cscanf("%X",&dec);

        gotoxy(22,8);
        cprintf("dit tal i dec: %d",dec);
        getch();
        break;
      case '5':

      clrscr();
      ramme();
    gotoxy(22,6);
    cprintf("bin til dec: ");
    char num[33];
    cscanf("%s",num);
    int dec = inbin(num);

        gotoxy(22,8);
        cprintf("dit tal i dec: %d",dec);
        getch();
        break;
}
}


int inbin(char *s)
{
  char *ep;
  int v;
  v = strtol(s, &ep, 2);
  if(ep >= (s+strlen(s)))
  {
      return v;
  }
  else
  {
      return -1;
  }
}

void dectobin()
{

bit=0x8000;

  gotoxy(36,8);
  for(bum = 0; bum < 16; bum++)
  {
  ciffer = (bit & dec) ?1:0;
  cprintf("%u",ciffer);
  bit /= 2;
  }
  getch();
  }

/* END */
Avatar billede jonasr Nybegynder
23. august 2004 - 23:31 #25
må jo nok give en del mere end 160 point for alt den hjælp her.... men nu har jeg prøvet at ændre den formel der til bin-hex... det endte ikke godt:

case '6':

      clrscr();
      ramme();

        gotoxy(22,6);
        cprintf("bin til hex: ");
        char num[33];
        cscanf("%s",num);
        int hex = inbin(num);

        gotoxy(22,8);
        cprintf("dit tal i dec: %x",hex);
        getch();
            break;

/* det der burde, ihvertfald ifølge min teori virke... men der kommer nu engang en fejl... altså må jeg have en skidt logik... */
Avatar billede arne_v Ekspert
23. august 2004 - 23:32 #26
Hvilken fejl ?
Avatar billede jonasr Nybegynder
23. august 2004 - 23:35 #27
sec... "Multiple declaration for 'num'"
Avatar billede arne_v Ekspert
23. august 2004 - 23:37 #28
Slet:

char num[33];

i dette stykke kode. Den er allerede erklæret. Flyt den evt. op fra
label 5 til der hvor dec og hex er erklæret.
Avatar billede jonasr Nybegynder
23. august 2004 - 23:41 #29
så er det kun logoet og finpudsningen er mangler :D mange tak!

så skal du vist have nogle point...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester