• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

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

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Решите, пожалуйста, задачу на Паскале

Boshaft_Elfe

Новые
Регистрация
28 Мар 2010
Сообщения
477
Реакции
22
Баллы
0
Решите, пожалуйста, задачу на Паскале

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

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

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

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

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

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

Формат входного файла
Входной файл содержит одну строку — имя переменной в каком-либо из стандартов.
Формат выходного файла
Выходной файл должен содержать имя переменной, переведённое в другой стандарт.
Ограничения
Входное имя имеет длину не более 255 символов, содержит только латинские буквы и символ подчёркивания, заведомо соответствует одному из стандартов.
 
Ну что же, Ира, попробуй разобраться. Вот решение (один из возможных вариантов):
Код:
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
и наоборот. Тип записи определяется автоматически.
Удачи!
Если что непонятно, спрашивай, разберемся.
 
Владимир, большое спасибо. Поняла только небольшую часть кода((
Не знаю этих типов переменных.
Код:
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);
И в основной части не могу разобраться((
 
Владимир, большое спасибо. Поняла только небольшую часть кода((

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

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

О типах:
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.
 
Этими командами символы переводятся в коды и производится сдвиг по кодовой таблице вверх или вниз соответственно, в зависимости от типа записи. Затем соответственно возвращается символ.

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

Смотри ASCII — Википедия
Ну можно, конечно, и так - коротко и ёмко! :D:D
 
Vladimir_S, AlexZir, спасибо, возникнут вопросы - отпишусь)
 
Так. С регистрами вроде все понятно: порядковый номер в двоичной системе счисления после 100 для прописных и после 110 для строчных... Таблицу поразглядывала, что она из себя представляет, примерно поняла... А насчет функций можно, если не затруднит, поподробней?:tehnari_ru_942:
 
ORD(C) преобразует символ в десятичное соответствие ASCII кода
CHR(P) преобразует десятичное соответствие ASCII кода в соответствующий символ
 
Кажется, до меня дошло... Берем букву F, например, переводим ее в код ASCII, потом смотрим на кодовую таблицу, отсчитываем вправо 32 знака (то есть -32), и получаем f. Правильно?
 
Кажется, до меня дошло... Берем букву F, например, переводим ее в код ASCII, потом смотрим на кодовую таблицу, отсчитываем вправо 32 знака (то есть -32), и получаем f. Правильно?
Абсолютно верно! Только чуть-чуть наоборот: код "F" - 70, "f" - 102.
 
То есть, если из прописной делаем строчную, тогда прибавляем 32. И наоборот. Все-то просто на самом деле)) если код "F" - 70, то мой вопрос о диапазоне 64...91 отпадает. 70 - это порядковый номер "F" в самой таблице?
 
То есть, если из прописной делаем строчную, тогда прибавляем 32. И наоборот. Все-то просто на самом деле)) если код "F" - 70, то мой вопрос о диапазоне 64...91 отпадает. 70 - это порядковый номер "F" в самой таблице?
Ну да. К сожалению, сейчас найти "нормального" (с моей точки зрения) представления кодовой таблицы в Сети невозможно. Под "нормальным" я понимаю соответствие символа его десятичному номеру. Когда-то в книжках приводился именно такой вид, а теперь зачем-то все выкладывают номер в 16-ричной системе. Вот таблица, которой я привык пользоваться:NC01.webp
Это для кодов 0..127. Для старших (128..255) уже куча вариантов, связанных, в первую очередь, с кодировками кириллицы.
 
Вопросов больше нет, спасибо Вам большое)
 
Назад
Сверху