Різниця між write та writeLn

Різниця між write та writeLn

Якщо write залишає курсор у поточному рядку, то writeLn після виведення переходить на новий. Ця дрібниця сильно впливає на формат результату.

Ключові відмінності write і writeLn

  • Перенесення рядка: write залишає курсор після виведеного тексту, writeLn переходить нижче.
  • Кілька значень: обидві процедури можуть виводити кілька аргументів одним викликом.
  • Порожній виклик: writeLn; створює порожній рядок, а write; без аргументів не має такого призначення.
  • Форматування: обидві процедури підтримують числові формати на кшталт :8:2.
  • Консоль: без файлового параметра результат іде у стандартний вивід програми.
  • Файли: обидві процедури можуть записувати текст у файлову змінну.
  • Типове призначення: write зручний для складання одного рядка, writeLn – для завершення рядка.
  • Результат: різниця часто помітна вже на другому виклику процедури.

Що таке write у Pascal

write виводить передані значення у стандартний вивід або текстовий файл. Після завершення процедури курсор залишається одразу після останнього символу, тому наступний write продовжить той самий рядок.

Наприклад:

begin
  write('Ім'я: ');
  write('Олександр');
end.

Результат:

Ім'я: Олександр

Тепер додамо ще один виклик:

begin
  write('Ім'я: ');
  write('Олександр');
  write(' Вік: ');
  write(35);
end.

Отримаємо:

Ім'я: Олександр Вік: 35

Саме ця властивість робить write зручним для складання рядка частинами. Документація Free Pascal прямо описує Write як процедуру, яка виводить змінні у текстовий файл або стандартний вивід.

“Write виводить вміст змінних у файл або стандартний вивід.” – документація Free Pascal, переклад українською.

Це добре пояснює головну роль процедури: вона друкує дані, але сама по собі не завершує рядок.

Цікавий факт! write може приймати кілька аргументів, тому write('Сума: ', 1250, ' грн'); виведе все одним викликом.

Що таке writeLn у Pascal

writeLn робить те саме базове виведення, але після нього додає послідовність переходу на новий рядок. Тому наступний текст починається вже з нового рядка.

Приклад:

begin
  writeLn('Олександр');
  writeLn(35);
end.

Результат:

Олександр
35

У документації Free Pascal ця різниця сформульована прямо:

“WriteLn робить те саме, що Write, а після цього додає символи переходу на новий рядок.” – документація Free Pascal, переклад українською.

Є ще одна корисна особливість. Виклик writeLn; без аргументів просто створює новий рядок. Наприклад:

writeLn('Результати:');
writeLn;
writeLn('Готово');

На екрані з’явиться порожній рядок між двома повідомленнями.

Порівняння write та writeLn

Ознака write writeLn
Виведення тексту Так Так
Виведення чисел Так Так
Перехід на новий рядок Ні Так
Кілька аргументів Так Так
Порожній виклик Не для перенесення Створює новий рядок
Запис у текстовий файл Так Так
Формат числа Підтримується Підтримується
Наступний write Продовжує рядок Починає новий рядок
Типовий сценарій Складання рядка Завершення рядка

Типові помилки під час виведення

  • Очікувати автоматичного перенесення після write → наступний текст приєднається до попереднього, навіть якщо програміст візуально очікував новий рядок.
  • Плутати writeLn з окремою системою форматування → процедура виводить дані так само, як write, а її головна додаткова дія – перехід на новий рядок.
  • Ставити writeLn після кожного фрагмента → один логічний рядок розпадеться на кілька фізичних рядків.
  • Забувати про writeLn; → для порожнього рядка не потрібно передавати порожній текст.
  • Не перевіряти результат кількох write → пробіли між аргументами не додаються автоматично.
  • Плутати writeLn із ReadLn → перша процедура виводить дані, друга працює з введенням.

Детальні відмінності write та writeLn

Як змінюється позиція курсора

Уявімо програму, яка формує простий чек:

write('Товар: ');
write('Хліб');
writeLn;
write('Ціна: ');
writeLn(35);

Перші два виклики створюють один рядок. writeLn після них переносить курсор, а останній виклик уже виводить число й одразу завершує другий рядок.

Мій досвід із навчальними прикладами Pascal підказує просте правило: якщо наступний фрагмент має стояти поруч – потрібен write; якщо нижче – writeLn.

Чому пробіли треба додавати самому

Команди write і writeLn не вставляють пробіл між аргументами автоматично. Тому:

write('Вік:', 35);

дасть:

Вік:35

А варіант

write('Вік: ', 35);

дасть:

Вік: 35

Для навчання це дрібниця, яка швидко стає причиною дивного форматування.

💡 Важливий момент! writeLn('A', 'B', 'C'); створить ABC і лише після цього перейде на новий рядок. Між аргументами автоматичних роздільників немає.

Форматування чисел працює в обох процедурах

Pascal дозволяє задавати ширину поля та кількість знаків після десяткової крапки. Наприклад:

writeLn(12.5:8:2);

Число буде виведене з шириною поля щонайменше 8 символів і двома десятковими знаками.

Це корисно для таблиць. Якщо треба вивести 10 значень одне під одним, задана ширина допоможе тримати колонки рівно.

Запис у файл має ту саму логіку

Різниця між процедурами зберігається і під час запису в текстовий файл. write додає дані в поточну позицію, а writeLn після них додає перехід рядка.

Тому файл із таким кодом:

write(F, 'Іван');
writeLn(F, ' 35');
write(F, 'Київ');

матиме два рядки:

Іван 35
Київ

🔍 До речі! У Free Pascal для перенесення рядка використовується системне значення slinebreak, тому конкретна послідовність символів може залежати від середовища.

Що обрати для конкретної задачі

  • Формуєте один рядок частинами → беріть write. Якщо поставити writeLn після кожного фрагмента, інформація розійдеться по різних рядках.
  • Кожне значення має бути на новому рядку → беріть writeLn. Інакше доведеться окремо додавати перенесення після кожного набору даних.
  • Створюєте таблицю або звіт → комбінуйте обидві процедури. write зручно залишає заголовки в одному рядку, а writeLn завершує готовий рядок.

🚨 Зверніть увагу! Для навчального коду різниця між write і writeLn особливо добре помітна на прикладі 2-3 послідовних команд: одна команда змінює позицію курсора, інша – ні.

Висновок+контрольний список для Pascal

  • write виводить дані й залишає курсор після останнього символу. Наступний виклик продовжить той самий рядок.
  • writeLn спочатку виводить дані, а потім переводить курсор на наступний рядок. Саме слово Ln підказує логіку команди.
  • Для складання одного повідомлення частинами зручніше писати кілька write. Так легше контролювати пробіли між фрагментами.
  • Для списку значень по одному в кожному рядку зручніший writeLn. Кожен виклик одразу завершує поточний рядок.
  • writeLn; без параметрів створює порожній рядок. Такий прийом зручний для візуального поділу блоків результату.
  • Обидві процедури приймають кілька аргументів. writeLn('Сума: ', 250); виведе напис і число, після чого перейде нижче.
  • Обидві процедури можуть працювати з текстовими файлами. Різниця в переході рядка залишається такою самою, як і під час роботи з консоллю.
  • Якщо результат програми “злипається”, спочатку перевірте місця, де мав бути writeLn. У більшості простих навчальних програм проблема саме там.

Відповідаю на часті запитання

Чому write не переносить текст на новий рядок у Pascal?
Я сприймаю write як “надрукувати тут і залишитися”. Процедура навмисно не завершує рядок, тому наступний виклик продовжує виведення з поточної позиції. Для перенесення потрібен writeLn.

Що означає Ln у назві writeLn?
Ln походить від слова “line” – рядок. Для новачка це зручна підказка: writeLn завершує поточний рядок після виведення, тому наступні дані з’являться нижче.

Чи можна замінити writeLn на write у програмі Pascal?
Можна, якщо після цього вам не потрібен автоматичний перехід. Я б не робив так у коді, де формат виводу має значення: доведеться окремо організовувати перенесення, і шанс помилки зростає.

Що краще вчити новачку: write чи writeLn?
Я радив би вивчити їх одразу разом. Спробуйте три рядки: write('A'); write('B'); writeLn('C'); – результат одразу покаже, хто відповідає за продовження, а хто за завершення рядка.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *