Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 23.11.2024
Сообщений: 6

Сделать проверку на ввод только букв из русского алфавита

25.03.2025, 23:15. Показов 8807. Ответов 19

Студворк — интернет-сервис помощи студентам
Сделать проверку на ввод только букв из русского алфавита(lazarus).
Во всём разобрался, туплю с проверкой на корректностью ввода, лазарус не доволен
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
unit Unit1;
 
interface
 
uses
  SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Classes;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button2: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    type
      Student = record
        Surname: string;
        Gender: string;
        Age: Integer;
        Grade: Integer;
      end;
 
    var
      Students: array[1..10] of Student;
      StudentCount: Integer;
 
    procedure AddStudent(Surname, Gender: string; Age, Grade: Integer);
    procedure Sort;
    procedure FindYoungestStudent;
    procedure CountStudents;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.AddStudent(Surname, Gender: string; Age, Grade: Integer);
begin
  if StudentCount < 10 then
  begin
    StudentCount := StudentCount + 1;
    Students[StudentCount].Surname := Surname;
    Students[StudentCount].Gender := Gender;
    Students[StudentCount].Age := Age;
    Students[StudentCount].Grade := Grade;
    ListBox1.Items.Add(Surname + ' - ' + Gender + ' - ' + IntToStr(Age) + ' - ' + IntToStr(Grade));
  end
  else
    ShowMessage('Максимум 10 студентов!');
end;
 
procedure TForm1.Sort;
var
  i: Integer;
   t: TStringlist;
begin
  ListBox2.Items.Clear;
  for i := 1 to StudentCount do
  begin
    if (Students[i].Gender = 'муж') and (Students[i].Grade = 3) and (Students[i].Age > 17) then
      ListBox2.Items.Add(Students[i].Surname);
    TStringList(ListBox2.Items).Sort;
  end;
end;
 
procedure TForm1.FindYoungestStudent;
var
  i, YoungestIndex: Integer;
  YoungestAge: Integer;
begin
  if StudentCount = 0 then
    ShowMessage('Нет студентов.')
  else
  begin
    YoungestAge := Students[1].Age;
    YoungestIndex := 1;
 
    for i := 2 to StudentCount do
    begin
      if Students[i].Age < YoungestAge then
      begin
        YoungestAge := Students[i].Age;
        YoungestIndex := i;
      end;
    end;
 
    ShowMessage('Самый молодой студент: ' + Students[YoungestIndex].Surname + ' (' + IntToStr(YoungestAge) + ' лет)');
  end;
end;
 
procedure TForm1.CountStudents;
var
  i, ManCount, WomenCount: Integer;
begin
  ManCount := 0;
  WomenCount := 0;
  for i := 1 to StudentCount do
  begin
    if Students[i].Gender = 'муж' then
      ManCount := ManCount + 1;
    if Students[i].Gender = 'жен' then
      WomenCount := WomenCount + 1;
  end;
 
  ShowMessage('Количество студентов: ' + IntToStr(StudentCount));
 
  if ManCount = 0 then
    ShowMessage('Нет мужчин.');
  if WomenCount = 0 then
    ShowMessage('Нет женщин.');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Surname, Gender: string;
  Age, Grade, i, NumberOfStudents: Integer;
begin
  NumberOfStudents := StrToIntDef(InputBox('Количество студентов', 'Введите количество студентов (макс. 10):', '10'), 1);
 
  if (NumberOfStudents < 1) or (NumberOfStudents > 10) then
  begin
    ShowMessage('Количество студентов должно быть от 1 до 10.');
    Exit;
  end;
 
  StudentCount := 0;
for i := 1 to NumberOfStudents do
  begin
    Surname := InputBox('Введите фамилию', 'Введите фамилию студента русскими буквами ' + IntToStr(i) + ':', '');
    Gender := InputBox('Введите пол', 'Введите пол студента ' + IntToStr(i) + ' (муж/жен):', '');
    if ((Gender<>('муж')) and (Gender<>('жен'))) then
    gender:='неправильный пол';
    Age := StrToIntDef(InputBox('Введите возраст', 'Введите возраст студента ' + IntToStr(i) + ':', '18'), 18);
     if ((Age<0) or (Age=0)) then
     Age:=1;
    Grade := StrToIntDef(InputBox('Введите оценку', 'Введите оценку студента ' + IntToStr(i) + ':', '5'), 5);
     if (((Grade<0) or (Grade=0))) then
     grade:=0;
    AddStudent(Surname, Gender, Age, Grade);
  end;
 sort;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    FindYoungestStudent;
end;
 
 
end.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.03.2025, 23:15
Ответы с готовыми решениями:

Заменить буквы русского алфавита на соответствующие им буквы латинского алфавита
Дана строка символов, содержащая некоторый текст на русском языке. Заменить буквы русского алфавита на соответствующие им буквы латинского...

Заменить буквы русского алфавита на соответствующие им буквы латинского алфавита
Дана строка символов, содержащая некоторый текст на русском языке. Заменить буквы русского алфавита на соответствующие им буквы латинского...

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

19
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
26.03.2025, 05:51
Лучший ответ Сообщение было отмечено mikhlop100 как решение

Решение

Цитата Сообщение от mikhlop100 Посмотреть сообщение
лазарус не доволен
Вообще не увидел в Вашем коде попыток сделать какое-нибудь ограничение ввода символов. Так что Ваш лазарус недоволен чем-то другим.
А проверить можно такой функцией:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
uses ..., LazUTF8;
...
function RusOnly(_text: String): boolean;
const rus: String = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
var i: integer;
begin
  result := true;
  for i := 1 to UTF8Length(_text) do begin
    result := UTF8Pos(UTF8Copy(_text, i, 1), rus) > 0;
    if not result then break;
  end;
end;
пример вызова
Pascal
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  if RusOnly(Edit1.Text) then ShowMessage('только русские буквы') else ShowMEssage('что-то левое');
end;
Миниатюры
Сделать проверку на ввод только букв из русского алфавита  
1
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,328
26.03.2025, 10:24
Цитата Сообщение от mikhlop100 Посмотреть сообщение
Delphi
1
     if ((Age<0) or (Age=0)) then
Тут одним действием проверяется:
Delphi
1
     if Age<=0 then
Раз на то пошло, то лучше не хранить сам возраст - он меняется каждый год и у разных студентов в течение года. Лучше хранить дату рождения и вычислять возраст на текущую или любую нужную дату.
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
26.03.2025, 10:35
Не хотел это писать, т.к. к основному вопросу не относится, но раз затронули момент...
Цитата Сообщение от mikhlop100 Посмотреть сообщение
if ((Age<0) or (Age=0)) then
Вот возьму и введу в качестве возраста значение 100500... Число? Да. Больше нуля? Да. Подходит для возраста человека? Ну, если только про Агасфера речь... Если без намеков - где проверка на верхнюю границу, на ввод больше максимального возраста?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
26.03.2025, 12:19
Цитата Сообщение от D1973 Посмотреть сообщение
Pascal
4
const rus: String = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
Ужас какой. Зачем дублировать полстроки?

Pascal
1
2
3
4
5
6
7
8
9
function RusOnly(_text: String): boolean;
const rus: String = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
var i: integer;
begin
  Result := True;
  _text := UTF8UpperString(_text);
  for i := 1 to UTF8Length(_text) do
    if UTF8Pos(UTF8Copy(_text, i, 1), rus) = 0 then Exit(False)
end;
не проще?
1
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
26.03.2025, 12:31
Как-то криво я в справку смотрел: не увидел UTF8UpperString()... Спасибо.
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
26.03.2025, 14:23
Цитата Сообщение от volvo Посмотреть сообщение
Pascal
1
2
3
4
5
6
7
8
9
function RusOnly(_text: String): boolean;
const rus: String = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
var i: integer;
begin
  Result := True;
  _text := UTF8UpperString(_text);
  for i := 1 to UTF8Length(_text) do
    if UTF8Pos(UTF8Copy(_text, i, 1), rus) = 0 then Exit(False)
end;
не проще?
КМК тоже выглядит сложновато. Можно же
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
uses ..., LazUnicode;
 
function RusOnly(const _text: string): boolean;
const
  rus: string = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
var
  c: string;
begin
  for c in AnsiUpperCase(_text) do
    if Pos(c, rus) = 0 then exit(False);
  Result := True;
end;
1
Нарушитель
169 / 285 / 26
Регистрация: 11.08.2022
Сообщений: 3,579
26.03.2025, 14:58
Pascal
1
where ((key => 'A') and (key <= 'Я'))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,854
Записей в блоге: 12
26.03.2025, 15:18
Ludwig Valentin, садись, два. Ибо буква Ё в Юникоде (а Лазарус - это UTF8, так-то, времена CP866 давно закончились) пролетает мимо этого условия, её код 0401, а "А" это уже 0410.
0
Нарушитель
169 / 285 / 26
Регистрация: 11.08.2022
Сообщений: 3,579
26.03.2025, 15:23
Цитата Сообщение от volvo Посмотреть сообщение
садись, два.
Слишком по-злому оцениваете.
Я показал принцип, а программер должен уметь допилить.
Сделать это можно, имея таблицу символов перед глазами.
И достаточно не сканировать таблицу, а проверить символ в интервалах.
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
26.03.2025, 18:07
Цитата Сообщение от Ludwig Valentin Посмотреть сообщение
Я показал принцип
Этот "принцип" - он просто не сработает с юникодной кириллицей...
0
Нарушитель
169 / 285 / 26
Регистрация: 11.08.2022
Сообщений: 3,579
26.03.2025, 20:08
Цитата Сообщение от D1973 Посмотреть сообщение
Этот "принцип" - он просто не сработает с юникодной кириллицей...
А что, в ней буквы/литеры не идут по порядку?
Проверка на диапазон А-Я плюс проверка на Ё. То же для нижнего регистра. В одну строку условие уложится.
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
26.03.2025, 20:35
Цитата Сообщение от D1973 Посмотреть сообщение
Этот "принцип" - он просто не сработает с юникодной кириллицей...
Все перечисленные выше "принципы" могут не сработать при определённых условиях, этот ничем не хуже.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uses ..., LazUtf8;
 
function RusOnly(const s: string): boolean;
var
  p, pEnd: PChar;
  Len: Integer;
  c: DWord;
begin
  if s = '' then exit(False);
  p := Pointer(s);
  pEnd := p + Length(s);
  while p < pEnd do begin
    c := UTF8CodepointToUnicode(p, Len);
    case c of
      $401, $410..$44f, $451: ;
    else
      exit(False);
    end;
    Inc(p, Len);
  end;
  Result := True;
end;
Другое дело, что выглядит ещё угрюмее предыдущих.
Зато быстрее.
1
 Аватар для DoNVen
14 / 12 / 2
Регистрация: 30.10.2024
Сообщений: 68
26.03.2025, 21:18
Цитата Сообщение от avk959 Посмотреть сообщение
case c of
      $401, $410..$44f, $451: ;
Можно ли набор значений передвать в процедуру? Чтобы унифицировать
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
26.03.2025, 21:56
Цитата Сообщение от DoNVen Посмотреть сообщение
Можно ли набор значений передвать в процедуру? Чтобы унифицировать
А в чём проблема с передачей в процедуру набора значений?
0
 Аватар для DoNVen
14 / 12 / 2
Регистрация: 30.10.2024
Сообщений: 68
26.03.2025, 22:13
Цитата Сообщение от avk959 Посмотреть сообщение
А в чём проблема с передачей в процедуру набора значений?
Было бы удобно оформить эти значения в Тип диапозон и передавать переменную этого типа.
Pascal
1
2
3
type
  TRuSet = $410..$44f;
  TRu = set of TRuSet;
Но Set of не позволяет создать такую переменную. Ни по отдельности же передавать символы. У меня нет понимания как сделать что-то подобное
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
26.03.2025, 22:52
В данном случае весь диапазон содержит всего 81 значение, если вычесть из всех элементов нижнюю границу, разности можно поместить в стандартный сет. Соответственно передавать в процедуру сет и нижнюю границу.
Иначе можно использовать хешсет(или сортированный список) из какой-нибудь контейнерной библиотеки FPC, но будет медленнее.
Или взять стороннюю библиотеку, имеющую сеты, которые вмещают более 256 элементов.
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
27.03.2025, 04:45
Цитата Сообщение от Ludwig Valentin Посмотреть сообщение
В одну строку условие уложится.
Вы сами пробовали уложить и попробовать? Было бы интересно посмотреть.

Добавлено через 7 минут
Цитата Сообщение от avk959 Посмотреть сообщение
можно использовать хешсет(или сортированный список) из какой-нибудь контейнерной библиотеки FPC
Да о чем вы рассуждаете! Это школьная домашка, там учитель половины этих слов не поймет.
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
27.03.2025, 08:47
Цитата Сообщение от D1973 Посмотреть сообщение
Да о чем вы рассуждаете! Это школьная домашка, там учитель половины этих слов не поймет.
Полагаю, это всё же проблема учителя и его учеников.
Во всяком случае это не должно быть оправданием привычки постить лютый говнокод.
0
Нарушитель
169 / 285 / 26
Регистрация: 11.08.2022
Сообщений: 3,579
27.03.2025, 12:19
avk959, уже дал ответ.

Добавлено через 3 часа 11 минут
Moжно - со сравнением

Pascal
1
if (c = $401) or ((c => $410) and (c <= $44f)) or (c = $451) then r:= true;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2025, 12:19
Помогаю со студенческими работами здесь

Сопоставление букв русского алфавита их порядковым номерам.
Подскажите алгоритм сопоставления букв русского алфавита его порядковым номерам. Т.е. А-1, Б-2 и т.д. до Я - 33. Нужно собственно вот...

Удалить все символы кроме букв латинского и русского алфавита
Есть такое вот задние: Дана строка S и текстовый файл resource.txt. Добавить строку S между каждой строкой исходного файла. Сохранить...

Извлечение слов и их распределение на категории: из русс. букв, из англ. букв, из русс. и англ. букв, слова схожие по начертанию букв с русс и англ.
В тексте содержатся русские и англ слова. разделить все слова на 3 списка: русские слова, англ слова, слова, происхождения которых нельзя...

Сделайте проверку для кода на ввод букв и вылет программы
program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function factorial(number : integer) :...

Вывод на экран в алфавитном порядке всех различных прописных русских букв
Данный код выводит все заглавные буквы, что нужно изменить в коде, чтоб выводил только по одной заглавной букве. var s,k:string; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru