Головна

Практичне заняття №25

  1.  Залучення до заняття проституцією
  2.  Залучення до заняття проституцією (ст. 240 КК РФ).
  3.  Питання № 9. Завдання на наступне заняття.
  4.  Е заняття
  5.  Е заняття
  6.  Е заняття
  7.  Е заняття

Найменування:Створення та налагодження програм для обслуговування списку (дерева або стека)

1. Мета роботи:

Навчиться створювати і використовувати програми для обслуговування списку, при програмування на С ++.

2. ПІДГОТОВКА ДО ЗАНЯТТЯ:

2.1. Вивчити запропоновану літературу.

2.2. Підготувати бланк звіту.

3. ЛІТЕРАТУРА:

3.1 Бєлов В. В., Чистякова В. І. Програмування в Delphi: процедурне, об'єктно-орієнтоване, візуальне. Навчальний посібник. - М .: Гаряча лінія - Телеком 2009

3.2 Голіцина О. Л., Попов І. І. Основи алгоритмізації та програмування. - Форум 2010

3.3Семакін І. Г., Шестаков А. П. Основи алгоритмізації та програмування. - М .: Видавничий центр «Академія», 2008

3.4Семакін І. Г., Шестаков А. П. Основи програмування. - М .: Видавничий центр «Академія», 2008

4. ПЕРЕЛІК ОБЛАДНАННЯ І ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ:
 4.1. Персональний IBM PC.

5. ЗАВДАННЯ:

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

5.2. Скласти програму, яка в файлі, сформованому програмою з попередньої задачі, знаходить найбільше і найменше значення.

5.3. Скласти програму, яка формує файл з малих латинських букв, які обирають випадковим чином.

5.4. Скласти програму, яка в файлі, сформованому програмою з попередньої задачі, підрахує кількість букв z.

5.5. Скласти програму, що записує на диск таблицю Менделєєва.

5.6. Скласти програму, яка в файлі, сформованому в результаті рішення попередньої задачі, буде відшукувати відомості про заданий хімічний елемент.

5.7. Відомості про деталі, що зберігаються на складі, містять такі атрибути: назва, кількість, вартість однієї деталі. Скласти програми, вирішальні наступні завдання:

а) заповнити файл з інформацією про деталі на складі;

б) обчислити загальну вартість деталей;

в) з'ясувати, які деталі є в найбільшій кількості, які - в найменшому;

г) вивести інформацію про наявність на складі деталей даного типу і їх кількості;

д) внести зміни в файл після видачі зі складу певної кількості даного виду деталей. Якщо якийсь тип деталей повністю вибраний зі складу, то знищити запис про неї в файлі

6. ПОРЯДОК ВИКОНАННЯ РОБОТИ:

6.1 За запропонованою літературі вивчити необхідний матеріал;

6.2 Виконати завдання;

6.3 Оформити звіт;

7. ЗМІСТ ЗВІТУ:

7.1 Найменування та мета роботи

7.2 Записати результат (лістинг) виконаних завдань.

7.3 Відповіді на контрольні питання

7.4 Висновок про виконану роботу

8. Контрольні питання:

8.1. Що таке потік?

8.2 Що таке EOF?

8.3 Що таке fopen ()?

8.4 Які бувають режими відкриття потоку?

8.5 Описати як відбувається запис і читання цілих чисел?

8.6 Описати як проісходітзапісь і читання блоків даних?

Приложениe:

Під введенням-виведенням в програмуванні розуміється процес обміну інформацією між оперативною пам'яттю і зовнішніми пристроями: клавіатурою, дисплеєм, магнітними накопичувачами і т. П. Введення - це занесення інформації з зовнішніх пристроїв в оперативну пам'ять, а висновок - винос інформації з оперативної пам'яті на зовнішні пристрою. Такі пристрої, як дисплей і принтер, призначені тільки для виводу; клавіатура - пристрій введення. Магнітні накопичувачі (диски, стрічки) використовуються як для введення, так і для виведення. Основним поняттям, пов'язаним з інформацією на зовнішніх пристроях ЕОМ, є поняття файлу. Будь-яка операція введення-виведення трактується як операція обміну з файлами: введення - це читання з файлу в оперативну пам'ять; висновок - запис інформації з оперативної пам'яті в файл. Тому питання про організацію в мові програмування введення-виведення зводиться до питання про організацію роботи з файлами. Згадаймо, що в Паскалі ми використовували уявлення про внутрішнє і зовнішнє файлі. Внутрішній файл - це змінна файлового типу, що є структурованою величиною. Елементи файлової змінної можуть мати різний тип і, відповідно, різну довжину і форму внутрішнього представлення.

Внутрішній файл зв'язується із зовнішнім (фізичним) файлом за допомогою стандартної процедури Assign. Один елемент файлової змінної стає окремим записом в зовнішньому файлі і може бути прочитаний або записаний за допомогою однієї команди. Спроба записати в файл або прочитати з нього величину, не збігається з типом з типом елементів файлу, призводить до помилки. Аналогом поняття внутрішнього файлу в мовах Сі / Сі ++ є

поняття потоку. Відмінність від файлової змінної Паскаля полягає в тому, що потоку в Сі не ставиться у відповідність тип.

потік - це байтовая послідовність, що передається в процесі введення-виведення.

Потік повинен бути пов'язаний з будь-яким зовнішнім пристроєм або файлом на диску. У термінології Сі це звучить так: потік повинен бути спрямований на якийсь пристрій або файл. Основні відмінності файлів в Сі полягають у наступному: тут відсутнє поняття типу файлу і, отже, фіксованої структури записи файлу. Будь-який файл розглядається як байтовая послідовність:

Байт Про байт 1 байт 2 EOF

Стрілочкою позначений покажчик файлу, що визначає поточний байт файлу. EOF є стандартною константою - ознакою кінця файлу.

Існують стандартні потоки і потоки, які оголошуються в програмі. Останні зазвичай зв'язуються з файлами на диску, створюваними програмістом. Стандартні потоки призначаються і відкриваються системою автоматично. З початком роботи будь-якої програми відкриваються 5 стандартних потоків, з яких основними є наступні:

