[C++] programma beëindigen bij <Enter>

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
Gegroet,

Ik heb wat moeilijkheden bij een opdracht voor school.
Ik moet een programma schrijven waar de user max. 20 floats kan invoeren.
Daarna worden de ingevoerde floats weergegeven.
Als er vroegtijdig een 0 (nul) ingegeven wordt, worden de reeds ingevoerde floats weergegeven en wordt het programma beëindigd.
Als er echter geen getal word ingevoerd, moet het programma zonder meer eindigen.

Dit is mijn code tot nu toe
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>

int main(void)
{
    float nrs[20];
    int i, res, check;
    char c = 'a';
    int aantal = 20;
    
    for(i = 0; i < aantal; i++) // zet alle cellen van nrs[] op 0
    {
        nrs[i] = 0;   
    }
    
    for(i = 0; aantal--; i++)
    {
        check = 1;
        while(check)
        {
            printf("Geef getal nr. %d in : ", i+1);
            res = scanf("%f%c", &nrs[i], &c);
            if(res != 2 || c != '\n') // test op juiste invoer
            {
                printf("Foutieve invoer!\n");
                scanf("%*[^\n]%*c");       
            }
            else
            {
                check = 0;    
            }
        }
        
        if(nrs[i] == 0) // als er een 0 ingevoerd wordt
        {
            check = 0;
            break;
        }
    }
    
    aantal = 20 - aantal;
    
    for(i = 0; i < aantal; i++) // print heel nrs[]
    {
        printf("Getal %d : %f\n", i+1, nrs[i]);
    }
    
    return 0;
}


Het enige wat ik nu nog nodig heb is het herkennen van "geen invoer".
Als ik het programma start en op <Enter> druk bij een invoer, gaat de cursor echter gewoon naar de volgende lijn, terwijl ik dacht dat het programma <Enter> ook zou herkennen als Foutieve Invoer...
Iemand enige suggesties? :)

[GoT] TF2 Clan


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Ik vind je for - loop op regel 15 maar een rare constructie hoor...

https://fgheysels.github.io/


  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
whoami schreef op zaterdag 09 december 2006 @ 17:23:
Ik vind je for - loop op regel 15 maar een rare constructie hoor...
de constructie voor een for loop is :
code:
1
for(expr1; cond1; expr2)

expr1 & expr2 zijn gewone expressions.
cond1 is een conditional. Zolang deze "true" is, word de loop herhaald.

Ik gebruik :
code:
1
for(i = 0; aantal--; i++)


als aantal == 0 word, is de conditie van de for-loop niet meer "true" en eindigt ook de for loop.
Dus eigenlijk is de constructie niet zo raar, ze wordt gewoon minder gebruikt. :)
Ik gebruik deze constructie op regel 15 omdat ik dan het aantal ingevoerde getallen tel.
Als de for-loop vroegtijdig gestopt word (door een 0 in te geven) is aantal niet nul, maar 20 min het ingegeven aantal getallen.

Door na die for loop aantal = 20 - aantal in te voeren. Is aantal gelijk aan het totaal ingegeven getallen.

[GoT] TF2 Clan


  • EnnaN
  • Registratie: September 2002
  • Laatst online: 11:26

EnnaN

Toys in the attic

ik ben er een beetje uit, maar het lijkt me een beetje een hack om een "conditie" te doen door een aantal te verlagen. dat is volgens mij gewoon een zgn 'scheerlijn', en zeker voor een schoolopdracht niet echt toelaatbaar....een "bad practice" ...

maar goed, misschien is het juist wel heel mooi en ben ik te vastgeroest om het in te zien :)

sig


  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
EnnaN schreef op zaterdag 09 december 2006 @ 18:16:
ik ben er een beetje uit, maar het lijkt me een beetje een hack om een "conditie" te doen door een aantal te verlagen. dat is volgens mij gewoon een zgn 'scheerlijn', en zeker voor een schoolopdracht niet echt toelaatbaar....een "bad practice" ...

maar goed, misschien is het juist wel heel mooi en ben ik te vastgeroest om het in te zien :)
Nochtans zal de for-loop er niet slechter door werken hoor en eigenlijk is het net hetzelfde al een aantal te verhogen :)
Dit soort van constructies word gewoon niet zoveel gebruikt...

Maar rare constructie, of niet. Door daarover te discusieren kom ik niet vooruit...

[GoT] TF2 Clan


Verwijderd

system("PAUSE");

?

  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
Sorry, maar ik weet absoluut niet wat je hiermee bedoelt...

[GoT] TF2 Clan


Verwijderd

Daarmee pauzeer je het programma, en moet de gebruiker enter drukken voordat het programma afsluit.. Dit is toch was je zoekt?

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Elvis schreef op zaterdag 09 december 2006 @ 18:09:
[...]


de constructie voor een for loop is :
code:
1
for(expr1; cond1; expr2)
Ik weet wat een for loop is , en ik weet ook uit wat hij bestaat. Ik schrijf er zelf nl. genoeg.
Echter, jouw conditie binnen die for is volgens mij geen geldige conditie. Het is een expressie waarbij je een aantal gewoon verminderd, en als aantal nul is, zal hij gewoon stoppen.
Niet echt duidelijk / leesbaar / onderhoudbaar als je 't mijvraagt.

Over je probleem: door je code eens te debuggen kom je vooruit. :)
Ik vraag me trouwens af of je die code niet beter zo schrijft:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for( int i = 0; i < 20; i++ )
{
    printf("Geef getal nr. %d in : ", i+1);
    res = scanf("%f%c", &nrs[i], &c); 
    
    if( c == '\n' )
    {
         break; // break voortijdig als enter is ingegeven.
    }

    while( res != 2 )
    {
          printf("ongeldige invoer");
          res = ....
    }
}

Moet je trouwens geen gebruik maken van de cout en cin objecten ipv de printf / scanf C manier ?

[ Voor 33% gewijzigd door whoami op 09-12-2006 19:15 ]

https://fgheysels.github.io/


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

1) Waarom heb je het over C++ terwijl je code plain C is?

2) Je matched op twee chars waarvan de eerste een float moet zijn, dat gaat fout in het geval van input die alleen uit een newline ('\n') bestaat omdat scanf() een blocking functie is en net zolang blijft wachten tot er iets langskomt waar een getal van te maken valt. Gebruik daarom bij voorkeur een andere manier om input te lezen, bv:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
int i = 0;
char buf[16];

while (loop) {
    fgets(buf, 16, stdin);

    if (buf[0] == '\n') {
        break;
    }
    else {
        nrs[i++] = atof(buf);
    }
}

[ Voor 29% gewijzigd door DroogKloot op 09-12-2006 19:44 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Elvis schreef op zaterdag 09 december 2006 @ 18:09:
als aantal == 0 word, is de conditie van de for-loop niet meer "true" en eindigt ook de for loop.
Nee, als aantal -1 wordt zal hij stoppen, omdat a-- de oude waarde van a retourneert. Dus pas als aantal==0 vóórdat de -- wordt gedaan zal de loop stoppen, maar dan ga je de loop wel uit met een aantal==-1.
Dit gaat toevallig goed omdat je aantal al verminderd aan het begin van de eerste iteratie, maar na de lus klopt de code niet meer: de '20 - aantal' zal altijd 1 item teveel geven.

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.


  • apokalypse
  • Registratie: Augustus 2004
  • Laatst online: 12:30
Elvis schreef op zaterdag 09 december 2006 @ 18:25:
[...]


Nochtans zal de for-loop er niet slechter door werken hoor en eigenlijk is het net hetzelfde al een aantal te verhogen :)
Dit soort van constructies word gewoon niet zoveel gebruikt...

Maar rare constructie, of niet. Door daarover te discusieren kom ik niet vooruit...
om die reden zou ik ook while(2>3 || 4>3) kunnen gebruiken ipv while(true)
een conditietest met een zij-effect wil je meestal voorkomen. :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap niet helemaal wat je 2e zin met je 1e te maken heeft (er zitten geen side-effects aan 2>3 || 4>3), maar je hebt wel gelijk :)

[ Voor 20% gewijzigd door .oisyn op 11-12-2006 11:34 ]

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.


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
In plaats van een Float array een String array gebruiken,
deze strings doorlopen op een lege string, gevonden -> Beeindig programma
Cast de string naar een float om de berekening te doen.

[ Voor 4% gewijzigd door Mastermind op 11-12-2006 11:45 ]


Verwijderd

Volgens mij heeft mr Elvis er niet echt veel zin meer in?

Naja het is als het goed is ook mogelijk om met "cin.get();" je programma af te laten sluiten dmv een hit op je keyboard. (dacht ik ;))

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien moet je de topic beter lezen :)

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.

Pagina: 1