2016-12-01 3 views
1

Я получил код, как это:Pascal - найти, если элемент существует в наборе

program Project1; 
uses crt; 
type alph=set of 'A'..'Z'; 
var mn:alph; 

begin 
    clrscr; 
    if ('A' in mn) then writeln('Yes'); 
    readln; 
end. 

Он ничего не печатать, и это бросает некоторые вопросы: project1.lpr (11,14) Предупреждение: переменная «mn», похоже, не инициализируется Не понимаю, почему, что-то не так?

+0

Сообщение об ошибке означает, что он говорит. Пока вы не выполняете задание на 'mn', вы не должны предполагать, что оно имеет какое-то особое значение. – MartynA

ответ

4

Декларация

type 
    Alpha = set of 'A'..'Z'; 

просто говорит о том, что Alpha тип, которому разрешено содержать ноль или более букв между A и Z включительно. Это не означает, что переменная этого типа автоматически содержит каждый элемент этого набора; это просто означает, что переменная будет состоять из набора символов внутри этого диапазона.

var 
    mn: Alpha;    // Uninitialized variable that can contain 
          // characters between 'A'..'Z'. 
begin 
    mn := ['A'..'Z'];   // Valid set of every member 
    mn := ['A', 'C', 'X']; // Valid set of three members 

Компилятор правильно говорит вам, что вы не назначили никакого значения для mn, и, следовательно, вы используете неинициализированный переменную.

BTW, стандартное соглашение в большинстве диалектов Паскаля состоит в том, чтобы вводить типы с T, чтобы было ясно, что это тип. Итак, имея в виду, вот рабочая версия кода, который вы опубликовали с включенной коррекцией.

program Project1; 

uses 
    crt; 

type 
    TAlpha=set of 'A'..'Z'; 

var 
    mn: TAlpha; 
begin 
    clrscr; 
    mn := ['A'..'Z']; 
    if ('A' in mn) then 
    Writeln('A is in mn'); 
    { 
    My preference to the if statement above - prints true or false 
    depending on whether the character is in the set, so you get output 
    either way. 
    } 
    WriteLn('A in mn: ', ('A' in mn)); 
    Readln; 
end. 

Для решения вашего дополнительный вопрос (из комментария ниже):

Чтобы проверить строку, чтобы увидеть, если все символы являются числами («0» .. «9»), вы можете сделать что-то вроде это:

function IsNumeric(const str: string): Boolean; 
var 
    i: Integer; 
begin 
    Result := True; 
    for i := 1 to Length(str) do 
    if not (str[i] in ['0'..'9']) then 
     Result := False; 
end; 
+0

Хороший код .. и что, если бы у меня была строка, состоящая из случайных символов f.e. это может быть «a2es0», и мне нужно проверить, содержит ли эта строка только числа (вернет False для этой строки), и я хочу сделать это с ** в ** оператором, поэтому что-то вроде 'для i: = от 1 до 5 do begin если нет (str [i] в ​​['0' .. '9'], тогда сделайте что-то .... '' 'Может ли я запустить его? – sliziky

+0

Да, вы могли бы запустить это. Возможно, вы также попробовали его вы узнаете, вы знаете? :-) Лучше было бы 'для i: = 1 to Length (str) начинать, если str [i] не в ['0' .. '9'], а затем DoSomething; конец; '. –

+1

@Ken: Вы не имеете в виду 'if not (str [i] in ['0' .. '9'])'? +1 для хорошего ответа кстати. – MartynA

0

Нет, в этом нет ничего плохого. Однако, как говорится в предупреждении, nm не инициализируется. Вы либо столкнетесь с неопределенным поведением (я не уверен, насколько это возможно в Pascal), либо фрагмент кода ничего не полезен - вы хотите проверить, содержит ли mn'A', но ничего не вложил в mn.

+0

Ну, я думал, что mm будет чем-то вроде массива, заполненного значениями от a до z ... как проверить, является ли символ от алфавита? Спасибо – sliziky

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