Проверим по-порядку выполнимость указанных условий. Если все условия выполняются, то переменная Flag логического типа не изменит своего значения. В противном случае эта переменная поменяет свое значение. По этому значению мы определим, является ли заданная последовательность символов правильным именем.

    Для установления того факта, буква это или нет, цифра это или нет, заведем две константы, которые будут содержать соответственно все буквы и цифры. Если проверяемый символ является буквой, то значение функции Pos не будет равно 0. Аналогично можно определить, является ли проверяемый символ цифрой.

    Приведем текст программы:

Program Problem36_3; 
Const
    Bukva = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    Cifra = '0123456789';
Var
  St:String;
  Flag:Boolean;
  i:Byte;
Begin
  Write('Задайте строку символов: ');
  ReadLn(St);
  Flag:=True; {Допустим это правильное имя.}
  {Проверка длины строки.}
  If (Length(St)>32) Or (Length(St)=0) Then Flag:=False;
  If Flag Then {Длина правильная, проверяем остальные условия.}
    If Pos(St[1],Bukva)=0 Then Flag:=False {Первый символ не буква.}
    Else {Проверка остальных символов.}  
      For i:=2 To Length(St) Do
        If Not ((Pos(St[i],Bukva)<>0) Or 
          (Pos(St[i],Cifra)<>0) Or (St[i]='_')) Then 
            Flag:=False; {Текущий символ не буква, не цифра}
                         {и не символ подчеркивания.}
  If Flag Then WriteLn('Заданная строка - правильное имя')
  Else WriteLn('Заданная строка не является правильным именем');
End.
Текст этой программы можно взять здесь.


Усовершенствуйте программу, сделав возможным автоматическое преобразование неправильных имен в синтаксически допустимые. Если исходная строка имеет слишком большую длину, укоротите ее до допустимого размера. Если строка пустая, то добавьте символ, например, 'x'. Если первый символ не буква, то измените его на букву, например, на 'x'. Если в строке существуют какие-то "незаконные" символы, то удалите их.

Текст этой программы можно взять здесь.