2013-09-17 5 views
1

Я только начинаю с Object Pascal для своих компьютерных исследований, поэтому для многих из вас это, вероятно, простой вопрос. Я пытаюсь создать систему проверки для калькулятора Sum и Average, чтобы ответы, которые не являются целыми числами, не могут быть приняты, но также не разбивают программное обеспечение. Я проработал несколько часов, чтобы получить решение для этого, и пока он находится в текущем состоянии, если я ввешу целое число, оно будет интерпретировать его как нецелочисленное, тогда как если я введу неинтегрированный код, программа просто сработает. Во всяком случае, вокруг?Проверка типа данных

кодируются в настоящее время выглядит следующим образом:

Program SumAverageCalculator; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

Const 
    NumberOfIntegers = 3; 

Var 
    NumberOne, NumberTwo, NumberThree: integer; 
    Sum: integer; 
    Average: real; 

Begin 
    Writeln ('======================================='); 
    Write ('What is your first number? '); readln(NumberOne); 
    If NumberOne-sqr(0) <> 1 then 
    Begin 
     Write ('Please write an integer only. What is your first number? '); readln(NumberOne); 
    End 
    Else 
    Begin 
     Write ('Great, that is an Integer! '); 
    End; 
    Write ('And the second number? '); readln(NumberTwo); 
    If NumberTwo-sqr(0) <> 1 then 
    Begin 
     Write ('Please write an integer only. What is your second number? '); readln(NumberOne); 
    End 
    Else 
    Begin 
     Write ('Great, that is an Integer! '); 
    End; 
    Write ('And the third number? '); readln(NumberThree); 
    If NumberThree-sqr(0) <> 1 then 
    Begin 
     Write ('Please write an integer only. What is your third number? '); readln(NumberOne); 
    End 
    Else 
    Begin 
     Write ('Great, that is an Integer! '); 
    End; 
    Sum := NumberOne + NumberTwo + NumberThree; 
    Average := Sum/NumberOfIntegers; 
    Writeln; 
    Writeln ('======================================='); 
    Writeln ('The number of given integers was ', NumberOfIntegers); 
    Writeln ('Your first number was ', NumberOne); 
    Writeln ('Your second number was ', NumberTwo); 
    Writeln ('Your third number was ', NumberThree); 
    Writeln ('======================================='); 
    Writeln ('The Sum of your numbers is ', Sum); 
    Writeln ('The Average of your numbers is ', Average: 1:2); 
    Writeln ('======================================='); 
    Readln; 
End. 

Спасибо за любую помощь, оказанную. :)

ответ

2

Это действительно потому, что вы передали целочисленную переменную в вызов readln, и она действительно хочет поместить туда целое число. Если он не может (вход не является целым числом), он сработает. Решение состоит в том, чтобы сначала прочитать ввод в наиболее общей форме, то есть в строке, проверить, что это целое число, а затем преобразовать его в один.

Конечно, вам не обязательно делать все это самостоятельно. У блока sysutils есть некоторые полезные функции, и среди них функция TryStrToInt, которая делает то, что она говорит: она попытается преобразовать ввод строки в целое число и позволит вам (разработчику) знать, не сработает ли он, а не сбой и сжигание ,

uses 
    SysUtils; 

Var 
    Input: String; 
    IsInteger: Boolean; 
    Value: Integer; 
begin 
    Write('Enter an integer: '); 
    ReadLn(Input); // will work, user input can always be represented by a string 

    IsInteger := TryStrToInt(Input, Value); 

    if IsInteger then 
    begin 
    // Do stuff with "Value" which contains the input integer 
    end 
    else 
    begin 
    WriteLn('Sorry, that''s not an integer.'); 
    end; 
end. 

Конечно, если вы будете делать это часто, это может иметь смысл реализовать вспомогательную функцию, которая действует как readln но делает проверку самостоятельно и печатает ошибку без сбоев (возможно, программа может продолжать запрашивать целое число, пока пользователь не выполнит его, или, возможно, он должен изящно прекратить действие). Например, некоторые из вышеприведенного кода могут быть завернуты в служебную функцию readint.

Как только вы сталкиваетесь с исключениями, вы найдете более общий способ обработки сбоев в своей программе и правильно реагировать на них, чтобы избежать сбоя вашей программы при малейшей ошибке пользователя, однако на данный момент это, вероятно, то, что вы находясь в поиске.


Если вы задаетесь вопросом, что означает, что out вещь в функции TryStrToInt, это похоже на var, но это в основном означает, что «я буду заполнять эту величину, но я не буду пытаться читать "(параметр только для записи), в отличие от var, что означает« Я собираюсь заполнить это значение, но я могу попытаться его прочитать раньше »(параметр чтения-записи). Поэтому параметр out не должен быть инициализирован перед использованием (поэтому в некотором смысле параметр out является «вторым возвращаемым значением», что имеет смысл в этом случае, поскольку функция TryStrToInt должна возвращать две вещи: был ли вход целым , и какое это целое было, но функции могут иметь только одно «стандартное» значение возврата).

Смежные вопросы