Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 12.11.2010, 17:45   #1 (permalink)
Boshaft_Elfe
Member
 
Аватар для Boshaft_Elfe
 
Регистрация: 28.03.2010
Сообщений: 477
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1837
По умолчанию Решите, пожалуйста, задачу на Паскале

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

Цитата:
Условие
При написании сложных программ важное значение имеет стандартизация стиля кодирования, в частности формата записи имён переменных. Часто используются следующие два стандарта для имён переменных, состоящих из нескольких слов:

1. Слова записываются друг за другом через знак подчёркивания с маленькой буквы (например my_variable).
2. Слова записываются друг за другом подряд, при этом каждое слово начинается с большой буквы (например MyVariable).

Требуется написать программу, переводящую имя переменной из одного стандарта в другой.

Рекомендуется рассмотреть частичные решения:

1. Имя состоит из одного слова

Формат входного файла
Входной файл содержит одну строку — имя переменной в каком-либо из стандартов.
Формат выходного файла
Выходной файл должен содержать имя переменной, переведённое в другой стандарт.
Ограничения
Входное имя имеет длину не более 255 символов, содержит только латинские буквы и символ подчёркивания, заведомо соответствует одному из стандартов.
Boshaft_Elfe вне форума   Ответить с цитированием

Старый 12.11.2010, 17:45
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Вот ссылки на темы, которые скорее всего помогут вам в решении проблемы

Помогите решить задачу в Паскале
Помогите решить задачу на Паскале

Старый 12.11.2010, 22:13   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну что же, Ира, попробуй разобраться. Вот решение (один из возможных вариантов):
Код:
VAR
 F_in,F_out:TEXT;
 p:BYTE;
 C:Char;
BEGIN
 Assign(F_in, 'D:\t1.txt');
 ReSet(F_in);
 Assign(F_out, 'D:\t2.txt');
 ReWrite(F_out);
 p:=0;
 Read(F_in,C);
 If (Ord(C)>64) and (Ord(C)<91) then
  Write(F_out,Chr(Ord(C)+32))
 else
  Write(F_out,Chr(Ord(C)-32));
 Repeat
  Read(F_in, C);
  If C='_' then p:=1;
  If p=0 then
   begin
    If (Ord(C)>64) and (Ord(C)<91) then
     begin
      Write(F_out,'_',Chr(Ord(C)+32));
     end else
      Write(F_out,C);
   end;
  If (p=1) and (C<>'_') then
   begin
    Write(F_out,Chr(Ord(C)-32));
    p:=0;
   end;
 Until EoF(F_in);
 Close(F_in);
 Close(F_out);
END.
Проведено следующее тестирование:
Если в файл t1.txt записать строку
long_ago_there_were_three_pigs
то в файле t2.txt появится строка
LongAgoThereWereThreePigs
и наоборот. Тип записи определяется автоматически.
Удачи!
Если что непонятно, спрашивай, разберемся.
Vladimir_S вне форума   Ответить с цитированием
Старый 13.11.2010, 15:51   #3 (permalink)
Boshaft_Elfe
Member
 
Аватар для Boshaft_Elfe
 
Регистрация: 28.03.2010
Сообщений: 477
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1837
По умолчанию

