Archief - Q: C++ Rekenmachine

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.

FRozEN_FRoST

Legacy Member
Nadak de 5 eerste lessen van Cprogramming.com heb gedaan, en tijdens die lessen enkele voorbeelde had gemaakt, wou ek nu es alles van die lessen samengieten in een eigen projectje; een rekenmachine. Enkele dage gelede haddek et al es geprobeerd, maar toen bleefek maar foutmeldingen krijge, en nu hebbek et nekeer van 0 herschreven en zijn de foutmeldingen eruit, maar klopt het programma langs geen kanten.

Het begint goed, de gebruiker moet ingeve offem +,-,*,/ wil doen, en dan de twee getallen ingeve. Achteraf wordt er ook gevraagd of em opnieuw wilt (j) of niet (n), en da werkt ook, maar 't probleem zit bij de berekeningen zelf. Hij geeft een totaal verkeerd getal weer, en alsek + ingeef, doetem zowel + en -, alsek min ingeef - en *, en alsek * ingeef doetem * en /, in de volgorde van de code dus. Beetje te vreemd om het uit te leggen, moeste jullie es wille zien wa het probleem is, da zou heel vriendelijk zijn :)

Code:
/* Rekenmachine
5 maart 2005
Bruno Moorthamers */

#include <iostream>

using namespace std;

int add(int x, int y)   // Functie declareren
{
  return x + y;
}

int mul(int x, int y)   // Functie declareren
{
  return x * y;
}

int sub(int x, int y)   // Functie declareren
{
  return x - y;
}

int divi(int x, int y)  // Functie declareren
{
  return x / y;
}

int main()
{
	char berekening;	// Welke berekening wil de gebruiker doen?
	int x, y;		   // De twee getallen die gebruikt worden voor de berekening.
	char opnieuw[1];	// Wil de gebruiker een nieuwe berekening maken?
	
	do
	{
		  cout << "Wilt u optellen(+), aftrekken(-), vermenigvuldigen(*) of delen(/)?\n";
		  cin >> berekening;
		  
		  switch(berekening)
		  {
		  case '+':
			   cout << "Welke twee getallen wilt u optellen?\n";
			   cin >> x, y;
			   cin.ignore();
			   cout << "De uitkomst is: " << add(x, y) << ".\n";
		  case '-':
			   cout << "Welke twee getallen wilt u aftrekken?\n";
			   cin >> x, y;
			   cin.ignore();
			   cout << "De uitkomst is: " << sub(x, y) << ".\n";
		  case '*':
			   cout << "Welke twee getallen wilt u vermenigvuldigen?\n";
			   cin >> x, y;
			   cin.ignore();
			   cout << "De uitkomst is: " << mul(x, y) << ".\n";
		  case '/':
			   cout << "Welke twee getallen wilt u delen?\n";
			   cin >> x, y;
			   cin.ignore();
			   cout << "De uitkomst is: " << divi(x, y) << ".\n";
		  }
		  
		  cout << "Wilt u een nieuwe berekening maken (j) of niet (n)?\n";
		  cin >> opnieuw[1];
		  
	}
	while(opnieuw[1] == 'j');
	cin.get();

	return 0;
}

Greetz

el73

Legacy Member
Je laatste statement van een case moet een "break;" zijn als je niet wil dat de volgende gevallen worden uitgevoerd.

FRozEN_FRoST

Legacy Member
k, ty, da werkt nu al, nu nog een verklaring voor de vreemde oplossingen :-/

QplQyer

Legacy Member
Voor wat gebruik je eigenlijk een array voor die opnieuw als je er maar 1 char insteekt?

Tyfius

Legacy Member
simpel
normaal zou uwe tut da moeten uitgelegd hebben
Code:
switch() {
 case 1:
  doSomething();
  break;
 case 2:
  doSomething();
  break;
 default:
  doSomething();
  break;
}

Elke moegelijkheid moet ge hard afsluiten (mbv break). Een switch-case is ook de enige plaats waar ge in principe een break; moogt gebruiken.

Als ge geen break; gebruikt gaat die doorgaan, dus bvb
Code:
switch(antwoord) {
 case 'J':
 case 'j':
  actionYes();
  break;
 case 'N':
 case 'n':
  actionNo();
  break;
 default:
  actionNo();
  break;
}
Hier gaat gij dus kijken, als 'antwoord' == 'J', dan verder gaan tot als hij een functie tegenkomt (in dit geval actionYes(); en na deze functie de switch-case beeindigen.

MasterOfTerror

Legacy Member
eigenlijk toch wel een ingewikkeld script.. kan toch veel simpeler, maar kom

bij switch moet je idd na iedere case een break hebben
en dan op het einde van je case's een default waarde met ernaa break

Krueger

Legacy Member
MasterOfTerror zei:
eigenlijk toch wel een ingewikkeld script.. kan toch veel simpeler, maar kom

bij switch moet je idd na iedere case een break hebben
en dan op het einde van je case's een default waarde met ernaa break
Wat is er zo ingewikkeld aan dat script? Ik zie niet hoe je het veel eenvoudiger zou kunnen maken. (buiten die char die em in een array van 1 lang steekt dan)

wlibaers

Legacy Member
Tyfius zei:
Elke moegelijkheid moet ge hard afsluiten (mbv break). Een switch-case is ook de enige plaats waar ge in principe een break; moogt gebruiken.

Break kan ook in loops gebruikt worden, om uit de loop te raken voordat hij op de normale manier eindigt.

Voor een voorbeeld van een meer geavanceerde rekenmachine kan je eens in "The C++ Programming Language" (Stroustrup) gaan kijken.

Ollie

Legacy Member
Ik begrijp niet dat jij geen runtime errors krijgt als ik zie hoe jij je opnieuw array gebruikt. Array indices beginnen vanaf 0 en niet vanaf 1.

QplQyer

Legacy Member
Ollie zei:
Ik begrijp niet dat jij geen runtime errors krijgt als ik zie hoe jij je opnieuw array gebruikt. Array indices beginnen vanaf 0 en niet vanaf 1.
Nu je het zegt, dat moet een index out of bounds opleveren inderdaad.

TH.EraSerX

Legacy Member
QplQyer zei:
Nu je het zegt, dat moet een index out of bounds opleveren inderdaad.

C++ geeft geen out of bounds errors geloof ik, maar ge zit wel te rommelen in geheugen dat niet gealloceerd is voor uwen array, kan interessante resultaten geven :)

Silenger.BE

Legacy Member
??? Waarom dat, zou stom zijn om de cpu nog eens 1000 keer te laten loopen om niets te doen....

Tyfius

Legacy Member
dan is uw lus eigelijk fout, break; moet zoveel mogelijk vermeden worden, en de enige correcte plaats waar ge die zou mogen gebruiken is een switch-case.

Krueger

Legacy Member
Als ge een break hebt in een lus, betekend dat meestal dat je een lus hebt die mag uitvoeren totdat er aan een voorwaarde is voldaan. Ipv dan break te gebruiken kan je die voorwaarde in uw while steken, en als je een for hebt gebruikt, betekend dat dat je beter een while zou gebruiken.
Een break in een lus wordt echt aanzien als een serieuse stijlfout ivm programmeren.

Yngwie

Legacy Member
Ik heb dus ff u programma gecompiled en nekeer gezien naar de fouten en aangepast zodat het programma volledig werkt zoals het moet.

wat ik aangepast heb is :

* dien array weggedaan voor opnieuw te berekenen en er ne gewone char van gemaakt.

* uwe switch herschreven door die cin.ignore weg te laten(zou begot ni wete voorwa die daar staat) en de twee variabelen apart laten ingeven (na elkaar dus in plaats van "cin>>x,y;"

*breaks toegevoegd zoda em ni elke keer door de gehele switch valt

* voor een deling te doen heb ik u divi() functie aangepast naar "float divi()'" in plaats van "int divi" en ne cast operator toegevoegd aan u twee variabelen binnen die functie (die float binnen haakjes dus) as ge dees ni doe dan zult ge een deling maken zonder komma, 5/2 zou dus 2 geven, terwijl het eigelijk 2.5 moet zijn. da wordt dan opgelost door die float.

en dan nu natuurlijk het afgewerkte programma :

Code:
#include <iostream>

using namespace std;

int add(int x, int y)   // Functie declareren
{
  return x + y;
}

int mul(int x, int y)   // Functie declareren
{
  return x * y;
}

int sub(int x, int y)   // Functie declareren
{
  return x - y;
}

float divi(int x, int y)  // Functie declareren
{
  return (float)x / (float)y;
}

int main()
{
	char berekening;	// Welke berekening wil de gebruiker doen?
	int x, y;		   // De twee getallen die gebruikt worden voor de berekening.
	char opnieuw;	   // Wil de gebruiker een nieuwe berekening maken?
	
	do
	{
		  cout << "Wilt u optellen(+), aftrekken(-), vermenigvuldigen(*) of delen(/)?\n";
		  cin >> berekening;
		  
		  switch(berekening)
		  {
		  case '+':
			   cout << "Welke twee getallen wilt u optellen?\n";
			   cin >> x;
			   cin >> y;
			   cout << "De uitkomst is: " << add(x, y) << ".\n";break;
		  case '-':
			   cout << "Welke twee getallen wilt u aftrekken?\n";
			   cin >> x;
			   cin >> y;
			   cout << "De uitkomst is: " << sub(x, y) << ".\n";break;
		  case '*':
			   cout << "Welke twee getallen wilt u vermenigvuldigen?\n";
			   cin >> x;
			   cin >> y;
			   cout << "De uitkomst is: " << mul(x, y) << ".\n";break;
		  case '/':
			   cout << "Welke twee getallen wilt u delen?\n";
			   cin >> x;
			   cin >> y;
			   cout << "De uitkomst is: " << divi(x, y) << ".\n";break;
		  }
		  
		  cout << "Wilt u een nieuwe berekening maken (j) of niet (n)?\n";
		  cin >> opnieuw;
		  
	}
	while(opnieuw == 'j');
	cin.get();

	return 0;
}

as ge nog vragen hebt ofzo, add mij dan ma op msn => [email protected]

ps : mijn leerkracht c++ zou freaken moest er iemand nen break in een lus gebruiken :p

wlibaers

Legacy Member
Krueger zei:
Als ge een break hebt in een lus, betekend dat meestal dat je een lus hebt die mag uitvoeren totdat er aan een voorwaarde is voldaan. Ipv dan break te gebruiken kan je die voorwaarde in uw while steken, en als je een for hebt gebruikt, betekend dat dat je beter een while zou gebruiken.
Een break in een lus wordt echt aanzien als een serieuse stijlfout ivm programmeren.

Welnee, er zijn gevallen waarin dat perfect verdedigbaar is.
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2003-09/0446.html

Dit zijn serieuze stijlfouten:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2003-09/0479.html
Sorry voor de schaamteloze zelfpromotie, maar dit is nu eenmaal een van de weinige gevallen met zo'n duidelijke voorstelling van extreem gortige code. De zinsstructuur is ook moedwillig bizar gemaakt ;)


Voor wie context wil, de threads zijn vie google groups te vinden, hier de message ID van de beginposts van de threads (te gebruiken met geavanceerd zoeken).
Message-ID: <[email protected]>
Message-ID: <[email protected]>
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