Является ли строка идентификатором

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

При решении задачи следует проверить:

  1. Принадлежит ли первый символ слова множеству английских букв, или является символом подчеркивания?
  2. Принадлежат ли все остальные символы слова множеству английских букв или множеству символов цифр или являются символами подчеркивания?

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

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

var
    ch, n: set of char;
    str: string;
    i: byte;
begin
    ch := ['a'..'z','A'..'Z','_'];
    n := ['0'..'9'];
    readln(str);
    if str = '' then exit;
    if not (str[1] in ch) then begin
        writeln('No');
        exit;
    end;
    for i:=2 to length(str) do
        if not ((str[i] in ch) or (str[i] in n)) then begin
            writeln('No');
            exit;
        end;
    writeln('Yes');        
end.
u786
Yes

В Паскале есть тип данных "множество" (set), которое легко задается. В данном случае множество ch содержит буквы в обоих регистрах и знак подчеркивания, а множество n - символы цифр.

Сначала проверяется первый символ на принадлежность множеству ch. Если он ему не принадлежит, то программа завершается на этом этапе.

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

Если все символы прошли проверку, то, значит, введенное слово - идентификатор.

#include <stdio.h>
#include <string.h>
main() {
    char s[100];
    short i, f;
    scanf("%s", s);
    f = 1;
 
    for (i=0; i < strlen(s); i++)
        if (!(s[i] <= 'z' && s[i] >= 'a' ||
              s[i] <= 'Z' && s[i] >= 'A' ||
              s[i] == '_' ||
              s[i] <= '9' && s[i] >= '0') ) {
                printf("No\n");
                f = 0;
                break;
        }
 
    if (f == 1)
        if (s[0] <= '9' && s[0] >= '0')
            printf("No\n");
        else
            printf("Yes\n");    
}
_4ks
Yes

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

s = input()
if 'a' <= s[0].lower() <= 'z' or s[0] == '_':
    for i in range(1,len(s)):
        if not('a' <= s[i].lower() <= 'z' \
            or '0' <= s[i].lower() <= '9' \
            or s[i].lower() == '_'):
            print('No')
            quit()
    print('Yes')
else:
    print('No')
max array
No

Метод lower() приводит символ к нижнему регистру.

Цикл проверки символов запускается, если первый символ является буквой или знаком подчеркивания.

алг является ли слово идентификатором
нач
  лит s
  цел i, f
  ввод s
  если не (s[1] >= "a" и s[1] <= "z" или s[1] >= "A" и s[1] <= "Z" или s[1] = "_") то
    вывод "Не идентификатор"
    выход
  все
  f := 1
  нц для i от 2 до длин(s)
    если не (s[i] >= "a" и s[i] <= "z" или s[i] >= "A" и s[i] <= "Z" или s[i] = "_" или s[i] >= "0" и s[i] <= "9") то
      вывод "Не идентификатор"
      f := 0
      выход
    все
  кц
  если f = 1 то
    вывод "Идентификатор"
  все
кон
7hg
Не идентификатор

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

Далее в цикле проверяются остальные символы. Как только встречается символ, не принадлежащий указанным диапазонам, цикл завершается. При этом флаговой переменной присваивается 0. Это делается для того, чтобы понять, завершился цикл путем прерывания или нет. Если цикл не прерывался, флаг останется равным 1. В этом случае слово является идентификатором.