Символ
|
Вводимі
дані
|
Тип
аргументу
|
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>() /* простий
калькулятор */
{sum, v;= 0;(scanf ("%lf", &v) ==
1)("\t%.2f\n", sum += v);0;
}
Скажімо, ми хочемо прочитати рядки вводу, які містять
дату у формі
Dec 1988
Твердження зі scanf у такому разі становитимеday,
year;monthname [20];("%d %s %d", &day, monthname, &year);
Знак & не використовується зі змінною, що
зберігає назву місяця monthname, оскільки назва масиву і так є покажчиком. Буквальні
знаки також можуть з'являтися в ланцюжку формату scanf; вони повинні співпасти
з такими самими знаками у вводі. Тож ми могли би читати дати, що мають форму
мм/дд/рр за допомогою виразу зі scanf:
day, month, year;("%d/%d/%d",
&month, &day, &year);
ігнорує пробіли і табуляцію в ланцюжкові формату.
Більше того, вона пропускає пропуски і пробіли (пробіли, табуляцію, нові рядки
тощо), розглядаючи ввід. Для прочитання вводу, чий формат не є сталим, кращим
буде читати по одному рядкові за раз, після чого розбити його на окремі частини
за допомогою scanf. Наприклад, скажімо ми хотіли би прочитати рядки, які можуть
включати дату в одній з, наведених вище, форм. В такому разі ми могли би
написати
(getline (line, sizeof (line)) > 0) {(sscanf
(line, "%d %s %d", &day, monthname, &year) == 3)("valid:
%s\n", line); /* форма 25 Dec 1988 */if (sscanf (line,
"%d/%d/%d", &month, &day, &year) == 3)("valid:
%s\n", line); /* форма мм/дд/рр */("invalid: %s\n", line); /*
недійсна форма */
}
Виклики scanf можна змішувати з викликами інших
функцій вводу. Наступний виклик будь-якої ввідної функції почнеться з
прочитання першого знака, не прочитаного scanf.
Останнє попередження: аргументи scanf і sscanf
повинні бу покажчиками. Найчастішою помилкою є написання
("%d", n);
замість("%d", &n);
Цю помилку, як правило, не буде виявлено під час
компіляції.
Приклади, з якими ми досі стикалися, усі читали
стандартний ввід і записували до стандартного виводу, які автоматично
визначаються для програми операційною системою.
Наступним кроком буде написати програму, яка
матиме доступ до файла. Одна з програм, що демонструє необхідність таких
операцій, це cat, яка зчеплює набір вказаних їй файлів, виводячи їх на
стандартний пристрій виводу. cat використовується для видруку файлів на екрані
і як збирач вводу загального призначення для програм, які не мають можливості
доступу до файлів за іменем. Наприклад, команда
x. c y. c
виводить вміст файлів x. c та y. c (і нічого
більше) на стандартний пристрій виводу. Питання в тому, як забезпечити
прочитання даних файлів, тобто, як під'єднати зовнішні назви, про які думає
користувач, до твердження, яке читатиме дані.
Правила - прості. Перед тим як його можна
прочитати або здійснити до нього запис, файл потрібно відкрити за допомогою
бібліотечної функції fopen. fopen візьме зовнішні назви, такі як x. c або y. c,
здійснить певні службові дії і переговори з операційною системою (деталі яких
не повинні нас хвилювати), і повертає покажчик, який використовуватиметься в
наступних читаннях і записах до файла.
Цей покажчик, який називається покажчиком файла,
вказує на структуру, яка містить інформацію про файл, таку як місцеперебування
буфера, поточне положення знака в буфері, чи файл читається, чи до нього йде
запис, і, чи мали місце помилки або вказівник кінця файла. Користувачі не
повинні знати подробиць, оскільки визначення, що знаходяться в <stdio. h>
включають оголошення структури під назвою FILE. Єдине, що потрібно знати, це
оголошення покажчика файла, яке спрощено виглядає як
*fp;*fopen (char *name, char *mode);
Це означає, що fp є покажчиком на (структуру
типу) FILE і fopen повертає покажчик на FILE. Замітьте, що FILE, це назва типу,
така сама як int, а не мітка структури; її означено за допомогою typedef.
(Деталі щодо того як можна втілити fopen на UNIX надано в Розділі 8.5.) Виклик
fopen у програмі має вигляд
= fopen (name, mode);
Першим аргументом fopen є символьний ланцюжок, що
містить назву файла. Другий аргумент - це режим, також символьний ланцюжок,
який вказує на те, як буде використовуватись файл. Допустимими режимами можуть
бути режим читання ("r" - read), запису ("w" - write) і
долучення ("a" - append). Деякі системи розрізняють текстові і
бінарні файли, для останніх потрібно додати "b" (binary) до літери
режиму.
Якщо файл, якого не існує, відкрито для запису
або додання, його буде створено, якщо це можливо. Відкриття наявного файла для
запису спричинить звільнення старого змісту, тоді як відкриття для дозапису
(доточення) - збереже старий зміст. Спроба прочитання файла, якого не існує,
викличе помилку; існують також інші причини помилок, як скажімо спроба
прочитати файл, на який ви не маєте дозволу. Якщо сталася якась помилка, fopen
повертає NULL. Наступний крок - мати спосіб читання або запису до файла після
того, як його відкрито. getc повертає наступний знак з файла; вона вимагає
покажчика на файл, щоб знати, який саме файл.
getc (FILE *fp)
повертає наступний знак з потоку, на який вказує
fp; вона повертає EOF у випадку кінця файла або помилки.- це функція виводу:
putc (int c, FILE *fp)
запише символ з c до файла fp і поверне записаний
знак або EOF у випадку помилки. Так само як getchar і putchar, getc із putc
можуть бути макросами, а не функціями. Під час запуску C-програми, середовище
операційної системи бере на себе завдання відкриття трьох файлів і надання
покажчиків до них. Ці файли - це стандартний ввід, стандартний вивід і
стандартна помилка; відповідні їм покажчики називаються stdin, stdout і stderr,
і оголошено в <stdio. h>. За звичайних обставин, stdin сполучено з
клавіатурою, тоді як stdout із stderr - з екраном, але stdin і stdout можна
перенаправити в інші файли або конвеєри, як описано в Розділі 7.1.і putchar
можна визначити через getc, putc, stdin і stdout наступним чином:
#define getchar () getc (stdin)
#define putchar (c) putc ( (c), stdout)
Для форматованого вводу або виводу із файлами,
можна використати функції fscanf і fprintf. Вони тотожні scanf із printf за
винятком того, що першим аргументом є покажчик на файл, який вказує на, власне,
файл, який читатиметься; другим аргументом є ланцюжок формату.
fscanf (FILE *fp, char *format,.)fprintf (FILE
*fp, char *format,.)
Маючи такий начерк, ми тепер можемо написати
власну програму cat для зчеплення файлів. Схема буде тією самою, що виявилась
корисною в багатьох інших програмах. Якщо існують аргументи командного рядка,
їх буде інтерпретовано як назви файлів і оброблено по-порядку. Якщо немає
аргументів, обробляється стандартний ввід.
#include <stdio. h>
/* cat: зчеплює файли, 1-а версія */(int argc,
char *argv [])
{*fp;filecopy (FILE *, FILE *)(argc == 1) /*
немає аргументів; копіює *
* стандартний ввід */(stdin, stdout);(--argc >
0)( (fp = fopen (*++argv, "r")) == NULL) {("cat: can't open
%s\n, *argv);1;
} else {(fp, stdout);(fp);0;
}
/* filecopy: копіює файл ifp до файла ofp
*/filecopy (FILE *ifp, FILE *ofp)
{c;( (c = getc (ifp))! = EOF)(c, ofp);
}
Покажчики на файл stdin і stdout являються
об'єктами типу FILE *. Незважаючи на це, вони є константами (сталими), а не
змінними, що внеможливлює надання їм нового значення.
Функція
fclose (FILE *fp)
являється протилежністю fopen, вона розриває
зв'язок між покажчиком на файл і зовнішньою назвою, отриманою fopen, звільняючи
покажчик для іншого файла. Оскільки більшість операційних систем мають певне
обмеження кількості файлів, які програма в змозі відкрити одночасно, хорошою
ідеєю буде звільнити покажчики на файли, якщо їх більше не потрібно, як ми це
зробили в cat. Існує також інша причина зробити fclose для файла виводу - це
очищує буфер, в якому putc накопичує вивід. fclose викликається автоматично для
кожного відкритого файла при нормальному завершенні програми. (Ви можете
замкнути stdin і stdout, якщо вони непотрібні. Їх також можна перепризначити за
допомогою бібліотечної функції freopen.)
Обробка помилок у cat не є ідеальною. Проблема в
тому, що якщо неможливо дістатися до одного з файлів з якоїсь причини,
діагностичне повідомлення буде виведене в кінці зчепленого виводу. Це, можливо,
допустимо, якщо вивід направляється на екран, але не тоді, коли він надходить у
файл або іншу програму через конвеєр.
Щоб краще справлятися з подібними ситуаціями,
програмам надається другий поток виводу під назвою stderr, поряд із stdin і
stdout. Вивід, записаний до stderr, як правило, з'являється на екрані навіть
якщо стандартний вивід перенаправлено.
Давайте виправимо cat так, щоб писати його
повідомлення про помилки до стандартної помилки.
#include <stdio. h>
/* cat: зчеплює файли, 2-а версія */(int argc,
char *argv [])
{*fp;filecopy (FILE *, FILE *);*prog = argv [0];
/* назва програми, для помилок */(argc == 1) /* немає аргументів; копіює *
* стандартний ввід */(stdin, stdout);(--argc >
0)( (fp = fopen (*++argv, "r")) == NULL) {(stderr, "%s: can't
open %s\n",, *argv);(1);
} else {(fp, stdout);(fp);
}(ferror (stdout)) {(stderr, "%s: error
writing stdout\n", prog);(2);
}(0);
}
Програма сигналізує помилки в два способи.
Перший: діагностичний вивід, спричинений fprintf надходить до stderr, тож він
знаходить свій шлях на екран замість того, щоб зникнути кудись через конвеєр
або в файлі виводу. Ми включили в повідомлення назву програми з argv [0], тож,
якщо програма використовується разом з іншими, джерело помилки буде
ідентифіковано.
Другий: програма використовує функцію стандартної
бібліотеки exit, яка завершує виконання програми, якщо її викликано. Аргумент
exit стане доступний будь-якому процесові, який викликав даний, тож успіх чи
невдача програми може перевірятись іншою програмою, яка використовує першу як
дочірній процес. Традиційно, повернене значення 0 сигналізує, що все успішно;
ненульові значення, звично, означають анормальні ситуації. exit викликає fclose
для кожного відкритого файла виводу для того, щоб очистити будь-який
буферований вивід.
Всередині main, return expr еквівалентне exit
(expr). Перевага використання exit полягає в тому, що її можна викликати з
інших функцій і її виклики можна знаходити за допомогою програм пошуку за
шаблоном як ті, які ви знайдете у Розділі 5.
Функція ferror повертає ненульове значення, якщо
відбулася помилка при обробці потоку fp.
ferror (FILE *fp)
Хоча помилки виводу являються рідкістю, вони теж
відбуваються (наприклад, якщо диск заповнено до кінця), тож виробнича програма
також повинна це перевірити.
Функція feof (FILE *) є аналогічною ferror; вона
повертає ненульове значення, якщо досягнуто кінця файла.
feof (FILE *fp)
Загалом, нас не цікавив статус виходу наших
маленьких ілюстративних програм, але будь-яка серйозна програма повинна
піклуватися щодо повернення зрозумілих і корисних значень статусу.
Стандартна бібліотека надає функцію вводу і
виводу fgets, аналогічну getline, яку ми використовували в попередніх розділах:
*fgets (char *line, int maxline, FILE *fp)
читає наступний рядок вводу (включаючи символ
нового рядка) з файла fp у символьний масив line; щонайбільше maxline-1 знаків
буде прочитано. Отриманий в результаті рядок буде завершено '\0'. Звично, fgets
повертає рядок; у випадку кінця файла або помилки, вона повертає NULL. (Наша
getline повертає довжину рядка, - корисніше значення; нуль означає кінець
файла.)
Для виводу, функція fputs записує ланцюжок (який
не повинен включати символ нового рядка) до файла:
fputs (char *line, FILE *fp)
Вона повертає EOF, якщо відбулася помилка і
додатнє значення у протилежному випадку.
Функції бібліотеки gets і puts тотожні fgets і
fputs, але оперують над stdin і stdout. Плутанину викликає те, що gets видаляє
кінцевий '\n', тоді як puts додає його.
Щоб продемонструвати, що немає нічого особливого
в таких функціях як fgets і fputs, ось вони, будь-ласка, скопійовані зі
стандартної бібліотеки до нашої системи:
/* fgets: отримує щонайбільше n символів з iop
*/*fgets (char *s, int n, FILE *iop)
{int c;char *cs;= s;(--n > 0 && (c =
getc (iop))! = EOF)( (*cs++ = c) == '\n');
*cs = '\0';(c == EOF && cs == s)? NULL:
s;
}
/* fputs: додає ланцюжок s до файла iop */fputs
(char *s, FILE *iop)
{c;(c = *s++)(c, iop);ferror (iop)? EOF: 0;
}
З невідомих причин, стандарт вказує на відмінні
значення повернення для ferror і fputs. Досить легко втілити нашу getline за
допомогою fgets:
/* getline: читає рядок, повертає довжину */getline
(char *line, int max)
{(fgets (line, max, stdin) == NULL)0;strlen
(line);
}
1.3
Додаткові функції
Стандартна бібліотека надає широкий вибір
різноманітних функцій.
Операції з ланцюжками
Ми вже згадали ланцюжкові функції strlen, strcpy,
strcat і strcmp, які ви знайдете в <string. h>. В наступному огляді, s із
t - це char *, тоді як c та n - це int.
(s,t) доточує t до кінця s(s,t,n) доточує n
знаків t до кінця s(s,t) повертає від'ємне, нуль або додатнє значення для s
< t, s == t, s > t(s,t,n) те саме, що й strcmp, але тільки для перших n
знаків(s,t) копіює t до s(s,t,n) копіює щонайбільше n символів t до s(s)
повертає довжину s(s,c) повертає покажчик на перший знайдений символ c у s, або
NULL, якщо жодного не знайдено(s,c) повертає покажчик на останній знайдений
символ c у s, або NULL, якщо жодного не знайдено
Перевірка і перетворення класів символів
Декілька функцій з <ctype. h> здійснюють
перевірку символів і перетворення. В наступному, c є типу int, який може бути
представленим як unsigned char (беззнаковим символом) або EOF. Функції
повертають int.(c) повертає ненульове значення, якщо c є літерою алфавіта, 0 -
якщо ні(c) повертає ненульове значення, якщо c є верхнього регістру, 0 - якщо
ні(c) повертає ненульове значення, якщо c є нижнього регістру, 0 - якщо ні(c)
повертає ненульове значення, якщо c є цифрою, 0 - якщо ні(c) повертає ненульове
значення, якщо isalpha (c) або isdigit (c), 0 - якщо ні(c) повертає ненульове
значення, якщо c являється пробілом, табуляцією, символом нового рядка, вертанням
каретки, зміною сторінки або вертикальною табуляцією(c) повертає c, обернене у
верхній регістр(c) повертає c, обернене у нижній регістр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 динамічно добувають
відрізки пам'яті.
*malloc (size_t n)
повертає покажчик на n байтів неініційованої
пам'яті, або NULL, якщо запит неможливо задовольнити.
*calloc (size_t n, size_t size)
повертає покажчик на досить вільного місця для
масиву з n об'єктами вказаного розміру size, або NULL, якщо запит неможливо
задовольнити. Місце зберігання ініціюється нулем.
Покажчик, повернений malloc або calloc, матиме
відповідне вирівнювання для даного об'єкту, але його необхідно звести до
підходящого типу, як скажімо
*ip;= (int *) calloc (n, sizeof (int));
(p) звільняє місце, на яке вказує p, де p
попередньо отримано викликом malloc або calloc. Немає обмежень щодо
послідовності в якій звільнюється простір, але виникне жахлива помилка, якщо
звільнити щось, що не було отримано викликом malloc або calloc.
Помилкою буде також використати щось після того,
як воно було звільнено. Типовий код з помилкою, в цьому циклові, що звільняє
елементи зі списку:
(p = head; p! = NULL; p = p->next) /*
НЕПРАВИЛЬНО */(p);
Правильним буде зберегти те, що потрібно перед
тим як звільнювати:
(p = head; p! = NULL; p = q) {= p->next;(p);
}
Математичні функції
Існує більш ніж двадцять математичних функцій,
оголошених в <math. h>; ось декілька з найчастіше використовуваних. Кожна
з них візьме один або два аргументи типу double (подвійного) і повертає теж
double.
(x) синус x, x в радіанах(x) косинус x, x в
радіанах(y,x) арктангенс y/x, в радіанах(x) показникова функція ex(x)
натуральний логарифм x (x>0) (при основі e)(x) десятковий (звичайний)
логарифм x (x>0)(x,y) xy(x) квадратний корінь x (x>0)(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>()
{float x,s,o,y;float R=4.21, g=3, a=11.6,
Q=89.52,d=1;("%f",&x);=x*g+a;=pow (6+a,1/3);=pow ( (d*d+log (y) -
R*Q) *o/R,0.5);("\n s=%f", s);();0; }
Результат:
Блок схема:
Завдання
2. Програми з розгалуженням
Скласти програму з розгалуженням для обрахунку:
=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()
{float x,y;("%f",&x);(x==A)
{=exp (abs (x+A)) *sin (x);("\n y=%f
x=%f\n",y,x);
}if (x>A&&x<pow (A,2))
{=pow ( ( (x-A) *cos (x)),2);("\n y=%f x=%f
\n",y,x);
}printf ("Vvedene chuslo za mezhamu");();0; }
Результат:
Блок схема:
Завдання
3. Циклічні програми з регулярною змінною аргументу
Скласти циклічну програму з регулярною змінною:
=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()
{x,t;(x=4.6; x<16.6; x+=1.5)
{= (pi-pow (x,2)) *sin (sqrt (2.1*b+x*log (x)));("t=%f
x=%f \n",t,x);
}();0;
}
Результат:
Блок схема:
Завдання
4-1. Циклічні програми з регулярною змінною аргументу, які містять розгалуження
Визначити найбільший спільний дільник (НСД) трьох
введених з клавіатури цілих чисел або вивести повідомлення про його відсутність,
якщо такий дільник дорівнює 1. Підказка: пошук НСД вести, починаючи від
найменшого з введених чисел.
Код програми:
#include <stdio. h>
#include <conio. h>gcd (int i, int j)
{(i&&j)
}i|j;
}()
{a,b,c,D;("Enter
a,b,c\n");("%d%d%d",&a,&b,&c);=gcd (c, (gcd
(a,b)));(D! =1)("Najbilshuj spilnuj dilnuk =%d\n",D);printf
("Nemae najbilshogo spilnogo dilnuka!!!");();0;
}
Результат:
Блок схема:
Завдання
4-2. Циклічні програми з регулярною змінною аргументу, які містять розгалуження
Обчислити значення функції
у набуває значення від 0 до 8 з кроком
0.15.
Код програми:
#include <math. h>
#include <conio. h>
#include <stdio. h>()
{ float x,y,p; x=4.6;(y=0; y<=8; y=y+0.15)
{(y<0.6)
{x=y*y+y+1;=pow (x+exp (x-2),0.5);("p=%f y=%f
\n",p,y); }if (y>=1)
{x=y-1;=pow (x+exp (x-2),0.5);("p=%f y=%f
\n",p,y); }printf ("non difine p y=%f \n",y); }();0; }
Результат:
Блок схема:
Завдання
5-1. Одновимірні масиви
З клавіатури ввести масив дійсних чисел
(максимальна розмірність - 30 елементів). Циклічно зсунути його елементи на одну
позицію ліворуч. Надрукувати отриманий масив. Підказка: циклічне
зсування означає, що перший елемент масиву переходить на місце зсунутого
останнього.
Код програми:
#include <stdio. h>
#include <conio. h>
#include <stdlib. h>()
{ int i,j,kk,k,max,flag,n,R;int M=30;nat
[M];("%d\n",&n);(i=0; i<n; i++)
{("%d\n",&nat [i]);
}=nat [0];(i=0; i< (n-1); i++)
{[i] =nat [i+1];
}[n-1] =kk;(i=0; i<n; i++)
{("\n nat%d=%d", i,nat [i]);
}();0; }
Результат:
Блок схема:
Завдання
5-2. Одновимірні масиви
Дано одновимірний масив Х, який складається з 12
елементів, обчислити
Результат обчислення вивести і вигляді масиву у.
Код програми:
#include <stdio. h>
#include <conio. h>
#include <math. h>()
{i,x [12],y [12];(int k=0; k<12; k++)
{("%f\n",&x [k]);( (abs (x [k])) <0.1)[k]
=x [k] - (1/3) *x [k] *x [k] *x [k];[k] =cos (3.14/2-x [k]);
}(int k=0; k<12; k++)("y [%d] =%f \n",k+1,y
[k]);();0; }
Результат:
Блок схема:
Завдання
6. Використання вказівників для роботи з масивами даних
З клавіатури ввести довге беззнакове ціле число.
Утворити масив з цифр цього числа. Потім сформувати і надрукувати нове число з
інверсним (зворотним) порядком цифр.
Код програми:
#include <stdio. h>
#include <conio. h>
#include <iostream. h>()
{A [25];i,b,a;>>a;=0;(a>0)
{[b] =a%10;/=10;++;
}(i=0; i<b; i++)=a*10+A [i];("\n
a=%d",a);();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()
{y,x,b,S,dx;=13/9;=0;(x=1.3; x<=14.3; x+=dx)+= (pow
(a+x,2)) / (1+pow (cos (x),2));("\n suma S=%f\n",y);();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()
{b,c;a [3] ={1.95,0.87,1.29};(int i=0; i<3; i++)
{("\n a=%f\n",a [i]);(c=0.26; c<1.26; c+=0.2)
{= (a [i] * (p+1)) / (p*sin (c));(" b=%f
c=%f\n",b,c);
}
}();0;
}
Результат:
Блок схема:
Завдання
9. Двовимірні масиви, сортування масивів
Дано матрицю А розміром 4х5. Визначити кількість
елементів в кожному рядку матриці А, модуль яких дорівнює порядковому номеру
елемента в рядку. На друк вивести кількість таких елементів для кожного рядка.
Код програми:
#include <stdio. h>
#include <conio. h>
#include <stdlib. h>()
{i,j,n,k;a [4] [5] ={{1, 0, 0, 0,0},
{1, 2, - 1, 22,3},
{1, 2, - 1, - 2,3},
{1, - 3, - 1, - 4,5}};(i=0; i<4; i++)
{=0;(j=0; j<5; j++)(abs (a [i] [j])
==j+1)++;("Kilkist y riadky=%d\n",k);
}();0;
}
Результат:
Блок схема:
Завдання
10. Процедури-функції
Дано квадратну матрицю А розміром nxn. Скласти
програму нормування матриці, поділивши всі елементи кожного рядка на
максимальний елемент за модулем цього рядка. Пошук максимального елемента рядка
оформити у вигляді процедури.
Код програми:
#include <stdio. h>
#include <conio. h>
#include <math. h>
#define n 4norm (float x,float y);()
{i,j;max [n],A [n] [n] ={{4,-5,6,2},
{2,-2,3,4},
{-9,7,1,7},
{5,-5,-5,5}};(i=0; i<n; i++)
{("\n");[i] =fabs (A [i] [0]);(j=0;
j<n; j++)
{[i] =norm (max [i],A [i] [j]);(" %f
",A [i] [j]);
}
}("\n");(i=0; i<n; i++)
{("\n");(j=0; j<n; j++)
{[i] [j] = A [i] [j] / max [i];(" %f
",A [i] [j]);
}
}();0;
}norm (float x,float y)
{(x<fabs (y))=fabs (y);x;
}
Результат:
Блок схема:
Завдання
11. Підпрограми-функції
Скласти процедуру-функцію, яка обчислює значення
х аргументу монотонної функції, при якому f (х) =0, згідно формули:
Очевидно:
Код програми:
#include <conio. h>
#include <stdio. h>
#include <math. h>argyment (float x,float a, float b,
int i);()
{i;a,b,X;(" Vveditj a ta b
\n");("%f%f",&a,&b);= (b-a) /2;(i=2; i<5; i++)
{=argyment (X,a,b, i);(" X=%f\n",X);
}();0;
}argyment (float x,float a, float b, int i)
{n,sign;(x>0) sign=1;if (x==0) sign=0;if (x<0)
sign=-1;=x-sign* ( (b-a) /pow (2, i));x;
}
Результат:
Блок схема:
Завдання
12-1. Опрацювання символьних рядків
Перевірити, чи введений з клавіатури символьний
рядок є правильним записом беззнакового цілого числа у системі числення з
основою 5 (з можливими символами пропуску перед числом і після нього). Якщо
так, то визначити і надрукувати десяткове значення цього числа.
Код програми:
#include <stdio. h>
#include <math. h>
#include <conio. h>
#include <string. h>()
{();n1,n2, i,x=0,k,m1,m2;text [150], text2 [150],
slovo2 [40], prslovo [40];(text);=strlen (text);(i=0; i<k; i++)(text [i] ==
' ')
{++;(x==1) n1=i;(x==2) n2=i;
}(i=n1+1; i<n2; i++)[i- (n1+1)] =text
[i];=0;(i=k; i>0; i--)(text [i] == ' ')
{++;(x==1) m2=i;(x==2) m1=i;
}c= (m2-m1) - (n2-n1);(i=m1+1; i<=m2; i++)[i-
(m1+1)] =text [i];(i=0; i<=n1; i++) // До першого пропуску[i] =text
[i];(i=n1+1; i<n1+ (m2-m1); i++) // Вставка перед останнбого слова замість
другого[i] =prslovo [i- (n1+1)];(i=n1+ (m2-m1); i<=m1+c; i++) // Після
другого слова[i] =text [i-c];(i=m1+c+1; i<m2; i++) // Вставка другого
замість перед останнього[i] =slovo2 [i- (m1+c+1)];(i=m2; i<k; i++) //
Вставка останнього слова[i] =text [i];(i=0; i<k; i++) // Вивід переробленого
речення("%c",text2 [i]);();0; }
Результат:
Блок схема:
Завдання
12-2. Опрацювання символьних рядків
В заданому тексті знайти і вивести на друк цифри,
які містяться в ньому, і їх кількість.
Код програми:
#include <stdio. h>
#include <stdio. h>
#include <conio. h>()
{char *pStr;str [80];isNumber = 0,k=0;(str);=
str;(*pStr) {(*pStr >= '0' && *pStr <= '9') {=
1;++;("%c", *pStr);
} else {(isNumber) {= 0;(" ");
}}++;
}("\nKilkistb cufr y danomy
rechenni=%d",k);();0; }
Результат:
Блок схема:
Завдання
13. Застосування бібліотечних функцій для роботи з символами та символьними
рядками
З клавіатури ввести речення. Визначити, чи
входить до його складу задане слово (регістри літер не враховувати). Якщо так,
то надрукувати номер цього слова в реченні, інакше вивести відповідне
повідомлення.
Код програми:
#include <iostream. h>
#include <conio. h>
#include <stdio. h>
#include <string. h>main ()
{line [1024], *word [100], slovo
[100];n=0,k=1,m=0;<<"Enter rechennia:
";(line);<<"\nEnter slovo: ";(slovo);[n] = strtok
(line," ");(word [n])
{(! strcmp (word [n],slovo))
{<<"Nomer zadanogo slova:
"<<k;++;
}[++n] = strtok (NULL," ");++;
}(m==0) cout<<"Zadanogo slova nemae y
rechenni!!!";();0;
}
Результат:
Блок схема:
Завдання
14. Багатовимірні масиви та масиви символьних рядків
Ввести послідовність символьних рядків, у кожному
з яких записано прізвище, ім’я та по-батькові одного студента. Визначити і
запам’ятати стать кожного. Потім скоротити рядки, залишивши тільки прізвище та
ініціали. Надрукувати скорочений список, вказавши в дужках стать кожного
студента.
Код програми:
#include <stdio. h>
#include <conio. h>
#include <iostream. h>FFF (char M []);()
{A [100],B [100],C [100];<<"Vvedu PIB
persogo stydenta: ";(A);<<"Vvedu PIB drygogo stydenta:
";(B);<<"Vvedu PIB tretiogo stydenta:
";(C);<<"Skorochenuj spusok stydentiv:
\n";(A);(B);(C);();0;
}FFF (char M [])
{i,k,n=0,n1,n2;im [20], *st;=strlen (M);(i=0;
i<k; i++)(M [i] ==' ')
{++;(n==1) n1=i+1;(n==2) n2=i;
}(i=n1; i<n2; i++)[i-n1] =M [i];[i-n1]
='\0';(im [i-n1-1] =='a') st="zh"; else st="ch";(i=0;
i<=n1; i++)
{<<M [i];(i==n1) cout<<".
";
}<<M [n2+1] <<".
"<<" ("<<st<<") \n";
}
Результат:
Блок схема:
Завдання
15. Файли
Сформувати файл А, що містить інформацію про
кінострічки:
назва фільму;
рік випуску;
кіностудія;
режисер.
З файлу А вибрати і переписати у файл В
інформацію про кінострічки, зняті кіностудією ім. Довженка у 1985-92 рр.
Код програми:
#include <conio. h>
#include <stdio. h>
#include <fstream. h>kino
{name [50], studia [50], rejiser [50];rik;
};()
{i;A [3];fileo ("A. txt");(int i = 0; i
< 3; i++)
{<< "nazva filmu: ";>> A
[i]. name;<< "rik: ";>> A [i]. rik;<< "studia:
";>> A [i]. studia;<< "rejiser: ";>> A [i].
rejiser;<< A [i]. name << "\t"
<< A [i]. rik << "\t"
<< A [i]. studia << "\t"
<< A [i]. rejiser << "\n";
}filei ("A. txt");fielTwo ("B.
txt");(int i = 0; i < 3; i++)
{(A [i]. rik>1985&&A [i].
rik<1992&& (! strcmp (A [i]. studia,"Dovzhenka")))
{<< A [i]. name << "\t"
<< A [i]. rik << "\t"
<< A [i]. studia << "\t"
<< A [i]. rejiser << "\n";
}
}();0;
}
Результат:
Блок схема:
Завдання
16. Основи опрацювання структур
З клавіатури ввести послідовність адрес, кожна з
яких задається структурою з полями: <Індекс>, <Місто>,
<Вулиця>, <Будинок>. Відсортувати ведені дані за
порядком зростання індексів та роздрукувати їх у формі таблиці. Визначити
відсоток львівських адрес.
Код програми:
#include <conio. h>
#include <iostream. h>
#include <stdio. h>
#define n 3adresa
{misto [30], vulycia [30];index, budynok;
};()
{A [n],k;i,j;m=0,V=0;(i=0; i<3; i++)
{<<"\n Vveditj misto: ";>>A
[i]. misto;<<"Vulycu: ";>>A [i].
vulycia;<<"Index: ";>>A [i]. index;<<"Budynok:
";>>A [i]. budynok;
}(i=0; i<3; i++)(j=i+1; j<3; j++)(A [i].
index>A [j]. index)
{=A [i];[i] =A [j];[j] =k;
}<<"Index: \tMisto: \tVulycia:
Budynok: \n";(i=0; i<3; i++)
{(! strcmp (A [i].
misto,"Lviv"))++;<<A [i]. index<<"\t"<<A
[i]. misto
<<"\t"<<A [i].
vulycia<<"\t"<<A [i]. budynok<<"\n";
}(m! =0) V= (m/n) *100;<<"Vidsotok
lvivskih adres: "<<V<<"%";();0;
}
Результат:
Блок схема:
Завдання
17. Основи ООП. Принципи побудови класів
Створити клас з такими полями та методами:
СТУДЕНТ
поля:
ім'я - char*
курс - int
стать - int (bool)
методи:
зміна курсу
введення імені
введення статі
виведення інформації про об’єкт
Код програми:
#include <iostream. h>
#include <conio. h>
#include <string. h>Stydent
{name [25];k,st;:();(char*, int, int);(const
Stydent&);SetName (char*);SetStatj (int);ZminaKyrsy (int);Show ();
};:: Stydent ()
{(name, "---");=0;=0;
}:: Stydent (char* a, int b, int c)
{(name, a);=b;=c;
}:: Stydent (const Stydent& X)
{(name, X. name);=X. k;=X. st;
}Stydent:: SetName (char* a)
{(name, a);
}Stydent:: SetStatj (int a)
{=a;
}Stydent:: ZminaKyrsy (int a)
{=a;
}Stydent:: Show ()
{<< "\nInformacia pro stydenta:
";<< "\nName: " << name;<< "\nKyrs:
" << k;<< "\nStatj: " << st;
}main ()
{T1;T2 ("Makarchenko",1,1);<<
"Show 1: ";. Show ();<< "\n\nShow 2: ";. Show ();.
SetName ("Adrienko");<< "\n\nShow 1: ";. Show ();.
SetStatj (1);. ZminaKyrsy (2);<< "\n\nShow 1: ";. Show
();T3;<< "\n\nShow 3: ";. Show ();= T1;<< "\n\nShow
3: ";. Show ();();
}
Результат:
Блок схема:
Завдання
18. Перевантаження функцій
Написати функцію min, яка шукає мінімум серед
двох, трьох та чотирьох цілих та дійсних чисел.
Код програми:
#include<iostream. h>
#include<conio. h>
#include<math. h>min (int, int);min
(float,float);min (int, int, int);min (float,float,float);min (int, int, int,
int);min (float,float,float,float);()
{a = 0, b = 0, c = 0, d=0;a1 = 0, b1 = 0, c1 =
0,d1=0;<< "Vvedu 4 cili chisla: \n";>> a >> b
>> c>>d;<<"Minimaljne sered ciluh chusel
="<<min (a,b,c,d);<< "\nVvedu 4 diisni chisla: \n";>>
a1 >> b1 >> c1>>d1;<<"Minimaljne sered dijsnuh
chusel ="<<min (a1,b1,c1,d1);();0;
}min (int d1, int d2)
{m=d1;(m>d2) m=d2;m;
}min (float d1,float d2)
{m=d1;(m>d2) m=d2;m;
}min (int d1, int d2, int d3)
{m=d1;(m>d2) m=d2;(m>d3) m=d3;m;
}min (float d1,float d2,float d3)
{m=d1;(m>d2) m=d2;(m>d3) m=d3;m;
}min (int d1, int d2, int d3, int d4)
{m=d1;(m>d2) m=d2;(m>d3) m=d3;(m>d4)
m=d4;m;
}min (float d1,float d2,float d3,float d4)
{m=d1;(m>d2) m=d2;(m>d3) m=d3;(m>d4)
m=d4;m;
}
Результат:
Блок схема:
Завдання
19. Шаблони функцій
Написати функцію perum, яка шукає периметр
трикутника, чотирикутника та п’ятикутника, передбачити задання сторін за
допомогою цілих та дійсних чисел.
Код програми:
#include<iostream. h>
#include<conio. h>
#include<math. h><class MyType>perum
(MyType,MyType,MyType);<class MyType>perum
(MyType,MyType,MyType,MyType);<class MyType>perum
(MyType,MyType,MyType,MyType,MyType);()
{a = 0, b = 0, c = 0, d=0;a1 = 0, b1 = 0, c1 =
0,d1=0;<< "Vvedu storonu bagatokytnuka: \n";>> a >>
b >> c>>d;<<"Perumetr bagatokytnuka ="<<perum
(a,b,c,d);<< "\nVvedu storonu bagatokytnuka: \n";>> a1
>> b1 >> c1>>d1;<<"Perumetr bagatokytnuka
="<<perum (a1,b1,c1,d1);();0;
}<class MyType>perum (MyType d1,MyType
d2,MyType d3)
{p;=d1+d2+d3;p;
}<class MyType>perum (MyType d1,MyType
d2,MyType d3,MyType d4)
{p;=d1+d2+d3+d4;p;
}<class MyType>perum (MyType d1,MyType
d2,MyType d3,MyType d4,MyType d5)
{p;=d1+d2+d3+d4+d5;p;
}
Результат:
Блок схема:
Найпростіший механізм вводу - це читати по одному
символу за один раз зі стандартного вводу/
Список
використаних джерел
1. Глинський Я.М. - С++ і С++ Builder - Львів: "Деол”,
2006. - 191 с.
2. Deitel H. M. - C++ How to Program (fifth
edition) (2005). chm 10 709 381
3. Deitel H. M. - Visual C# How to Program
(second edition) (2005) 29 851 185
. Blanchette J., Summerfield M. - C++ GUI
Programming with Qt 3 (2004) 3 051 937
. Blanchette J., Summerfield M. - C++ GUI
Programming with Qt 4 (2001) 6 358 317
. Стивен Прата. Язык программирования C++
(C++11). Лекции и упражнения = C++ Primer Plus, 6th Edition (Developer’s
Library). - 6-е изд. - М.: Вильямс, 2012. - 1248 с. - ISBN 978-5-8459-1778-2
. Айвор Хортон. Visual C++ 2010: полный
курс = Ivor Horton’s Beginning Visual C++ 2010. - М.: Диалектика, 2010. -
С.1216. - ISBN 978-5-8459-1698-3
. Герберт Шилдт. Полный справочник по C++
= C++: The Complete Reference. - 4-е изд. - М.: Вильямс, 2011. - С.800. - ISBN
978-5-8459-0489-8
. Герберт Шилдт Теория и практика С++ =
Shildt'sExpertC++. - СПб.: BHV - Санкт-Петербург, 1996. - ISBN 0-07-882209-2,
5-7791-0029-2
10. LermanJ.
ProgrammingEntityFramework, 2ndEdition. - ’OReilly
<http://ru.wikipedia.org/wiki/O%E2%80%99Reilly_Media>, 2010. - 920 с.
. Conger
D., Little R. - Creating Games in C++ - A Step-by-Step Guide (2006) 1 301 734
. Бьёрн
Страуструп Дизайн и эволюция C++ = The Design and Evolution of C++. - СПб.:
Питер, 2007. - 445 с. - ISBN 5-469-01217-4
. Сиддхартха
Рао Освой самостоятельно C++ за 21 день, 7-е издание (C++11) = Sams Teach
Yourself C++ in One Hour a Day, 7th Edition. - М.: "Вильямс", 2013. -
688 с. - ISBN 978-5-8459-1825-3
. Щедріна
О.І. Алгоритмізація та програмування процедур обробки інформації С++
[навчальний посібник] - Київ: КНЕУ, 2001-244c.
. Круглински
Д., Уингоу С., Шеферд Дж. - Программирование на MicrosoftVisualC++ 6.0 для
профессионалов (2004). pdf 120 038 828
. Культин
Н. - C++ Builder в задачах и примерах (2005) 28 136 426