Рядок у загальному значенні
цього слова — це скінченна послідовність символів. У мові Turbo Pascal
значення-рядки записуються за допомогою апострофів, наприклад, 'ABC' або '12345'.
Порожній рядок, тобто послідовність символів довжиною 0,
позначається ' '.
Для подання та обробки рядків мова Turbo Pascal надає спеціальний тип string [n] ,
де n— ціла константа (можливо, іменована) не більше 255. Значення
типу string [ n ] — це по слідовності символів довжиною від 0 до n.
Змінна типу string [ n ] являє собою масив символів з індексами від 0 до n.
Нехай s — змінна типу string [n] . Елемент s [0] відіграє особливу роль.
Значенням L = ord ( s [ 0 ]) може бути число від 0 до n — довжина рядка , що є
значенням s . Сам рядок-значення представлено елементами з індексами від 1 до L
.
Елементи масиву-рядка з
індексами від L + 1 до n невизна чені ;
спроба їх використання може призвести до неочікуваних наслідків. їх значення
варто розглядати як «сміття», що позна чено в наведених байтах знаком ?.
Довжина рядка зберігається в одному байті й не переви щує 255 .
Замість string [255] можна писати string .
Найпростішими виразами рядкового
типу є ім'я змінної-рядка, рядкова константа (літерал) та вираз типу char .
Для рядків означена двомісна операція конкатенації
(об’єднання, дописування) + . Результат утворюється
шляхом дописування правого операнда до лівого: значенням '12' +
'3' є '123 ' . Ціла довжина рядка повертається з
виклику функції length із аргументом рядком: length (' 123 ') =3.
Рядковий вираз можна присвоїти рядковій
змінній. Символи присвоюються елементам змінної, починаючи з першого. Довжина
значення виразу стає довжиною значення змінної. Якщо ця довжина більша за
максимально можливу довжину n змінної, то елементам
змінної присвоюються n перших символів.
Приклад. Нехай змінна s має тип string [3] . Після присвоювання s: = '12345' її послідовні елементи мають значення #3, '1', '2', '3' ; Після присвоювання s:='12' вони мають значення #2, '1', '2' , а елемент s [3] невизначений. Нехай за s = '12' виконуються оператори s: = s + '7' ; s : = '9' + s . Тоді s послідовно одержить значення '127' та '912 ' . Після s : = ' ' маємо: s [ 0 ] =#0 ,а всі інші елементи невизначені.
Рядки,
як і інші масиви, допускають використання та обробку їх окремих елементів, але
тільки в межах значення ,поданого масивом. Наприклад, за s типу string [3] is
='12' можна присвоїти s [ 1 ] і s [ 2 ] символьні значення або використати їх,
але s [3] є невизначеним. Можна також використовувати та змінювати s [ 0 ] .
Наприклад, якщо за s = ' ' виконати s [ 0 ] : = chr (2) , то довжиною значення
s стане 2 , тобто s [ 1 ] і s [ 2 ] будуть
визначеними.
Явне використання окремих
елементів рядків, особливо елемента з індексом 0 , не
рекомендується .
Для рядків означено операції
порівняння =, <>, <, <=, >, >=. Рядки рівні , якщо мають
однакову довжину і в її межах відповідні символи збігаються; інакше рядки не
рівні.
Рядки порівнюються відповідно до їх лексикографічного порядку , тобто як слова
в словнику, тільки символами алфавіту є #0 , #1 , ..., #255 , упорядковані за
номерами. Точніше, для не порожніх рядків s 1 < s 2 , якщо існує і , 1 ? і ?
min { length (. j 7), length ( s 1)} , при якому sl [ i ] < s 2[ i ] , а всі
відповідні елементи з індексами менше i у рядках
рівні. У Pascal для визначення поточної довжини рядка служить
функція lenght, Параметром даних функцій є рядок, значення довжини якого
вони повертають. порожній рядок ' ' є найменшим.
УВЕДЕННЯ ТА ВИВЕДЕННЯ РЯДКІВ
Для введення-виведення рядків у
мовах програмування, зазвичай, використовуються вбудовані підпрограми. Так у
мові Pascal для цього служать стандартні процедури Read/ReadLn, Write/WriteLn.
Уведення . Якщо змінна s має
рядковий тип, a f є файловою змінною типу text , то
при виконанні read ( f , s )
символи до найближчого кінця рядка або до кінця файла чи його ознаки #26 читаються
та присвоюються елементам рядка s ; доступним буде кінець
рядка #13 (або кінець тексту #26 ). Сам
символ #13 або #26 у рядок-змінну не
записується. Якщо символів тексту до кінця рядка або тексту більше, ніж
уміщається в s , то s заповнюється до кінця,
і доступним стає перший символ після прочитаних у s . Якщо
перед читанням рядка s за допомогою процедури read доступний
кінець рядка, то він залишається доступним, а
значенням s стає порожній рядок.
Застосовувати read при введенні
рядків небезпечно , особливо в циклі. Якщо після введення рядка доступним
символом стане #13 , то подальші спроби читання рядків залишатимуть його
доступним, і виконання програми може «зациклитися».
Приклад. Нехай змінні s 1 , s
2 , s 3 мають тип string [3] , а
текст f містить таку послідовність символів.
Тоді після read ( f , sl , s 2, s 3) змінні мають такі значення: s1= ' 123 ',
s2 = '45' , s3= ' ' ; доступним залишається символ #13 . Подальші спроби
вводити з цього тексту в рядкові змінні будуть надавати їм значення ' ' й
залишати доступним символ #13.
Уведення рядків з клавіатури є аналогічним. Щоб виконання виклику read було
закінчено, треба натиснути клавішу < Enter >.
Уведення рядків з клавіатури за
допомогою процедури read не рекомендується , оскільки має додаткові «підводні
камені».
Виконання процедури readln аналогічно read, але після заповнення рядкової
змінної або досягнення кінця рядка в тексті частина тексту разом із найближчим
кінцем рядка пропускається й доступним стає перший символ наступного рядка. В
умовах попереднього прикладу після виконання readln ( f , sl , s2, s 3) змінні
матимуть такі самі значення, але доступним буде символ 'а' . Якби виконувалися
виклики readln ( f , s1) ; readln ( f , s2) ; readln ( f , s3) , то s1 мало б
значення '123 ', s2 — ' a ' , s3 — ' ' , а доступним став би символ #26 .
Уведення рядків з
текстових файлів та з клавіатури за процедурою readln надійніше, ніж
за процедурою read .
Виведення. Виведення рядкових виразів не
має особливостей — символи значення виразу виводяться в текстовий файл або на
екран. Наприклад, якщо рядкова змінна s має значення ' 12 ',
то при виконанні виклику write ( s +'*'+ s ) виводяться
символи 12*12.
Приклад. Розглянемо програму, яка отримує рядки тексту від клавіатури та виводить у текстовий файл.
Приклад. Розглянемо програму, яка отримує рядки тексту від клавіатури та виводить у текстовий файл.
program CreateText;
var f:text; {файл-текст}
s:string; {рядок для введення з клавіатури)
begin
writeln( 'Створення тексту.');
assign(f,'myfile . txt '); rewrite(f );
write ('Рядок і : ');
while not eof do begin
readln (s) ;
writeln (f , s) ;
writeln ('Рядок і : '); end;
close(f) end .
Для закінчення
роботи замість введення нового рядка треба натиснути < Ctrl + Z
> і < Enter >.
Внаслідок особливостей системи Turbo Pascal довжина рядків, що набираються на клавіатурі, не більше 127 .
Приклад. Розглянемо «копіювання» тексту за таких умов: рядки тексту мають довжину не більше 255 , а порожні рядки або ті, що містять лише пропуски, не копіюються.
Власне «копіювання» опишемо процедурою; вхідний і цільовий файли-тексти задамо як її параметри. За умовою, рядки тексту «уміщуються» в змінних типу string , тому для введення тексту використаємо стандартну процедуру readln та змінну-рядок. Обробляючи рядок, визначимо, чи є в ньому хоча б один символ, відмінний від пропуску. Якщо є, рядок копіюється в цільовий текст.
Внаслідок особливостей системи Turbo Pascal довжина рядків, що набираються на клавіатурі, не більше 127 .
Приклад. Розглянемо «копіювання» тексту за таких умов: рядки тексту мають довжину не більше 255 , а порожні рядки або ті, що містять лише пропуски, не копіюються.
Власне «копіювання» опишемо процедурою; вхідний і цільовий файли-тексти задамо як її параметри. За умовою, рядки тексту «уміщуються» в змінних типу string , тому для введення тексту використаємо стандартну процедуру readln та змінну-рядок. Обробляючи рядок, визначимо, чи є в ньому хоча б один символ, відмінний від пропуску. Якщо є, рядок копіюється в цільовий текст.
program copyPress;
var f,g : text;
fName : string;
procedure copyNonEmpty(var f,g:text);
var s:string; {поточний рядок тексту}
k:byte; {лічильник позицій}
empty:boolean; {ознака порожності} begin
reset(f); rewrite(g);
while not eof (f) do begin
readln(f,s);
{обробка рядка s}
k:=l; empty:=true;
while (k<=length(s)) and empty do
if s[k] <> ' '
then begin
writeln(g,s);
empty:=false end else inc (k) ;
{рядок оброблено}
end;
close(f); close(g);
end;
begin
write('Вхідний текст: '); readln(fName);
assign(f,fName);
write('Цільовий текст: '); readln(fName);
assign(g,fName);
copyNonEmpty(f,g);
end.
Для перевірки
цієї програми достатньо вхідного тексту, в якому лише три рядки — порожній,
складений кількома пропусками та рядок, що містить, крім пропусків, хоча б один
інший символ. У цільовий текст має скопіюватися тільки останній рядок.
Завдання для самостійного опрацювання
Завдання 1. Вивести в один
рядок: ABBCCC ... ZZ ... Z
Змінні:
i - змінна циклу; визначає, яка буква буде виводитися;
i - змінна циклу; визначає, яка буква буде виводитися;
k - кількість повторень букви;
j - змінна циклу, лічильник
кількості вже виведених букв.
Завдання 2. Скласти програму визначальну,
яка з двох прізвищ довше. Прізвища мають різну довжину.
Завдання 3. Дано два слова. Скласти
програму визначальну вірно, що перше слово починається на ту ж букву, якої
закінчується друге слово.
Задача 4. Обмін
У різдвяний вечір у віконці стояло три квіточки,
зліва на право: герань, крокус та фіалка. Кожен ранок Маша витирала віконце і
міняла містами стоявшу праворуч квіточку з центральною кввточкою. А Таня кожен
вечір поливала квіточки і міняла місцями ліву та центральну квіточку. Потрібно
визначити порядок квітів вночі після того, як пройде k днів.
Вхідні дані
Перший рядок містить кількість
тестів m (1 ≤ m ≤ 12). В кожному з
наступних m рядків знаходиться кількість
днів k (k ≤ 1000).
Вихідні дані
Вивести m рядків, що
містять по три латинських літери: "G", "C" и "V"
(великі літери без пропусків), які описують порядок квітів на вікні по
закінченню k днів (зліва направо). Позначення: G –
герань, C – крокус, V – фіалка.
Приклад
Вхідні дані
2 1 5
Вихідні
дані VGC CVG
завдання Vinni
Вінні
Пух любить складати віршики говорячи речення задом наперед. Якось йому попалось
довге складне речення і він забув свій віршик, пробуючи його виговорити.
Складіть програму, яка б допомагала ведмедику легко складати такі віршики.
Зауваження: віршик може складатись як із 1 слова, так і з декількох, розділених
пропусками.
Технічні
умови. Програма
зчитує з клавіатури стрічку-віршик. В кінці віршика ніколи не ставиться крапка.
Довжина віршика менша за 255 символів. Програма виводить на екран стрічку, яку
отримано внаслідок повороту.
Приклад.
Введення> роза
Виведення> азор
Виведення> азор
Введення> Все ведмеді люблять
мед
Виведення> дем тябюл ідевдем ЄСВ
Виведення> дем тябюл ідевдем ЄСВ
В даному розділі розглянуто набір реалізацій А.Нікітін на мові Pascal стандартних алгоритмів, застосовуваних при вирішенні завдань олімпіадного програмування.
- Підрахунок різних букв в слові
- Перестановка букв в слові (циклічний зсув вправо)
- Перевірка рядки на "паліндромний"
- Друк всіх дільників натурального числа A
- Друк всіх скоєних чисел до 10000
- Друк всіх простих чисел до 500
- Підрахунок суми цифр числа
- Підрахунок суми елементів одновимірного масиву
- Підрахунок суми елементів двомірного масиву
- Пошук максимального елемента в масиві
- Пошук мінімального елемента в масиві
- Пошук середнього арифметичного в масиві
- Друк всіх елементів масиву з інтервалу C..D
- Циклічний зсув елементів масиву вправо
- Друк самого часто зустрічається елемента з масиву
- Чи всі елементи масиву різні?
- Сортування масиву "бульбашкою"
- Рішення рівняння: A * x ^ 2 + B * x + C = 0
- Обчислення довжини відрізка | AB |
- Яка точка (A або B) ближче до початку координат
- Обчислення площі трикутника по 3 вершин
- Чи потрапляє точка M (x, y) в коло з центром O (Xc, Yc) і радіусом R
- Перекладу десяткового числа в двійкове
- Перекладу двійкового числа в десяткове
- Перекладу десяткового числа в шістнадцяткове
- Перекладу шістнадцятирічного числа в десяткове
- Рекурсивні алгоритми: знаходження НСД і НСК двох чисел
- Рекурсивні алгоритми: обчислення факторіала
- Рекурсивні алгоритми: генерація перестановок
- Рекурсивні алгоритми: швидке сортування
- Рішення системи 2-х рівнянь з двома невідомими
- Рішення системи 3-х рівнянь з трьома невідомими
- Визначення перетину двох відрізків
- Визначення положення точки відносно сектора
- Положення точки щодо вектора
- Положення точки щодо трикутника (варіант 1)
- Положення точки щодо трикутника (варіант 2)
- Моделювання додавання двійкових чисел
- Моделювання віднімання двійкових чисел
- Зведення цілого числа в натуральну ступінь (варіант 1)
- Зведення цілого числа в натуральну ступінь (варіант 2)
- Множення довгих натуральних десяткових чисел
- Кодування: приклад простий кодування (зрушення по ключу)
- Обробка тексту: підрахунок кількості слів в тексті
- Обробка тексту: виділення слів з тексту
- Обробка тексту: виділення чисел з тексту
- Обробка тексту: дозвіл введення тільки цифр
- Обробка тексту: переклад в маленькі букви (нижній регістр)
- Обробка тексту: переклад в заголовні букви (верхній регістр)
- Обробка тексту: видалення з тексту Комметаріі типу {...}
- Бек-трекінг: Міста
- Бек-трекінг: Прохід по лабіринту
- Бек-трекінг: Доміно
- Бек-трекінг: Послідовність
- Бек-трекінг: Магічний квадрат
Немає коментарів:
Дописати коментар