You are on page 1of 46

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

Дніпропетровський національний університет імені Олеся Гончара

Кафедра ЕОМ

Курсова робота

З дисципліни «Програмування»

Виконав студент 1 курсу

групи КІ-17-1

Гречка Дмитро Сергійович

Керівник: Карпенко Н.В.

Кількість балів:________

Національна шкала:________

Оцінка ECTS:________

Дніпро
2018
1. Завдання на курсову роботу
Варіант 7.
1. Функція Position(s,s1). Призначення: пошук позиції останнього входження
підрядку s1 в рядок s.
2. Знайти мінімальне з чисел, що зустрічається у матриці більше одного разу.
3. Скласти функцію, що переставляє півбайти в двійковому представленні
символу (символ, що містить до перестановки значення 0х3f, після
перестановки повинен містити 0хf3). Застосувати цю функцію до всіх
символів заданого рядку. Результати представити у символьному,
шістнадцятковому та двійковому вигляді.
4. Є матриця m*k, де m і k – цілі числа, слів довжиною 6. Упорядкувати слова у
її діагоналі за спаданням методом мінімумів. Методами послідовного та
бінарного пошуку знайти в упорядкованій діагоналі задане слово. Дані
вводяться з файлу.
2. Анотація

RESUME

The term project of the 1-st year student Grechka D.S. (DNU, Faculty
of Physics, Electronics and Computer Systems, Department of
Electronic Computing Systems) deals with designing algorithms and
programs using programming language C for 4 tasks. They are
processing symbol strings, processing matrics, operations with
separate bits, and the applications of sorting and searching methods.
The block diagrams and listings are presented.
3. Зміст

1. 1.Завдання на курсову роботу..........................................................................2


2.....................................................................................................................2.Анотація
.......................................................................................................................................3
3...........................................................................................................................3.Зміст
.......................................................................................................................................4
4..........................................................................................................................8.Вступ
.......................................................................................................................................5
5.....................................................................................................10.Основна частина
.......................................................................................................................................6
Завдання 1...................................................................................................................................................6
Умова завдання.......................................................................................................................................6
Завдання 2.................................................................................................................................................12
Завдання 3.................................................................................................................................................20
Завдання 4.................................................................................................................................................31
Блок-схема.............................................................................................................................................33
6..................................................................................................................12.Висновки
.....................................................................................................................................44
7...............................................................................14.Список використаних джерел
.....................................................................................................................................45
4. Вступ
C — універсальна, процедурна, імперативна мова програмування загального
призначення, розроблена у 1972 році Денісом Рітчі у Bell Telephone
Laboratories з метою написання нею операційної системи UNIX.
Хоча С і було розроблено для написання системного програмного
забезпечення, наразі вона досить часто використовується для
написання прикладного програмного забезпечення.
С імовірно, є найпопулярнішою у світі мовою програмування за кількістю вже
написаного нею програмного забезпечення, доступного під вільними
ліцензіями коду та кількості програмістів, котрі її знають. Версії компіляторів
для мови С існують для багатьох операційних систем та апаратних архітектур.
C здійснила великий вплив на інші мови програмування, особливо на C++, яку
спочатку проектували як розширення для С, а також на Java та C#, які
запозичили у С синтаксис.
5. Основна частина
Завдання 1
Умова завдання
Функція Position(s,s1). Призначення: пошук позиції останнього входження
підрядку s1 в рядок s.
Теоретична частина
1) #include <locale.h> - бібліотека для підключення російської мови в
консолі.

2) #include <stdio.h> - дана бібліотека керує виділенням пам’яті, для


операцій вводу/виводу.

3) #include <cstdbool> - дана бібліотка підключає логічний тип bool в сі.

4) setlocale(LC_ALL, "Russian"); - встановлення російської мови в консолі.

5) system("cls"); - очищення консолі.

6) free() - функція для звільнення динамічної пам’яті.

7) printf() – функція виведення інформації в консоль.

8) scanf_s() – функція зчитки інформації з консолі.

9) gets() – функція для зчитки символьних рядків з консолі.

10) _getch() – функція для зчитки одного символу з консолі.

11) rewind(stdin); - функція для очищення потоку вводу/виведення.

Опис вхідних та вихідних параметрів


 Вхідними параметрами являються рядок s та s1.

 Вихідними параметрами є індекс останнього входження рядку s1 в s.

Логічна структура програми та функцій


1) void main(); - Головна функція програми.
2) bool Check(char * mainStr, char * str, int pos) – Функція порівнює
частину з рядку mainStr з підрядком str та повертає true, якщо підрудок
входить в рядок, починаючи з позиції pos і false – якщо інакше.

3) bool CheckWithPtr(char * mainPtr, char * ptr, int pos) – Функція


порівнює частину з рядку mainStr з підрядком str та повертає true, якщо
підрудок входить в рядок, починаючи з позиції pos і false – якщо інакше.
Демонструє арифметику вказівників.

4) int Position(char * mainStr, char * str) – функція повертає індекс


останнього входження підрядку в рядок.

5)
Блок-схема
Виклик та завантаження програми
Виклик та завантаження програми здійснюється в середовищі Visual Studio
шляхом натиснення на кнопку «Старт» чи методом відкриття .exe файлу в
каталозі Debug в папці проекту.

Тестові дані для перевірки роботи програми


1) s=”Hellolo, wowo”, s1=”wo”

2) s=”Hello”, s1 = “Hello”

Результати тестування

Мал 1. s=”Hellolo, wowo”, s1=”wo”

Мал 2. s=”Hello”, s1 = “Hello”


Аналіз одержаних результатів
Програма захищена від аномальних випадків, таких як пустий рядок s чи s1, чи
якщо довжина підрядку більша ніж у рядку.

В звичайному режимі програма демонструє вірне визначення позиції


останнього входження підрядку s в s1.
Завдання 2
Умова завдання
Знайти мінімальне з чисел, що зустрічається у матриці більше одного разу
Теоретична частина
1) #include <locale.h> - бібліотека для підключення російської мови в
консолі.

2) #include <stdio.h> - дана бібліотека керує виділенням пам’яті, для


операцій вводу/виводу.

3) #include <time.h> - дана бібліотека дозволяє дізнатись системний час.

4) #include <cstdbool> - бібліотека для підключення логічного типу bool в


програмі.

5) setlocale(LC_ALL, "Russian"); - встановлення російської мови в консолі.

6) system("cls") - очистка консолі.

7) free() - функція для звільнення динамічної пам’яті.

8) Malloc() – функція для виділення пам’яті.

9) printf() – функція виведення інформації в консоль.

10) scanf_s() – функція зчитки інформації з консолі.

11) gets() – функція для зчитки символьних рядків з консолі.

12) _getch() – функція для зчитки одного символу з консолі.

13) srand(time(NULL)) – визначення «зерна» для рандомної генерації.

14) rewind(stdin) - функція для очищення потоку вводу/виведення.

Опис вхідних та вихідних параметрів


 Вхідним параметром є розмірність генеруємої матриці (від 6 до 10,
включно).
 Вихідними параметрами є: згенерована матриця розмірності, яка була
введена, та мінімальний елемент матриці, який зустрічається мінімум два
рази, якщо такий існує.

Логічна структура програми та функцій


1) void main(); - Головна функція програми.

2) float** GenerateMatrix(int size) – Функція генерації квадратичної


матриці та заповнення її рандомними числами.

3) void Print(float ** matrix, int size) – Функція виводу матриці на


екран.

4) int SearchCount(int ** matrix, int size, int elem) – Функція знаходить


кількість раз, яку зустрічається елемент в матриці.

5) int SearchNextMin(int ** matrix, int size, int minE, int maxE) –


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

6) void Task(int ** matrix, int size) – функція знаходить мінімальне


число, яке зустрічається в матриці принаймні два рази, якщо таке існує.
Блок-схема
Виклик та завантаження програми
Виклик та завантаження програми здійснюється в середовищі Visual Studio
шляхом натиснення на кнопку «Старт» чи методом відкриття .exe файлу в
каталозі Debug в папці проекту.

Тестові дані для перевірки роботи програми


1) size = 10

2) size = 4
Результати тестування

Мал 1. size=10

Мал 2. size = 4

Аналіз одержаних результатів


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

Результати звичайного режиму роботи також залишаються логічно


обгрунтованими та корректними. На всіх тестових прикладах результат роботи
програми демонстрував вірну видачу мінімального числа, яке зустрічається
мінімум два рази в матриці.
Завдання 3
Умова завдання
Скласти функцію, що переставляє півбайти в двійковому представленні
символу (символ, що містить до перестановки значення 0х3f, після
перестановки повинен містити 0хf3). Застосувати цю функцію до всіх символів
заданого рядку. Результати представити у символьному, шістнадцятковому та
двійковому вигляді.
Теоретична частина
1) #include <locale.h> - бібліотека для підключення російської мови в
консолі.

2) #include <stdio.h> - дана бібліотека керує виділенням пам’яті, для


операцій вводу/виводу.

3) #include <cstdbool> - дана бібліотека підключає в проекті логічний тип


bool.

4) setlocale(LC_ALL, "Russian"); - встановлення російської мови в консолі.

5) system("cls") - очистка консолі.

6) free() - функція для звільнення динамічної пам’яті.

7) malloc() – функція для виділення пам’яті.

8) printf() – функція виведення інформації в консоль.

9) scanf_s() – функція зчитки інформації з консолі.

10) gets() – функція для зчитки символьних рядків з консолі.

11) _getch() – функція для зчитки одного символу з консолі.

12) srand(time(NULL)) – визначення «зерна» для рандомної генерації.

13) rewind(stdin) - функція для очищення потоку вводу/виведення.

14) FILE – клас для роботи з файлами.


Опис вхідних та вихідних параметрів
 Вхідними параметрами являються імена вхідного і вихідного файлів.

 Вихідними параметрами є масив, зчитаний з файлу, його змінена версія,


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

Логічна структура програми та функцій


1) main() – Головна функція програми.

2) void Print(int * mas) – Функція виводу масиву на екран.

3) int * ReadFile(char * fname) – Функція зчитки масиву з файлу.

4) void SaveToFile (int * mas, char * fname)– Функція збереження


масиву до файлу.

5) void BinaryConvert(int number) – Функція рекурсивно конвертує


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

6) void HexConvert(int number) – Функція рекурсивно конвертує


десяткове число в шістнадцяткове.

7) void SymbolConvert(int number) – Функція представляє число


символом, якщо такий код існує.

8) bool CheckBit(int number, unsigned int pos) – Функція повертає true,


якщо біт по позиції pos встановлей в 1 і false, якщо в 0.

9) void PrintToOtherSystem(int number1, int number2) – функція друкує


два числа в різних системах.

10) int * SwapsHalfBytes(int * mas) – функція міняє місцями півбайти


числа.

11)
Блок-схема
Виклик та завантаження програми
Виклик та завантаження програми здійснюється в середовищі Visual Studio
шляхом натиснення на кнопку «Старт» чи методом відкриття .exe файлу в
каталозі Debug в папці проекту.

Тестові дані для перевірки роботи програми


1) Вхідний файл - 1.txt, вихідний файл – 2.txt

2) Ім’я вхідного файлу, яке не існує

3) Пустий вхідний файл

Результати тестування

Мал 1. Вхідний файл - 1.txt, вихідний файл – 2.txt


Мал 2. Ім’я вхідного файлу, яке не існує

Мал 3. Пустий вхідний файл

Аналіз одержаних результатів


Програма захищена від аномальних випадків, таких як неіснуючий вхідний
файл чи пустий, та неіснуюче ім’я файлу чи таке ім’я, яке неможливо задати
для вихідного файлу.
Результати звичайного режиму роботи також залишаються логічно
обгрунтованими та корректними. На всіх тестових прикладах результат роботи
програми демонстрував вірний обмін півбайтів місцями та представлення
елементу масиву до і після конвертації в бінарній, шістнадцятковій та
символьній системах.
Завдання 4
Умова завдання
Є матриця m*k, де m і k – цілі числа, слів довжиною 6. Упорядкувати слова у її
діагоналі за спаданням методом мінімумів. Методами послідовного та
бінарного пошуку знайти в упорядкованій діагоналі задане слово. Дані
вводяться з файлу.
Теоретична частина
1) #include <locale.h> - бібліотека для підключення російської мови в
консолі.

2) #include <stdio.h> - дана бібліотека керує виділенням пам’яті, для


операцій вводу/виводу.

3) #include <cstdbool> - дана бібліотека підключає в проекті логічний тип


bool.

4) setlocale(LC_ALL, "Russian"); - встановлення російської мови в консолі.

5) system("cls") - очистка консолі.

6) free() - функція для звільнення динамічної пам’яті.

7) malloc() – функція для виділення пам’яті.

8) printf() – функція виведення інформації в консоль.

9) scanf_s() – функція зчитки інформації з консолі.

10) gets() – функція для зчитки символьних рядків з консолі.

11) _getch() – функція для зчитки одного символу з консолі.

12) srand(time(NULL)) – визначення «зерна» для рандомної генерації.

13) rewind(stdin) - функція для очищення потоку вводу/виведення.

14) FILE – клас для роботи з файлами.


Опис вхідних та вихідних параметрів
 Вхідними параметрами являються імена вхідного і вихідного файлів,
шукане слово.

 Вихідними параметрами є зчитаний масив з файлу, його відсортована


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

Логічна структура програми та функцій


1) void main() – Головна функція програми.

2) void Print(int * mas) – Функція для виводу масиву на екран.

3) int * Read(char *fname)– Функція зчитує масив з файлу.

4) void Save (int * mas, char * fname) – Функція зберігає масив до


файлу.

5) int Simile(char * firstWord, char * lastWord) – функція знаходить, як


слова співвідносяться між собою за алфавітом та повертає 1, якщо слово 1
розміщено пізніше за алфавітом, -1, якщо раніше, і 0, якщо це одне і те ж
слово.

6) void LineSearch(int * mas, int number) – Функція лінійного пошуку


по головній діагоналі матриці.

7) bool BinarySearch(int * mas, int number) – Функція бінарного пошуку


по головній діагоналі матриці.

8) struct Word ** MinimumSort(struct Word ** matrix) – Функція сортує


головну діагональ матриці методом мінімумів-максимумів.
Блок-схема
Виклик та завантаження програми
Виклик та завантаження програми здійснюється в середовищі Visual Studio
шляхом натиснення на кнопку «Старт» чи методом відкриття .exe файлу в
каталозі Debug в папці проекту.

Тестові дані для перевірки роботи програми


1) Ім’я вхідного файлу = “1.txt”, ім’я вихідного файлу “2.txt”, word = "Mretrt"

2) Ім’я вхідного файлу = “2.txt”, ім’я вихідного файлу “2.txt”, word =


"NoWord"

Результати тестування

Мал 1. Ім’я вхідного файлу = “1.txt”, ім’я вихідного файлу “2.txt”, word = "
Mretrt"

Мал 2. Ім’я вхідного файлу = “1.txt”, ім’я вихідного файлу “2.txt”, word = "
NoWord"
Аналіз одержаних результатів
Програма захищена від аномальних випадків, таких як неіснуючий вхідний
файл чи пустий, та неіснуюче ім’я файлу чи таке ім’я, яке неможливо задати
для вихідного файлу

Результати звичайного режиму роботи також залишаються логічно


обгрунтованими та корректними. На всіх тестових прикладах результат роботи
програми демонстрував вірний результат лінійного і бінарного пошук
введеного рядку числа, та сортування послідовності методом мінімумів-
максимумів.
6. Висновки
Отже, в даній курсовій роботі я розробив алгоритм пошуку останнього
входження підрядку в рядок і повертання позиції цього входження. В випадку,
якщо в функцію передано пусті рядки – алгоритм виконуватись не буде. Тобто,
програма має захист від некоректних параметрів.
Такой було реалізовано алгоритм генерування матриці рандомних чисел та
пошук мінімального елементу матриці, який зустрічається в матриці не менше,
ніж два рази.
В третьому завданні необхідно було поміняти місцями півбайти заданого числа,
тим самим, фактично закодувавши його та записати цей масив в файл,
попередньо зчитавши його з файлу.
Найцікавішим виявилось написання останнього завдання, а саме: алгоритмів
лінійного та бінарного пошуків в головній діагоналі матриці, та сортування
матриці в її головній діагоналі методом мінімумів.
Загалом, дана курсова робота привнесла ряд корисних знань в мій професійний
багаж знань та являється початковим етапом майбутнього зростання в сфері ІТ.
7. Список використаних джерел
1) https://ru.wikipedia.org/wiki/Си_(язык_программирования)
2) https://prog-cpp.ru/c/
3) https://tproger.ru/tag/c-language/
4) http://kpolyakov.spb.ru/school/c.htm
5) https://habrahabr.ru/company/nixsolutions/blog/265427/
6) Шилдт Г. , C++: базовый курс, 3-е издание . –М.: Вильямс, 2005. -624 ст.
7) Шилдт Г. , Справочник программиста по C/C++, 3-е издание. –М.:
Вильямс, 2003. -432 ст.
Додаток 1.
Завдання №1
Текст програми
#include <locale.h>
#include <stdio.h>
#include <stdbool.h>

