Toon posts:

[DELPHI] Controleren op String *

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

Verwijderd

Topicstarter
Val(StringVar : String;VAR NumeriekeVar : Integer; Code : Integer)

Volgens een opdracht kan ik met deze functie controleren of een invoer een letter is of niet..

Hoe moet ik dat toepassen op dit:
code:
1
2
3
4
5
BEGIN (* PerGetal *)
 IF (Getal <= Bovengrens) AND (Getal >= Ondergrens) THEN
 PosNegVrg;
 Voerin;
END;

Verwijderd

meuh?

Zou gewoon zoiets proberen als

functie isGetal(x : string) : boolean
var i : integer;
begin
result := true;
i := StrToInt(x);
except result := false;
end;

ofzo...

Verwijderd

Topicstarter
huh? Snap er niet veel van :) Heb nog niet zolang Delphi op school. Maar dat stond dus in de opgave, vaag he. Snap niet hoe ik dat moet doen :(

mijn 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
PROGRAM GemiddeldeProg;

{$R *.res}

CONST
Ondergrens = -1000;
Bovengrens = 1000;

VAR
 Getal,
 TotaalPos,
 SomPos,
 TotaalNeg,
 SomNeg : Integer;

 GemPos,
 GemNeg : Real;

      PROCEDURE Init;
      BEGIN
       TotaalPos := -1;
       TotaalNeg := 0;
       SomPos    := 0;
       SomNeg    := 0;
      END;

      PROCEDURE KopAfdruk;
      BEGIN
       WriteLn('************************************************');
       WriteLn('*                               *');
       WriteLn('* Dit programma berekend het gemiddelde van    *');
       WriteLn('* positieven en negatieve ingevoerde getallen. *');
       WriteLn('* domein: -1000 tot +1000               *');
       WriteLn('*                               *');
       WriteLn('************************************************');
      END;

      PROCEDURE Getallen;

            PROCEDURE PerGetal;

                PROCEDURE PosNegVrg;

                      PROCEDURE Ophogen(VAR Totaal : Integer;
                                  Erbij  : Integer);

                      BEGIN
                       Totaal := Totaal + Erbij;
                      END; (* Ophogen *)

                      PROCEDURE Negatief;
                      BEGIN
                       Ophogen(SomNeg, Getal);
                       Ophogen(TotaalNeg,1);
                      END;

                      PROCEDURE Positief;
                      BEGIN
                       Ophogen(TotaalPos,1);
                       Ophogen(SomPos, Getal);
                      END;

                BEGIN (* PosNegVrg *)
                 IF Getal < 0 THEN
                 Negatief
                 ELSE
                 Positief;
                END; (* PosNegVrg *)

                PROCEDURE Voerin;
                BEGIN
                 Write('Geef een getal : ');
                 Readln(Getal);
                END;

            BEGIN (* PerGetal *)
            IF (Getal <= Bovengrens) AND (Getal >= Ondergrens) THEN
             PosNegVrg;
             Voerin;
            END;

      BEGIN (* Getallen *)
      REPEAT PerGetal UNTIL
       Getal = 0;
      END;

      PROCEDURE Slot;

            PROCEDURE BerekenGemiddelde;

                PROCEDURE Deling(VAR Gem : Real;
                            Som  : Integer;
                            Totaal: Integer);
                BEGIN
                 Gem := Som / Totaal;
                END;

            BEGIN (* BerekenGemiddelde *)
            IF (SomPos <> 0) THEN
            Deling(GemPos,SomPos,TotaalPos)
            ELSE
            GemPos := 0;
            IF (SomNeg <> 0) THEN
            Deling(GemNeg,SomNeg,TotaalNeg)
            ELSE
            GemNeg := 0;
             END; (* BerekenGemiddelde *)

            PROCEDURE SlotAfdruk;
            BEGIN
            WriteLn;
            WriteLn('>>>>>>>>>>OUTPUT<<<<<<<<<<<<');
            WriteLn;
            WriteLn('++++++++ POSITIEF ++++++++');
            WriteLn('Aantal Positief    : ',TotaalPos);
            WriteLn('Totaal Positief    : ',SomPos);
            WriteLn('Gemiddeld Positief : ',GemPos:0:2);
            WriteLn;
            WriteLn('-------- NEGATIEF --------');
            WriteLn('Aantal Negatief    : ',TotaalNeg);
            WriteLn('Totaal Negatief    : ',SomNeg);
            WriteLn('Gemiddeld Negatief : ',GemNeg:0:2);
            Readln;
            END;

      BEGIN (* Slot *)
       BerekenGemiddelde;
       SlotAfdruk;
      END;

BEGIN (* GemiddeldeProg *)
 Init;
 KopAfdruk;
 Getallen;
 Slot;
END.

Wat ik dus niet begrijp:
Breid de procedure van opgave 2 zodanig uit, dat ook gecontroleerd wordt op foutieve invoer van letters. Maak hierbij gebruik van de volgende standaard procedure binnen pascal:

Val(StringVar : String;VAR NumeriekeVar : Real; Code : Integer)
of
Val(StringVar : String;VAR NumeriekeVar : Integer; Code : Integer)


Als het omzetten van de String naar een getal is gelukt, zal Code de waarde 0 krijgen en anders een waarde <> 0

Verwijderd

Topicstarter
dat red ik dus niet meer voor morgen :(

Verwijderd

Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
Var str : string;
    i,code : integer;
    
begin
str := '123a456';
Val(Str,I,Code);  {code zal hier 4 worden omdat op positie 4 een letter staat ipv een cijfer}
            {kan ie dus niet converteren}
str := '123';
Val(Str,I,Code);  {code zal 0 worden omdat er geen letters staan. I heeft nu waarde 123}
WriteLn(I);  {om het the checken}
end;

Verwijderd

heeft trouwes weinig met delphi te maken..tis meer turbo pascal in een delphi omgeving :) Delphi werkt toch wel wat anders...

Verwijderd

Topicstarter
Op dinsdag 05 februari 2002 23:11 schreef Lynx666 het volgende:
Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
Var str : string;
    i,code : integer;
    
begin
str := '123a456';
Val(Str,I,Code);  {code zal hier 4 worden omdat op positie 4 een letter staat ipv een cijfer}
            {kan ie dus niet converteren}
str := '123';
Val(Str,I,Code);  {code zal 0 worden omdat er geen letters staan. I heeft nu waarde 123}
WriteLn(I);  {om het the checken}
end;
Dit snap ik nu, maar ik heb al een variabele "Getal", dat is een Integer. Nu moet er dus gecontroleerd worden of dat Getal dus alleen cijfers bevat... En dus een 0 terug geeft. Dan kan ik weer iets doen zoals IF Code = o THEN ...

Maar hoe komt dat er dan uit te zien?

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

De bovenste code werkt wel gewoon. Het programma probeert een bewerking uit te voeren die je alleen met een string kan doen. Met een cijfer (|:() kan dat natuurlijk niet, en komt er een foutmelding. Je weet dan dat het niet een string is.

Wat er eigenlijk bedoelt word, is dat je aan de hand van ascii codes gaat controleren of het betreffende teken in een bepaalde range valt. Het blijft een opdracht dus ik zal het niet precies uitleggen, maar als je eens bij de help zoekt op 'ord' dan red je je wel weer denk ik.. post maar als het je nog niet lukt..

edit: lees net dat het om de implementatie gaat.

Je kunt met een lading if/then statements alles afvangen, maar makkelijker is daar een case statement van te maken. Nou werk ik met school al enige maanden met java, dus ben ff kwijt hoe het met delphi was. Syntax vind je wel in de help. Succes!

Wat je dan moet doen is per case een string in een variabele zetten, en na de case deze string in edit1.text neerplanten.

Localhost is where the heart is


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                PROCEDURE Voerin;
                var
                StrGetal : String[8];
                Getal    : Integer;
                Code     : Integer;

                BEGIN
                Write('Geef een getal : ');
                Readln(StrGetal);
                (* Omzetten *)
                Val(StrGetal, Getal, Code);
                (* Check *)
                IF Code <> 0 THEN
                WriteLn('Ongeldige waarde')
                ELSE
                Getal := StrToInt(StrGetal);
                END;

Dit werkt niet! Ik dacht dat dit wel goed was, niet dus :(
Delphi komt met deze foutmelding:
code:
1
[Error] GemiddeldeProg.dpr(88): Undeclared identifier: 'StrToInt'

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

ik denk dat je iets mist in je Uses clause..

Localhost is where the heart is


Verwijderd

Topicstarter
vaag allemaal, als ik die regel met StrToInt ergens anders in mn programma zet gaat het wel goed :'(

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 15:23

Delphi32

Heading for the gates of Eden

Op woensdag 06 februari 2002 00:24 schreef Mr.SubZero het volgende:
vaag allemaal, als ik die regel met StrToInt ergens anders in mn programma zet gaat het wel goed :'(
StrToInt staat (uit mn hoofd) in SysUtils. Die bevindt zich standaard in de uses clause van elk form in een applicatie, dus dat zal het probleem zijn. Jij zit je hele pascalzooi (heeft idd weinig met Delphi te maken, maar goed, opdracht is opdracht) in de *.dpr te rommelen. In de *.dpr staan in de uses alleen de files die jouw project definiëren (forms en units die je zelf aanmaakt dus) en NIET de VCL units...

Dus SysUtils toevoegen aan de Uses van je dpr, dan doetie het.

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

console applicatie noemen we dat.. poept die functie niet meteen al het 'int' antwoord uit in Getal?

Localhost is where the heart is


Verwijderd

Topicstarter
Dat was de oplossing ja, uses SysUtils...
Maar nu breekt hij uit de loop van "Until Getal = 0" Wanneer als invoer een letter wordt gegeven...

Waarom gaat hij an niet opnieuw om invoer vragen?
Hij gaat dan verder met de rest van het programma...

Het is de bedoeling dat hij net zolang blijft vragen totdat er wel een geldige (integer) invoer is..

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

code:
1
2
3
4
5
While (Val(StrGetal, Getal, Code)) = false)
begin
  writeln("Voer geldig getal in");
  readln(StrGetal);
end;

zoiets?

Localhost is where the heart is


Verwijderd

Topicstarter
nee, want dan wordt er dus niks met Getal gedaan in de rest van het programma, omdat hij dan steeds in die loop blijft als het een geldig getal is, nutteloos dus...

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45

SilentStorm

z.o.z

wat ie hier doet is eruit springen zodra die een geldig getal heeft gevonden..opf mn delphi skills zijn wel heel roestig geworden..

edit: moet je natuurlijk wel eerst een ongeldig StrGetal gebruiken voor je in de loop komt..

Localhost is where the heart is


Verwijderd

Topicstarter
ik ben erachter gekomen dat:

Wanneer ik nu geen getal maar bijvoorbeeld "a" intik...
Dan wordt getal "automatisch" op "0" gezet..
Laat dat nou net mijn afslagcriterium zijn :(
(UNTIL Getal = 0)

Dus hoe moet ik dat nou afvangen?
Nu heb ik dus
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                PROCEDURE Voerin;
                VAR
                StrGetal : String;
                Code     : Integer;

                BEGIN
                Write('Geef een getal : ');
                Readln(StrGetal);
                (* Omzetten *)
                Val(StrGetal, Getal, Code);
                (* Check *)
            -->   IF Code <> 0 THEN
            -->   WriteLn('Ongeldige waarde')
                ELSE
                Getal := StrToIntStrGetal);
                END;

Dus wat gebeurt er nu als er een karakter in de invoer blijkt te zitten -->
code:
1
2
                IF Code <> 0 THEN
                WriteLn('Ongeldige waarde')

Dan schrijft hij een foutmelding naar het scherm, geeft Getal de waarde "0" en breekt uit de loop :(
Hoe kan ik er nu voor zorgen dat hij weer opnieuw vraagt om een invoer? Let dus op dat afslagcriterium van Getal = 0. Dat moet zo blijven staan..

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure VoerIn;
var
  StrGetal: string;
  Code: Integer;
begin
  repeat
    Write('Geef een getal : ');
    Readln(StrGetal);
    Val(StrGetal, Getal, Code);
    if Code <> 0 then
    WriteLn('Ongeldige waarde');
  until Code = 0;
  { In de var. Getal staat nu het ingevoerde getal :) }
end;

  • Dapa
  • Registratie: Januari 2001
  • Niet online
Op woensdag 06 februari 2002 01:21 schreef Mr.SubZero het volgende:
ik ben erachter gekomen dat:

Wanneer ik nu geen getal maar bijvoorbeeld "a" intik...
Dan wordt getal "automatisch" op "0" gezet..
Laat dat nou net mijn afslagcriterium zijn :(
(UNTIL Getal = 0)
Maak er dan van UNTIL (Getal = 0) AND (CODE = 0)

Verwijderd

Topicstarter
eindelijk af en werkend. Denk wel op een omslachtige manier maar anders kon ik het niet werkend krijgen. Bedankt voor jullie reacties. Ik zal nog 1x mijn juiste (hele) code posten zodat jullie weten hoe het is geworden. Misschien dat jullie er zelf ook nog eens mee willen klooien...
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
PROGRAM GemiddeldeProg4;

uses SysUtils;
{$R *.res}

CONST
Ondergrens = -1000;
Bovengrens = 1000;

VAR
 Getal,
 TotaalPos,
 SomPos,
 TotaalNeg,
 Code2,
 Teveel,
 SomNeg : Integer;

 GemPos,
 GemNeg : Real;

      PROCEDURE Init;
      BEGIN
       TotaalPos := -1;
       TotaalNeg := 0;
       SomPos    := 0;
       SomNeg    := 0;
       Teveel    := 0;
      END;

      PROCEDURE KopAfdruk;
      BEGIN
       WriteLn('************************************************');
       WriteLn('*                               *');
       WriteLn('* Dit programma berekend het gemiddelde van    *');
       WriteLn('* positieven en negatieve ingevoerde getallen. *');
       WriteLn('* domein: -1000 tot +1000               *');
       WriteLn('*                               *');
       WriteLn('************************************************');
      END;

      PROCEDURE Getallen;

            PROCEDURE PerGetal;

                PROCEDURE PosNegVrg;

                      PROCEDURE Ophogen(VAR Totaal : Integer;
                                  Erbij  : Integer);

                      BEGIN
                       Totaal := Totaal + Erbij;
                      END; (* Ophogen *)

                      PROCEDURE Negatief;
                      BEGIN
                       Ophogen(SomNeg, Getal);
                       Ophogen(TotaalNeg,1);
                      END;

                      PROCEDURE Positief;
                      BEGIN
                       Ophogen(TotaalPos,1);
                       Ophogen(SomPos, Getal);
                      END;

                BEGIN (* PosNegVrg *)
                 IF Getal < 0 THEN
                 Negatief
                 ELSE
                 {IF Getal > 0 THEN als SomPos op 0 staat}
                 Positief;
                END; (* PosNegVrg *)

                PROCEDURE Voerin;
                VAR
                StrGetal : String;
                Code      : Integer;

                BEGIN
                Write('Geef een getal : ');
                Readln(StrGetal);
                (* Omzetten *)
              Val(StrGetal, Getal, Code);
                (* Check *)
                IF Code <> 0 THEN
                BEGIN
                Code2 := Code;
                WriteLn('Ongeldige waarde');
                Teveel := Teveel + 1;
                END
                ELSE
                BEGIN
                Getal := StrToInt(StrGetal);
                Code2 := 0;
                END
                END;


            BEGIN (* PerGetal *)
            IF (Getal <= Bovengrens) AND (Getal >= Ondergrens) THEN
             PosNegVrg;
             Voerin;
            END;

      BEGIN (* Getallen *)
      REPEAT PerGetal UNTIL
       (Getal = 0) AND (Code2 = 0);
      END;

      PROCEDURE Slot;

            PROCEDURE BerekenGemiddelde;

                PROCEDURE Deling(VAR Gem : Real;
                             Som  : Integer;
                             Totaal: Integer);
                BEGIN
                 Gem := Som / Totaal;
                END;

            BEGIN (* BerekenGemiddelde *)
            IF (SomPos <> 0) THEN
            Deling(GemPos,SomPos,TotaalPos)
            ELSE
            GemPos := 0;
            IF (SomNeg <> 0) THEN
            Deling(GemNeg,SomNeg,TotaalNeg)
            ELSE
            GemNeg := 0;
             END; (* BerekenGemiddelde *)

            PROCEDURE SlotAfdruk;
            BEGIN
            WriteLn;
            WriteLn('>>>>>>>>>>OUTPUT<<<<<<<<<<<<');
            WriteLn;
            WriteLn('++++++++ POSITIEF ++++++++');
            WriteLn('Aantal Positief    : ',TotaalPos-Teveel);
            WriteLn('Totaal Positief    : ',SomPos);
            WriteLn('Gemiddeld Positief : ',GemPos:0:2);
            WriteLn;
            WriteLn('-------- NEGATIEF --------');
            WriteLn('Aantal Negatief    : ',TotaalNeg);
            WriteLn('Totaal Negatief    : ',SomNeg);
            WriteLn('Gemiddeld Negatief : ',GemNeg:0:2);
            Readln;
            END;

      BEGIN (* Slot *)
       BerekenGemiddelde;
       SlotAfdruk;
      END;

BEGIN (* GemiddeldeProg *)
 Init;
 KopAfdruk;
 Getallen;
 Slot;
END.

of download het:
http://members.home.nl/sub0/opdracht1.zip

Verwijderd

Topicstarter
Heb nu met booleans gewerkt om te controleren op geldige invoer
update:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
PROGRAM GemiddeldeProg4;

uses SysUtils;
{$R *.res}

CONST
Ondergrens = -1000;
Bovengrens = 1000;

VAR
 Getal,
 TotaalPos,
 SomPos,
 TotaalNeg,
 Teveel,
 SomNeg : Integer;
 GemPos,
 GemNeg : Real;
 GeldigeInvoer: Boolean;

      PROCEDURE Init;
      BEGIN
       TotaalPos := -1;
       TotaalNeg := 0;
       SomPos    := 0;
       SomNeg    := 0;
       Teveel    := 0;
      END;

      PROCEDURE KopAfdruk;
      BEGIN
       WriteLn('************************************************');
       WriteLn('*                               *');
       WriteLn('* Dit programma berekend het gemiddelde van    *');
       WriteLn('* positieven en negatieve ingevoerde getallen. *');
       WriteLn('* domein: -1000 tot +1000               *');
       WriteLn('*                               *');
       WriteLn('************************************************');
      END;

      PROCEDURE Getallen;

            PROCEDURE PerGetal;

                PROCEDURE PosNegVrg;

                      PROCEDURE Ophogen(VAR Totaal : Integer;
                                  Erbij  : Integer);

                      BEGIN
                       Totaal := Totaal + Erbij;
                      END; (* Ophogen *)

                      PROCEDURE Negatief;
                      BEGIN
                       Ophogen(SomNeg, Getal);
                       Ophogen(TotaalNeg,1);
                      END;

                      PROCEDURE Positief;
                      BEGIN
                       Ophogen(TotaalPos,1);
                       Ophogen(SomPos, Getal);
                      END;

                BEGIN (* PosNegVrg *)
                 IF Getal < 0 THEN
                 Negatief
                 ELSE
                 {IF Getal > 0 THEN als SomPos op 0 staat}
                 Positief;
                END; (* PosNegVrg *)

                PROCEDURE Voerin;
                VAR
                StrGetal : String;
                Code      : Integer;

                BEGIN
                Write('Geef een getal : ');
                Readln(StrGetal);
                (* Omzetten *)
              Val(StrGetal, Getal, Code);
                (* Check *)
                IF Code <> 0 THEN
                BEGIN
                GeldigeInvoer := false;
                WriteLn('Ongeldige waarde');
                Teveel := Teveel + 1;
                END
                ELSE
                BEGIN
                Getal := StrToInt(StrGetal);
                GeldigeInvoer := true;
                END
                END;


            BEGIN (* PerGetal *)
            IF (Getal <= Bovengrens) AND (Getal >= Ondergrens) THEN
             PosNegVrg;
             Voerin;
            END;

      BEGIN (* Getallen *)
      REPEAT PerGetal UNTIL
       (Getal = 0) AND (GeldigeInvoer = true);
      END;

      PROCEDURE Slot;

            PROCEDURE BerekenGemiddelde;

                PROCEDURE Deling(VAR Gem : Real;
                             Som  : Integer;
                             Totaal: Integer);
                BEGIN
                 Gem := Som / Totaal;
                END;

            BEGIN (* BerekenGemiddelde *)
            IF (SomPos <> 0) THEN
            Deling(GemPos,SomPos,TotaalPos)
            ELSE
            GemPos := 0;
            IF (SomNeg <> 0) THEN
            Deling(GemNeg,SomNeg,TotaalNeg)
            ELSE
            GemNeg := 0;
             END; (* BerekenGemiddelde *)

            PROCEDURE SlotAfdruk;
            BEGIN
            WriteLn;
            WriteLn('>>>>>>>>>>OUTPUT<<<<<<<<<<<<');
            WriteLn;
            WriteLn('++++++++ POSITIEF ++++++++');
            WriteLn('Aantal Positief    : ',TotaalPos-Teveel);
            WriteLn('Totaal Positief    : ',SomPos);
            WriteLn('Gemiddeld Positief : ',GemPos:0:2);
            WriteLn;
            WriteLn('-------- NEGATIEF --------');
            WriteLn('Aantal Negatief    : ',TotaalNeg);
            WriteLn('Totaal Negatief    : ',SomNeg);
            WriteLn('Gemiddeld Negatief : ',GemNeg:0:2);
            Readln;
            END;

      BEGIN (* Slot *)
       BerekenGemiddelde;
       SlotAfdruk;
      END;

BEGIN (* GemiddeldeProg *)
 Init;
 KopAfdruk;
 Getallen;
 Slot;
END.

Laat het slotje maar komen ;)
(tenzij iemand nog verbeterpunten ziet of ziet hoe het anders kan...)

Verwijderd

Misschien het welbekende zout na de maaltijd. Bovendien kan het best zijn dat deze oplossing al gegeven is maar ik kon hem niet zo snel vinden:
code:
1
2
3
4
5
function Val(const S: String; var G: Integer): Boolean;
begin
  G:=StrToIntDef(S, Low(Integer));
  Result:=G>Low(Integer);
end;

Lekker kort maar werkt wel!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:04

Tomatoman

Fulltime prutser

[offtopic]
Die docent van jou is blijkbaar in het Pascal-tijdperk blijven hangen. Die code werkt natuurlijk best in Delphi, maar druist in tegen de conventies. Sinds het verschijnen van Delphi in 1995 doen we het allemaal een beetje anders. Vertel hem maar eens namens een tweaker:

1) Gereserveerde woorden en standard directives schrijf je geheel in kleine letters. In het Pascal-tijdperk schreef je ze in hoofdletters om je code te verduidelijken. In Delphi geeft de code editor ze automatisch aan met andere opmaak (normaliter vet gedrukt), zodat hoofdletters alleen maar storend werken.

2) Inspringen doe je met minder marge bijvoorbeeld de breedte van twee letters om minder te hoeven klooien met tekst die niet op één regel past.

3) Direct onder de regel program Blabla; zet je de directive {$APPTYPE CONSOLE}.

4) Welke resource wil je in het programma linken? {$R *.res} linkt waarschijnlijk niets nuttigs.

5) Commentaar geef je met { blabla } en // blabla. De notatie (* blabla*) wordt in de praktijk vrijwel nooit meer gebruikt.

Herschrijven die hap dus. Wat die docent jou leert is niet echt fout, maar wel hopeloos achterhaald. In educatief opzicht verdient hij een flinke onvoldoende.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
het is een ZEI

Vandaar... :+

Verwijderd

Topicstarter
mijn code heb ik aangepast, ze zei dat ik het simpeler kon doen, ik snap nu ook waarom. De code is nu:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
PROGRAM GemiddeldeProg;

uses SysUtils;
{$APPTYPE CONSOLE}

CONST
Ondergrens = -100;
Bovengrens = 100;

VAR
 Getal,
 TotaalPos,
 SomPos,
 TotaalNeg,
 SomNeg : Integer;
 GemPos,
 GemNeg : Real;

      PROCEDURE Init;
      BEGIN
       TotaalPos := 0;
       TotaalNeg := 0;
       SomPos    := 0;
       SomNeg    := 0;
      END;

      PROCEDURE KopAfdruk;
      BEGIN
       WriteLn('************************************************');
       WriteLn('*            ------ ----            *');
       WriteLn('*             IB1B3            *');
       WriteLn('*                               *');
       WriteLn('*                               *');
       WriteLn('* Dit programma berekend het gemiddelde van    *');
       WriteLn('* positieven en negatieve ingevoerde getallen. *');
       WriteLn('* domein: -100 tot +100             *');
       WriteLn('*                               *');
       WriteLn('************************************************');
      END;

      PROCEDURE Voerin;
      VAR
      Str : String;
      Code: Integer;

      BEGIN (* Voerin *)
      REPEAT
      Write('Geef een getal: ');
      ReadLn(Str);
      Val(Str, Getal, Code); //omzetten naar Integer
      UNTIL (Code = 0) AND ((Getal > Ondergrens) AND (Getal < Bovengrens) OR (Getal = 0));
      END; (* Voerin *)

      PROCEDURE Getallen;

            PROCEDURE PerGetal;

                PROCEDURE PosNegVrg;

                      PROCEDURE Ophogen(VAR Totaal : Integer;
                                  Erbij  : Integer);

                      BEGIN
                       Totaal := Totaal + Erbij;
                      END; (* Ophogen *)

                      PROCEDURE Positief;
                      BEGIN
                       Ophogen(TotaalPos,1);
                       Ophogen(SomPos, Getal);
                      END;

                      PROCEDURE Negatief;
                      BEGIN
                       Ophogen(SomNeg, Getal);
                       Ophogen(TotaalNeg,1);
                      END;

                BEGIN (* PosNegVrg *)
                 IF Getal < 0 THEN
                 Negatief
                 ELSE
                 Positief;
                END; (* PosNegVrg *)

                PROCEDURE Voerin;
                VAR
                Str : String;
                Code : Integer;

                BEGIN (* Voerin *)
                REPEAT
                Write('Geef een getal: ');
                ReadLn(Str);
                Val(Str, Getal, Code);
                UNTIL (Code = 0) AND (Getal > Ondergrens) AND ((Getal < Bovengrens) OR (Getal = 0));
                END; (* Voerin *)

            BEGIN (* PerGetal *)
             PosNegVrg;
             Voerin;
            END;

      BEGIN (* Getallen *)
      WHILE NOT (Getal = 0) DO
      PerGetal;
      END;

      PROCEDURE Slot;

            PROCEDURE BerekenGemiddelde(VAR Gem : Real;
                  Som  : Integer;
                  Totaal: Integer);

            BEGIN (* BerekenGemiddelde *)
             IF Totaal > 0 THEN      //Controleren, delen door 0 kan niet!
            Gem := Som / Totaal
             ELSE Gem := 0;
            END; (* BerekenGemiddelde *)

            PROCEDURE SlotAfdruk;
            BEGIN
            WriteLn;
            WriteLn('>>>>>>>>>>OUTPUT<<<<<<<<<<<<');
            WriteLn;
            WriteLn('++++++++ POSITIEF ++++++++');
            WriteLn('Aantal Positief    : ',TotaalPos);
            WriteLn('Totaal Positief    : ',SomPos);
            WriteLn('Gemiddeld Positief : ',GemPos:0:2);
            WriteLn;
            WriteLn('-------- NEGATIEF --------');
            WriteLn('Aantal Negatief    : ',TotaalNeg);
            WriteLn('Totaal Negatief    : ',SomNeg);
            WriteLn('Gemiddeld Negatief : ',GemNeg:0:2);
            Readln;
            END;

      BEGIN (* Slot *)
       IF (SomPos <> 0) THEN
       BerekenGemiddelde(GemPos,SomPos,TotaalPos)
       ELSE
       GemPos := 0;
       IF (SomNeg <> 0) THEN
       BerekenGemiddelde(GemNeg,SomNeg,TotaalNeg)
       ELSE
       GemNeg := 0;
       SlotAfdruk;
      END;  (* Slot *)

BEGIN (* GemiddeldeProg *)
 Init;
 KopAfdruk;
 Voerin;
 Getallen;
 Slot;
END.

En dat ik sommige woorden in KAPITAAL heb, doe ik omdat ik dat zelf overzichterlijk vind. Ook dat inspringen doe ik zelf. Gewoon met TABS, dan vind ik het onderscheid duidelijker. Maar op school wordt het ons ook gewoon geleerd met een paar spaties.
5) Commentaar geef je met { blabla } en // blabla. De notatie (* blabla*) wordt in de praktijk vrijwel nooit meer gebruikt.
Dat vind ik zelf overzichterlijker, het gaat er toch uiteindelijk om of IK het overzichtelijk vind of niet?

Verwijderd

code:
1
2
3
4
5
6
7
8
PROCEDURE Init;
BEGIN
  TotaalPos := -1;
  TotaalNeg := 0;
  SomPos    := 0;
  SomNeg    := 0;
  Teveel    := 0;
END;

Dit is niet nodig. Je kunt deze variabelen als typed constanten definiëren, dus bijvoorbeeld zo:
code:
1
const TotaalPos : integer = -1;

Je kunt deze waarden (niet zoals het lijkt dus) gewoon laten veranderen.

(8>

Verwijderd

Topicstarter
maar zo wordt het ons op school geleerd :?

Verwijderd

Op woensdag 06 februari 2002 19:40 schreef ne0 het volgende:
code:
1
2
3
4
5
6
7
8
PROCEDURE Init;
BEGIN
  TotaalPos := -1;
  TotaalNeg := 0;
  SomPos    := 0;
  SomNeg    := 0;
  Teveel    := 0;
END;

Dit is niet nodig. Je kunt deze variabelen als typed constanten definiëren, dus bijvoorbeeld zo:
code:
1
const TotaalPos : integer = -1;

Je kunt deze waarden (niet zoals het lijkt dus) gewoon laten veranderen.

(8>
KHad niet verwacht dat dit zou werken maar dat deed het wel. Toch zou ik het als volgt doen:
code:
1
2
var
  TotaalPos: Integer = -1;

Voor mijn idee toch iets netter i.p.v. een constante.
Pagina: 1