Avatar billede jonasr Nybegynder
26. august 2004 - 10:19 Der er 13 kommentarer og
1 løsning

forklaring af advancerede funktioner

skal forstå det 100%.... så det ville være rart hvis folk kunne rette på det jeg har skrevet og skrive resten af forklaringerne :) det tager vist heller ikke den store tid....

/* Jonas R. DFT uddannelsen 2004 */
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


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

int inbin(char *);

char num[33];

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(); // rydder skærmen
ramme(); // gør opmærksom på at void ramme(); skal kaldes
menuet(); // gør opmærksom på at void menuet(); skal kaldes
menuto(); // gør opmærksom på at void menuto(); skal kaldes
gotoxy(22,18); // koordinater til tekststregen nedenunder
cprintf("Vil du afslutte? J/N\n"); // tekststreng vist på skærmen
do
{  // her starter "do"
cont = getch();
}
    while(cont != 'j' && cont !=  'J' && cont != 'n' && cont != 'N'); // aktiverer knapperne j-J n-N
  }
  while(cont == 'n' || cont == 'N'); // hvis man trykker n (NEJ) ryger man tilbage til hovedmenuen, hvis man trykker j (JA) ryger man ud af programmet
  return 0; // tilbage til starten af "do"

} // her slutter "do"



void ramme()
{ // start på min ramme

_setcursortype(_NOCURSOR); // gør 'cursor' usynlig på skærmen
textbackground(WHITE); // gør baggrunden "hvid" dvs. Grå
textcolor(561); // giver teksten farve, dvs. tekst skrevet i en cprintf og ikke i en printf

      clrscr(); // rydder skærm
      logo(); // kalder logo

      for(int i=21;i<58;i++) // gentag kommando
      {
      gotoxy(i,5); // koordinater for første tegn
      cprintf("%c",205); // indsæt dette symbol
      }

      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);
     
} // slut på min ramme


void menuet()
{ // start på min første menu

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,9);
cprintf("Tryk 4 for at regne Hex til Bin");
gotoxy(22,10);
cprintf("Tryk 5 for at regne Bin til Dec");
gotoxy(22,11);
cprintf("Tryk 6 for at regne Bin til Hex");
gotoxy(22,14);
cprintf("OBS! kun 1'er og 0'er i '5' og '6'");

} // slut på min første menu


void menuto()
{ // start på min anden menu


  decibina=getch();
  switch(decibina)

      { // start på switch
      case '1': // hvis du trykker '1' sker dette

      clrscr(); // rydder skærmen
      ramme(); // kalder rammen (OG logo fordi logo ligger inden i rammen)

    gotoxy(22,6); // koordinater til nedenstående
    cprintf("Dec til Bin: "); // tekst
    gotoxy(35,6); // koordinater til nedenstående
    cscanf("%u",&dec); // gemmer indtastning i 'unsigned dec;'

        gotoxy(22,8); // koordinater til nedenstående
        cprintf("Dit tal i Bin: "); // tekst
        dectobin(); // kalder omregner: void dectobin()
        break; // slutter case '1'

      case '2': // hvis du trykker '2' sker dette

      clrscr(); // rydder skærmen
      ramme(); // kalder rammen

    gotoxy(22,6); // gå til nedenstående koordinater
    cprintf("Dec til Hex: "); // tekst
    cscanf("%u",&hex); // gemmer indtastning i 'int hex;'

        gotoxy(22,8); // koordinater til nedenstående
        cprintf("Dit tal i Hex: %X",hex); // dit resultat i hex, tekst
        getch(); // tryk enter for at fortsætte
        break; // slut på case '2'

      case '3': // hvis du trykker '3' sker dette

      clrscr(); // rydder skærmen
      ramme(); // kalder void ramme()

    gotoxy(22,6); // koordinater til nedenstående
    cprintf("hex til dec: "); // tekst
    cscanf("%X",&dec); // gem indtastning i int dec;

        gotoxy(22,8); // koordinater til nedenstående
        cprintf("dit tal i dec: %d",dec); // omregner dit hexadecimale tal til decimal og viser på skærmen
        getch(); // tryk enter for at fortsætte
        break; // slut på case '3'


      case '4': // start case '4'

      clrscr(); // clear screen, ryd skærmen
      ramme(); // kalder void ramme()

        gotoxy(22,6); // koordinater
        cprintf("hex til bin: "); // tekst
        cscanf("%X",&hex); // gemmer din indtastning i int hex;

          gotoxy(22,8); // koordinater
          cprintf("dit tal i bin: "); // tekst
          hextobin(); // kalder omregner
          getch(); // tryk enter for at fortsætte
          break; // slut på case '4'

      case '5': // start på case '5'

      clrscr(); // ryd skærm
      ramme(); // kalder void ramme()

    gotoxy(22,6); // koordinater
    cprintf("bin til dec: "); // tekst
    char num[33]; // et storage ligesom int og float
    cscanf("%s",num); // gemmer din indtastning i char num[33];
    int dec = inbin(num); // får programmet til at omregne

      gotoxy(22,8); // koordinater
      cprintf("dit tal i dec: %d",dec); // omregner dit tal til decimal
      getch(); // tryk enter for at forsætte
      break; // slut på case '5'


      case '6': // start på case '6'

      clrscr(); // clear screen, ryd skærmen
      ramme(); // kalder void ramme()

      gotoxy(22,6); //koordinater
      cprintf("bin til hex: "); // tekst
      cscanf("%s",num); // gemmer dit tal i char num[33];

      int hex = inbin(num); // får programmet til at omregne

    gotoxy(22,8); // koordinater
    cprintf("dit tal i dec: %X",hex); // omregner dit tal til hexadecimal
    getch(); // tryk enter for at fortsætte
    break; // slut på case '6'

} // slut på switch
} // slut på void menuto()