- S t d i n - потік стандартного введення (зазвичай пов'язаний з клавіатурою);

- Stdout - потік стандартного виведення (зазвичай пов'язаний з

дисплеєм);

- S t d e r r - виведення повідомлень про помилки (пов'язаний з дисплеєм).

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

з клавіатури і виведення на екран, ми вже неявно мали справу з першими двома потоками. А повідомлення про помилки, які система виводила на екран, ставилися до третього стандартному

потоку. Потік для роботи з дисковим файлом повинен бути відкритий в програмі.

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

FILE * імя_указателя;

наприклад:

FILE * fp;

Слово FILE є стандартним ім'ям структурного типу, оголошеного в заголовки s t d i o. h. У структурі FILE міститься інформація, за допомогою якої ведеться робота з

потоком, зокрема: покажчик на буфер, покажчик (індикатор) поточної позиції в потоці і т.д.

Наступний крок - відкриття потоку, яке проводиться за допомогою стандартної функції fopen (). Ця функція повертає конкретне значення для покажчика на потік і тому її значення присвоюється оголошеному раніше вказівником. Відповідний оператор має формат:

імя_указателя =: ? ореп (имя_файла, режім__откритія);

Параметри функції fopen () є рядками, які можуть бути як константами, так і покажчиками на символьні масиви.

наприклад:

fp = fopen ( "t e s t. d a t", "r");

Тут t e s t. dat - це ім'я фізичної файлу в поточному каталозі диска, з яким тепер буде пов'язаний потік з покажчиком f p. Параметр режиму г означає, що файл відкритий для читання. що

стосується термінології, то допустимо вживати як вираз «відкриття потоку», так і вираз «відкриття файлу».

Існують наступні режими відкриття потоку і відповідні їм параметри:

параметр Режим

г відкрити для читання

w створити для запису

а відкрити для додавання

г + відкрити для читання і запису

w + створити для читання і запису

а + відкрити для додавання або

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

Потік може бути відкритий або для текстового, або для двійкового (бінарного) режиму обміну. Сенс поняття залишається тим самим: це послідовність символів, яка ділиться на рядки спеціальними кодами - повернення каретки (код 13) і новий рядок (код 10). Якщо файл відкритий в текстовому режимі, то при читанні з такого файлу комбінація символів «повернення каретки - новий рядок» перетвориться в один символ \ n - перехід до нового рядка.

При записи в файл здійснюється зворотне перетворення. При роботі з двійковим файлом ніяких перетворень символів не відбувається, тобто інформація переноситься без будь-яких змін. Зазначені вище параметри режимів відкривають текстові файли. Якщо потрібно вказати на двійковий файл, то до параметру додається буква b. Наприклад: rb, або wb, або г + b. У деяких компіляторах текстовий режим обміну позначається буквою t, тобто записується a + t або r t.

Якщо при відкритті потоку з якої-небудь причини виникла помилка, то функція fopen () повертає значення константи NULL. Ця константа також визначена у файлі s t d i o. h. Помилка може виникнути через відсутність файлу, що на диску, нестачі місця в динамічній пам'яті і т.п. Тому бажано контролювати правильність проходження процедури відкриття файлу. Рекомендується наступний спосіб відкриття:

FILE * fp;

if (fp = fopen ( "test.dat", "r") == NULL

{Puts ( "He можу відкрити файл \ п");

return;

}

У разі помилки програма завершить виконання з закриттям всіх раніше відкритих файлів.

Закриття потоку (файла) здійснює функція f c l o s e О, прототип якої має вигляд:

i n t fclose (FILE * f p t r);

Тут f p t r позначає формальне ім'я покажчика на закривається потік. Функція повертає нуль, якщо операція закриття Пройшла успішно. Інша величина означає помилку.

Запис і читання символів.Запис символів в потік проводиться функцією putc () з прототипом

i n t p u t c (i n t ch, FILE * f p t r);

Якщо операція пройшла успішно, то повертається записаний символ. У разі помилки повертається константа EOF. Зчитування символу з потоку, відкритого для читання, виробляється функцією gets () з прототипом int gets (FILE * fptr);

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

Історично склалося так, що gets () повертає значення типу int. To ж можна сказати і про аргумент ch в описі функції puts (). Використовується ж в обох випадках тільки молодший байт. Тому обмін при зверненні може відбуватися і з перемінними типу char.

Приклад 1.Складемо програму записи в файл символьного послідовності, що вводиться з клавіатури. Нехай ознакою завершення введення буде символ *.

// Запис символів у файл

tinclude

voidmain ()

{FILE * fp;

charc;

if((Fp = fopen ( "test.dat", "w")) == NULL)

{Puts ( "He можу відкрити файл! \ П"); return;}

puts ( "Введіть символи. Ознака кінця - *");

while((C = getchar ())! = '*')

putc (с, fp);

fclose (fp);

}

В результаті на диску (в каталозі, який визначається системою) буде створений файл з ім'ям t e s t. d a t, який заповниться вводяться символами. Символ * в файл не запишеться.

Приклад 2.Файл, створений в результаті роботи попередньої програми, потрібно послідовно прочитати і вміст вивести на екран.

// Читання символів з файлу

#include

tinclude

voidmain ()

{FILE * fp;

charc;

clrscr ();

if ((fp = fopen ( "test.dat", "r")) == NULL)

{Puts ( "He вдалося відкрити файл! \ П"); return;}

while((C = getc (fp))! = EOF) putchar (c);

fclose (fp);

}

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

Запис і читання цілих чисел.Запис цілих чисел в потік без перетворення їх в символьну форму проводиться функцією putw () з прототипом i n t putw (int, FILE * fptr);

Якщо операція пройшла успішно, то повертається записане число. У разі помилки повертається константа EOF. Зчитування цілого числа з потоку, відкритого для читання,

виробляється функцією getw () з прототипом i n t getw (FILE * fptr);

Функція повертає значення зчитує з файлу числа. Якщо прочитаний кінець файлу, то повертається значення EOF.

Приклад 3.Складемо програму, за якою в файл запишеться послідовність цілих чисел, що вводяться з клавіатури, а потім ця послідовність буде прочитана і виведена на екран. Нехай ознакою кінця введення буде число 9999.

// Запис і читання цілих чисел

#include

#include

voidmain ()

{FILE * fp;

intx;

clrscr ();

// Відкриття потоку для запису

iff(Fp = fopen ( "test.dat", "w")) == NULL)

{Puts ( "Помилка відкриття файлу для запису! \ N"), -

return;

}

puts ( "Введіть числа. Ознака кінця - 9999»);

scanf ( "% d", & x);

while (x! = 9999)

{Putw (x, fp); scanf ( "% d", & x);

}

fclose (fp); // Закриття потоку в режимі запису

// Відкриття потоку для читання

if ((fp = fopen ( "test.dat", "r")) == NULL)

{Puts ( "Помилка відкриття файлу для читання! \ П");

return;

}

while ((X = getw (fp))! = EOF) printf ( "\ n% d", x);

fclose (fp);

}

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

Запис і читання блоків даних.Спеціальні функції обміну з файлами є тільки для символьного і цілого типів даних. У загальному випадку використовуються функції читання і запису блоків даних. З їх допомогою можна записувати в файл і читати з

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

Функція запису блоку даних має прототип

int fread (void * buf, int bytes, int n, FILE * fptr);

тут

buf - покажчик на адресу даних, що записуються в файл;

bytes - довжина в байтах однієї одиниці записи (блоку даних);

n - число блоків, що передаються в файл;

fptr - покажчик на потік.

Якщо запис виконалася благополучно, то функція повертає число записаних блоків (значення n). Функція читання блоку даних з файлу має прототип int fwrite (void * buf, int bytes, int n, FILE * fptr);

За аналогією з попереднім описом легко зрозуміти сенс параметрів.

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

tinclude

tinclude

voidmain ()

{FILE * stream;

charmsg [] = "this is a test";

charbuf [20];

if ((stream = fopen ( "DUMMY.FIL", "w +")) == NULL)

{Puts ( "Помилка відкриття файлу \ п");

return;

}

// Запис рядка в файл

fwrite (msg, strlen (msg) +1, 1, stream);

// Установка покажчика на початок файлу

fseek (stream, О, SEEK_SET);

// Читання рядки з файлу

fread (buf, strlen (msg) + 1, 1, stream);

printf ( "% s \ n", buf);

fclose (stream);

}

У цій програмі потік відкривається в режимі w + (створення для запису з подальшим читанням). Тому закривати файл після запису не було потрібно. Новим елементом даної програми в порівнянні з попередніми є використання функції установки покажчика потоку в задану позицію. Її формат:

int fseek (указатель_на потік, зміщення,

начало__отсчета);

початок відліку задається однією з констант, визначених у файлі stdio.h:

SEEK_SET (має значення 0) - початок файлу;

SEEK_CUR (має значення 1) - поточна позиція;

SEEK_END (має значення 2) - кінець файлу.

зсув визначає число байт, на яке треба змістити покажчик щодо заданого початку відліку. Зсув може бути як позитивним, так і негативним числом. Обидва параметра мають тип long.

Форматний обмін з файлами.За допомогою функції форматного виведення можна формувати на диску текстовий файл з результатами обчислень, представленими в символьному вигляді. Надалі цей файл може бути переглянутий на екрані, роздрукований

на принтері, відредагований за допомогою текстового редактора. Загальний вигляд функції форматного виведення:

int fprintf (указатель_на_поток, форматная_строка,

спісок__переменних);

Використовувалася нами раніше функція printf () для організації виведення на екран є приватним варіантом функції fprintf (). Функція printf () працює лише зі стандартним

потоком stdin, який завжди пов'язується системою з дисплеєм. Не буде помилкою, якщо в програмі замість printf () написати fprintf (stdin, ...).

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

Приклад 5.Складемо програму, за якою буде розрахована і записана в файл таблиця квадратних коренів для цілих чисел від 1 до 10. Для контролю ця ж таблиця виводиться на екран.

// Таблиця квадратних коренів

#include

#include

#include

voidmain ()

{FILE * fp;

intx;

fp = fopen ( "test.dat", "w");

// Висновок на екран і в файл шапки таблиці

printf ( "\ t Таблиця квадратних коренів \ п");

fprintf (fp, "\ t Таблиця квадратних коренів \ п");

printf ( "\ t x \ t \ tsqrt (x) \ n");

fprintf (fp, "\ t x \ t \ tsqrt (x) \ n");

// Обчислення і виведення таблиці квадратних коренів

// На екран і в файл

for (x = l;x <= 10; х ++)

{Printf ( "\ t% f \ t% f \ n", float (x), sqrt (float (x)));

fprintf (fp, "\ t% f \ t% f \ n", float (x),

sqrt (float (x)));

}

fclose (fp);

}

Якщо тепер за допомогою текстового редактора (наприклад, що входить в систему програмування) відкрити файл t e s t. d a t, то на екрані побачимо:

Таблиця квадратних коренів

х sqrt (x)

1.000000 1.000000

2.000000 1.414214

3.000000 1.732051

4.000000 2.000000

5.000000 2.236068

6.000000 2.449490

7.000000 2/645751

8.000000 2.828427

9.000000 3.000000

10.000000 3.162278

Тепер ці результати можна роздрукувати, включити в текст звіту і т. П.

Форматний введення з текстового файлу здійснюється за допомогою функції fscanf (), загальний формат якої виглядає наступним чином:

i n t fscanf (указатель_на_поток, форматная_строка,

спісок_адресов ^ змінних);

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

файлу t e s t. d a t, отриманого в результаті виконання попередньої програми, вводяться в числові масиви х і Y. Для контролю значення елементів масивів виводяться на екран. Попередньо за допомогою текстового редактора в файлі t e s t. dat видаляються дві перші рядки з заголовками. В результаті в файлі залишаться тільки числа.

 



 Структури і об'єднання |  Практичне заняття №26

 Лабораторна робота №22 |  Приклад 1. |  Лабораторна робота №23 |  Приклад 1. |  Приклад 2. |  Приклад 3. |  Приклад 5. |  Практичне заняття №24 |  Практичне заняття №27 |  Практичне заняття №28 |

© um.co.ua - учбові матеріали та реферати