Archief - Compilers (noobquestion)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Tyfius

Legacy Member
[muggenzifterij]
tremor,

uw programma's zijn niet hetzelfde.

ofwel doende

printf("Hallo"); en cout << "Hallo";

ofwel

printf("Hallo\n"); en cout << "Hallo" << endl;

[/muggenzifterij]

:p

Grayfox

Legacy Member
tremor zei:
uw code is trouwens nie zo schitterend :-)
ge zegt dat het een C++ programma is, ma ge include een C header
In C++ is het normaal dat je ook C kan gebruiken, daarom da naam C++ ;)

declareren is een variable(naam) aanmaken, een geheugenplaats vrijhouden, en definieren is er een gegeven insteken
int variable; //declareren
variable = 5; //definieren

hopelijk heb ik ze niet omgewisseld =)

Wid@ker

Legacy Member
Sry voor het zagen, maar de vragen blijven maar komen ^^

Ik snap dus eigenlijk niet veel van die variabelen.

unsigned short int 0 tot 65.535
short int -32.768 tot 32.767
unsigned long int 0 tot 4.294.967.295
long int -2.147.483.648 tot 2.147.483.647
char 256 karakters
bool waar/onwaar
float 1,2e-38 tot 3,4e38
double 2,2e-308 tot 1,8e308
Wa wilt dat allemaal zeggen? Tis zo'n beetje Chinees voor mij :p (en ook da van float: 1,2e-38 blabla en bij double van tzelfde. Waarvoor staat da?)

Edit: En nog iets: wa is et verschil tussen void main en int main? (sry voor al de vragen :))

Krueger

Legacy Member
Wid@ker zei:
Sry voor het zagen, maar de vragen blijven maar komen ^^

Ik snap dus eigenlijk niet veel van die variabelen.

Wa wilt dat allemaal zeggen? Tis zo'n beetje Chinees voor mij :p (en ook da van float: 1,2e-38 blabla en bij double van tzelfde. Waarvoor staat da?)

Edit: En nog iets: wa is et verschil tussen void main en int main? (sry voor al de vragen :))
Dat zijn de ranges van uw variabelen.
vb in een unsigned short kunde getallen steken van 0 tot 65535.
In een short int kunde getlallen steken van -32.768 tot 32.767.
Probeer het anders eens he. Doe vb
unsigned short test=65533;
test++;
en zie wat er gebeurd.
die E staat voor de wetenschappelijke notatie, dat is het zelfde als 10 tot de macht ...
in een float kunde vb getallen steken van 1.2 *10^(-38) tot 3.4*10^(38) (dus zeer kleine en grote komma getallen)
Het verschil tussen int main en void main is niet zo groot, het mag alle twee. Het zou beter zijn int main te gebruiken, schijnt het.

Wid@ker

Legacy Member
Krueger zei:
Dat zijn de ranges van uw variabelen.
vb in een unsigned short kunde getallen steken van 0 tot 65535.
In een short int kunde getlallen steken van -32.768 tot 32.767.
Probeer het anders eens he. Doe vb
unsigned short test=65533;
test++;
en zie wat er gebeurd.
die E staat voor de wetenschappelijke notatie, dat is het zelfde als 10 tot de macht ...
in een float kunde vb getallen steken van 1.2 *10^(-38) tot 3.4*10^(38) (dus zeer kleine en grote komma getallen)
Het verschil tussen int main en void main is niet zo groot, het mag alle twee. Het zou beter zijn int main te gebruiken, schijnt het.
K, thx, maar wat is dan het nut van short int als long int toch een grotere range heeft?

Krueger

Legacy Member
Wid@ker zei:
K, thx, maar wat is dan het nut van short int als long int toch een grotere range heeft?
Het neemt minder geheugen in. Bij kleine apllicaties gade daar natuurlijk niets van merken, maar als ge weinig geheugen ter beschikking hebt, kunde op die manier derop bezuinigen.

Wid@ker

Legacy Member
K, kheb weer een vraag:

wat doet dit stuk code (een for loop) eigenlijk? (kheb et van een tutorial gehaald, maar kvind et nogal vaag).

Code:
for (int x=0; x<=10; x++)
{
  for (int y=0; y<=10; y++)
  {
  //hier komt de code
  }
}

alvast bedankt.

wlibaers

Legacy Member
Wid@ker zei:
K, kheb weer een vraag:

wat doet dit stuk code (een for loop) eigenlijk? (kheb et van een tutorial gehaald, maar kvind et nogal vaag).

Code:
for (int x=0; x<=10; x++)
{
  for (int y=0; y<=10; y++)
  {
  //hier komt de code
  }
}

alvast bedankt.


De code wordt eerst uitgevoerd met als waarden van x en y 0. Dan wordt de code opnieuw uitgevoerd, maar deze keer is x 0 en y 1. Dan opnieuw, x = 0, y = 2, en dat gaat verder tot x = 0 en y = 10. Dan is de binnenste loop afgelopen, wordt in de buitenste loop x groter, en dan begint de binnenste loop opnieuw vanaf nul, dus dan wordt de code daarbinnen uitgevoerd met x = 1, y = 0, dan nog eens met x = 1, y = 1, enz...
De laatste keer zullen zowel x als y 10 zijn, en daarna gaat het programma verder met de code achter de loop.

Maar dergelijke dubbele loops begrijpen zou geen probleem mogen zijn als je enkele loops begrijpt.

De for loop in C en C++ is wel een van de moeilijker versies van dat type, omdat het formaat nogal vrij is, en niet beperkt tot gewoon een reeks getallen. Je kan ook stukken weglaten. Bijvoorbeeld dit:

for (;;)
{
// code
}

Deze loop eindigt nooit, tenzij er binnen in die code een opdracht is m eruit te springen (break of return bijvoorbeeld).

Wid@ker

Legacy Member
En dan nog iet (ja, kweetet, kbegin echt te zagen ^^)

Code:
     int x,y,z;
        
        cout << "Voer een getal in: ";
        cin >> x;
        cout << "\nVoer nog een getal in: ";
        cin >> y;
        cout << "\nVoer nog een laatste getal in: ";
        cin >> z;
        cout << endl << endl << endl;
        
     if (x && y == z)
          {
               cout << "Alle getallen zijn hetzelfde!" << endl << endl << endl; 
          }
     if (x && !y == z)
          {
               cout << "Het eerste getal is gelijk aan het derde maar het tweede niet." << endl << endl << endl; 
          }
     if (y && !x == z)
          {
               cout << "Het tweede getal is gelijk aan het derde maar het eerste niet." << endl << endl << endl;     
          }
     if (x && !z == y)
          {
               cout << "De eerste 2 getallen zijn gelijk aan elkaar maar niet aan het derde." << endl << endl << endl;   
          }
     else
          {
               cout << "Alle getallen zijn verschillend." << endl << endl << endl;    
          }

Is dit geen correct if-statement?

Want als ik het programma test, en ik geef bij elk getal 5 in bv. zegt hij dat alle getallen gelijk zijn, maar ook dat alle getallen verschillend zijn. En als bv. x en y allebei 4 zijn en z = 9, zegt hij dat alle getallen verschillend zijn.

Tyfius

Legacy Member
Je moet alle variabelen vergelijken.

Code:
#include <iostream>
using namespace std;

int main() {
	int x,y,z;

	cout << "Voer een getal in: ";
	cin >> x;
	cout << "\nVoer nog een getal in: ";
	cin >> y;
	cout ww "\nVoer nog een laatste getal in: ";
	cin >> z;
	cout << endl << endl << endl;

	if ((x == z) && (y == z)) {
		cout << "Alle getallen zijn hetzelfde!" << endl << endl << endl;
	} else if ((x == z) && (y != z)) {
		cout << "Het eerste getal is gelijk aan het derde, maar het tweede niet." << endl << endl << endl;
	} else if ((x != z) && (y == z)) {
		cout << "Het tweede getal is gelijk aan het derde, maar het eerste niet." << endl << endl << endl;
	} else if ((x == y) && (x != z)) {
		cout << "De eerste twee getallen zijn gelijk aan elkaar, maar niet aan het derde." << endl << endl << endl;
	} else {
		cout << "Alle getallen zijn verschillend." << endl << endl << endl;
	}

	cin.get();
	return 0;
}

*note: programma niet gecompiled, maar het zou op het eerste zicht moeten werken.

wlibaers

Legacy Member
En als je zou willen weten waarom het werkt:

x && y == z
is hetzelfde als (x) && (y == z)
wat hetzelfde is als (x != 0) && (y == z)

De haakjes zijn niet echt nodig, maar zo zie je makkelijker de volgorde. Het kan in dit geval ook zonder:
x != 0 && y == z
omdat de prioriteiten van de operatoren toevallig zijn zoals ze hier moeten zijn.
http://www.difranco.net/cop2220/op-prec.htm

Wid@ker

Legacy Member
wlibaers zei:
En als je zou willen weten waarom het werkt:

x && y == z
is hetzelfde als (x) && (y == z)
wat hetzelfde is als (x != 0) && (y == z)

De haakjes zijn niet echt nodig, maar zo zie je makkelijker de volgorde. Het kan in dit geval ook zonder:
x != 0 && y == z
omdat de prioriteiten van de operatoren toevallig zijn zoals ze hier moeten zijn.
http://www.difranco.net/cop2220/op-prec.htm
Thx.

En wrm moet je eig na de eerste if telkens else if gebruiken?

visual_bAstArd

Legacy Member
Wid@ker zei:
Thx.

En wrm moet je eig na de eerste if telkens else if gebruiken?

Omdat je anders steeds een nieuwe if clausule start. Hij moet doorgaan naar het volgende gedeelte als de voorwaarde voldaan is, maar hij blifjt gewoon alles doorlopen. En dus is er geen resultaat.

Btw ik heb het ook geleerd via een dik boek van easy computing denk ik.
Ik heb nog eens een opfrissingscursus nodig. :cool:

Wid@ker

Legacy Member
visual_bAstArd zei:
Omdat je anders steeds een nieuwe if clausule start. Hij moet doorgaan naar het volgende gedeelte als de voorwaarde voldaan is, maar hij blifjt gewoon alles doorlopen. En dus is er geen resultaat.

Btw ik heb het ook geleerd via een dik boek van easy computing denk ik.
Ik heb nog eens een opfrissingscursus nodig. :cool:
K thx.

Kga wel is naar de bib of zo voor nen boek :)

Wid@ker

Legacy Member
K, weer een vraag:

Ik probeer iets te maken waarbij je een getal moet raden tussen 0 en 500. Als je het getal fout hebt, zegt hij of het groter of kleiner is. Als je het juist hebt zegt het programma het.

Kheb 2 manieren geprobeerd (allebei even slecht denk ik ma kom):

Code:
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
    int x = (rand() % 500) + 0;
    int y;
    
        cout << "Probeer het getal te raden: ";
        cin >> y;
        
            do
            {
                 cout << "Fout, het getal is kleiner: ";
                 cin >> y;    
            } 
            while(x < y);
            
            do
            {
                 cout << "Fout, het getal is groter: ";
                 cin >> y;
            }
            while(x > y); 
            
            do
            {
                 cout << "\nJuist, u hebt het getal geraden!" << endl << endl << endl;    
            }
            while(x == y);
        
    system ("PAUSE");
    return 0;
}

Code:
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
    int x = (rand() % 500) + 0;
    int y;
        
        cout << "Probeer het getal te raden: ";
        cin >> y;
            
        do
        {         
              if(x > y)
              {
                    cout << "\nFout, het getal is groter. "; 
                    cin >> y;   
              }
              else if(x < y)
              {
                    cout << "\nFout, het getal is kleiner. ";   
                    cin >> y;
              }  
              else
              {
                    cout << "\n\nJuist, u hebt het getal geraden!" << endl << endl << endl;    
              }
         }        
        while((x != y) || (x == y));
        
    system ("PAUSE");
    return 0;
}

Bij de eerste manier draait heel het programma zot als je het getal raadt. Het laat heel de tijd de zin van 'U hebt het geraden.' op het scherm komen.

Bij de 2de manier, daar heb ik da ding opt einde nooit dat dat zot draait. Maar als je daar van de eerste keer het getal raadt, of het is groter, dan zegt hij sowieso dat het getal kleiner is, omdat een do while sowieso 1 keer wordt uitgevoerd denk ik, maar kweet niet goed hoe ik 't moet stoppen.

Dit zijn wrs allebei codes die op niks trekken :/

En het zou ook heel handig zijn als je me zou kunnen vertellen hoe ik het programma laat zeggen in hoeveel keer het getal geraden is.

Tyfius

Legacy Member
Dit zou moeten werken.

Code:
#include <iostream>
// 2 C headers als ik me niet vergis, maar mogen normaal in C++
// ook gebruikt worden.
#include <time.h>
#include <stdlib.h>
using namespace std;

int main() {
    int randomGetal;
    int teRaden;
    int teller;

    // eerst moeten we een random getal generator seeden
    // met behulp van time.h en stdlib.h
    srand((unsigned)time(NULL));

    // 500 was wat te veel tijdens het testen.
    randomGetal = rand()%5;
    teller = 0;

    cout << "Geef een getal in: ";
    cin >> teRaden;

    do {
       if (randomGetal > teRaden) {
          cout << endl << "Het geraden getal is te klein.";
       } else if (randomGetal < teRaden) {
         cout << endl << "Het geraden getal is te groot.";
       } else if (randomGetal == teRaden) {
         cout << endl << "PROFICIAT, U HEBT JUIST GERADEN!!";
       }
       teller++;
       // een nieuw getal vragen
       cout << endl << "Geef een getal in: ";
       cin >> teRaden;
   }
   while (randomGetal != teRaden);

   cout << "Het werd geraden in " << teller << " keer." << endl;
   // wachten op een toets om ons programma te beïndigen.
   cin.get();
   return 0;
}

wlibaers

Legacy Member
Wid@ker zei:
K, weer een vraag:

Ik probeer iets te maken waarbij je een getal moet raden tussen 0 en 500. Als je het getal fout hebt, zegt hij of het groter of kleiner is. Als je het juist hebt zegt het programma het.

Kheb 2 manieren geprobeerd (allebei even slecht denk ik ma kom):

Zoek snel een goed boek, want je weet duidelijk niet waarmee je bezig bent.

De structuur is erg onlogisch.

Code:
        cout << "Probeer het getal te raden: ";
        cin >> y;
        
            do
            {
                 // dit zal altijd 1 keer uitgevoerd worden, ook als het getal niet kleiner is
                 cout << "Fout, het getal is kleiner: ";
                 cin >> y;    
            } 
            while(x < y); // herhalen zolang x < y
            
            do
            {
                 cout << "Fout, het getal is groter: "; // zal oook minstens 1 keer uitgevoerd worden
                 cin >> y;
            }
            while(x > y);
Herhalen zolang x > y
Als je hier een x < y ingeeft, zal het programma naar het volgende deel gaan en zeggen dat je het juiste getal geraden hebt. Het zal niet zeggen dat het kleiner is, want dat deel is al voorbij.
Code:
            do
            {
                 cout << "\nJuist, u hebt het getal geraden!" << endl << endl << endl;    
            }
            while(x == y);

Probeer eens flowcharts te maken, want wat ik hier zie demonstreert een gebrek aan inzicht in de volgorde waarin dingen uitgevoerd worden en hoe loops werken.

wlibaers

Legacy Member
Tyfius zei:
Dit zou moeten werken.

Code:
    teller = 0;

    cout << "Geef een getal in: ";
    cin >> teRaden;

    do {
       if (randomGetal > teRaden) {
          cout << endl << "Het geraden getal is te klein.";
       } else if (randomGetal < teRaden) {
         cout << endl << "Het geraden getal is te groot.";
       } else if (randomGetal == teRaden) {
         cout << endl << "PROFICIAT, U HEBT JUIST GERADEN!!";
       }
       teller++;
       // een nieuw getal vragen
       cout << endl << "Geef een getal in: ";
       cin >> teRaden;
   }
   while (randomGetal != teRaden);
}

Veel beter, maar nog niet helemaal correct volgens mij. (maar ik zit die programma's niet te testen, ben nu bezig op een PC zonder C++ compiler, ik voer ze gewoon in gedachten uit).

Het probleem duikt op wanneer je het juiste getal ingeeft. Dan val je uit de loop, zodat de "PROFICIAT, U HEBT JUIST GERADEN!!" nooit op het scherm komt.

Ik zou de volgende aanpassing uitvoeren:

Code:
    teller = 0;

    // weg met deze twee lijnen, overbodig door de volgende aanpassing
    //cout << "Geef een getal in: ";
    //cin >> teRaden;

    do {

       // de volgende lijnen verplaatst naar boven
       teller++;
       // een nieuw getal vragen
       cout << endl << "Geef een getal in: ";
       cin >> teRaden;

       if (randomGetal > teRaden) {
          cout << endl << "Het geraden getal is te klein.";
       } else if (randomGetal < teRaden) {
         cout << endl << "Het geraden getal is te groot.";
       } else if (randomGetal == teRaden) {
         cout << endl << "PROFICIAT, U HEBT JUIST GERADEN!!";
       }
   }
   while (randomGetal != teRaden);
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan