Schoolopdracht C

Status
Niet open voor verdere reacties.

Taigar

Gebruiker
Lid geworden
23 mei 2010
Berichten
9
Hoi allemaal,

ik ben voor school bezig, met de volgende opdracht:

Code:
Een binair getal kan omgezet worden naar een decimale waarde, door tijdens de invoer hiervan telkens met 2 te 
vermenigvuldigen en er eventueel een 1 bij op te tellen.
Bijvoorbeeld:    100101   >   37   als volgt:

Invoer                    Decimaal	
    1	>	2 *  0  + 1 =   1
    0	>	2 *  1  + 0 =   2
    0	>	2 *  2  + 0 =   4
    1	>	2 *  4  + 1 =   9
    0	>	2 *  9  + 0 =  18
    1	>	2 * 18 + 1 =  37

Schrijf een programma, waarbij het binaire getal karakter na karakter wordt ingevoerd  [gebruik de functie:  getche()  ]
en waarbij in een while()  lus de decimale waarde wordt berekend, tot een ander karakter dan een ‘0’ of een ‘1’ wordt 
ingevoerd, waarna het decimale getal op het scherm wordt getoond.

Ik dacht dat het algoritme hiervan niet zo moeilijk is, namelijk:

nDecimal = 2 * nDecimal + nBinair

Hierbij is nBinair het binaire getal cijfer voor cijfer ingevoerd. En op deze manier krijg je bij 100101 netjes 37 eruit.

Maar nu moet ik het in C programmeren, en dat ging me nog niet helemaal goed. Nu heb ik woensdag weer les, en kan ik het dan vragen. Maar als ik het dan in dat uurtje les niet afkrijg, dan ben ik weer een week later met inleveren en is m'n cijfer weer lager..

De code die ik al heb is als volgt:

[CPP]
/* INCLUDES: */
#include <stdio.h>
#include <math.h>
#include <conio.h>

/* MAINPROGRAM: */
int main()
{
char chAgain = 'y';

printf("Welkom,\n");

while(chAgain == 'y')
{
int nDecimal = 0, nBinair = 0;

printf("\nGeef een binair getal: ");

while(nBinair == 0 || nBinair == 1)
{
nDecimal = 2 * nDecimal + nBinair;
nBinair = getche();
}

printf("\nHet decimale getal is: %d", nDecimal);

printf("\nDo you want to run this program again? [y/n]: ");
chAgain = getche();
printf("\n");
}

return(0);
}
[/CPP]

Ik heb geprobeerd om aanhalingstekens om de 1 en 0 te zetten van nBinair. Maar dat gaat dan ook niet goed. Want dat had ik ook bij "int nDecimal = 0" staan. En dan werd nDecimal 48??

Hoe kan het dat dat niet goed gaat? En wat kan ik eraan doen?
 
Hoi,

Even wat me opvalt:

1: Het is ongebruikelijk in C om de functie main als int main() te declareren. Gebruik main() of de volledige en betere notatie int main(void). int main() gebruik je in C++, niet in C.

2. getche() is geen ANSI C functie. Gebruik liever getchar().

3. Je gebruikt de <math.h> library helemaal niet. Onnodig dus om deze te includen.

4. Je gebruikt Engels en Nederlands door mekaar.


Ook begrijp ik je vraag niet zo goed. Wat gaat er precies mis?


Jori.
 
Laatst bewerkt:
Code:
#include <stdio.h>

int bin2dec(const char *bin)
{
  int result=0;
  for(;*bin;bin++)
  {
    if((*bin!='0')&&(*bin!='1'))
      return -1;
    result=result*2+(*bin-'0');
    if(result<=0) return -1;
  }
  return result;
}

main()
{
  int dec=0;
  char bin[256]={0};
  printf("Geef een binair getal: ");
  gets(bin);
  dec=bin2dec(bin);
  if(dec!=-1)
    printf("Het decimale getal is: %d",dec);
  else
    printf("Geen geldige invoer");
  return 0;
}
 
int main gebruik je gewoon in C het is ook helemaal correct als he er een return 0 onder mikt.
 
Dat is gewoon onzin. Het mag dan wel compileren, maar het is uiterst ongebruikelijk. int main() is nog in traditioneel C nog in ANSI/ISO C een normale en correctere manier van programmeren.


Bronnen:
Wikipedia (main functie)
De programmeertaal C, hello world (K&R stijl)

De programmeertaal C (4de vernieuwde editie). Auteur: Al Kelley et alii. ISBN: 9043016691

Uiterst ongebruikelijk? Ik zie niks anders.
En wat doet het ertoe of dit zogenaamd "minder correct" is? Het is totaal niet van belang bij de vraag van de topic-starter.


Ik zou met behulp van printf() de waardes van nBinair en nDecimal naar het scherm printen, en zelf meerekenen of elke stap klopt. Op die manier kun je zelf zien waar het fout gaat.


Met doodgewoon een lap code antwoorden zonder verdere uitleg helpen we niemand verder. Het is zelfs tegen het beleid hier op helpmij.nl om dat te doen bij huiswerkopdrachten.
 
@jori13, ik ben pas 4-5 weken met de opleiding bezig, en programeren is een vak wat we slechts 2 uur in de week krijgen, en dit is dus m'n 2e programma.

De uitleg van functions ( en dus ook main(void)) hebben we vanmorgen gekregen, dus daar kan ik je antwoord geven. Ik zal voortaan ook netjes void invullen.

Verder hebben we de opdracht gekregen getche() te gebruiken. Vandaar dat ik hem gebruik.

De math library zal ik eruit halen, en engels en nederlands zal ik beter op gaan letten.

@DnB, zie de reactie van Arjan B. Gewoon een code heb ik niets aan, ik moet hem ook begrijpen en commentaar toevoegen. Verder moet ik de hele code met de leraar nalopen.

@Arjan B, ik had natuurlijk al wel van alles geprobeerd, en denk dat m'n probleem ergens zit in de aanhalingstekens.

Moet ik aanhalingstekens gebruik als ik een integer een waarde toe ken?
En kan ik getche() wel in een integer opslaan?

Edit, ben aan het proberen geweest, en zie dat een 0 verandert in 48 en een 1 in 49. Dit komt waarschijnlijk doordat getche() een char teruggeeft?
 
Laatst bewerkt:
Uiterst ongebruikelijk? Ik zie niks anders.
En wat doet het ertoe of dit zogenaamd "minder correct" is? Het is totaal niet van belang bij de vraag van de topic-starter.

Of je ziet alleen C++ code, of je hebt hele slechte informatie bronnen.

cl.exe en GCC geven allebei een waarschuwing.

cl.exe zei:
main.c(1) : warning C4255: 'main' : no function prototype given: converting '()' to '(void)'

Het was gewoon iets wat me opviel.


@TS

Verder hebben we de opdracht gekregen getche() te gebruiken. Vandaar dat ik hem gebruik.

Prima hoor, maar dan wordt ik wel nieuwsgierig waarom er niet voor een functie uit de standard library is gekozen door je leraar. Misschien een interessante vraag :)?

Moet ik aanhalingstekens gebruik als ik een integer een waarde toe ken?

Nee. Het is zelfs een fatale fout :P

En kan ik getche() wel in een integer opslaan?

Absoluut, aangezien een int een grote char is.

Edit, ben aan het proberen geweest, en zie dat een 0 verandert in 48 en een 1 in 49. Dit komt waarschijnlijk doordat getche() een char teruggeeft?

Dat zijn de waardes uit de ASCI tabel. Je moet het zo zien, elke char is in feite gewoon een kleine int, die in plaats van 4 bytes, 1 byte in neemt (systeem afhankelijk). Je kunt het ook andersom doen: declareer maar eens een int en print het met printf() als een char.


Jori.
 
Laatst bewerkt:
Maar ik moet verder met een 1 of 0, moet ik dan in m'n programma 48 en 49 gebruiken?

hij werkt nu, dit is m'n code:

Code:
/* INCLUDES: */
#include  <stdio.h>
#include <conio.h>

/* MAINPROGRAM: */
int main(void)
{
    char chAgain = 'y';

    printf("Welkom,\n");

    while(chAgain == 'y')/*nog een keer?*/
    {
        int nDecimal = 0, nBinary = 0;

        printf("\nGeef een binair getal: ");
        nBinary = getche();

        /*een 0 invoeren geeft 48, een 1 geeft 49. Hier verander ik ze terug1*/
        if(nBinary == 48){nBinary = 0;};
        if(nBinary == 49){nBinary = 1;};

        while(nBinary == 0 || nBinary == 1)
        {
            nDecimal = 2 * nDecimal + nBinary;
            nBinary = getche();

            if(nBinary == 48){nBinary = 0;};
            if(nBinary == 49){nBinary = 1;};
        }

        printf("\nHet decimale getal is: %d", nDecimal);

        printf("\nDo you want to run this program again? [y/n]: ");
        chAgain = getche();
        system ("cls");
    }

    return(0);
}
 
Laatst bewerkt:
Gebruik liever geen 48 en 49, maar gebruik de waardes '0' en '1'.
 
Dat probeer ik, maar als ik getche() gebruik, dan krijg ik geen 0 en 1. Ik krijg 48 en 49.

Is er een manier dat ik die 48 en 49 niet krijg, maar in plaats daarvan een 0 en 1?
 
i.p.v. 48 kan je '0' gebruiken dus met de enkele quote ' om de 0 heen.
Code:
if(nBinary == 48){nBinary = 0;};
if(nBinary == 49){nBinary = 1;};
wordt
Code:
if(nBinary == '0'){nBinary = 0;}
if(nBinary == '1'){nBinary = 1;}
of wat ik zelf makkelijker vindt
Code:
nBinary = nBinary - '0';

Edit:
Om je vraag te beantwoorden
Taigar zei:
Is er een manier dat ik die 48 en 49 niet krijg, maar in plaats daarvan een 0 en 1?
Nee die is er niet, getche() geeft '0' (met quotes). En '0' is gelijk aan 48. Je kan dus 48 met '0' vervangen. Dat staat wat beter.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan