elniniokev
asked on
avoiding integer run time errors
HOW DO I STOP THE PROGRAM FROM FAILING IF A NON-NUMERICAL CHARACTER IS ENTERED ie NOT AN INTEGER ?????
VAR
CHOICE INTEGER
{MAIN PROGRAM BODY}
begin
choice:= 10;
while choice <> 9 do
begin
clrscr;
showmenu;
readln(choice);
case choice of
1: CREATEPERMANENTFILE;
2: VIEW;
3: entercostumedetails;
4: ENTERCUSTOMERDETAILS;
5: ENTERCUSTOMERORDER;
6: SHOWALLCUSTOMERORDERS;
7: SEARCHDATEORDER;
8: SEARCHCNUMORDER;
end;
end;
I'm not allowed to change the choice to a char !!!!!!
VAR
CHOICE INTEGER
{MAIN PROGRAM BODY}
begin
choice:= 10;
while choice <> 9 do
begin
clrscr;
showmenu;
readln(choice);
case choice of
1: CREATEPERMANENTFILE;
2: VIEW;
3: entercostumedetails;
4: ENTERCUSTOMERDETAILS;
5: ENTERCUSTOMERORDER;
6: SHOWALLCUSTOMERORDERS;
7: SEARCHDATEORDER;
8: SEARCHCNUMORDER;
end;
end;
I'm not allowed to change the choice to a char !!!!!!
ASKER
the code didn't accept the choic e 1..9
an error was displyed
an error was displyed
run-time error ?
what exactly ?
hypo's code must work fine
what exactly ?
hypo's code must work fine
ASKER
the program doesn't accept the choices between 1 & 9, the error message I added is displayed no matter what I enter. I'm new to programming it could be something with the placement of the code any more help would be greatly appreciated.
ASKER
The Readln(st) is in the procedure showmenu as well as the main body code, I didn't understand why I have to have procedure val and what else it should contain.
ASKER
Adjusted points to 40
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
{
This is good working example of how you can eliminate error
occuring due to input of invalid number.
This function is verymuch similar to sscanf() in C.
}
program validint;
uses crt;
var str : string[10];
int : integer;
function give_int(s : string) : integer;
var n,i : integer;
begin
i:=1;
n:=0;
if not (s[i] in ['0'..'9','-']) then n := -1
else
begin
if s[i] = '-' then i:=2;
while s[i] in ['0'..'9'] do
begin
n := (n * 10) + ord(s[i]) - 48;
i := i + 1;
end;
end;
if s[1] = '-' then give_int := -n
else give_int := n;
end;
begin
clrscr;
write('Enter a number: ');
readln(str);
str[length(str)+1] := #0;
int := give_int(str);
write('The number is: ',int);
end.
This is good working example of how you can eliminate error
occuring due to input of invalid number.
This function is verymuch similar to sscanf() in C.
}
program validint;
uses crt;
var str : string[10];
int : integer;
function give_int(s : string) : integer;
var n,i : integer;
begin
i:=1;
n:=0;
if not (s[i] in ['0'..'9','-']) then n := -1
else
begin
if s[i] = '-' then i:=2;
while s[i] in ['0'..'9'] do
begin
n := (n * 10) + ord(s[i]) - 48;
i := i + 1;
end;
end;
if s[1] = '-' then give_int := -n
else give_int := n;
end;
begin
clrscr;
write('Enter a number: ');
readln(str);
str[length(str)+1] := #0;
int := give_int(str);
write('The number is: ',int);
end.
ASKER
Hypo, please re-submit your answer I got your code working and I want to give you the points you deserve. Thanks a million!!!!!
I can't answer this quizz as long as Sumant has proposed an answer to it. But I think that you can accept one of my comments as the answer? If you can't do that you have to reject Sumants answer first before I can propose an answer to it.
Anyway, I'm glad you got it to work.
regards Hypo.
Anyway, I'm glad you got it to work.
regards Hypo.
ASKER
Hypo's code is the one I'm using, I was wrong to reject it initialy. Sumant's answer is very good and shouldn't regard this as a rejection. Hypo's code was correct initially, it was me who stuffed up in the placement of the code he supplied.
Thanks to both !
Thanks to both !
Procedure Val(S: string; var V,Code : integer);
S is a string wich you want to convert to an integer, V is the target variable, and Code contains the possible error code!
Ok, so you might wonder why you want to use this function? I'll tell you why.
When you use readln(choice) and choice is an integer... the program will halt with an error code if you don't input a valid integer string.
But if you use a string instead of an integer in the readln procedure... You can enter whatever you like without have to worry about error messages halting the program! Also, the Val procedure converts a string into an integer variable and leaving an error code in a variable if the string is not a valid integer string.
So... to replace this process [readln(choice)], you need 2 more variables except choice. One called St, of type string (St : string;) and one called Code, of type integer (Code : integer;)
St will contain the string you get from the Readln, Code will contain the error code (if any), and Choice will contain... the users choice!!!
This is how you could use it.
readln(St);
val(St,Choice,Code);
If Code <> 0 then ... {Do something to handle the error!}
And this is what your code would look like!
VAR
CHOICE,
CODE : INTEGER;
ST : STRING;
{MAIN PROGRAM BODY}
begin
choice:= 10;
while choice <> 9 do
begin
clrscr;
showmenu;
readln(St);
Val(St,Choice,Code);
If Code <> 0 then Choice := 10;
case choice of
1: CREATEPERMANENTFILE;
2: VIEW;
3: entercostumedetails;
4: ENTERCUSTOMERDETAILS;
5: ENTERCUSTOMERORDER;
6: SHOWALLCUSTOMERORDERS;
7: SEARCHDATEORDER;
8: SEARCHCNUMORDER;
end;
end;
That should work just fine... If you don't enter a valid integer string... the program does nothing!
Hope it works!