Toon posts:

[C++] IF statement doet vreemd

Pagina: 1
Acties:

Verwijderd

Topicstarter
ok, eerst maar eens een stuk code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <conio.h>
#include <math>

using namespace std;

void wissel(int &, int &);

int main(void)
{
        bool isRechthoekigeDriehoek(int a, int b, int c);
        char stop;

        line1:
        int k, l, m;
        cout << "------------------ Created by NaturalBornKiller -------------------\n" << endl;
        cout << "-------- Kijk of een driehoek een RECHTHOEKIGE driehoek is --------"<< endl;
        cout << "\n*******************************************************************";
        cout << "\nGeef de lengte k\t"; cin >> k;
        cout << "\nGeef de lengte l\t"; cin >> l;
        cout << "\nGeef de lengte m\t"; cin >> m;
        cout << "\n*******************************************************************";
        cout << "\n\nDe door u ingevoerde waarde: \n";
        cout << "k = " << k << "\nl = " << l << "\nm = " << m << endl;
        if (isRechthoekigeDriehoek(k, l, m))
                cout << "\nDe lijnen vormen een rechthoekige driehoek" << endl;
        else
                cout << "\nDe lijnen vormen GEEN rechthoekige driehoek" << endl;

        getch();

        line2:
        cout << "\n\nProgramma afsluiten? (Y/N)";
        cin >> stop;
        if (stop == 'n' || stop == 'N')
        {
                cout << "\n\n\n\n\n\n\n\n\n";
                goto line1;
        }
        else if (stop != 'y' || stop != 'Y')
        {
                cout << "Toets Y voor YES of N voor NO";
                goto line2;
        }

  return 0;
}


bool isRechthoekigeDriehoek(int a, int b, int c)
{
        int h;

        if (a < b) wissel(a, b);
        if (a < c) wissel (a, c);
        if (a * a == pow(b, 2.0) + c * c) return true;
        return false;
}

void wissel(int &d, int &e)
{
        int h;
        h = d; d = e; e= h;
}


Het probleem zit 'm dus in het volgende stukje:
code:
1
2
3
4
5
else if (stop != 'y' || stop != 'Y')
        {
                cout << "Toets Y voor YES of N voor NO";
                goto line2;
        }


Als ik een Y of een y invoert gaat ie toch de IF-blok in, wat dus NIET de bedoeling is! :(

Maar als ik dit stukje code verander in dit:
code:
1
2
3
4
5
else if (stop != 'y')
        {
                cout << "Toets Y voor YES of N voor NO";
                goto line2;
        }


Doet het wel, althans als ik een kleine letter y invoer, bij een grote letter Y gaat ie dus wel weer IF-blok in, maar da 's logisch!

Wrom werkt dit niet ?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:55

Dido

heforshe

|| = OR?

(of vergis ik me nou?)

Dan kijk je dus of ie OF niet gelijk aan y is OF niet gelijk aan Y, en dat is hetzelfde als een IF 1==1 !

Wat betekent mijn avatar?


Verwijderd

code:
1
2
3
4
5
else if (stop != 'y' && stop != 'Y')
         {
                 cout << "Toets Y voor YES of N voor NO";
                 goto line2;
         }

zo dan?

Verwijderd

ik denk dat dit beter zal werken:

code:
1
else if (stop != 'y' && stop != 'Y')

Verwijderd

Topicstarter
hmm, ja zie wat ik verkeerd heb gedaan! Nu nog ff kijken of ik het kan oplossen met julli eopmerkingen! iig weet ik nu wat ik fout heb gedaan, en dan te bedneken dta ik dar al 4 uur naar aan het staren ben! :S

En ja hoor, opgelost! EINDELIJK !!!! _/-\o_

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

Dido schreef op 14 November 2002 @ 17:18:
|| = OR?

(of vergis ik me nou?)

Dan kijk je dus of ie OF niet gelijk aan y is OF niet gelijk aan Y, en dat is hetzelfde als een IF 1==1 !
C++:
1
2
3
4
if (stop != 'y' && stop != 'Y')
{

}


Dat zou moeten werken.... :P
Had je ook zelf kunnen testen of niet ;)

edit:

Was vergeten op verstuur te drukken |:(

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:55

Dido

heforshe

En dan doe ik nog mijn best om niet meteen het antwoord voor te kauwen :)

