Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/30: Рейтинг темы: голосов - 30, средняя оценка - 4.63
2 / 2 / 0
Регистрация: 21.09.2009
Сообщений: 75

преобразование строк

03.11.2009, 16:18. Показов 6192. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите найти ошибку, пожалуйста.по идее программа должна преобразовывать строчные буквы в прописные
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
program tekstf;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
var
  st: string[80];
 len:integer;
 i:integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  writeln('vvedite stroku i nagmi enter') ;
  write('->') ;
  readln(st);
  len:=length(st);
 
  for i:=1 to len do
      begin
  case st[i] of
  'а'..'п': st[i]:=chr(ord(st[i])-32);
  'р'..'я' :st[i]:=chr(ord(st[i])-80);
      
writeln('stroka preobrazovana')
writeln(st)
readln  ;
  end;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2009, 16:18
Ответы с готовыми решениями:

Преобразование строк в Delphi
Здравствуйте , объясните пожалуйста как можно понятнее главное предназначение . И вот объясните на примере калькулятора , Почему нельзя...

Преобразование строк в числа
Нужно написать прогу что бы в после ввода в поле edit1 какого-нибудь слова, после нажатия на кнопку button в поле edit2 выводилось сколько...

Преобразование Java строк в WideString
Всем доброго времени суток! Проблема такая: есть русско-казахский словарь под андроид, расковырял *.apk файл нашел внутри файлы типа *.dic....

4
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
03.11.2009, 17:08
Мне кажется в консоли Делфи у Вас ничего не выйдет с русскими буквами. Или в Паскале писать или в оконном приложении.
0
115 / 114 / 22
Регистрация: 29.08.2009
Сообщений: 174
03.11.2009, 17:08
для кодировки Windows-1251:

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
program tekstf;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
var
  st: string[80];
 len:integer;
 i:integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  writeln('vvedite stroku i nagmi enter') ;
  write('->') ;
  readln(st);
  len:=length(st);
 
  for i:=1 to len do
    if st[i] in ['a'..'z', 'à'..'ÿ'] then st[i]:=chr(ord(st[i])-32);
 
writeln('stroka preobrazovana');
writeln(st);
readln  ;
 
end.
а вообще блок case завершается end'ом и точки с запятой в конце строк надо ставить.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
03.11.2009, 17:19
conn, Так тоже не выйдет. Буквы а-п так и останутся, а вместо р-я, ё будут крякозябры.
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
03.11.2009, 23:19
Здесь суть такая.
В Delphi редактор кода показывает текст в Windows кодировке. Эта кодировка называется ANSI. В зависимости от локализации в ANSI кодировке исользуются разные кодовые страницы. В русском Windows прменяется ANSI страница с номером 1251. Она называется по разному: CP1251, Win-1251, Windows-1251. Это ANSI кодировочная страница в которую добавлены буквы кириллицы.
---
А когда выполняется консольное приложение, то для показа текста на экране применяется уже другая кодировочная страница - предназначеная для DOS. Такие страницы называются OEM - это расширенные ASCII страницы в которые добавлены буквы национальных алфавитов. В русифицированной консоли действует кодировочная OEM страница под номером 866. Обозначается так: CP866. - Это OEM страница с добавленным кириллическим набором символов.
---
В кодовых страницах CP1251 (Windows) и CP866 (DOS или Windows консоль) одним и тем же буквам кириллицы соответствуют разные коды. Поэтому когда программист в редакторе кода Delphi вводит такой код:
Delphi
1
2
3
case st[i] of
  'а'..'п': st[i]:=chr(ord(st[i])-32);
  'р'..'я' :st[i]:=chr(ord(st[i])-80
то он в консоли станет работать неправильно. Потому что в редакторе кода Делфи буквам 'а'..'п', 'р'..'я' были сопоставлены коды согласно CP1251. А во время выполнения применяется CP866 - в ней буквам 'а'..'п', 'р'..'я' соответствуют совсем другие коды.
---
Как решить эту проблему? Для решения мы должны в редакторе кода отказаться от задания значений символов через символьную константную запись вида: 'а'..'п', 'р'..'я'. Вместо этого следует прменить запись символов через коды (коды кодировочной страницы). Причём, коды мы должны брать из страницы CP866, потому что во время выполнения консольного приложения будет действовать именно эта страница.
---
Таким образом, поставленная в первом посте темы задача, может быть решена, например, так:
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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Windows;
 
//Функция берёт строку в ANSI кодировке (Windows)
//и возвращает её перевод в OEM кодировку (DOS) в виде отдельной строки.
function AnsiToOem(aStr : String) : String;
begin
  Result := '';
  if Length(aStr) > 0 then begin
    SetLength(Result, Length(aStr));
    CharToOem(PChar(aStr), PChar(Result));
  end;
end;
 
//Функция выполняет преобразование букв из нижнего в верхний регистр.
//Применяется кодировочная таблица с кириллическим набором: CP866.
function ToUpperCase(aStr : String) : String;
var
  Code : Byte;
  i    : Integer;
begin
  //Устанавливаем длину результирующей строки такую же, как у исходной строки.
  SetLength(Result, Length(aStr));
 
  for i := 1 to Length(Result) do begin
 
    //Извлекаем код, соответствующий очередному символу строки.
    //Code := Ord(aStr[i]);  //Способ 1 - использована функция Ord().
    //Code := Byte(aStr[i]); //Способ 2 - применено приведение к типу Byte.
    Code := Byte(aStr[i]);
 
    case Code of
 
      //Преобразования для букв кириллицы.
 
      160 .. 175 : //Буквы: "а".."п".
        begin
          //Result[i] := Chr(Code - 32);  //Способ 1 - использована функция Chr().
          //Result[i] := Char(Code - 32); //Способ 2 - применено приведение к типу Char.
          Result[i] := Char(Code - 32);
        end;
      224 .. 239 : //Буквы: "р".."я".
        begin
          Result[i] := Char(Code - 80);
        end;
      241, 243 :        //Буквы: "ё" и "э".
        begin
          Result[i] := Char(Code - 1);
        end;
 
      //Преобразования для букв латиницы.
 
      97 .. 122 : //Все буквы латиницы: "a".."z".
        begin
          Result[i] := Char(Code - 32);
        end;
 
      //Все остальные символы (коды) не изменяем.
 
      else
        begin
          Result[i] := aStr[i];
        end;
    end;
  end;
end;
 
var
  StrTmp : String;
 
begin
 
  Writeln(AnsiToOem( 'Эта программа преобразует буквы строки в верхний регистр.' ));
  Writeln(AnsiToOem( 'Преобразования производятся согласно кодовой странице CP866.' ));
  repeat
    Writeln(AnsiToOem( 'Для преобразования введите строку и нажмите клавишу ENTER.' ));
    Writeln(AnsiToOem( 'Чтобы выйти из программы нажмите клавишу ENTER без ввода строки.' ));
    Readln(StrTmp);
    if StrTmp = '' then begin
      Continue;
    end;
    Writeln(AnsiToOem( 'Результат преобразования:' ));
    Writeln(ToUpperCase(StrTmp));
  until StrTmp = '';
 
end.
В этом коде функция AnsiToOem() применяется только для того, чтобы уже прямо в редакторе кода Delphi было удобно задавать консольный строковый вывод на кириллице.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2009, 23:19
Помогаю со студенческими работами здесь

Преобразование строк
Очень прошу помочь с решение задачи: Из заданного предложения, начиная с первой встретившейся буквы "a", скопировать в новую...

Преобразование строк
Добрый день. Есть задача со строками. Строка допустим начинается с символа @ и есть строка которая начинается с цифры. Мне нужно если...

Преобразование строк
Как можно запись такого вида: 16_11_1995, преобразовать в такой: 16.11.1995

Преобразование строк
Привет всем. Помогите пожалуйста написать код программы... Задание: Поменяйте порядок следования символов строки на обратный, определить...

Преобразование строк
Hi, тормознул на элементарном, как нужно верно преобразовать число в строку string N; for (int i=0;i<=22;i++) { N =...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru