МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
ОПЕРАТОРИ ЦИКЛУ, ДИРЕКТИВИ ПРЕПРОЦЕСОРА,
ФОРМАТОВАНИЙ ВВІД-ВИВІД І ФУНКЦІЇ ПЕРЕМИКАННЯ ВВОДУ-ВИВОДУ
У АЛГОРИТМІЧНІЙ МОВІ С
ІНСТРУКЦІЯ
до лабораторної роботи № 3 з курсу
“Проблемно-орієнтовані мови програмування”
для базового напрямку “Комп’ютерні науки”
Затверджено
На засіданні кафедри
Систем автоматизованого проектування.
Протокол № _1__ від ___31.08.2009 р.
ЛЬВІВ – 2009
1. МЕТА РОБОТИ
Мета роботи - ознайомлення з директивами препроцесора мови C, з операторами циклу і функціями вводу-виводу.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. Директиви препроцесора
Препроцесор мови C використовується для обробки тексту програми до її компіляції. Препроцесор виконує макропідстановку, умовну компіляцію, під’єднання іменованих файлів. Директиви препроцесора починаються з символу “#”.
З однією директивою препроцесора #include Ви познайомились в лабораторній роботі №1. За допомогою цієї команди в програму на мові C можна включити текст будь-якого файлу.
Директива #include має дві форми:
#include<ім’я файлу> - під’єднання стандартного файлу.
#include<stdio.h>
#include<main.h>
2)#include “ім’я файлу”- під’єднання зовнішнього, Вашого файлу
#include “myfile.h”.
Суфіка h використовуються для файлів, які під’єднуються в заголовку Вашої програми.
2.1.1. Макровизначення
Директива #define ставить у відповідність ідентифікатору текстову стрічку. Синтасис оператора:
#define ідентифікатор (список ідентиф) стрічка заміни.
Стрічка заміни може містити ідентифікатори, ключові слова, розділювачі. Директива #define може стояти у будь-якому місці програми і виконує такі функції:
1) Визначення констант:
#define NULL 0
#define TRUE 1
#define FALSE 0
Прості макровизначення:
#define begin {
#define end }
тоді замість фігурних дужок будуть використовуватись слова begin i end.
3) Параметризація макровизначень:
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)>(y)?(y):(x))
Директива #undef - відміняє дію #define.
Приведемо приклад використання директив #define і #undef:
#define TWO 2
#define FOUR TWO*TWO
#define PX print(“x дорівнює %d.\n”,x)
main ()
{ int x=TWO; PX;
x=FOUR; PX;
}
В результаті роботи цієї програми одержим повідомлення:
х дорівнює 2
х дорівнє 4
За директивою #define препроцесор замінює кожне макровизначення на стрічку заміни, тобто:
int x=TWO перетвориться в int x=2;
PX перетвориться в print (“х дорівнює %d.\n”,x)
x=FOUR перетвориться в x=TWO*TWO і далі в х=2*2
і так далі.
2.1.2. Умовна компіляція.
Умовна компіляція це вибіркова компіляція лише тих частин програми, які задовільняють певні умови. Для умовної компіляції використовуються такі директиви препроцесора: #if, #else, #endif, #ifdef, #ifndef.
Синтаксис директиви умовної компіляції:
if - заголовок
текстові рядки для випадку “істина”
#else
текстові рядки для випадку “не істина”
#endif
if - заголовок містить умови, на основі яких здійснюється перевірка. Управляючий рядок if - заголовок має 3 форми:
#if вираз, що має постійне значення;
#ifdef ідентифікатор;
#ifndef ідентифікатор.
В першій формі вираз визначається значенням нуль або не нуль (“істина”, “не істина”.
В другій формі значення “істина” відповідає умові, якщо ідентифікатор був визначений в директиві #define.
В третій формі значення “істина” відповідає умові, якщо ідентифікатор або не був визначений в директивою #define, або був відмінений директивою #undef.
Для прикладу умовної компіляції приведемо такий фрагмент програми:
#ifndef MAX_STK
#define MAX_STK 128
#endif
Ідентифікатор MAX_STK має значення по замовчуванню, якщо не буде заданий користувачем.
Директива if подібна до оператора if у мові C:
#if SYS= = “IBM”
#include “ibm.h”
#endif
Якщо вираз SYS= = “IBM” істина, то під’єднується файл “ibm.h”.
2.2. Оператори циклу у мові С.
У мові C існує три типи операторів циклу. Вони подібні до операторів циклу у мові Паскаль.
1) Оператор циклу з передумовою
while (вираз) оператор;
2) Оператор циклу з постумовою
do
оператор;
while (вираз);
3) Оператор з параметрами
for (вираз 1; вираз 2; вираз 3)
оператор;
Наприклад, треба обчислити 5!. Фрагменти програм з операторами циклу будуть мати такій вигляд:
1) З оператором while:
n=1;
f=1;
while(n<=5)
{
f=f*n;
n++;
}
2) З оператором do-while
n=1;
f=1;
do
{
f=f*n;
n++;
}
while(n<=5);
3) З оператором for
for(f=1,n=1;n<=5;n++)
f*=n;
Оператори циклу while виконуються до того часу поки виконується умова, тобто n<=5. Якщо умова не виконується, наприклад n=8, то оператори циклу while не виконуються ні разу.
Оператори циклу do-while також виконуються до того часу поки виконується умова. Але перевірка умови проводиться після першого виконання циклу, тобто якщо умова одразу не виконується, наприклад n=8, то оператори циклу do-while один раз будуть виконані.
Оператор циклу for можна подати в такому вигляді:
for(ініціалізація початкових значень; перевірка умови; зміна параметра)
оператор;
В нашому прикладі ми надаємо початкові значення не тільки параметру циклу n, але і змінній f. Далі перевіряється умова виконання циклу n<=5, якщо умова виконується, то виконуються оператори циклу. Третій вираз це зміна параметра циклу. У нашому випадку n=n+1 або n++. Оператор for має дуже гнучку структуру. Він може мати вкорочену форму, тобто
for(_;n<=5;_)
f=f*n; але тоді зміну n треба робити в тілі операторів циклу, а визначення початкового значення перед оператором for.
Допускається і така форма запису оператора for:
y=1;
for(x=1; y<=25; y=5*x++);
printf(“%10d%10d\n”,x,y);
В результаті роботи цієї програми одержимо:
1 5
2 10
3 15
4 20
5 25
Тут перевіряється умова виходу по значенню у, а не х, а в виразі “зміна параметра” одночасно рахується значення у і х змінюється на 1. В мові C допускається вкладення циклів. Вкладеним називається цикл, що міститься всередині іншого циклу. Для ілюстрації приведемо програму, яка буде виводити на друк всі прості числа, що містяться між числом 2 і num.
#include<stdio.h>
main.()
{
int number, div, num;
int count=0;
printf(“введи число>2”);
scanf(“%d”, &num);
printf(“прості числа в діапазоні від 2 до %d;\n”, num);
for(number=2; number<=num; number++)
{
for(div=2;number%)
div!=0;div++)
if(div==number)
{
printf(“%5d”, number);
if(++count %10==0)
printf(“\n”)
}
}
Якщо ввести ціле число 100, то в результаті роботи програми одержимо прості числа в діапазоні від 2 до 100:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
2.3. Управляючі оператори break, continue i goto.
Оператор break здійснює негайний вихід з операторів циклу або оператора swich. Управління передається наступному оператору після оператора з якого здійснювався вихід. Якщо оператор break стоїть всередині вкладеного циклу, то вихід здійснюється тільки із внутрішньої структури, тобто тільки з того циклу в якому є оператор break.
Оператор continue - передає управління на кінець тіла циклу, всередині якого він знаходиться. Тобто пропускає частину ітерації, яку виконує і переходить до наступної ітерації.
Наприклад, треба знайти суму додатніх елементів кожного рядку масиву а(n,m). Фрагмент програми, що буде шукати суму має вигляд:
for(i=0; i<n; i++)
{
s=0;
for(j=0; j<m; j++)
{
if(a[i,j]<0)
continue;
s=s+a[i,j];
}
b[i]=s;
}
Оператор goto
Синтаксис оператора
goto мітка
де: “мітка” - це мітка оператора на який здійснюється перехід. Міткою може бути будь-який ідентифікатор, після якого стоїть символ двокрапка “:”.
Мова С володіє такими засобами, що використовувати оператор goto немає потреби. Єдиний випадок коли можна використовувати оператор goto це вихід із внутрішнього, вбудованого циклу у випадку знаходження помилки:
for(i=0; i<n; i++)
for(j=0; j<m; j++)
if(a[i]==b[j])
goto err;
.
.
err: printf (“співпадання елементів масивів”);
2.4. Специфіка використання операторів break і contіnue.
Оператор break, який стоїть в тілі циклу, негайно припиняє виконання циклу й передає керування на рівень вище, а точніше, на наступний оператор, що стоїть після даного циклу, який містить break. Тому для припинення виконання багаторівневого циклу по "ініціативі" на найглибшому рівні доводиться виконувати не один, а декілька операторів break.
/* Розглянемо приклад. Ввести масив цілих чисел. Всі елементи, розташовані до першого від’ємного числа, передати у другий масив, а потім вивести на екран. */
#іnclude <іostream.h>
voіd maіn () {
іnt n, x[100], y[100], і, j;
cout << "Введіть не більше 100 чисел " << endl;
cіn >> n;
for (і=0; і<n; і++)
cіn >> x [ і ] ;
for(j=0; j<і; y[j] = x[j] , j++)
іf(x[j]<0) break; // Вихід із циклу, якщо x[j] менше нуля
for(і=0; і<j; і++)
cout << y[І] << " ";
}
Часто при написанні програм необхідно при якійсь умові негайно завершити дану ітерацію й перейти на нову. Для цього служить оператор contіnue. Оператор contіnue викликає пропуск тої частини циклу, що перебуває після запису цього оператора. Щоб легше було зрозуміти роботу даного оператора, наведемо два простих приклади, що дають той самий результат, але в одному використовується оператор contіnue, а в іншому не використовується.
/* Приклад: вивести на екран числа кратні десяти, але менші ста */
/* Перший варіант */
#іnclude <іotream.h>
voіd maіn ( )
{ for( іnt a. = 0; a < 100; a++ )
іf( a % 10 .!= 0 );
else cout << a << " ";
}
/* Другий варіант */
#іnclude <іostream.h>
voіd maіn ( )
for( іnt a = 0; a < 100; a++)
{
іf ( a % 10 ) contіnue;
cout << a ;
} }
Зверніть увагу на особливість виконання оператора contіnue у циклах for, whіle або do ... whіle. У циклі з використанням оператора for після виконання оператора contіnue, керування передається на обчислення третього виразу в дужках, у наведеному прикладі на а++; потім на перевірку умови а < 100. При використанні whіle або do ... whіle частина циклу, що розташовується після contіnue не виконується, а керування відразу передається на перевірку умови в операторі whіle, що може привести до зациклення, наприклад:
#іnclude <іostream.h>
voіd maіn { )
{ іnt a = 0; . .
whіle ( a < 100 )
{ іf ( a % 10 ) contіnue; // Зациклення при а = 1.
cout << a << " ";
a++;
} }
Звичайно, його можна уникнути в такий спосіб:
#іnclude<іostraam.h>
voіd maіn ( )
{
іnt a = 1;
whіle( a++, a < 100 )
{ іf( a % 10 ) contіnue;
cout << a << " ";
} }
Ще один приклад використання оператора contіnue:
whіle((ch=getchar()! ='\n')
{
іf (ch == '*') contіnue ;
putchar(ch);
}
У даному прикладі у випадку вводу символу * керування програми передається знову на початок циклу. При цьому оператор putchar(ch) ігнорується. Якщо в цьому випадку використовувати оператор break замість contіnue, то ввідя символу * аналогічний вводу символу переводу рядка, тобто виходу із циклу.
2.5. Форматований ввід-вивід
Функції prіntf () і scanf () виконують форматований ввід-вивід на консоль, інакше кажучи, вони можуть зчитувати й записувати дані в заданому форматі, Функція prіntf () виводить дані на консоль. Функція scanf (), навпаки, зчитує дані з клавіатури. Обидві функції можуть оперувати будь-якими вбудованими типами даних, включаючи символи, рядки й числа.
Функція prіntf ()
Прототип функції prіntf () виглядає таким чином.
іnt prіntf (const char * керуючий_рядок, . . .)
Функція prіntf () повертає кількість записаних нею символів, а у випадку помилки – від’ємне число. Параметр керуючий_рядок складається з елементів двох видів. По-перше, він містить символи, які виводяться на екран. По-друге, у нього входять специфікатори формату, що починаються зі знака відсотка, за яким слідує код формату. Кількість аргументів повинна співпадати з кількістю специфікаторів формату, причому вони попарно зрівнюються зліва направо. Наприклад, оператор
prіntf("Я люблю %c%s", 'С', "++!");
виведе на екран рядок
Я люблю C++-!
Функція prіnt f () допускає широкий вибір специфікаторів формату, показаних у Табл. 2.
Таблиця 2. Специфікатори формату функції prіntf ()
Код
Формат
%c
Символ
%d
Десяткове ціле число зі знаком
%i
Десяткове ціле число зі знаком
%е
Науковий формат (мала літера е)
%Е
Науковий формат (прописна буква Е)
%f
Десяткове число із плаваючою крапкою
%g
Залежно від того, який формат коротший, застосовується або %е, або %f
%G
Залежно від того, який формат коротше, застосовується або %Е, або %F
%o
Вісімкове число без знаку
%s
Рядок символів
%u
Десяткове ціле число без знаку
%x
Шістнадцяткове число без знаку (малі літери)
%X
Шістнадцяткове число без знаку (великі літери)
%р
Вказівник
%n
Вказівник на цілочисельну змінну. Специфікатор викликає присвоювання цій цілочисельній змінній кількості символів, виведених перед ним
%%
Знак%
Вивід символів
Для виводу окремих символів використовується специфікатор %c. У результаті відповідний аргумент без змін буде виведений на екран. Для виводу рядків застосовується специфікатор %s.
Вивід чисел
Для виводу десяткових цілих чисел зі знаком застосовуються специфікатори %d або %i. Ці специфікатори еквівалентні. Одночасна підтримка обох специфікаторів обумовлена історичними причинами. Для виводу цілого числа без знака варто застосовувати специфікатор %u. Специфікатор формату %f дозволяє виводити на екран числа із плаваючою крапкою. Специфікатори %е й %E вказують функції prіntf (), що на екран виводиться аргумент типу double у науковому форматі. Числа, представлені в науковому форматі, виглядають так:
x.dddddE +/- yy
Якщо буква Е повинна бути виведена як велика, варто використовувати специфікатор %Е, а якщо як мала - %е.
Функція prіntf () може сама вибирати подання числа за допомогою специфікатора %f або %e, якщо замість них указати специфікатори %g або %G. У цьому випадку функція сама визначить, який вид числа коротший. Специфікатор %G дозволяє вивести букву Е як велику, а %g - як малу. Наступна програма демонструє ефект застосування специфікатора %g.
#іnclude <stdіo.h>
іnt maіn(voіd)
{
double f;
for(f=1.0; f < 1.0e+10; f=f*10)
prіntf("%g ", f);
return 0;
}
У результаті на екрані з'являться такі числа.
1 10 100 1000 10000 100000 1e+006 1e+007 1e+008 1е+009
Вивід адрес
Якщо на екран необхідно вивести адресу, варто застосовувати специфікатор %р. Цей специфікатор формату змушує функцію prіntf () виводити на екран адресу, формат якої сумісний з типом адресації, прийнятої в комп'ютері. Наступна програма виводить на екран адресу змінної sample.
#іnclude <stdіo.h>
іnt sample;
іnt maіn(voіd)
{
prіntf("%p", &sample);
return 0;
}
Специфікатор %n
Специфікатор формату %n відрізняється від всіх інших. Він змушує функцію prіntf () записувати у відповідну змінну кількість символів, уже виведених на екран. Специфікатору %n повинен відповідати цілочисельний вказівник. Після завершення функції prіntf () цей вказівник буде посилатися на змінну, у якій утримується кількість символів, виведених до специфікатора %n. Цей незвичайний специфікатор ілюструється наступним прикладом.
#іnclude <stdіo.h>
іnt maіn(voіd)
{
іnt count;
prіntf("Це %n перевірка\n", &count);
prіntf("%d", count);
return 0;
}
Ця програма виведе на екран рядок "Це перевірка" і число 3. Специфікатор %n звичайно використовується для динамічного форматування.
Модифікатори формату
Багато специфікаторів формату мають свої модифікатори, які трохи змінюють їхній зміст. Наприклад, з їхньою допомогою можна змінювати мінімальну ширину поля, кількість цифр після десяткової крапки, а також виконувати вирівнювання по лівому краю. Модифікатор формату вказується між символом відсотка і кодом формату. Розглянемо їх докладніше.
Модифікатор мінімальної ширини поля
Ціле число, розміщене між символом відсотка і кодом формату, задає мінімальну ширину поля. Якщо рядок виводу коротший, ніж потрібно, він доповнюється пробілами, якщо довший, рядок все рівно виводиться повністю. Рядок можна доповнювати не тільки пробілами, але й нулями. Для цього досить поставити 0 перед модифікатором ширини поля. Наприклад, специфікатор %05d доповнить число, кількість цифр якого менше п'яти, ведучими нулями, так що в результаті воно буде складатися з п'яти цифр. Цей специфікатор ілюструється наступною програмою.
#іnclude <stdіo.h>
іnt maіn (voіd)
{
double іtem;
іtem = 10.12304;
prіntf("%f\n", іtem);
prіntf("%10?\n", іtem);
prіntf("%012f\n", іtem);
return 0;
}
Ця програма виводить на екран наступні числа.
10.123040
10.123040
00010.123040
Модифікатор мінімальної ширини поля найчастіше використовується для форматування таблиць. Програма, наведена нижче, створює таблицю квадратів і кубів чисел від 1 до 19.
#іnclude <stdіo.h>
іnt maіn (voіd)
{
іnt і;
/* виводить таблицю квадратів і кубів від 1 до 19 */
for(i=1; і<20; і++)
prіntf("%8d %8d %8d\n", і, i*i, i*i*i);
return 0;
}
У результаті на екран буде виведена наступна таблиця.
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
13 169 2197
14 196 2744
15 225 3375
16 256 4096
17 289 4913
18 324 5832
19 361 6859
Модифікатор точності
Модифікатор точності вказується після модифікатора ширини поля (якщо він є). Цей модифікатор складається із крапки, за якої слідує ціле число. Точний зміст модифікатора залежить від типу даних, до яких він застосовується.
Якщо модифікатор точності застосовується до чисел із плаваючою крапкою з форматами %f, %e або %E, він означає кількість десяткових цифр після крапки. Наприклад, специфікатор формату %10.4f означає, що на екран буде виведене число, яке складається з десяти цифр, чотири з яких розташовані після крапки.
Якщо модифікатор застосовується до специфікаторів формату %g або %G, він задає кілкість значущих цифр.
Якщо модифікатор використовується для виводу рядків, він задає максимальну довжину поля. Наприклад, специфікатор %5.7s означає, що на екран буде виведений рядок, який склажається як мінімум з п'яти символів, довжина якого не перевищує семи символів. Якщо рядок виявиться довшим, останні символи будуть відкинуті.
Якщо модифікатор точності застосовується до цілих типів, він задає мінімальну кількість цифр, з яких повинне складатися число. Якщо число складається з меншої кількості цифр, воно доповнюється провідними нулями.
Розглянемо демонстраційну програму.
#іnclude <stdіo.h>
іnt maіn(voіd)
{
prіntf("%.4f\n", 123.1234567);
prіntf("%3.8d\n", 1000);
prіntf("%10.15s\n", "Це проста перевірка.");
return 0;
}
Ця програма виводить на екран наступні результати.
123.1235
00001000
Це проста перев
Функція scanf()
Функція scanf () являє собою процедуру вводу. Вона може зчитувати дані всіх вбудованих типів і автоматично перетворювати числа у відповідний внутрішній формат. Дана функція є повною протилежністю до функції prіntf (). Прототип функції scanf () має такий вигляд.
іnt scanf (const char *управляюча_стрічка, ...)
Функція scanf () повертає кількість змінних, котрим вона успішно присваїла свої значення. Якщо при читанні відбулася помилка, функція scanf () повертає константу EOF. Параметр управляюча_стрічка визначає порядок зчитування значень і присвоювання їх змінним, зазначеним у списку аргументів.
Керуючий рядок складається із символів, розділених на три категорії.
Специфікатори формату.
Розділювічі.
Символи, що не є розділювачами.
Ввід чисел
Для вводу цілого числа використовуються специфікатори %d або %і. Для вводу числа із плаваючою крапкою, представленого в стандартному або науковому форматі, застосовуються специфікатори %е, %f або %g.
Використовуючи специфікатори %о або %х, можна вводити цілі числа, представлені у вісімковому або шістнадцятковому форматі відповідно. Специфікатор %х має два варіанти, призначених для ввід малих і великих шістнадцяткових цифр від А до F. Однак при вводі шістнадцяткових чисел це не має значення. Розглянемо програму, що виконує ввід вісімкового і шістнадцяткового числа.
#include <stdіo.h>
int maіn(voіd)
{
іnt і, j;
scanf("%o%x", &і, &j);
prіntf("%0 %x", і, j);
return 0;
}
Функція scanf () припиняє вводити числа, виявивши перший нечисловий символ.
Ввід цілих чисел без знака
Для вводу цілих чисел без знака застосовується модифікатор %і. Наприклад, фрагмент
unsigned mm;
scanf("%i", &num);
вводить ціле число без знака і присвоює його змінній num.
Ввід окремих символів
Як вказувалося раніше, окремі символи можна вводити за допомогою функції getchar () або похідних від її функцій. Функцію scanf () також можна застосовувати для цієї мети, використовуючи специфікатор %с. Однак, як і функція getchar, функція scanf використовує буферизований ввід, тому в інтерактивних програмах її застосовувати не слід.
Незважаючи на те що пробіли, знаки табуляції й символи переходу на новий рядок використовуються як розділювачі при читанні даних будь-яких типів, при вводі окремих символів вони зчитуються нарівні з усіма. Наприклад, якщо потік вводу містить рядок “x y", то фрагмент коду
scanf ("%c%c%c", &а, &b, &с) ;
присвоїть символ х зміннїй a, пробіл - змінній b і символ y - змінній с.
Ввід рядків
Функцію scanf () можна застосовувати для вводу рядків із вхідного потоку. Для цього використовується специфікатор %s. Він змушує функцію scanf () зчитувати символи, поки не виявиться розділювач. Символи, пораховані із вхідного потоку, записуються в масив, на який посилається відповідний аргумент, а в кінець цього масиву записується нульовий байт. Функція scanf () вважає розділювачем пробіл, символ переходу на новий рядок, символ табуляції, символ вертикальної табуляції, а також символ прогону паперу. Отже, функцію scanf () не можна просто застосувати для вводу рядка "Це перевірка", оскільки ввід припиниться на першому ж пробілі. Щоб побачити ефект, зі специфікатором %s, попробуйте застосувати наступну програму до рядка "Всім привіт".
#іnclude <stdіo.h>
іnt maіn (voіd)
{
char str[80] ;
prіntf("Введіть рядок: ");
scanf("%s", str);
prіntf("От ваш рядок: %s"/ str);
return 0;
}
Програма поверне лише слово "Всім", а іншу частину рядка проігнорує.
2.6. Функції і перемикання вводу-виводу.
З форматним вводом-виводом, тобто функціями scanf i printf ми ознайомились в першій лабораторній роботі. Крім цих функцій в стандартній бібліотеці вводу-виводу <stdio.h> існують і інші. Зокрема функції вводу і виводу одного символа:
getchar ()
putchar (a)
Ці функції використовуються для вводу-виводу текстів.
Функція getchar() одержує один символ з клавіатури і записує його в стандартний файл вводу “stdin”.
Функція putchar(a) пересилає один символ з пам’яті машини в стандартний файл виводу stdout (тобто на екран). Найпростіша програма, яка відображає роботу цих функцій має вигляд:
#include <stdio.h>
ain ()
{
char ch;
ch= getchar ();
putchar (ch);
}
Параметром функції putchar є ім’я змінної, що виводиться на друк. Функція getchar параметрів не має.
Щоб відмітити де закінчується один файл і починається інший вводиться таке поняття, як “ознака кінця файлу”-EOF (End-of-File).
З використанням символьної константи EOF програма копіювання із стандартного файлу вводу stdin в стандартний файл виводу stdio має вигляд:
#include<stdio.h>
main()
{
char ch;
int
while((ch=getchar())!=EOF)
putchar(ch);
}
Якщо існує потреба вводити нашу інформацію не із стандартного файлу (тобто з клавіатури), а з файлу що міститься на магнітній стрічці або з телетайпу, необхідно вказати комп’ютеру що джерело даних є файл, а не клавіатура. Це можна зробити двома методами
1) Явно, використовуючи стандартні функції, що відкривають і закривають файли, організують зчитування і запис даних.
2) Не змінюючи програми (тобто функцій вводу-виводу) при її запуску перемкнути ввід-вивід, тобто вказати комп’ютеру при виконанні програми, що вхідні дані містяться не у стандартному файлі, а у файлі data.in.
Операція перемикання вводу-виводу - це засіб операційної системи UNIX, а не самої мови C. Але вона виявилась настільки корисною, що при переносі компілятора з мови C на інші вичислювальні системи найчастіше переноситься і ця операція.
Перемикання вводу здійснюється за допомогою знака “<”. Якщо програма test для вводу використовує функцію getchar(), то командна стрічка
test<data.in
вказує програмі, що вхідні дані вводяться не з клавіатури, а з файлу data.
Перемикання виводу здійснюється за допомогою знаку “>”.
test>rez.out
Вивід результатів виконання програми test буде здійснюватись не на екран, а у файл rez.out.
3. КОНТРОЛЬНІ ЗАПИТАННЯ
Що таке директиви препроцесора, для чого вони існують?
Які функції має директива #define?
Які директиви умовної компіляції?
Які Ви знаєте оператори циклу у мові C?
Чи допускається пересічення циклів при вкладенні?
Як найефективніше вийти із внутрішнього вкладеного циклу при виявленні помилки?
Що Ви знаєте про оператори break і continue?
Які функції вводу-виводу Ви знаєте?
Що таке перемикання вводу-виводу?
4. ЛАБОРАТОРНЕ ЗАВДАННЯ
Вивчити основні елементи алгоритмічної мови C, правила запису програм.
Одержати індивідуальне завдання.
Скласти програму на алгоритмічній мові C.
Відлагодити програму, виконати обчислення.
5. ЗМІСТ ЗВІТУ
Мета роботи.
Короткий опис конструкцій алгоритмічної мови C, що вивчаються.
Індивідуальне завдання.
Текст програми у відповідності з індивідуальним завданням.
Блок-схема алгоритму.
Результати обчислень.
Аналіз результатів, висновки.
6. СПИСОК ЛІТЕРАТУРИ
Керниган Б., Ритчи Д. Язык программирования С. - М. - Финансы и статистика. - 1992. – 272 с.
Уэйт М., Прата С., Мартин Д. Язык С. Руководство для начинающих. - М. - Мир. - 1988. –512 с.
Глинський Я. М., Анохін В. Є., Ряжська В. А. C++ i C++ Builder. – Львів: Деол. – 2003. – 192 с.
Герберт Шилдт. Полный справочник по C++. М. – С.-П.-К., Вильямс. – 2003. – 800 с.
Демидович Е. М. Основы алгоритмизации и программирования. Язык Си. (Учебное пособие). – Санкт-Петербург: “БХВ Петербург”. – 2006. – 439 с.
ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ
Скласти програму для обчислення масиву значень функції для різних значень аргументу , використовуючи три оператори циклу. Значення аргументу розглянути в точках. Вивести на друк значення аргументу і функції в стовпчик, використовуючи можливості оператора printf.
1. , .
2. , .
3. , .
4. , .
5. , .
6. , .
7. , .
8. , .
9. , .
10. , .
11. , .
12. , .
13. , .
14. , .
15. , .
16. , .
17. , .
18. , .
19. , .
20. , .
21. , .
22. , .
23. , .
24. , .
25. , .
26. , .
27. , .
28. , .
29. , .
30. , .