You are on page 1of 15

Міністерство освіти і науки України

Національний університет «Львівська політехніка»


Кафедра систем
автоматичного проектування

Звіт
Про виконання лабораторної роботи №7
Підпрограми (функції) в мові програмування С
Варіант 13

Виконала:
студент групи КН-11з
Вакарова В.В.

Прийняв:
ассистент, к.т.н
Оборська О.В.

Львів 2021
Мета роботи: ознайомитися із особливостями застосування функцій у
мові С.
Лабораторне завдання:

1. Ознайомитися із особливостями застосування функцій у мові С.

2. Одержати індивідуальне завдання.

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

4. Скласти програми на алгоритмічній мові C згідно завдання.

5. Відлагодити програми, виконати обчислення, проаналізувати отримані


результати.

Завдання 1

Виконати завдання наведені нижче. Ввід-вивд даних та виконання інших


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

13. Обчислити суму

для значень 0 < x < 1 з точністю, що задає користувач з клавіатури. На основі


отриманих результатів обчислити означений інтеграл цієї функції. Крок вводити
з клавіатури.

Блок-схема:

OutputhNum:
CalculateSum:

InputNum:

Main:

Код:
Результат:

Завдання 2

Виконати аналіз текстового файлу (текст довільний). Ввід-вивд даних та


виконання інших окремих логічних дій необхідно реалізувати в окремих
функціях. У головній функції необхідно виконувати лише їх виклик.
Використання глобальних змінних не допускається. Інформація повинна
передаватися у функції лише за допомогою параметрів. Назва текстового файлу
та інші вхідні дані передаються в програму через аргументи функції main().
Вихідні дані виводяться на консоль.

13. Вивести всі слова, що починаються з літер, які вказані користувачем (слова
не дублювати, вивести кожне окреме слово та кількість його входжень).
Блок-схема:

GetText:
InputLetters:
PrintArray:
CheckDuplicates:
Search:
Main:

Код:
#include <stdio.h>
#include <string.h>
struct Words {
char Letters[15];
int Count;
};
void GetText(FILE* T, char* P) {
int k = 0;
while (feof(T) == 0) {
fscanf(T, "%c", &P[k]);
k++;
}
P[k - 1] = '\0';
}
void InputLetters(char* P) {
printf("Enter letters to search: ");
gets(P);
}
void PrintArray(int n, struct Words Words[20]) {
int check;
printf("\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < 15; j++) {
check = j;
if (Words[i].Letters[j] != '0') printf("%c", Words[i].Letters[j]);
else break;
}
if (check != 0) printf(" - %d time(s)\n", Words[i].Count);
}
if (Words[0].Count == 0) printf("No words were found!");
}
void CheckDuplicates(int n, struct Words Words[20]) {
int k = 0;
for (int i = 0; i < n; i++) {
Words[i].Count = 1;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
while (Words[i].Letters[k] != '0' || Words[j].Letters[k] != '0') {
if (tolower(Words[i].Letters[k]) == tolower(Words[j].Letters[k])) {
k++;
}
else {
k = 0;
break;
}
}
if (k != 0) {
Words[j].Letters[0] = '0';
Words[i].Count++;
Words[j].Count = 0;
}
k = 0;
}
}
PrintArray(n, Words);
}
void Search(char* P, char* L, struct Words Words[20]) {
int i = 0, j = 0, k = 0, t = 0, n = 0;
Words[0].Count = 0;
while (P[i] != '\0' && i < 200) {
while (L[j] != '\0' && i < 200) {
if ((P[i] == L[j] || P[i] == L[j] - 32) && (P[i - 1] == ' ' || j != 0 || i == 0))
{
j++;
}
else {
j = 0;
}
i++;
}
if (j != 0 && i < 200) {
k = i - j;
while (P[k] != ' ' && P[k] != '.' && P[k] != ',' && P[k] != '!' && P[k] != '\0')
{
Words[n].Letters[t] = P[k];
t++;
k++;
}
Words[n].Letters[t] = '0';
t = 0;
i = k;
n++;
}
j = 0;
}
CheckDuplicates(n, Words);
}
int main() {
FILE* T = fopen("Text.txt", "r");
struct Words Words[20];
char Text[200], Letters[10];
char* P = Text;
GetText(T, P);
char* L = Letters;
InputLetters(L);
Search(P, L, Words);
}

Результат:

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

1. Коли виникає необхідність застосування функцій?


Проектна філософія С передбачає використання функцій в якості
будівельних блоків. Функції позбавляють від необхідності в
багаторазовому написанні одного і того ж коду. Використання функції
має сенс, тому що це робить програму більш модульною, таким чином
покращуючи її читабельність і спрощуючи внесення змін чи
виправлень.
2. Який загальний вигляд функцій?
<тип> < ідентифікатор> (<список формальних параметрів>)
{
<оператор1>;
<оператор2>;

}
3. Як функція повертає значення?
<тип> – визначає тип значення, яке поверне функція у місце свого
виклику використовуючи оператор return. Якщо тип не визначений, то
функція поверне значення типу int по замовчуванню.
Для повернення значення з функції використовується оператор return із
вказаним виразом, результат якого повертається. Дозволяється
використовувати більше одного оператора return. Це спрощує розуміння
алгоритму.
4. Які завдання виконує прототип функції?
Прототип функції виконує два завдання. Перше полягає в
ідентифікації типу значення, яке поверне функція, так, щоб компілятор
міг згенерувати коректний код для типу даних, що повертаються. Друге
завдання – у визначенні типу та кількості параметрів, які
використовуються функцією.
5. Як виглядає функція типу void?
#include <stdio.h>
void sign(int);
int main ()
{
sign (5);
return 0;
}
Void sign (int a)
{
if (a > 0) printf (“positsve value/n”);
else printf (“negative value/n”);
}
*Або без вказаних параметрів.
6. Як реалізується виклик функції з передачею значень?
#include <stdio.h>
int sqr (int x);
int main ()
{
int t=10;
printf (“%d %d”, sqr(t), t);
return 0;
}
int sqr(int x)
{
x = x * x;
return 0;
}
У цьому прикладі значення аргументу для sqr( ) , скопіювалося у
параметр x . Коли відбулося присвоєння x = x * x , змінилося значення
лише локальної змінної x . Змінна t , яка використовувалася для виклику
sqr( ) , і надалі має значення 10. А на екран виведеться: 100 10 .

7. Як реалізується виклик функції з передачею адреси змінних?


{
int t=10;
printf(“%d”, sqt(&t));
printf(“%d”, t);
return 0;
}
int sqr (int *x)
{
*x = (*x) * (*x);
return *x;
}
8. Як реалізується виклик функції з масивом?
У цьому і тільки в цьому контексті С інтерпретує int аrr[] як int *аrr,
тобто аrr є типом вказівника на int. Оскільки в прототипах дозволено
опускати ім'я, всі чотири наведених нижче прототипу еквівалентні:
int sum (int *arr, int n);
int sum (int *, int);
int sum (int arr[], int n);
int sum (int [] , int );

9. Як реалізується виклик функції зі змінним числом параметрів?


Мова програмування С дозволяє використання змінного числа
аргументів. Наприклад функції printf() та scanf(). Ознакою функції з і
змінним числом аргументів є три крапки (еліпсис) “...” у списку
параметрів прототипу функції. Зустрівши “...”, компілятор зупиняє
контроль відповідності типів параметрів для такої функції. Звичайно,
функція зі змінним числом параметрів повинна мати засіб визначення
точного їх числа при кожному виклику.
10.Що таке рекурсія?
У мові С функції можуть викликати самі себе. Функція називається
рекурсивною, якщо вираз в тілі функції містить виклик самої функції.
Для того, щоб алгоритмічна мова була рекурсивною, потрібно, щоб
функції мали можливість викликати самі себе.

11.Які Ви знаєте параметри функції main()?


Параметр – void.
argc – число параметрів, що зберігаються в argv. Якщо оголошений, то
обов’язково є більшим нуля;
*argv[ ] – вказівник на масив стрічок з argc елементів (argv[argc]
обов’язково рівний NULL). argv[0] – назва програми (і залежно від
поточного каталогу, шлях до неї), якщо argc>1, то рядки з argv[1] по
argv[argc-1] містять параметри програми, оголошені при її виклику з
операційної системи, наприклад з командного рядка.

You might also like