Ввід-вивід інформації, специфікації, оператори та ресурси вводу-виводу

Користування стандартним та форматованим вводом-виводом. Використання вводу та виводу аргументу. Розробка лінійних програм. Програми з розгалуженням, циклічні програми з регулярною змінною аргументу. Використання вказівників для роботи з масивами даних.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 27.02.2014
Размер файла 4,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

КУРСОВИЙ ПРОЕКТ (РОБОТА)

З програмування

на тему:

Ввід-вивід інформації, специфікації, оператори та ресурси вводу-виводу

Реферат

Курсова робота складається з: 2-х розділів, ___ сторінок, 12-ти ілюстрацій, 2-х таблиць, 16-х літературних джерел.

Мета роботи - навчитися користуватися стандартним вводом-виводом, форматованим вводом-виводом, використовувати ввід та вивід аргумента.

В роботі проведено аналіз форматованого вводу та виводу.

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

Ключові слова: ввід, вивід, СИМВОЛИ, C++, програма, ФУНКЦІЇ.

Зміст

  • Вступ
  • Розділ І. Теоретична частина
  • 1.1 Стандартний ввід і вивід
  • 1.2 Форматований ввід і вивід
  • 1.3 Додаткові функції
  • Розділ ІІ. Практична частина
  • Завдання 1. Лінійні програми
  • Завдання 2. Програми з розгалуженням
  • Завдання 3. Циклічні програми з регулярною змінною аргументу
  • Завдання 4-1. Циклічні програми з регулярною змінною аргументу, які містять розгалуження
  • Завдання 4-2. Циклічні програми з регулярною змінною аргументу, які містять розгалуження
  • Завдання 5-1. Одновимірні масиви
  • Завдання 5-2. Одновимірні масиви
  • Завдання 6. Використання вказівників для роботи з масивами даних
  • Завдання 7. Циклічні програми з накопиченням суми або добутку
  • Завдання 8. Вкладені цикли
  • Завдання 9. Двовимірні масиви, сортування масивів
  • Завдання 10. Процедури-функції
  • Завдання 11. Підпрограми-функції
  • Завдання 12-1. Опрацювання символьних рядків
  • Завдання 12-2. Опрацювання символьних рядків
  • Завдання 13. Застосування бібліотечних функцій для роботи з символами та символьними рядками
  • Завдання 14. Багатовимірні масиви та масиви символьних рядків
  • Завдання 15. Файли
  • Завдання 16. Основи опрацювання структур
  • Завдання 17. Основи ООП. Принципи побудови класів
  • Завдання 18. Перевантаження функцій
  • Завдання 19. Шаблони функцій
  • Висновок
  • Список використаних джерел

Вступ

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

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

Властивості функцій бібліотеки зазначено в більш ніж двох десятках файлів заголовка; ми вже зустрічалися з деякими з них, включаючи <stdio. h>, <string. h> і <ctype. h>. Ми не зможемо представити цілу бібліотеку тут, оскільки ми більш зацікавлені в написанні програм, що можуть її використовувати.

Розділ І. Теоретична частина

1.1 Стандартний ввід і вивід

Бібліотека втілює просту модель текстового вводу і виводу. Текстовий потік складається з послідовності рядків, кожний рядок закінчується знаком нового рядка. Якщо система не працює в такий спосіб, бібліотека зробить все від неї залежне, щоб здавалося, що все саме так і є. Наприклад, бібліотека може перетворювати повернення каретки і переведення рядка на символ нового рядка при вводі і в зворотньому напрямку при виводі.

Найпростіший механізм вводу - це читати по одному символу за один раз зі стандартного вводу, як правило це клавіатура, за допомогою getchar: int getchar (void)

getchar повертає наступний введений знак кожний раз як її викликано, або EOF, коли вона зіткнулася з кінцем файла. Символічну константу EOF визначено в <stdio. h>. Це значення, типово, дорівнює - 1, але краще вживати EOF, щоб не залежати від певного значення. В багатьох середовищах, клавіатуру можна замінити на файл скориставшись з умовного знака <, який позначає перенаправлення вводу: якщо програма prog послуговується getchar, тоді команда prog <infile

змушує prog читати символи з infile, натомість. Перемкнення вводу відбувається в такий спосіб, що сама програма prog знає про зміну; зокрема, ланцюжок "<infile" не включається як аргумент командного рядка в argv. Заміна вводу також залишається невидимою, якщо ввід надходить з іншої програми через конвеєр: на деяких системах, команда otherprog | prog

запускає дві програми, otherprog і prog, і передає через конвеєр стандартний вивід otherprog стандартному вводу prog.

Функція

int putchar (int)

ввід вивід програма циклічна

використовується для виводу: putchar (c) виводить символ c на стандартний вивід, типово, це екран. putchar повертає виведений символ, або EOF, якщо відбулася помилка. Знову ж таки, вивід можна перенаправити у файл за допомогою >filename. Якщо програма використовує putchar, команда prog >outfile запише стандартний вивід до outfile, натомість. Якщо підтримуються конвеєри, prog | anotherprog поміщає стандартний вивід prog у стандартний ввід anotherprog. Вивід, спричинений printf, також знаходить свій шлях до стандартного пристрою виводу. Виклики putchar і printf можуть чергуватися - вивід відбувається в тій послідовності, в якій виклики відбуваються.

Кожний вихідний файл, що згадує якусь з функцій бібліотеки вводу/виводу, повинен містити рядок #include <stdio. h> перед тим як їх вживати. Коли назву файла заголовка включено в дужки < та >, пошук такого відбувається в стандартному наборі місць в системі (наприклад, на UNIX, типовим каталогом є /usr/include).

Багато програм читають тільки один потік вводу і записують тільки один виводу; для таких програм буде цілком достатньо здійснення вводу і виводу за допомогою getchar, putchar і printf, або, принаймні, цього вистачить для початку. Це особливо так, якщо перенаправлення використовується для під'єднання виводу однієї програми до вводу іншої. Наприклад, розглянемо програму lower, яка переводить свій ввід у нижній регістр:

#include <stdio. h>

#include <ctype. h>

main () /* lower: переводить ввід у нижній регістр */

{

int c

while ( (c = getchar ())! = EOF)

putchar (tolower (c));

return 0;

}

Функцію tolower визначено в <ctype. h>, вона перетворює літеру верхнього регістру у нижній і повертає решту символів незмінними. Як ми зазначили раніше, "функції" на зразок getchar і putchar з <stdio. h> і tolower з <ctype. h> часто являються макросами, щоб запобігти витраті ресурсів на виклик функції для кожного символу. Незалежно від того, як втілено функції <ctype. h> на окремих машинах, програми, що використовують їх, не вимушені знати деталей про набір символів.

1.2 Форматований ввід і вивід

Функція виводу, printf, обертає внутрішні значення на друковні знаки. Ми неформально застосовували printf у попередніх розділах. Опис, який ви знайдете тут, охоплює найтиповіші випадки використання функції, але не є повним.

int printf (char *format, arg1, arg2,.);

printf перетворює, форматує і виводить свої аргументи на стандартний пристрій виводу згідно із форматом (format). Вона повертає кількість виведених символів.

Ланцюжок формату містить два типи об'єктів: звичайні символи, які буде копійовано до вивідного потоку і вказівники перетворення, кожен з яких призводить до, власне, перетворення і виводу кожного наступного аргументу printf. Кожний вказівник перетворення починається з % і закінчується знаком перетворення. Між % і цим знаком можуть також знаходитись, в даній послідовності:

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

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

Крапка, яка відокремлює ширину поля від вказівника точності.

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

Знак h, якщо ціле буде виведене як коротке (short), або l (англійська літера "л"), якщо як довге (long).

Символи перетворення показано в Таблиці 1.1. Якщо знак після % не являється вказівником перетворення, поводження залишиться невизначеним.

Таблиця 1.1 Основні перетворення printf

Знак

Тип аргументу

Виводиться як

d, i

int

десяткове число.

o

int

беззнакове вісімкове число (без нуля попереду).

x, X

int

беззнакове шістнадцяткове число (без 0x або 0X попереду), використовуючи abcdef або ABCDEF замість 10,., 15.

u

int

беззнакове ціле число.

c

int

один знак.

s

char *

виводить знаки ланцюжка до '\0' або тієї кількості знаків, яку задано вказівником точності.

f

double

[-] m. dddddd, де кількість d задано вказівником точності (за замовчуванням - 6).

е, Е

double

[-] m. dddddde+/-xx або [-] m. ddddddE+/-xx, де кількість d задано вказівником точності (за замовчуванням - 6).

g, G

double

застосовувати %e або %E, якщо показник степеня менший за - 4 або більший за або рівний точності; у протилежному випадку, використовувати %f. Хвостові нулі і хвостова десяткова крапка не виводяться.

p

void *

покажчик (представлення залежить від реалізації).

%

жодного аргументу не перетворено, вивести %.

Ширина або точність можуть бути вказаними як *, у такому разі, значення обчислюється шляхом перетворення наступного аргументу (який повинен бути типу int). Наприклад, щоб вивести, щонайбільше, max знаків ланцюжка s, ми можемо написати printf ("%. *s", max, s);

Більшість перетворень формату було проілюстровано в попередніх розділах. Одним виключенням є точність, так як вона має відношення до ланцюжків. Наступна таблиця демонструє ефект різних означень для виводу "hello, world" (12 знаків). Ми додали двокрапки навколо кожного поля, щоб було видно їхній розмір.

: %s:: hello, world:

: %10s:: hello, world:

: %.10s:: hello, wor:

: % -10s:: hello, world:

: %.15s:: hello, world:

: % -15s:: hello, world:

: %15.10s:: hello, wor:

: % -15.10s:: hello, wor:

Застереження: printf використовує свій перший аргумент для того, щоб дізнатися як багато аргументів в цілому і який їхній тип. Вона заплутається і ви отримаєте неправильний результат, якщо недостатньо аргументів або вони неправильного типу. Вам також слід знати про відмінність цих двох викликів:

printf (s); /* ЗАЗНАЄ НЕВДАЧІ, якщо s містить % */

printf ("%s", s); /* БЕЗПЕЧНИЙ для використання */

Функція sprintf здійснює ті самі перетворення, що й printf, але зберігає свій вивід у ланцюжку: int sprintf (char *string, char *format, arg1, arg2,.); sprintf форматує аргументи arg1, arg2 і так далі, відповідно до формату (format), як і раніше, але результат в ланцюжку (string) замість стандартного виводу; string повинен бути досить великим, щоб втримати результат.

Оскільки ми, головним чином, зацікавлені в опрацьовуванні аргументів, minprintf оброблятиме форматувальний ланцюжок і аргументи, але викликатиме дійсний printf для перетворень формату. Чинним оголошенням printf є int printf (char *fmt,.) де. означає, що кількість і типи цих аргументів може відрізнятися. Оголошення. може тільки з'являтися в кінці списку аргументів. Нашу minprintf оголошено як void minprintf (char *fmt,.) оскільки ми не повертатимемо відлік символів, як це робить printf.

Делікатний момент полягає в тому, як minprintf просувається через список аргументів, в той час як сам список навіть не має імені. Стандартний файл заголовка <stdarg. h> містить набір макросів, який визначає, як проходити список аргументів. Втілення цього файла заголовка може відрізнятися на різних машинах, але інтерфейс, який він представляє є однорідним.

Тип va_list використовується для оголошення змінної, яка посилатиметься по-черзі до кожного аргументу; в minprintf ця змінна називається ap, як скорочення від "argument pointer" (покажчик на аргумент). Макрос va_start ініціалізує ap таким чином, щоб вона вказувала на перший безіменний аргумент. Макрос потрібно викликати один раз до того, як використовувати ap. Необхідно, щоб був щонайменше один аргумент з іменем; останній названий аргумент використовується va_start, щоб розпочати роботу. Кожний виклик va_arg повертає один аргумент і переводить ap до наступного; va_arg використовує назву типу, щоб визначити, який тип повернути і наскільки великим повинен бути крок. І, накінець, va_end здійснює очистку, якщо треба. Її потрібно викликати до того, як програма поверне своє значення.

Ці властивості складають базу для нашої спрощеної printf:

#include <stdarg. h>

/* minprintf: мінімальна printf зі списком аргументів *

* змінної довжини */

void minprintf (char *fmt,.)

{

va_list ap; /* покажчик на кожний безімений аргумент *

* по черзі */

char *p, *sval;

int ival;

double dval;

va_start (ap, fmt); /* заставляє ap бути покажчиком *

* на 1-ий безіменний аргумент */

for (p = fmt; *p; p++) {

if (*p! = '%') {

putchar (*p);

continue;

}

switch (*++p) {

case 'd':

ival = va_arg (ap, int);

printf ("%d", ival);

break;

case 'f':

dval = va_arg (ap, double);

printf ("%f", dval);

break;

case 's':

for (sval = va_arg (ap, char *); *sval; sval++)

putchar (*sval);

break;

default:

putchar (*p);

break;

}

}

va_end (ap); /* очистка */

}

Функція scanf є аналогічною printf, але тільки для вводу. Вона надає багато з тих самих можливостей перетворення в зворотньому, правда, напрямку.

int scanf (char *format,.)

scanf зчитує знаки зі стандартного вводу, інтерпретуючи їх відповідно до специфікації, вказаній форматом (format), і зберігає результат за допомогою решти аргументів. Аргумент формату описано нижче; решта аргументів, кожен з яких повинен бути покажчиком, вказує на те, де відповідний перетворений ввід потрібно зберегти. Так само як і з printf, цей розділ являється підсумком найкорисніших рис, а не вичерпним описом.

scanf зупиняється, якщо вона вичерпає свій список формату, або коли ввід не співпадає із контрольною специфікацією. Вона повертає як значення число елементів вводу, що співпали і яких було присвоєно. Це можна використати, щоб взнати, скільки об'єктів було знайдено. При завершенні файла повертається EOF; зауважте, що не те саме що й 0, який означає, що наступний символ вводу не співпав із першим описом в ланцюжку форматування. Наступний виклик scanf відновить продовжить пошук, починаючи з місця, де було оброблено останній знак.

Існує також функція sscanf, яка читає свій ввід з ланцюжка замість стандартного вводу: int sscanf (char *string, char *format, arg1, arg2,.)

Вона сканує ланцюжок, відповідно до формату format і зберігає отримані значення в arg1, arg2 і так далі. Останні мають бути покажчиками.

Ланцюжок формату, як правило, містить описи перетворення, що використовуються для керування перетворенням вводу. Ланцюжок формату може містити:

Пробіли і табуляцію, які не ігноруються.

Звичайні знаки (не %), які повинні співпасти з наступним символом, який не є пробілом, з потоку вводу.

Описувачі перетворення, що складаються зі знака %, необов'язкового знака блокування присвоєння *, необов'язкового числа, яке вказує ширину поля, необов'язкових h, l або L, які вказують ширину адресата та символ перетворення.

Описувач перетворення описує перетворення наступного поля вводу. Звичайно, результат розміщено в змінній, на яку вказує відповідний аргумент. Якщо ж за допомогою * вказано блокування присвоєння, ввідне поле пропускається, присвоєння не відбувається. Ввідним полем вважається ланцюжок знаків, які не являються пробілами; воно продовжиться або до наступного пробілу, або доки ширину поля, якщо вказано, вичерпано. Це означає, що scanf читатиме крізь границі для того, щоб знайти ввід, оскільки символи нового рядка також вважаються пробілами. (Символами-пробілами вважаються пробіл, табуляція, новий рядок, повернення каретки, вертикальна табуляція і зміна сторінки.)

Символ перетворення визначає інтерпретацію ввідного поля. Відповідний аргумент повинен бути покажчиком, як вимагається семантикою "виклику за значенням" C. Символи перетворень показано в Таблиці 1.2.

Таблиця 1.2 Основні перетворення scanf

Символ

Вводимі дані

Тип аргументу

d

десяткове ціле

int *.

i

ціле

int *. Ціле може бути у вісімковій (з 0 попереду) або шістнадцятковій (з 0x або 0X) формі.

o

вісімкокове ціле (із або без попереднього 0)

int *.

u

беззнакове десяткове ціле

unsigned int *.

x

шістнадцяткове ціле (із або без попереднього 0x або 0X)

int *.

c

символи

char *. Наступні введені знаки (без задання 1) розміщено у вказане місце. Звичайний пробіл пригнічено; щоб прочитати наступний не-пробіл, використайте %1s.

s

символьний ланцюжок (не екрановнаий)

char *, вказуючи на масив символів достатньо великий для ланцюжка і кінцевого '\0', який буде додано.

e,f,g

число з рухомою точкою з необов'язковим знаком, необов'язковою експонентою

float *.

%

буквальний %

присвоєння не відбувається

Перед знаками перетворення d, i, o, u та x може стояти h, щоб вказати, що в списку аргументів знаходиться покажчик на коротке ціле (short) а не ціле (int), або l (англійська "л"), щоб вказати на покажчик на довге ціле (long).

Як перший приклад, простенький калькулятор з Розділу 4 можна написати зі scanf, щоб здійснювати перетворення вводу:

#include <stdio. h>

main () /* простий калькулятор */

{

double sum, v;

sum = 0;

while (scanf ("%lf", &v) == 1)

printf ("\t%.2f\n", sum += v);

return 0;

}

Скажімо, ми хочемо прочитати рядки вводу, які містять дату у формі

25 Dec 1988

Твердження зі scanf у такому разі становитиме

int day, year;

char monthname [20];

scanf ("%d %s %d", &day, monthname, &year);

Знак & не використовується зі змінною, що зберігає назву місяця monthname, оскільки назва масиву і так є покажчиком. Буквальні знаки також можуть з'являтися в ланцюжку формату scanf; вони повинні співпасти з такими самими знаками у вводі. Тож ми могли би читати дати, що мають форму мм/дд/рр за допомогою виразу зі scanf:

int day, month, year;

scanf ("%d/%d/%d", &month, &day, &year);

scanf ігнорує пробіли і табуляцію в ланцюжкові формату. Більше того, вона пропускає пропуски і пробіли (пробіли, табуляцію, нові рядки тощо), розглядаючи ввід. Для прочитання вводу, чий формат не є сталим, кращим буде читати по одному рядкові за раз, після чого розбити його на окремі частини за допомогою scanf. Наприклад, скажімо ми хотіли би прочитати рядки, які можуть включати дату в одній з, наведених вище, форм. В такому разі ми могли би написати

while (getline (line, sizeof (line)) > 0) {

if (sscanf (line, "%d %s %d", &day, monthname, &year) == 3)

printf ("valid: %s\n", line); /* форма 25 Dec 1988 */

else if (sscanf (line, "%d/%d/%d", &month, &day, &year) == 3)

printf ("valid: %s\n", line); /* форма мм/дд/рр */

else

printf ("invalid: %s\n", line); /* недійсна форма */

}

Виклики scanf можна змішувати з викликами інших функцій вводу. Наступний виклик будь-якої ввідної функції почнеться з прочитання першого знака, не прочитаного scanf.

Останнє попередження: аргументи scanf і sscanf повинні бу покажчиками. Найчастішою помилкою є написання

scanf ("%d", n);

замість

scanf ("%d", &n);

Цю помилку, як правило, не буде виявлено під час компіляції.

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

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

cat x. c y. c

виводить вміст файлів x. c та y. c (і нічого більше) на стандартний пристрій виводу. Питання в тому, як забезпечити прочитання даних файлів, тобто, як під'єднати зовнішні назви, про які думає користувач, до твердження, яке читатиме дані.

Правила - прості. Перед тим як його можна прочитати або здійснити до нього запис, файл потрібно відкрити за допомогою бібліотечної функції fopen. fopen візьме зовнішні назви, такі як x. c або y. c, здійснить певні службові дії і переговори з операційною системою (деталі яких не повинні нас хвилювати), і повертає покажчик, який використовуватиметься в наступних читаннях і записах до файла.

Цей покажчик, який називається покажчиком файла, вказує на структуру, яка містить інформацію про файл, таку як місцеперебування буфера, поточне положення знака в буфері, чи файл читається, чи до нього йде запис, і, чи мали місце помилки або вказівник кінця файла. Користувачі не повинні знати подробиць, оскільки визначення, що знаходяться в <stdio. h> включають оголошення структури під назвою FILE. Єдине, що потрібно знати, це оголошення покажчика файла, яке спрощено виглядає як

FILE *fp;

FILE *fopen (char *name, char *mode);

Це означає, що fp є покажчиком на (структуру типу) FILE і fopen повертає покажчик на FILE. Замітьте, що FILE, це назва типу, така сама як int, а не мітка структури; її означено за допомогою typedef. (Деталі щодо того як можна втілити fopen на UNIX надано в Розділі 8.5.) Виклик fopen у програмі має вигляд

fp = fopen (name, mode);

Першим аргументом fopen є символьний ланцюжок, що містить назву файла. Другий аргумент - це режим, також символьний ланцюжок, який вказує на те, як буде використовуватись файл. Допустимими режимами можуть бути режим читання ("r" - read), запису ("w" - write) і долучення ("a" - append). Деякі системи розрізняють текстові і бінарні файли, для останніх потрібно додати "b" (binary) до літери режиму.

Якщо файл, якого не існує, відкрито для запису або додання, його буде створено, якщо це можливо. Відкриття наявного файла для запису спричинить звільнення старого змісту, тоді як відкриття для дозапису (доточення) - збереже старий зміст. Спроба прочитання файла, якого не існує, викличе помилку; існують також інші причини помилок, як скажімо спроба прочитати файл, на який ви не маєте дозволу. Якщо сталася якась помилка, fopen повертає NULL. Наступний крок - мати спосіб читання або запису до файла після того, як його відкрито. getc повертає наступний знак з файла; вона вимагає покажчика на файл, щоб знати, який саме файл.

int getc (FILE *fp)

getc повертає наступний знак з потоку, на який вказує fp; вона повертає EOF у випадку кінця файла або помилки.

putc - це функція виводу:

int putc (int c, FILE *fp)

putc запише символ з c до файла fp і поверне записаний знак або EOF у випадку помилки. Так само як getchar і putchar, getc із putc можуть бути макросами, а не функціями. Під час запуску C-програми, середовище операційної системи бере на себе завдання відкриття трьох файлів і надання покажчиків до них. Ці файли - це стандартний ввід, стандартний вивід і стандартна помилка; відповідні їм покажчики називаються stdin, stdout і stderr, і оголошено в <stdio. h>. За звичайних обставин, stdin сполучено з клавіатурою, тоді як stdout із stderr - з екраном, але stdin і stdout можна перенаправити в інші файли або конвеєри, як описано в Розділі 7.1.

getchar і putchar можна визначити через getc, putc, stdin і stdout наступним чином:

#define getchar () getc (stdin)

#define putchar (c) putc ( (c), stdout)

Для форматованого вводу або виводу із файлами, можна використати функції fscanf і fprintf. Вони тотожні scanf із printf за винятком того, що першим аргументом є покажчик на файл, який вказує на, власне, файл, який читатиметься; другим аргументом є ланцюжок формату.

int fscanf (FILE *fp, char *format,.)

int fprintf (FILE *fp, char *format,.)

Маючи такий начерк, ми тепер можемо написати власну програму cat для зчеплення файлів. Схема буде тією самою, що виявилась корисною в багатьох інших програмах. Якщо існують аргументи командного рядка, їх буде інтерпретовано як назви файлів і оброблено по-порядку. Якщо немає аргументів, обробляється стандартний ввід.

#include <stdio. h>

/* cat: зчеплює файли, 1-а версія */

main (int argc, char *argv [])

{

FILE *fp;

void filecopy (FILE *, FILE *)

if (argc == 1) /* немає аргументів; копіює *

* стандартний ввід */

filecopy (stdin, stdout);

else

while (--argc > 0)

if ( (fp = fopen (*++argv, "r")) == NULL) {

printf ("cat: can't open %s\n, *argv);

return 1;

} else {

filecopy (fp, stdout);

fclose (fp);

return 0;

}

/* filecopy: копіює файл ifp до файла ofp */

void filecopy (FILE *ifp, FILE *ofp)

{

int c;

while ( (c = getc (ifp))! = EOF)

putc (c, ofp);

}

Покажчики на файл stdin і stdout являються об'єктами типу FILE *. Незважаючи на це, вони є константами (сталими), а не змінними, що внеможливлює надання їм нового значення.

Функція

int fclose (FILE *fp)

являється протилежністю fopen, вона розриває зв'язок між покажчиком на файл і зовнішньою назвою, отриманою fopen, звільняючи покажчик для іншого файла. Оскільки більшість операційних систем мають певне обмеження кількості файлів, які програма в змозі відкрити одночасно, хорошою ідеєю буде звільнити покажчики на файли, якщо їх більше не потрібно, як ми це зробили в cat. Існує також інша причина зробити fclose для файла виводу - це очищує буфер, в якому putc накопичує вивід. fclose викликається автоматично для кожного відкритого файла при нормальному завершенні програми. (Ви можете замкнути stdin і stdout, якщо вони непотрібні. Їх також можна перепризначити за допомогою бібліотечної функції freopen.)

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

Щоб краще справлятися з подібними ситуаціями, програмам надається другий поток виводу під назвою stderr, поряд із stdin і stdout. Вивід, записаний до stderr, як правило, з'являється на екрані навіть якщо стандартний вивід перенаправлено.

Давайте виправимо cat так, щоб писати його повідомлення про помилки до стандартної помилки.

#include <stdio. h>

/* cat: зчеплює файли, 2-а версія */

main (int argc, char *argv [])

{

FILE *fp;

void filecopy (FILE *, FILE *);

char *prog = argv [0]; /* назва програми, для помилок */

if (argc == 1) /* немає аргументів; копіює *

* стандартний ввід */

filecopy (stdin, stdout);

else

while (--argc > 0)

if ( (fp = fopen (*++argv, "r")) == NULL) {

fprintf (stderr, "%s: can't open %s\n",

prog, *argv);

exit (1);

} else {

filecopy (fp, stdout);

fclose (fp);

}

if (ferror (stdout)) {

fprintf (stderr, "%s: error writing stdout\n", prog);

exit (2);

}

exit (0);

}

Програма сигналізує помилки в два способи. Перший: діагностичний вивід, спричинений fprintf надходить до stderr, тож він знаходить свій шлях на екран замість того, щоб зникнути кудись через конвеєр або в файлі виводу. Ми включили в повідомлення назву програми з argv [0], тож, якщо програма використовується разом з іншими, джерело помилки буде ідентифіковано.

Другий: програма використовує функцію стандартної бібліотеки exit, яка завершує виконання програми, якщо її викликано. Аргумент exit стане доступний будь-якому процесові, який викликав даний, тож успіх чи невдача програми може перевірятись іншою програмою, яка використовує першу як дочірній процес. Традиційно, повернене значення 0 сигналізує, що все успішно; ненульові значення, звично, означають анормальні ситуації. exit викликає fclose для кожного відкритого файла виводу для того, щоб очистити будь-який буферований вивід.

Всередині main, return expr еквівалентне exit (expr). Перевага використання exit полягає в тому, що її можна викликати з інших функцій і її виклики можна знаходити за допомогою програм пошуку за шаблоном як ті, які ви знайдете у Розділі 5.

Функція ferror повертає ненульове значення, якщо відбулася помилка при обробці потоку fp.

int ferror (FILE *fp)

Хоча помилки виводу являються рідкістю, вони теж відбуваються (наприклад, якщо диск заповнено до кінця), тож виробнича програма також повинна це перевірити.

Функція feof (FILE *) є аналогічною ferror; вона повертає ненульове значення, якщо досягнуто кінця файла.

int feof (FILE *fp)

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

Стандартна бібліотека надає функцію вводу і виводу fgets, аналогічну getline, яку ми використовували в попередніх розділах:

char *fgets (char *line, int maxline, FILE *fp)

fgets читає наступний рядок вводу (включаючи символ нового рядка) з файла fp у символьний масив line; щонайбільше maxline-1 знаків буде прочитано. Отриманий в результаті рядок буде завершено '\0'. Звично, fgets повертає рядок; у випадку кінця файла або помилки, вона повертає NULL. (Наша getline повертає довжину рядка, - корисніше значення; нуль означає кінець файла.)

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

int fputs (char *line, FILE *fp)

Вона повертає EOF, якщо відбулася помилка і додатнє значення у протилежному випадку.

Функції бібліотеки gets і puts тотожні fgets і fputs, але оперують над stdin і stdout. Плутанину викликає те, що gets видаляє кінцевий '\n', тоді як puts додає його.

Щоб продемонструвати, що немає нічого особливого в таких функціях як fgets і fputs, ось вони, будь-ласка, скопійовані зі стандартної бібліотеки до нашої системи:

/* fgets: отримує щонайбільше n символів з iop */

char *fgets (char *s, int n, FILE *iop)

{

register int c;

register char *cs;

cs = s;

while (--n > 0 && (c = getc (iop))! = EOF)

if ( (*cs++ = c) == '\n')

break;

*cs = '\0';

return (c == EOF && cs == s)? NULL: s;

}

/* fputs: додає ланцюжок s до файла iop */

int fputs (char *s, FILE *iop)

{

int c;

while (c = *s++)

putc (c, iop);

return ferror (iop)? EOF: 0;

}

З невідомих причин, стандарт вказує на відмінні значення повернення для ferror і fputs. Досить легко втілити нашу getline за допомогою fgets:

/* getline: читає рядок, повертає довжину */

int getline (char *line, int max)

{

if (fgets (line, max, stdin) == NULL)

return 0;

else

return strlen (line);

}

1.3 Додаткові функції

Стандартна бібліотека надає широкий вибір різноманітних функцій.

Операції з ланцюжками

Ми вже згадали ланцюжкові функції strlen, strcpy, strcat і strcmp, які ви знайдете в <string. h>. В наступному огляді, s із t - це char *, тоді як c та n - це int.

strcat (s,t) доточує t до кінця s

strncat (s,t,n) доточує n знаків t до кінця s

strcmp (s,t) повертає від'ємне, нуль або додатнє значення для s < t, s == t, s > t

strncmp (s,t,n) те саме, що й strcmp, але тільки для перших n знаків

strcpy (s,t) копіює t до s

strncpy (s,t,n) копіює щонайбільше n символів t до s

strlen (s) повертає довжину s

strchr (s,c) повертає покажчик на перший знайдений символ c у s, або NULL, якщо жодного не знайдено

strrchr (s,c) повертає покажчик на останній знайдений символ c у s, або NULL, якщо жодного не знайдено

Перевірка і перетворення класів символів

Декілька функцій з <ctype. h> здійснюють перевірку символів і перетворення. В наступному, c є типу int, який може бути представленим як unsigned char (беззнаковим символом) або EOF. Функції повертають int.

isalpha (c) повертає ненульове значення, якщо c є літерою алфавіта, 0 - якщо ні

isupper (c) повертає ненульове значення, якщо c є верхнього регістру, 0 - якщо ні

islower (c) повертає ненульове значення, якщо c є нижнього регістру, 0 - якщо ні

isdigit (c) повертає ненульове значення, якщо c є цифрою, 0 - якщо ні

isalnum (c) повертає ненульове значення, якщо isalpha (c) або isdigit (c), 0 - якщо ні

isspace (c) повертає ненульове значення, якщо c являється пробілом, табуляцією, символом нового рядка, вертанням каретки, зміною сторінки або вертикальною табуляцією

toupper (c) повертає c, обернене у верхній регістр

tolower (c) повертає c, обернене у нижній регістр

Ungetc

int ungetc (int c, FILE *fp)

проштовхує символ c назад у файл fp і повертає або c, або EOF у випадку помилки. Тільки один символ на файл гарантовано проштовхнути назад. ungetc може використовуватись разом з кожною з ввідних функцій, таких як scanf, getc або getchar.

Виконання команд

Функція system (char *s) виконує команду, що міститься в символьному ланцюжку s, після чого продовжує виконання поточної програми. Вміст s залежить великою мірою від операційної системи. Як тривіальний приклад, на UNIX-системах, вираз system ("date");

спричиняє до запуску програми date; вона видруковує дату і час дня на стандартному виводі. system повертає системозалежне ціле статусу виконаної команди. На UNIX, статус буде значенням, поверненим exit.

Керування пам'яттю

Функції malloc і calloc динамічно добувають відрізки пам'яті.

void *malloc (size_t n)

повертає покажчик на n байтів неініційованої пам'яті, або NULL, якщо запит неможливо задовольнити.

void *calloc (size_t n, size_t size)

повертає покажчик на досить вільного місця для масиву з n об'єктами вказаного розміру size, або NULL, якщо запит неможливо задовольнити. Місце зберігання ініціюється нулем.

Покажчик, повернений malloc або calloc, матиме відповідне вирівнювання для даного об'єкту, але його необхідно звести до підходящого типу, як скажімо

int *ip;

ip = (int *) calloc (n, sizeof (int));

free (p) звільняє місце, на яке вказує p, де p попередньо отримано викликом malloc або calloc. Немає обмежень щодо послідовності в якій звільнюється простір, але виникне жахлива помилка, якщо звільнити щось, що не було отримано викликом malloc або calloc.

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

for (p = head; p! = NULL; p = p->next) /* НЕПРАВИЛЬНО */

free (p);

Правильним буде зберегти те, що потрібно перед тим як звільнювати:

for (p = head; p! = NULL; p = q) {

q = p->next;

free (p);

}

Математичні функції

Існує більш ніж двадцять математичних функцій, оголошених в <math. h>; ось декілька з найчастіше використовуваних. Кожна з них візьме один або два аргументи типу double (подвійного) і повертає теж double.

sin (x) синус x, x в радіанах

cos (x) косинус x, x в радіанах

atan2 (y,x) арктангенс y/x, в радіанах

exp (x) показникова функція ex

log (x) натуральний логарифм x (x>0) (при основі e)

log10 (x) десятковий (звичайний) логарифм x (x>0)

pow (x,y) xy

sqrt (x) квадратний корінь x (x>0)

fabs (x) абсолютне значення x

Генератор випадкових чисел

Функція rand () обчислює послідовність псевдовипадкових цілих в діапазоні від нуля до RAND_MAX, означеного в <stdlib. h>. Одним з способів здобуття випадкових чисел з рухомою точкою більших або рівних нулю але менших одиниці, це

#define frand () ( (double) rand () / (RAND_MAX+1.0))

(Якщо ваша бібліотека передбачає функцію для випадкових чисел з рухомою точкою, вона ймовірніше матиме кращі статистичні властивості ніж навеведена вище.)

Розділ ІІ. Практична частина

Завдання 1. Лінійні програми

Скласти лінійну програму для обрахунку:

Аргумент x=2.456 вводиться з клавіатури.

Код програми:

#include <math. h>

#include <conio. h>

#include <stdio. h>

main ()

{float x,s,o,y;

const float R=4.21, g=3, a=11.6, Q=89.52,d=1;

scanf ("%f",&x);

o=x*g+a;

y=pow (6+a,1/3);

s=pow ( (d*d+log (y) - R*Q) *o/R,0.5);

printf ("\n s=%f", s);

getch ();

return 0; }

Результат:

Блок схема:

Завдання 2. Програми з розгалуженням

Скласти програму з розгалуженням для обрахунку:

a=1.62, b=-1.25

Значення аргументу x вводиться з клавіатури, або 1.62, або 1.41.

Код програми:

#include <math. h>

#include <conio. h>

#include <stdio. h>

#define A 1.62

// #define B - 1.25

main ()

{float x,y;

scanf ("%f",&x);

if (x==A)

{

y=exp (abs (x+A)) *sin (x);

printf ("\n y=%f x=%f\n",y,x);

}

else if (x>A&&x<pow (A,2))

{

y=pow ( ( (x-A) *cos (x)),2);

printf ("\n y=%f x=%f \n",y,x);

}

else printf ("Vvedene chuslo za mezhamu");

getch ();

return 0; }

Результат:

Блок схема:

Завдання 3. Циклічні програми з регулярною змінною аргументу

Скласти циклічну програму з регулярною змінною:

a=21.4, b=1.95

Початкове значення аргументу x 4.6, крок 1.5, кількість кроків 8.

Код програми:

#include <stdio. h>

#include <math. h>

#include <conio. h>

#define a 21.4

#define b 1.95

#define pi 3.14

main ()

{

float x,t;

for (x=4.6; x<16.6; x+=1.5)

{

t= (pi-pow (x,2)) *sin (sqrt (2.1*b+x*log (x)));

printf ("t=%f x=%f \n",t,x);

}

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 4-1. Циклічні програми з регулярною змінною аргументу, які містять розгалуження

Визначити найбільший спільний дільник (НСД) трьох введених з клавіатури цілих чисел або вивести повідомлення про його відсутність, якщо такий дільник дорівнює 1. Підказка: пошук НСД вести, починаючи від найменшого з введених чисел.

Код програми:

#include <stdio. h>

#include <conio. h>

int gcd (int i, int j)

{

while (i&&j)

{

if (i<j)

j%=i;

else

i%=j;

}

return i|j;

}

main ()

{

int a,b,c,D;

printf ("Enter a,b,c\n");

scanf ("%d%d%d",&a,&b,&c);

D=gcd (c, (gcd (a,b)));

if (D! =1)

printf ("Najbilshuj spilnuj dilnuk =%d\n",D);

else printf ("Nemae najbilshogo spilnogo dilnuka!!!");

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 4-2. Циклічні програми з регулярною змінною аргументу, які містять розгалуження

Обчислити значення функції

у набуває значення від 0 до 8 з кроком 0.15.

Код програми:

#include <math. h>

#include <conio. h>

#include <stdio. h>

main ()

{ float x,y,p; x=4.6;

for (y=0; y<=8; y=y+0.15)

{

if (y<0.6)

{x=y*y+y+1;

p=pow (x+exp (x-2),0.5);

printf ("p=%f y=%f \n",p,y); }

else if (y>=1)

{x=y-1;

p=pow (x+exp (x-2),0.5);

printf ("p=%f y=%f \n",p,y); }

else printf ("non difine p y=%f \n",y); }

getch ();

return 0; }

Результат:

Блок схема:

Завдання 5-1. Одновимірні масиви

З клавіатури ввести масив дійсних чисел (максимальна розмірність - 30 елементів). Циклічно зсунути його елементи на одну позицію ліворуч. Надрукувати отриманий масив. Підказка: циклічне зсування означає, що перший елемент масиву переходить на місце зсунутого останнього.

Код програми:

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

main ()

{ int i,j,kk,k,max,flag,n,R;

const int M=30;

int nat [M];

scanf ("%d\n",&n);

for (i=0; i<n; i++)

{

scanf ("%d\n",&nat [i]);

}

kk=nat [0];

for (i=0; i< (n-1); i++)

{

nat [i] =nat [i+1];

}

nat [n-1] =kk;

for (i=0; i<n; i++)

{

printf ("\n nat%d=%d", i,nat [i]);

}

getch ();

return 0; }

Результат:

Блок схема:

Завдання 5-2. Одновимірні масиви

Дано одновимірний масив Х, який складається з 12 елементів, обчислити

Результат обчислення вивести і вигляді масиву у.

Код програми:

#include <stdio. h>

#include <conio. h>

#include <math. h>

main ()

{

float i,x [12],y [12];

for (int k=0; k<12; k++)

{

scanf ("%f\n",&x [k]);

if ( (abs (x [k])) <0.1)

y [k] =x [k] - (1/3) *x [k] *x [k] *x [k];

else

y [k] =cos (3.14/2-x [k]);

}

for (int k=0; k<12; k++)

printf ("y [%d] =%f \n",k+1,y [k]);

getch ();

return 0; }

Результат:

Блок схема:

Завдання 6. Використання вказівників для роботи з масивами даних

З клавіатури ввести довге беззнакове ціле число. Утворити масив з цифр цього числа. Потім сформувати і надрукувати нове число з інверсним (зворотним) порядком цифр.

Код програми:

#include <stdio. h>

#include <conio. h>

#include <iostream. h>

main ()

{

int A [25];

int i,b,a;

cin>>a;

b=0;

while (a>0)

{

A [b] =a%10;

a/=10;

b++;

}

for (i=0; i<b; i++)

a=a*10+A [i];

printf ("\n a=%d",a);

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 7. Циклічні програми з накопиченням суми або добутку

Обчислити значення функції

Аргумент х змінюється від початкового значення 1.3 до кінцевого значення - 14.3 Кількість значень аргументу n=9; a=1.32. Код програми:

#include<stdio. h>

#include <math. h>

#include <conio. h>

#define n 9

#define a 1.32

main ()

{

float y,x,b,S,dx;

dx=13/9;

y=0;

for (x=1.3; x<=14.3; x+=dx)

y+= (pow (a+x,2)) / (1+pow (cos (x),2));

printf ("\n suma S=%f\n",y);

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 8. Вкладені цикли

Скласти програму використовуючи вкладені цикли.

Позначення індеса: i

Номери індекса: 1, 2, 3

Значення індексної змінної: 1.95, 0.87, 1.29

Функція:

Параметр циклу с, початкове значення 0.26, кінцеве 1.26, крок 0.2

Код програми:

#include <stdio. h>

#include <math. h>

#include <conio. h>

#define p 4.86

main ()

{

float b,c;

float a [3] ={1.95,0.87,1.29};

for (int i=0; i<3; i++)

{

printf ("\n a=%f\n",a [i]);

for (c=0.26; c<1.26; c+=0.2)

{

b= (a [i] * (p+1)) / (p*sin (c));

printf (" b=%f c=%f\n",b,c);

}

}

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 9. Двовимірні масиви, сортування масивів

Дано матрицю А розміром 4х5. Визначити кількість елементів в кожному рядку матриці А, модуль яких дорівнює порядковому номеру елемента в рядку. На друк вивести кількість таких елементів для кожного рядка.

Код програми:

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

main ()

{

int i,j,n,k;

int a [4] [5] ={{1, 0, 0, 0,0},

{1, 2, - 1, 22,3},

{1, 2, - 1, - 2,3},

{1, - 3, - 1, - 4,5}};

for (i=0; i<4; i++)

{

k=0;

for (j=0; j<5; j++)

if (abs (a [i] [j]) ==j+1)

k++;

printf ("Kilkist y riadky=%d\n",k);

}

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 10. Процедури-функції

Дано квадратну матрицю А розміром nxn. Скласти програму нормування матриці, поділивши всі елементи кожного рядка на максимальний елемент за модулем цього рядка. Пошук максимального елемента рядка оформити у вигляді процедури.

Код програми:

#include <stdio. h>

#include <conio. h>

#include <math. h>

#define n 4

float norm (float x,float y);

main ()

{

int i,j;

float max [n],A [n] [n] ={{4,-5,6,2},

{2,-2,3,4},

{-9,7,1,7},

{5,-5,-5,5}};

for (i=0; i<n; i++)

{

printf ("\n");

max [i] =fabs (A [i] [0]);

for (j=0; j<n; j++)

{

max [i] =norm (max [i],A [i] [j]);

printf (" %f ",A [i] [j]);

}

}

printf ("\n");

for (i=0; i<n; i++)

{

printf ("\n");

for (j=0; j<n; j++)

{

A [i] [j] = A [i] [j] / max [i];

printf (" %f ",A [i] [j]);

}

}

getch ();

return 0;

}

float norm (float x,float y)

{

if (x<fabs (y))

x=fabs (y);

return x;

}

Результат:

Блок схема:

Завдання 11. Підпрограми-функції

Скласти процедуру-функцію, яка обчислює значення х аргументу монотонної функції, при якому f (х) =0, згідно формули:

Очевидно:

Код програми:

#include <conio. h>

#include <stdio. h>

#include <math. h>

float argyment (float x,float a, float b, int i);

main ()

{

int i;

float a,b,X;

printf (" Vveditj a ta b \n");

scanf ("%f%f",&a,&b);

X= (b-a) /2;

for (i=2; i<5; i++)

{

X=argyment (X,a,b, i);

printf (" X=%f\n",X);

}

getch ();

return 0;

}

float argyment (float x,float a, float b, int i)

{

float n,sign;

if (x>0) sign=1;

else if (x==0) sign=0;

else if (x<0) sign=-1;

x=x-sign* ( (b-a) /pow (2, i));

return x;

}

Результат:

Блок схема:

Завдання 12-1. Опрацювання символьних рядків

Перевірити, чи введений з клавіатури символьний рядок є правильним записом беззнакового цілого числа у системі числення з основою 5 (з можливими символами пропуску перед числом і після нього). Якщо так, то визначити і надрукувати десяткове значення цього числа.

Код програми:

#include <stdio. h>

#include <math. h>

#include <conio. h>

#include <string. h>

main ()

{

clrscr ();

int n1,n2, i,x=0,k,m1,m2;

char text [150], text2 [150], slovo2 [40], prslovo [40];

gets (text);

k=strlen (text);

for (i=0; i<k; i++)

if (text [i] == ' ')

{

x++;

if (x==1) n1=i;

if (x==2) n2=i;

}

for (i=n1+1; i<n2; i++)

slovo2 [i- (n1+1)] =text [i];

x=0;

for (i=k; i>0; i--)

if (text [i] == ' ')

{

x++;

if (x==1) m2=i;

if (x==2) m1=i;

}

int c= (m2-m1) - (n2-n1);

for (i=m1+1; i<=m2; i++)

prslovo [i- (m1+1)] =text [i];

for (i=0; i<=n1; i++) // До першого пропуску

text2 [i] =text [i];

for (i=n1+1; i<n1+ (m2-m1); i++) // Вставка перед останнбого слова замість другого

text2 [i] =prslovo [i- (n1+1)];

for (i=n1+ (m2-m1); i<=m1+c; i++) // Після другого слова

text2 [i] =text [i-c];

for (i=m1+c+1; i<m2; i++) // Вставка другого замість перед останнього

text2 [i] =slovo2 [i- (m1+c+1)];

for (i=m2; i<k; i++) // Вставка останнього слова

text2 [i] =text [i];

for (i=0; i<k; i++) // Вивід переробленого речення

printf ("%c",text2 [i]);

getch ();

return 0; }

Результат:

Блок схема:

Завдання 12-2. Опрацювання символьних рядків

В заданому тексті знайти і вивести на друк цифри, які містяться в ньому, і їх кількість.

Код програми:

#include <stdio. h>

#include <stdio. h>

#include <conio. h>

main ()

{char *pStr;

char str [80];

int isNumber = 0,k=0;

gets (str);

pStr = str;

while (*pStr) {

if (*pStr >= '0' && *pStr <= '9') {

isNumber = 1;

k++;

printf ("%c", *pStr);

} else {

if (isNumber) {

isNumber = 0;

printf (" ");

}}

pStr++;

}

printf ("\nKilkistb cufr y danomy rechenni=%d",k);

getch ();

return 0; }

Результат:

Блок схема:

Завдання 13. Застосування бібліотечних функцій для роботи з символами та символьними рядками

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

Код програми:

#include <iostream. h>

#include <conio. h>

#include <stdio. h>

#include <string. h>

int main ()

{

char line [1024], *word [100], slovo [100];

int n=0,k=1,m=0;

cout<<"Enter rechennia: ";

gets (line);

cout<<"\nEnter slovo: ";

gets (slovo);

word [n] = strtok (line," ");

while (word [n])

{

if (! strcmp (word [n],slovo))

{

cout<<"Nomer zadanogo slova: "<<k;

m++;

}

word [++n] = strtok (NULL," ");

k++;

}

if (m==0) cout<<"Zadanogo slova nemae y rechenni!!!";

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 14. Багатовимірні масиви та масиви символьних рядків

Ввести послідовність символьних рядків, у кожному з яких записано прізвище, ім'я та по-батькові одного студента. Визначити і запам'ятати стать кожного. Потім скоротити рядки, залишивши тільки прізвище та ініціали. Надрукувати скорочений список, вказавши в дужках стать кожного студента.

Код програми:

#include <stdio. h>

#include <conio. h>

#include <iostream. h>

void FFF (char M []);

main ()

{

char A [100],B [100],C [100];

cout<<"Vvedu PIB persogo stydenta: ";

gets (A);

cout<<"Vvedu PIB drygogo stydenta: ";

gets (B);

cout<<"Vvedu PIB tretiogo stydenta: ";

gets (C);

cout<<"Skorochenuj spusok stydentiv: \n";

FFF (A);

FFF (B);

FFF (C);

getch ();

return 0;

}

void FFF (char M [])

{

int i,k,n=0,n1,n2;

char im [20], *st;

k=strlen (M);

for (i=0; i<k; i++)

if (M [i] ==' ')

{

n++;

if (n==1) n1=i+1;

if (n==2) n2=i;

}

for (i=n1; i<n2; i++)

im [i-n1] =M [i];

im [i-n1] ='\0';

if (im [i-n1-1] =='a') st="zh"; else st="ch";

for (i=0; i<=n1; i++)

{

cout<<M [i];

if (i==n1) cout<<". ";

}

cout<<M [n2+1] <<". "<<" ("<<st<<") \n";

}

Результат:

Блок схема:

Завдання 15. Файли

Сформувати файл А, що містить інформацію про кінострічки:

назва фільму;

рік випуску;

кіностудія;

режисер.

З файлу А вибрати і переписати у файл В інформацію про кінострічки, зняті кіностудією ім. Довженка у 198592 рр.

Код програми:

#include <conio. h>

#include <stdio. h>

#include <fstream. h>

struct kino

{

char name [50], studia [50], rejiser [50];

int rik;

};

main ()

{

int i;

kino A [3];

ofstream fileo ("A. txt");

for (int i = 0; i < 3; i++)

{

cout << "nazva filmu: ";

cin >> A [i]. name;

cout << "rik: ";

cin >> A [i]. rik;

cout << "studia: ";

cin >> A [i]. studia;

cout << "rejiser: ";

cin >> A [i]. rejiser;

fileo << A [i]. name << "\t"

<< A [i]. rik << "\t"

<< A [i]. studia << "\t"

<< A [i]. rejiser << "\n";

}

ifstream filei ("A. txt");

ofstream fielTwo ("B. txt");

for (int i = 0; i < 3; i++)

{

if (A [i]. rik>1985&&A [i]. rik<1992&& (! strcmp (A [i]. studia,"Dovzhenka")))

{

fielTwo << A [i]. name << "\t"

<< A [i]. rik << "\t"

<< A [i]. studia << "\t"

<< A [i]. rejiser << "\n";

}

}

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 16. Основи опрацювання структур

З клавіатури ввести послідовність адрес, кожна з яких задається структурою з полями: <Індекс>, <Місто>, <Вулиця>, <Будинок>. Відсортувати ведені дані за порядком зростання індексів та роздрукувати їх у формі таблиці. Визначити відсоток львівських адрес.

Код програми:

#include <conio. h>

#include <iostream. h>

#include <stdio. h>

#define n 3

struct adresa

{

char misto [30], vulycia [30];

int index, budynok;

};

main ()

{

adresa A [n],k;

int i,j;

float m=0,V=0;

for (i=0; i<3; i++)

{

cout<<"\n Vveditj misto: ";

cin>>A [i]. misto;

cout<<"Vulycu: ";

cin>>A [i]. vulycia;

cout<<"Index: ";

cin>>A [i]. index;

cout<<"Budynok: ";

cin>>A [i]. budynok;

}

for (i=0; i<3; i++)

for (j=i+1; j<3; j++)

if (A [i]. index>A [j]. index)

{

k=A [i];

A [i] =A [j];

A [j] =k;

}

cout<<"Index: \tMisto: \tVulycia: Budynok: \n";

for (i=0; i<3; i++)

{

if (! strcmp (A [i]. misto,"Lviv"))

m++;

cout<<A [i]. index<<"\t"<<A [i]. misto

<<"\t"<<A [i]. vulycia<<"\t"<<A [i]. budynok<<"\n";

}

if (m! =0) V= (m/n) *100;

cout<<"Vidsotok lvivskih adres: "<<V<<"%";

getch ();

return 0;

}

Результат:

Блок схема:

Завдання 17. Основи ООП. Принципи побудови класів

Створити клас з такими полями та методами:

СТУДЕНТ

поля:

ім'я - char*

курс - int

стать - int (bool)

методи:

зміна курсу

введення імені

введення статі

виведення інформації про об'єкт

Код програми:

#include <iostream. h>

#include <conio. h>

#include <string. h>

class Stydent

{

char name [25];

int k,st;

public:

Stydent ();

Stydent (char*, int, int);

Stydent (const Stydent&);

void SetName (char*);


Подобные документы

  • Базові типи змінних. Елементарний ввід-вивід. Умовні оператори та оператори множинного вибору. Основні функції вводу даних із клавіатури scanf, gets, getchar. Визначення основних (базових) типів даних. Вивід повідомлення при невірно заданому ключі.

    контрольная работа [74,6 K], добавлен 03.10.2010

  • Розробка програми для отримання відомостей про відвантаження готової продукції: програмування головного блоку та процедур вводу даних з первинних документів, їх виводу на дисплей, сортування записів вхідного файлу, підрахунку підсумків по коду утримання.

    курсовая работа [64,2 K], добавлен 23.04.2010

  • Призначення операцій * та &, які використовуються при роботі з вказівниками. Отримання адреси елемента в пам'яті та значення змінної за відомою адресою. Передавання масивів за допомогою вказівників та операндів. Програми з регулярною зміною аргументу.

    курсовая работа [859,7 K], добавлен 23.03.2014

  • Характеристика методів та етапів створення простих програм на мові програмування С++. Особливості структури та порядку запуску програми. Функції вводу і виводу та маніпулятори мови С++. Робота з одновимірними масивами. Символьна інформація та рядки.

    дипломная работа [91,2 K], добавлен 19.06.2010

  • Дослідження основних завдань та алгоритму роботи програм копіювання файлів: "COPY1.С" (функції роботи з file handles) та "COPY2.С" (функції потокового вводу-виводу). Повний розбір роботи обох кодів програм, їх тестування, модифікація та оптимізація.

    лабораторная работа [23,4 K], добавлен 04.04.2011

  • Створення програми для виконання найпростіших функцій календаря за допомогою Borland DELPHI 2007. Аналіз процесу обробки інформації і побудова функціональних діаграм. Розробка інтерфейсу користувача, форм вводу-виводу інформації, основних алгоритмів.

    курсовая работа [1,3 M], добавлен 01.06.2013

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

    курсовая работа [869,6 K], добавлен 15.02.2011

  • Практичне використання і вживання інструментів мови C для роботи із складними агрегатами даних. Загальний підхід до різних програмних об'єктів: масив і рядок. Використання вказівок при роботі з масивами і рядками. Розробка завдання і алгоритму програми.

    лабораторная работа [16,6 K], добавлен 15.02.2011

  • Прості та умовні оператори мови С++. Робота з двовимірними масивами. Пошук та сортування даних. Робота з файлами та з динамічними структурами даних. Опис мови програмування Delphi. Складення програми до розроблених алгоритмів. Організація циклів.

    отчет по практике [4,3 M], добавлен 28.08.2014

  • Розробка бази даних для автоматизації облікової інформації в системі управління базами даних Access з метою полегшення роботи з великими масивами даних, які існують на складах. Обґрунтування вибору системи управління. Алгоритм та лістинг програми.

    курсовая работа [550,9 K], добавлен 04.12.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.