int inbin(char *s) // lagrer info
{
  char *ep; // lagrer info
  int v; // lagrer info
  v = strtol(s, &ep, 2);
  if(ep >= (s+strlen(s))) // hvis det er korrekt, fortsæt - hvis det er forkert, skriv -1 istedet for resultat (kan skyldes 2-9 og a-å i det du skriver som input)
  {
      return v;
  }
  else
  {
      return -1;
  }
}

void dectobin() // start på dectobin()
{

bit=0x8000; // placerer vigtigste bit først

  gotoxy(36,8); //koordinater
  for(bum = 0; bum < 16; bum++) // gentager en kommando, i dette tilfælde dividerer den ens tal med 2 indtil man får nul, derved finder man bin værdi
  { // start forløkke
  ciffer = (bit & dec) ?1:0; // se: for(bum = 0; bum < 16; bum++)
  cprintf("%u",ciffer); // udskriver resultat
  bit /= 2; // hvor mange bit der er
  } // slut forløkke
  getch(); // tryk enter for at fortsætte
  } // slut void dectobin()

void hextobin() // start hextobin()
{

bit=0x8000; // placerer vigtigste bit først

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

/* SLUT mange tak for hjælpen */
Avatar billede arne_v Ekspert
26. august 2004 - 10:25 #1
Jeg synes at du mangler at forklare nogle af de vigtigste ting !

// funktioner de kommer senere men skal erklæres her fordi de bruges i main:
void dectobin();
void dectohex();
void bintodec();
void hextobin();
void menuet();
void ramme();
void menuto();
Avatar billede arne_v Ekspert
26. august 2004 - 10:26 #2
int i;
int a;
int l;
int b;
int hex; // tal som enten er konverteret fra eller skal konverteres til 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;

og tilsvarende for alle de andre variable
Avatar billede arne_v Ekspert
26. august 2004 - 10:26 #3
Lav en systematisk indrykning - det gør koen 10 gange nemmere at læse
Avatar billede arne_v Ekspert
26. august 2004 - 10:27 #4
cont = getch(); // læs et tegn uden at vente på retur
Avatar billede jonasr Nybegynder
26. august 2004 - 12:07 #5
kan du eventuelt uddybe forløkkerne og bit /= 2;

og den ciffer =.....

den forstår jeg heller ikke til fulde...
men det vigtigste:

char cont;
do
{
clrscr(); // rydder skærmen
ramme(); // gør opmærksom på at void ramme(); skal kaldes
menuet(); // gør opmærksom på at void menuet(); skal kaldes
menuto(); // gør opmærksom på at void menuto(); skal kaldes
gotoxy(22,18); // koordinater til tekststregen nedenunder
cprintf("Vil du afslutte? J/N\n"); // tekststreng vist på skærmen
do
{  // her starter "do"
cont = getch();
}
    while(cont != 'j' && cont !=  'J' && cont != 'n' && cont != 'N'); // aktiverer knapperne j-J n-N
  }
  while(cont == 'n' || cont == 'N'); // hvis man trykker n (NEJ) ryger man tilbage til hovedmenuen, hvis man trykker j (JA) ryger man ud af programmet
  return 0; // tilbage til starten af "do"

} // her slutter "do"

den funktion der skal jeg forstå 100%.... derfor er det vigtigt at den bliver max uddybet!
Avatar billede arne_v Ekspert
26. august 2004 - 12:09 #6
bit /= 2;

er det samme som

bit = bit / 2;

os så siger den sig selv.
Avatar billede jonasr Nybegynder
26. august 2004 - 12:15 #7
ja.... det giver jo rigtig meget mening :)... genialt!

og de andre?
Avatar billede arne_v Ekspert
26. august 2004 - 12:18 #8
for løkkerne i ramme tegner jo bare rammen d.v.s. at løber gennem x og y koordinater
Avatar billede arne_v Ekspert
26. august 2004 - 12:19 #9
ciffer = (bit & dec) ?1:0; // hvis bit er sat i dec sæt ciffer til 1 ellers sæt ciffer til 0
Avatar billede jonasr Nybegynder
26. august 2004 - 12:22 #10
tænkte nu mere på de forløkker der er i min udregning....
 
:) men den vigtigste er den oppe i main :) altså den "do" kommando

ciffer=....  // roger that!
Avatar billede arne_v Ekspert
26. august 2004 - 12:23 #11
char cont;
do
{
  clrscr(); // rydder skærmen
  ramme(); // lav ramme
  menuet(); // vis menu 1
  menuto(); // vis menu 2
  gotoxy(22,18); // placer cursor
  cprintf("Vil du afslutte? J/N\n"); // skriv prompt
  do
  {
      cont = getch(); // læ sbogstav
  }
  while(cont != 'j' && cont !=  'J' && cont != 'n' && cont != 'N'); // fortsæt indtil brugeren taster en af YyNn
}
while(cont == 'n' || cont == 'N'); // fortsæt indtil brugeren har valgt Nn
Avatar billede arne_v Ekspert
26. august 2004 - 12:24 #12
for(bum = 0; bum < 16; bum++) // check for alle 16 bit
Avatar billede jonasr Nybegynder
26. august 2004 - 13:41 #13
sweet :D

takker mange gange! send lige et svar
Avatar billede arne_v Ekspert
26. august 2004 - 13:43 #14
svar
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