Владимир, большое спасибо. Поняла только небольшую часть кода((
Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Код:
p:BYTE; C:Char;
Не знаю этих типов переменных.
Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Код:
p:=0;
 Read(F_in,C); If (Ord(C)>64) and (Ord(C)<91) then Write(F_out,Chr(Ord(C)+32)) else Write(F_out,Chr(Ord(C)-32));
Repeat
 Read(F_in, C);
 If C='_' then p:=1;
 If p=0 then begin If (Ord(C)>64) and (Ord(C)<91) then
 begin
 Write(F_out,'_',Chr(Ord(C)+32));
 end
 else Write(F_out,C);
 end; 
 If (p=1) and (C<>'_') then 
begin
 Write(F_out,Chr(Ord(C)-32));
 p:=0;
 end; 
Until EoF(F_in);
И в основной части не могу разобраться((
Boshaft_Elfe вне форума   Ответить с цитированием
Старый 13.11.2010, 16:18   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Boshaft_Elfe Посмотреть сообщение
Владимир, большое спасибо. Поняла только небольшую часть кода((

Не знаю этих типов переменных.

И в основной части не могу разобраться((
Так. Ну, ничего страшного - будем продвигаться потихоньку.

О типах:
1. Byte - целые неотрицательные числа в диапазоне 0..255.
2. Char - литерный тип. Переменной или константой типа Char может быть любой символ - буква, цифра, знак препинания, пробел и т.п.

По программе.
Работает она так:
Открываются два файла - входной и выходной, один - на чтение, другой, соответственно, на запись. Первый должен быть "изготовлен" заранее, т.е. в него должна быть вписана строка, подлежащая преобразованию.
Далее происходит последовательное ПОСИМВОЛЬНОЕ считывание информации из файла 1 и ПОСИМВОЛЬНАЯ же запись в файл 2. При этом:
1. У первой буквы заменяется регистр. Т.е. если первой буквой в файле 1 была, например, "m", то в файл 2 отправляется "M" и наоборот.
2. Если в строке, читаемой из файла 1, встречается прописная буква (например, "R"), то в файл 2 записывается знак подчеркивания и прочитанная буква в обратном регистре, т.е., в данном случае, "_r".
3. Если встречается знак подчеркивания, то в выходной файл ничего не отправляется, но устанавливается "флажок" путем присвоения служебному параметру p значения p=1. Если p=1, то при считывании следующей за знаком подчеркивания буквы регистр меняется со строчного на прописной и в таком виде буква записывается в выходной файл, после чего "флажок" сбрасывается, т.е. параметру p вновь присваивается значение p=0. В итоге комбинация, например, "_s" заменяется на "S".
4. Во всех прочих случаях символы переправляются из файла в файл в неизменном виде.

Ира, попробуй это всё "переварить". Потом, если возникнет с твоей стороны желание, я объясню, как всё это конкретно реализуется с помощью стандартных функций Ord и Chr.
Vladimir_S вне форума   Ответить с цитированием
Старый 14.11.2010, 08:33   #5 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Этими командами символы переводятся в коды и производится сдвиг по кодовой таблице вверх или вниз соответственно, в зависимости от типа записи. Затем соответственно возвращается символ.

Смотри ASCII — Википедия
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 14.11.2010, 08:48   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от AlexZir Посмотреть сообщение
Этими командами символы переводятся в коды и производится сдвиг по кодовой таблице вверх или вниз соответственно, в зависимости от типа записи. Затем соответственно возвращается символ.

Смотри ASCII — Википедия
Ну можно, конечно, и так - коротко и ёмко!
Vladimir_S вне форума   Ответить с цитированием
Старый 14.11.2010, 08:50   #7 (permalink)
Boshaft_Elfe
Member
 
Аватар для Boshaft_Elfe
 
Регистрация: 28.03.2010
Сообщений: 477
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1837
По умолчанию

Vladimir_S, AlexZir, спасибо, возникнут вопросы - отпишусь)
Boshaft_Elfe вне форума   Ответить с цитированием
Старый 14.11.2010, 13:04   #8 (permalink)
Boshaft_Elfe
Member
 
Аватар для Boshaft_Elfe
 
Регистрация: 28.03.2010
Сообщений: 477
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1837
По умолчанию

Так. С регистрами вроде все понятно: порядковый номер в двоичной системе счисления после 100 для прописных и после 110 для строчных... Таблицу поразглядывала, что она из себя представляет, примерно поняла... А насчет функций можно, если не затруднит, поподробней?
Boshaft_Elfe вне форума   Ответить с цитированием
Старый 14.11.2010, 13:17   #9 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

ORD(C) преобразует символ в десятичное соответствие ASCII кода
CHR(P) преобразует десятичное соответствие ASCII кода в соответствующий символ
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 14.11.2010, 13:34   #10 (permalink)
Boshaft_Elfe
Member
 
Аватар для Boshaft_Elfe
 
Регистрация: 28.03.2010
Сообщений: 477
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1837
По умолчанию

Кажется, до меня дошло... Берем букву F, например, переводим ее в код ASCII, потом смотрим на кодовую таблицу, отсчитываем вправо 32 знака (то есть -32), и получаем f. Правильно?
Boshaft_Elfe вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 21:22.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.