//Функция сравнивает часть с первой строки со второй строкой


bool Check(char * mainStr, char * str, int pos)
{
int index = 0;
for (int i = pos; i < pos + strlen(str); i++)
if (mainStr[i] != str[index++])
return false;
return true;
}

//Функция делает то, что и Check, но демонстрирует арифметику указателей


bool CheckWithPtr(char * mainPtr, char * ptr, int pos)
{
int index = 0;
for (int i = pos; i < pos + strlen(ptr); i++)
if (*(mainPtr + i) != *(ptr + index++))
return false;
return true;
}

//Функция возвращает позицию последнего вхождения подстроки в строку


int Position(char * mainStr, char * str)
{
if ( strlen(mainStr) > 0 && strlen(str) > 0 && strlen(mainStr) >= strlen(str))
//Проверка на граничные условия
for (int i = strlen(mainStr) - strlen(str); i >= 0; i--)//Идём с конца
if (Check(mainStr, str, i))
return i;
return -1;//Если такой подстроки не найдено
}

void main()
{
setlocale(LC_ALL, "Russian");
char * mainStr = (char*)malloc(100 * sizeof(char)); //Cтрока
char * str = (char*)malloc(100 * sizeof(char)); //Подстрока
char * mainPtr = mainStr, ptr = str;//Указатели на строки
printf("Введите главную строку: ");
gets(mainStr);

printf("Введите подстроку: ");


gets(str);

int position = Position(mainStr, str);


if (position != -1)
printf("Позиция последнего вхождения подстроки: %d\n", position);
else
printf("Данная подстрока не найдена в строке!\n");

free(mainStr); free(str);
printf("Программа завершена, для выхода нажмите любую кнопку!\n");
_getch();
}
Завдання №2
Текст програми
#include <locale.h>
#include <stdio.h>
#include <time.h>
#include <stdbool.h>

//Вывод матрицы на екран


void Print(int ** matrix, int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
printf("%d ", matrix[i][j]);
printf("\n");
}
}

//Генерирование матрицы
int ** GenerateMatrix(int size)
{
srand(time(NULL));
int **matrix = (int**)malloc(size * sizeof(int*));//Выделяем память на
матрицу
for (int i = 0; i<size; i++)
matrix[i] = (int*)malloc(size * sizeof(int));//Выделяем память на
каждую её строку
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
matrix[i][j] = rand() % 100;//Заполняем рандомными числами
return matrix;//Возвращаем сгенерированную матрицу
}

//Поиск количества вхождения числа в матрицу


int SearchCount(int ** matrix, int size, int elem)
{
int count = 0;
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
if (matrix[i][j] == elem)
++count;
return count;
}

//Поиск числа, которое "следующее минимальное"


int SearchNextMin(int ** matrix, int size, int minE, int maxE)
{
int min = maxE;
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
if (matrix[i][j] < min && matrix[i][j] > minE)//Если находим
новый минимум и он больше старого
min = matrix[i][j];
return min;
}

void Task(int ** matrix, int size)


{
//Поиск начальных минимальных и максимальных елементов матрицы
int max = matrix[0][0], min = matrix[0][0];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (matrix[i][j] < min)
min = matrix[i][j];
if (matrix[i][j] > max)
max = matrix[i][j];
}
}

//Поиск следующего минимума


printf("Минимальное число, которое встречается в матрице хотя-бы два
раза: ");
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
min = SearchNextMin(matrix, size, min, max);//...
if (SearchCount(matrix, size, min) >= 2)//...
{
printf("%d\n", min);
return;
}
}
}

printf("таких чисел не найдено!\n");


}

void main()
{
setlocale(LC_ALL, "Russian");
int ** matrix = NULL;
int size;

while (true)
{
printf("Введите размерность матрицы [6;10]: ");
rewind(stdin); scanf_s("%d", &size);
if (size >= 6 && size <= 10)
break;
}

printf("Сгенерированная матрица:\n");
matrix = GenerateMatrix(size);
Print(matrix, size);

Task(matrix, size);

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


free(matrix[i]);
free(matrix);

printf("Программа завершена, для выхода нажмите любую кнопку!\n");


_getch();
}
Завдання №3
Текст програми
#include <stdio.h>
#include <locale.h>
#include <cstdbool>

//Вывод массива чисел на екран


void Print(int * mas)
{
for (int i = 0; mas[i] != NULL; i++)
printf("%d ", mas[i]);
printf("\n");
}

//Считка массива с файла


int * ReadFile(char * fname)
{
FILE *file;//Переменная для работы с файлом
fopen_s(&file, fname, "r");//Открываем для чтения
if (file == NULL)//Если результат открытия неопределён
{
printf("Не могу открыть файл '%s'\n", fname);
printf("Программа завершена, для выхода нажмите любую клавишу
");
_getch();
exit(1);
}
else
printf("Файл '%s' успешно открыт\n", fname);

char * c = (char*)malloc(10 * sizeof(char)); int N = 0;


while (fgets(c, 10, file))//Подсчитываем количество елементов в файле
++N;

if (N < 1)//Если файл пуст


{
printf("Файл('%s') пуст\n", fname);
printf("Программа завершена, для выхода нажмите любую клавишу
");
_getch();
exit(1);
}

fseek(file, 0, 0);//Переустанавливаем указатель на начало файла


int *mas = (int*)malloc((N + 1) * sizeof(int));//Выделяем память на массив
int index = 0;
while (index < N)//Читаем новый елемент массива
fscanf_s(file, "%d", &mas[index++]);
mas[index] = NULL;

fclose(file);//Закрываем подключение
return mas;//Возвращаем указатель на массив
}

//Сохранение массива в файл


void SaveToFile(int * mas, char * fname)
{
FILE *file;//Переменная для работы с файлом
fopen_s(&file, fname, "w");//Открываем для записи (модификатор "w")
if (file == NULL)//Если мы открыли файл, то в переменной file появилось
какое-то значение. А раз его нет
{
printf("Не могу открыть файл '%s'!\n", fname);//то
printf("Программа завершена, для выхода нажмите любую клавишу
");
_getch();
exit(1);
}
for (int i = 0; mas[i] != NULL; i++)//Записываем в файл массив
{
fprintf(file, "%d\n", mas[i]);
}
fclose(file);//Закрываем файл, завершаем запись
printf("Массив успешно записан в файл - %s\n", fname);
}

//Конвертируем в двоичную систему


void BinaryConvert(int number)
{
if (number / 2 != 0) //Если это не конец деления
BinaryConvert(number / 2);//Рекурсивно вызываем саму себя
printf("%d", number % 2);//Печатаем бит
}

//Конвертируем в шестнадцатеричную систему


void HexConvert(int number)
{
if (number / 16 != 0) //Если это не конец деления
HexConvert(number / 16);//Рекурсивно вызываем саму себя
if (number % 16 < 10)//Если результат не буква
printf("%d", number % 16);//Печатаем цифру
else
printf("%c", number % 16 + 55);//Получаем смещение по ASCII
таблице и печатаем букву
}

//Конвертируем в символ
void SymbolConvert(int number)
{
if (number < 256)
printf("%c", number);
else
printf("Символа с таким кодом нет!");
}

//Проверка бита на 0 или 1


bool CheckBit(int number, unsigned int pos)
{
return number & (1 << pos);
}

//Печать двух елементов в разных системах


void PrintToOtherSystem(int number1, int number2)
{
printf("%d(10) - %d(10)\n", number1, number2);
BinaryConvert(number1); printf("(2) - "); BinaryConvert(number2);
printf("(2)\n");
HexConvert(number1); printf("(16) - "); HexConvert(number2);
printf("(16)\n");
SymbolConvert(number1); printf("(c) - "); SymbolConvert(number2);
printf("(c)\n");
printf("-------------------------------------------------------------------------\n");
}

//Обмен двух полубайтов местами


int * SwapsHalfBytes(int * mas)
{
for (int i = 0; mas[i] != NULL; i++)//Проходим по елементам массива
{
int temp = mas[i];
for (unsigned int j = 0; j < 32; j+=8)//Проходим по битам числа
{
for (int k = j; k < j + 4; k++)//Проходим по полубайтам
{
if (CheckBit(mas[i], k) && !CheckBit(mas[i], k+4))//Если
бит из младшего полубайта - 1, а из старшого - 0
{
mas[i] &= ~(1 << k);//Устанавливаем в 0
mas[i] |= (1 << (k+4));//Устанавливаем в 1
}
else if (!CheckBit(mas[i], k) && CheckBit(mas[i], k +
4))//Если бит из младшего полубайта - 0, а из старшого - 1
{
mas[i] &= ~(1 << (k + 4));//Устанавливаем в 0
mas[i] |= (1 << k);//Устанавливаем в 1
}
}
}
PrintToOtherSystem(temp, mas[i]);
}
return mas;//Возвращаем изменённый массив
}

void main()
{
setlocale(LC_ALL, "Russian");
int * mas = NULL;
char * input = (char*)malloc(100 * sizeof(char));
char * output = (char*)malloc(100 * sizeof(char));

printf("ВВЕДИТЕ ИМЯ ВХОДНОГО ФАЙЛА: ");


rewind(stdin);//Очистка потока ввода
gets(input);

printf("ВВЕДИТЕ ИМЯ ВЫХОДНОГО ФАЙЛА: ");


rewind(stdin);
gets(output);

mas = ReadFile(input);
printf("ИСХОДНЫЙ МАССИВ:\n");
Print(mas);

printf("МЕНЯЕМ МЕСТАМИ ВСЕ ПОЛУБАЙТЫ:\n");


printf("-------------------------------------------------------------------------\n");
mas = SwapsHalfBytes(mas);

SaveToFile(mas, output);

free(input); free(output); free(mas);


printf("Программа завершена, для выхода нажмите любую клавишу ");
_getch();
}
Завдання №4
Текст програми
#include <stdio.h>
#include <locale.h>
#include <math.h>
#include <stdbool.h>

unsigned int size = 0;

//Структура слово
struct Word
{
char word[7];
};

//Печать матрицы структур


void Print(struct Word **matrix)
{
for (unsigned int i = 0; i < size; i++)
{
for (unsigned int j = 0; j < size; j++)
printf("%s ", matrix[i][j].word);//Печать отдельного слова
printf("\n");
}
}

//Считка с файла матрицы


struct Word ** Read(struct Word ** matrix, char *fname)
{
FILE *file;//Переменная для работы с файлом
fopen_s(&file, fname, "r");//открываем файл для чтения
if (file == NULL)//Если результат открытия ноль
{
printf("Не могу открыть файл '%s'", fname);
_getch();
exit(1);
}

unsigned int count = 0;


char * temp = (char *)malloc(10 * sizeof(char));//Временная переменная
while (fgets(temp, 10, file))//Подсчитываем размерность size (количество
строк)
++count;
free(temp);

if (count > 0)
{
if ((int)sqrt(count) == sqrt(count))
{
fseek(file, 0, 0);//Устанавливаем указатель на начало файла

size = (int)sqrt(count);//Получаем размер матрицы


matrix = (struct Word**)malloc(size * sizeof(struct
Word*));//Выделяем память на матрицу, на сам "костяк"
for (unsigned int i = 0; i < size; i++)
matrix[i] = (struct Word*)malloc(size * sizeof(struct
Word));//Выделяем память по строкам

for (unsigned int i = 0; i < size; i++)


{
for (unsigned int j = 0; j < size; j++)
{
fgets(matrix[i][j].word, 7, file);//Читаем до \0
fseek(file, 2, SEEK_CUR);//Переносим указатель
на следующую строку
matrix[i][j].word[6] = NULL;//Устанавливаем
последний в NULL, чтобы не было мусора
}
}
fclose(file);//Закрываем файл и завершаем с ним работу
return matrix;
}
else
{
printf("Матрица не квадратная!\n");
printf("Программа завершена, для выхода нажмите любую
клавишу ");
_getch();
exit(1);
}
}
else
{
printf("Файл пуст!\n");
printf("Программа завершена, для выхода нажмите любую клавишу
");
_getch();
exit(1);
}
}

//Сохраняем в файл результаты работы


void Save(struct Word ** matrix, char * fname)
{
FILE *file;//Переменная для работы с файлом
fopen_s(&file, fname, "w");//Открываем для записи (модификатор "w")
if (file == NULL)//Если мы открыли файл, то в переменной file появилось
какое-то значение. А раз его нет
{
printf("Не могу открыть файл '%s'", fname);//то
_getch();
exit(1);
}

for (unsigned int i = 0; i < size; i++)


for (unsigned int j = 0; j < size; j++)
fprintf(file, "%s\n", matrix[i][j].word);//Записываем в файл
каждое слово

fclose(file);//Закрываем файл, завершаем запись


printf("Матрица успешно записана в файл - %s\n", fname);
}

//Функция для сравнения двух строк (<, >, ==)


int Simile(char * firstWord, char * lastWord)
{
int length = strlen(firstWord) > strlen(lastWord) ? strlen(firstWord) :
strlen(lastWord);
for (int i = 0; i < length; i++)
{
if (firstWord[i] > lastWord[i])//Если первая строка по алфавиту
поздже
return 1;
else if (firstWord[i] < lastWord[i])//Если раньше
return -1;
}
return 0;//Если строки равны
}

//Линейный поиск
bool LineSearch(struct Word ** matrix, char * word)
{
for (unsigned int i = 0; i < size; i++)//Проходим по диагонали
if (Simile(matrix[i][i].word, word) == 0)//Если находим совпадение
return true;
return false;
}

//Бинарный поиск
bool BinarySearch(struct Word ** matrix, char * word)
{
int average_index = 0, // переменная для хранения индекса среднего
элемента массива
first_index = 0, // индекс первого элемента в массиве
last_index = size - 1; // индекс последнего элемента в массиве
//------------------------------------------------
--------

while (first_index < last_index)//Пока левая граница левее правой


{
average_index = first_index + (last_index - first_index) / 2; // меняем
индекс среднего значения

//Если искомое слово раньше в алфавите, чем текущее


или равно ему
if (Simile(word, matrix[average_index][average_index].word) == 1 ||
Simile(word, matrix[average_index][average_index].word) == 0)
last_index = average_index;
else
first_index = average_index + 1;
}
if (Simile(matrix[last_index][last_index].word, word) == 0)// найден
ключевой элемент или нет
return true;
else
return false;
}

//Сортировка методом минимумов-максимумов


struct Word ** MinimumSort(struct Word ** matrix)
{
for (int i = 0; i < size; i++)
{
struct Word min = matrix[i][i];//Максимальный елемент
int index = i;
for (int j = i + 1; j < size; j++)//Проходим на единицу правей места,
что уже упорядочено
{
if (Simile(matrix[j][j].word, min.word) == 1)//Если текущее
слово больше, чем максимум
{
min = matrix[j][j];//Это новый максимум
index = j;//Запоминаем его индекс
}
}
matrix[index][index] = matrix[i][i];//Ставим максимум на его место
matrix[i][i] = min;//Меняя местами с текущим елементом
}
return matrix;
}

void main()
{
setlocale(LC_ALL, "Russian");

struct Word ** matrix = NULL;


char * read = (char*)malloc(100 * sizeof(char));//Входной файл
char * write = (char*)malloc(100 * sizeof(char));//Выходной файл

printf("Введите имя входного файла: ");


gets(read);

printf("Введите имя выходного файла: ");


gets(write);

printf("Считанная матрица с файла:\n");


matrix = Read(matrix, read);
Print(matrix);

printf("Сортировка матрицы на главной диагонали:\n");


matrix = MinimumSort(matrix);
Print(matrix);

char * word = (char*)malloc(6 * sizeof(char));


printf("Какое слово ищем на главной диагонали? ");
gets(word);

if (LineSearch(matrix, word))
printf("Линейный поиск: слово найдено\n");
else
printf("Линейный поиск: слово не найдено\n");
if (BinarySearch(matrix, word))
printf("Бинарный поиск: слово найдено\n");
else
printf("Бинарный поиск: слово не найдено\n");

Save(matrix, write);
for (unsigned int i = 0; i < size; i++)
free(matrix[i]);
free(matrix); free(read); free(write);
printf("Программа завершена, для выхода нажмите любую клавишу ");
_getch();
}
Блок-схеми

You might also like