Maar om de een of andere reden had ik al het vermoeden dat het hierom ging toen ik de topictitel zag...
Deze fout komt zo vaak voor dat ik me soms afvraag of programmeurs de basisbeginselen van logica niet meer kennen... (NOFI, maar het lijkt vaak een linguistisch probleem, zoals bij SQL problemen : "ik wil alles van Jansen en Pietersen" wordt dan vertaald naar WHERE naam = "Jansen" AND naam = "Pietersen"; precies de omgekeerde fout dus)

Wat betekent mijn avatar?


Verwijderd

Maar om de een of andere reden had ik al het vermoeden dat het hierom ging toen ik de topictitel zag...
Inderdaad zo iets of een '=' en '==' verward of een functieaanroep in de if en dan de ()'s vergeten...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Misschien een goed idee om de goto's weg te werken ? >:)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op 14 november 2002 @ 18:34:
Misschien een goed idee om de goto's weg te werken ? >:)
Wrom zou ik die GOTO's weg werken? IS dit niet goed ofzo! Ben pas begonnen met C++ heb eerst JAVA gedaan, dus zou graag willen weten wrom en hoe ?

Ik weet dat het een domme fout was, maar ik kwam er ECHT niet uit! Heb een dikke 4 uur naar me beeldscherm zitten staren, en andere mensen gevraagd, die zeiden:

"Snap niks van C++, doe alles in JAVA!" (Terwijl dit PRECIES hetzelfde is in JAVA)|:(

Kijk dat zijn nog eens mensen waar je wat aan hebt! :S Niet dus! 8)7

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:45
[nohtml]
Verwijderd schreef op 14 November 2002 @ 19:34:
[...]


Wrom zou ik die GOTO's weg werken?
Waarom? Omdat dat niet gestructureerd programmeren is maar spaghetti-code schrijven. Het niet gebruiken van goto's is iets waar al in de eerste programmeerles moet op gehamerd worden.
IS dit niet goed ofzo!
Neen dus. ;)
goto's gebruiken lijdt naar errors en bugs in uw code.

In jouw geval gebruik je beter een lus:
code:
1
2
3
4
5
6
7
do
{

  ....
  cout << "Nog eens (J/N) ? ";
  cin >> stop;
}while (stop == 'n' || stop == 'N');


Ik zie dat je Hogere Informatica studeert.... Waar doe je dat? Hebben ze je daar nooit gezegd dat je geen goto's mag gebruiken?

https://fgheysels.github.io/


Verwijderd

gotos zijn basic, is niet netjes, bovendien kunnen ze infinite loops makkelijker veroorzaken :)

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

Dido schreef op 14 november 2002 @ 17:29:
En dan doe ik nog mijn best om niet meteen het antwoord voor te kauwen :)

Maar om de een of andere reden had ik al het vermoeden dat het hierom ging toen ik de topictitel zag...
Deze fout komt zo vaak voor dat ik me soms afvraag of programmeurs de basisbeginselen van logica niet meer kennen... (NOFI, maar het lijkt vaak een linguistisch probleem, zoals bij SQL problemen : "ik wil alles van Jansen en Pietersen" wordt dan vertaald naar WHERE naam = "Jansen" AND naam = "Pietersen"; precies de omgekeerde fout dus)
Mwah dat je je vergist kan gebeuren, doe ik ook vaker, vooral als je 3 of meer dingen in een lus hebt of een WHILE met IFjes erin, dat kan soms ff denken zijn.
Maarja als ik 10 seconden dat ding bekijk ben ik er zo uit.

Maar ik vind 't idd wel vreemd dat je hier een topic hierover opent, als je als weet dat je IF lus fout is dan is het toch niet zo heel moeilijk om die andere opties te proberen. Maarja, moet kunnen :)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:45
Verwijderd schreef op 14 november 2002 @ 19:39:
gotos zijn basic, is niet netjes, bovendien kunnen ze infinite loops makkelijker veroorzaken :)


En ze zorgen voor onleesbare en moeilijk onderhoudbare code.

https://fgheysels.github.io/


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

Verwijderd schreef op 14 november 2002 @ 19:39:
gotos zijn basic, is niet netjes, bovendien kunnen ze infinite loops makkelijker veroorzaken :)
Voor dit is een WHILE beter idd, maar ik heb op stage nu 1x GOTO's moeten gebruiken in een WHILE lus, anders werd 't beetje ingewikkeld en zo is de code veel efficiënter, dus ik denk niet dat ze verboden zijn, maar meestal niet echt gebruikelijk idd.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Voor dit is een WHILE beter idd, maar ik heb op stage nu 1x GOTO's moeten gebruiken in een WHILE lus, anders werd 't beetje ingewikkeld en zo is de code veel efficiënter, dus ik denk niet dat ze verboden zijn, maar meestal niet echt gebruikelijk idd.
Ze zijn niet verboden, anders werden ze niet ondersteund :), maar inderdaad, het is niet erg zolang je er maar voor zorgt dat je verder springt in je programma en niet terug

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:45
LiquidSilver schreef op 14 november 2002 @ 19:41:
[...]


Voor dit is een WHILE beter idd, maar ik heb op stage nu 1x GOTO's moeten gebruiken in een WHILE lus, anders werd 't beetje ingewikkeld en zo is de code veel efficiënter, dus ik denk niet dat ze verboden zijn, maar meestal niet echt gebruikelijk idd.


Dat is nu net de verleiding.... Het is misschien makkelijk om het met een goto te doen, quick en dirty aanpassingen enzo.... Vgl het met de 'dark side of the force' in SW.

https://fgheysels.github.io/


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

whoami schreef op 14 November 2002 @ 19:48:

[...]


Dat is nu net de verleiding.... Het is misschien makkelijk om het met een goto te doen, quick en dirty aanpassingen enzo.... Vgl het met de 'dark side of the force' in SW.
* Klippy gaat morgen kijk of 't ook anders kan :P

Want ik zat ook te twijfelen, maar volgens mij was dat toen de beste oplossing.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
Ik doe HIO op de Hogeschool 's-Hertogenbosch! EN ze hebben wel degelijk gezegd dat je GEEN goto's moet gebruiken, maar een goede reden erbij gaven ze niet! Dus ik denk zal wel nie zo belangrijk zijn, maar blijkbaar dus wel! Zal het eens veranderen, maar op het eerste gezicht was dit het makkelijkst.

iig heb ik weer wat te doen! :)

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
* Infinitive gaat morgen kijk of 't ook anders kan :P
Het is bewezen (door wie weet ik niet) dat elk programma met een goto erin ook geschreven kan worden d.m.v. if/while. Dus het is zeker mogelijk :)
ze hebben wel degelijk gezegd dat je GEEN goto's moet gebruiken, maar een goede reden erbij gaven ze niet!
Go To Statement Considered Harmful (Edsger W. Dijkstra)

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
whoami schreef op 14 November 2002 @ 19:37:
Ik zie dat je Hogere Informatica studeert.... Waar doe je dat? Hebben ze je daar nooit gezegd dat je geen goto's mag gebruiken?
:D Dat werd mij pas verteld toen ik in het 3e jaar (HvA) zat, niet dat ik het al eerder gebruikte, maargoed, 't gaat om het idee :)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

Infinitive schreef op 14 november 2002 @ 20:11:
[...]

Het is bewezen (door wie weet ik niet) dat elk programma met een goto erin ook geschreven kan worden d.m.v. if/while. Dus het is zeker mogelijk :)


[...]
Go To Statement Considered Harmful (Edsger W. Dijkstra)
Ja dat wist ik, maarja dat is dan idd het risico dat het ondersteund wordt, bij Delphi geloof ik niet, iig niet dat ik weet dus daar heb ik 't nog nooit gebruikt, maar als je het hebt en je bent wat lui....

Maar verbeter 't misschien wel dan nog ooit ;)

Ik vind die while ( true ) { } (met evt. een break) loopjes ook wel leuk :)
1e keer gebruikt geloof ik van de week in een thread.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LiquidSilver schreef op 14 november 2002 @ 19:49:
* curry684 gaat morgen kijk of 't ook anders kan :P

Want ik zat ook te twijfelen, maar volgens mij was dat toen de beste oplossing.
Als je 'm doormailt krijg je 'm morgenavond terug zonder goto's.

ALLE goto's zijn te vervangen door leesbare, duidelijkere, charmantere of vooral correctere oplossingen. De enige plaats waar een goto mag staan is in assembler.

Overigens bevatten hogere programmeertalen hiervoor helemaal charmantere mogelijkheden, denk aan (pseudocode):
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
block
  while something
    if something
      while something
        for something to something
          if something
            // Found what we were looking for, leave all loops
            exit block
          end if
        end for
      end while
    end if
  end while
end block

Zund dat C/C#/C++/Java dit niet slikken.... :(

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LiquidSilver schreef op 14 November 2002 @ 20:26:
Ja dat wist ik, maarja dat is dan idd het risico dat het ondersteund wordt, bij Delphi geloof ik niet, iig niet dat ik weet dus daar heb ik 't nog nooit gebruikt, maar als je het hebt en je bent wat lui....
Goto is in C++ verdwaald geraakt omdat het in principe in concept backwards compatible is met de C runtime libraries van die tijd. Oprechte design fout...
Ik vind die while ( true ) { } (met evt. een break) loopjes ook wel leuk :)
1e keer gebruikt geloof ik van de week in een thread.
Echter puristen vinden break en continue ook illegale statements, en vinden dat er maar 1 return per functie aanwezig mag zijn... toegegeven is dit de enige manier om echt duidelijke code-analysis te kunnen doen maar ik vind het over-the-top. Rasechte while(true) statements gebruik ik echter zowat wekelijks :P

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]
curry684 schreef op 15 november 2002 @ 00:47:
Goto is in C++ verdwaald geraakt omdat het in principe in concept backwards compatible is met de C runtime libraries van die tijd. Oprechte design fout...
mwoah, het is enorm handig voor compiler generators (lex, yacc en varianten), of andere generatoren die c of c++ code uitpoepen.
Maar zo lang ik in C(++) niet op een retesnelle manier uit een drievoudig of meer geneste lus kan springen gebruik ik goto. Gelukkig is dit zelden (lees: nog niet eens 1x per jaar) :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

Ow ja mijn goto zit in een switch.

Ik heb een dialoog waarin je wat kan kiezen. Is een pop-up venster, daar kies je een optie, je gaat terug naar je hoofdscherm en dan laat ik een switch los op de returnwaarde van de dialog en als de functies in de switch zijn afgehandeld spring ik met een goto terug naar die switch om weer te testen wat dit keer de returnwaarde is. En dat net zolang totdat de return -1 is.

En eerlijk gezegd zie ik niet in hoe dat beter kan :P

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Demoswitch:                 
    {       
        switch ( Return )
        {
            case -1: 
                //end switch
            break;
            case 0:
                DoeIets();
                Return = Ddlg.DoModal();
                goto Demoswitch;
            break;
            case 1:         
                DoeIets();
                Return = Ddlg.DoModal();
                goto Demoswitch;
            break;
            case 2:         
                DoeIets();
                Return = Ddlg.DoModal();
                goto Demoswitch;
            break;
    
                                    etc....
        };  
    };


Of doe ik iets gewoon superfout dan :)
Want ik heb hier zelf ook al over gedacht hoe dit beter kan, maarja kwam er niet zo snel uit, dus ff van de gelegenheid gebruik maken :P

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
C++:
1
2
3
4
while( Return != -1 )
{
    // switch statement goes here
}

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

farlane schreef op 15 November 2002 @ 09:33:
C++:
1
2
3
4
while( Return != -1 )
{
    // switch statement goes here
}
Klinkt wel erg simpel ja :P

Uuhm ja klinkt logisch ja....
Kut als dit goed is voel ik me wel weer heel erg n00b :P
Niet dat ik nou zo'n C++ held ben, maar dit had ik idd zelf kunnen verzinnen :P

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 15:14

johnwoo

3S-GTE

curry684 schreef op 15 November 2002 @ 00:44:
[...]
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
block
  while something
    if something
      while something
        for something to something
          if something
            // Found what we were looking for, leave all loops
            exit block
          end if
        end for
      end while
    end if
  end while
end block

Zund dat C/C#/C++/Java dit niet slikken.... :(
Dat is gewoon een verkapte voorwaarts springende goto :P
En eerlijk gezegd zie ik niet in hoe dat beter kan
[...]
Hiervoor gebruik ik meestal een loopje, en laat de keuze-invoer-functie een bepaalde waarde teruggeven als het menu verlaten moet worden:
C:
1
2
3
4
5
6
7
8
9
10
11
12
while ((RetVal = DoMyMenu()) != CHOICE_EXIT_MENU) {
   switch (RetVal) {
   case CHOICE_DO_SOMETHING:
      DoSomething();
      break;
   case CHOICE_DO_SOMETHING_ELSE:
      DoSomethingElse();
      break;
   default:
      DoSomethingDefault();
   }
}

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 28-08 20:51

Klippy

Still Game

Oke ik sliep zeker toen ik dit maakte, thx iig ;)

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

johnwoo schreef op 15 November 2002 @ 09:37:
Dat is gewoon een verkapte voorwaarts springende goto :P
Sja op die manier zijn break en continue ook verkapte goto's... tering, zelfs een functiecall is eigenlijk een goto die toevallig ook nog wat zut op de stack knikkert :P

Dit is in ieder geval een duidelijke vorm die de structuur van je programma niet de grond in boort en/of onduidelijke constructies met labels bouwt.

Professionele website nodig?

Pagina: 1