From dfc6e5988b8bc95410038cab0988737bf16047c0 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Tue, 7 Oct 2025 20:50:06 +0000 Subject: [PATCH 1/4] Add homework optimal sort --- src/hw_Optimal_Sort/main.c | 25 +++++++++++++++++++++++++ src/hw_Optimal_Sort/sort.c | 16 ++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/hw_Optimal_Sort/main.c create mode 100644 src/hw_Optimal_Sort/sort.c diff --git a/src/hw_Optimal_Sort/main.c b/src/hw_Optimal_Sort/main.c new file mode 100644 index 0000000..ea4fa97 --- /dev/null +++ b/src/hw_Optimal_Sort/main.c @@ -0,0 +1,25 @@ +#include + +// Объявление функции +extern int sort_array(int array[], int count); + +// Основной код - объявление массива на 100 чисел, создание счетчика, чтобы знать со сколькими числами надо будет работать, чтение чисел через for с scanf и вывод +int main() { + int array[100]; + int count = 0; + + int i = 0; + while (i < 100 && scanf("%d", &array[i]) == 1) { + i++; + count++; + } + + int moved = sort_array(array, count); + + printf("Отсортированный массив:"); + for (int i = 0; i < count; i++) { + printf("%d ", array[i]); + } + printf("\n"); + return 0; +} diff --git a/src/hw_Optimal_Sort/sort.c b/src/hw_Optimal_Sort/sort.c new file mode 100644 index 0000000..b535d0e --- /dev/null +++ b/src/hw_Optimal_Sort/sort.c @@ -0,0 +1,16 @@ +int sort_array(int* array, int count) { + int moved_count = 0; + // сортировка пузырьком + for (int i = 0; i < count - 1; i++) { + for (int j = 0; j < count - i - 1; j++) { + if (array[j] > array[j + 1]) { + int temp = array[j]; + array[j] = array[j + 1]; + array[j + 1] = temp; + moved_count++; + } + } + } + + return moved_count; +} From fa6c3545826240f24290b78e092bdaff416fd3ee Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Fri, 17 Oct 2025 14:16:57 +0000 Subject: [PATCH 2/4] Added 2 files --- src/kr/diffPalindrome.c | 67 +++++++++++++++++++++++++++++++++++++++++ src/kr/max.c | 49 ++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 src/kr/diffPalindrome.c create mode 100644 src/kr/max.c diff --git a/src/kr/diffPalindrome.c b/src/kr/diffPalindrome.c new file mode 100644 index 0000000..2520787 --- /dev/null +++ b/src/kr/diffPalindrome.c @@ -0,0 +1,67 @@ +// +// Created by sasha on 17.10.2025. +// + +//Напечатать на экран все из диапазона [1;n], +//которые являются палиндромами в двоичной записи. Выводить в десятичной системе счисления. + +#include +#include + +int systemChangerTo2(int n) { + int binaryNum[1000]; //Массив для числа во вторичной + char charBinaryNum[1000]; // Массив для числа во вторичной, но в виде строки + int i = 0; + int len = 0; + + while (n > 0) { + binaryNum[i] = n % 2; + n = n / 2; + i++; + len = i; // Длина массива + } + + for (i = 0; i < len; i++) { + charBinaryNum[i] = binaryNum[i] + '0'; + } + + int left = 0; + int right = strlen(charBinaryNum) - 1; + + while (left <= right) { + if (charBinaryNum[left] == charBinaryNum[right]) { + left++; + right--; + } else { + return 0; + } + if (left > right) { + return 1; + } + } +} + + + + +int main(void) { + int n = 0; + + printf("Введите n \n"); + scanf("%d",&n); + + int arr[n]; + int num = 0; + + for (int i = 0; i < n; i++) { + arr[i] = num; + num++; + + if (systemChangerTo2(num) == 1) { + printf("%d\n", num); + } + } + + + return 0; +} diff --git a/src/kr/max.c b/src/kr/max.c new file mode 100644 index 0000000..11e420e --- /dev/null +++ b/src/kr/max.c @@ -0,0 +1,49 @@ +// +// В массиве целых чисел найти число, сумма цифр которого была бы наибольшей. +// Если таких чисел несколько, вывести на экран все эти числа. +// + +#include + +// Функция нахождения максимальной суммы +int finder(int arr[], int size) { + int sum = 0; + for (int i = 0; i < size; i++) { + int tempSum = 0; // Временная сумма для каждого отдельно взятого числа + int temp = arr[i]; + + while (temp / 10 != 0) { // "Резатель числа", режем - пока оно не станет нулевым, прибавляем хвостик к сумме + tempSum += (temp % 10); + temp = temp/10; + printf("Sum %d\n", tempSum); + printf("%d \n", temp); + } + tempSum = temp + tempSum; + printf("Sum %d\n", tempSum); + + if (tempSum > sum) { + sum = tempSum; + } + } + return sum; +} + +int main(void) { + int size = 0; + + printf("Введите колво чисел в массиве (len) \n"); + scanf("%d",&size); + + int arr[size]; + + printf("Введите сами числа в массив \n"); + for (int i = 0; i < size; i++) { + scanf("%d",&arr[i]); + } + + int maxSum = finder(arr, size); + + printf("\n"); + printf("Max sum of numbers %d", maxSum); + return 0; +} From 129695f459559931083986efe2e185e24ba04598 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Thu, 23 Oct 2025 20:21:11 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20stack.c=20?= =?UTF-8?q?=D0=B8=20stack.h=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=82=D1=8D?= =?UTF-8?q?=D0=BA=D0=B0,=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=B2=D1=83=D1=85=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=20=D0=B2=20=D0=94=D0=97=5F5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hw5_Sort_And_Queue/stack.c | 35 +++++++++++++++++++++++ src/hw5_Sort_And_Queue/stack.h | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/hw5_Sort_And_Queue/stack.c create mode 100644 src/hw5_Sort_And_Queue/stack.h diff --git a/src/hw5_Sort_And_Queue/stack.c b/src/hw5_Sort_And_Queue/stack.c new file mode 100644 index 0000000..9b785c9 --- /dev/null +++ b/src/hw5_Sort_And_Queue/stack.c @@ -0,0 +1,35 @@ +// +// Created by sasha on 23.10.2025. +// + +#include "stack.h" + +// Создаем стэк, делая значение top равным -1 ("нет элементов") +void init_stack(Stack *stack) { + stack->topIndex = -1; +} + +// Добавляем элемент +void push(Stack *stack, char value) { + stack->topIndex++; // Увеличиваем индекс на 1 + stack->elements[stack->topIndex] = value; // Добавляем сам элемент в массив +} + +// Берем верхний элемент и удаляем его +char pop(Stack *stack) { + if (StackEmptiness(stack)) { // Проверяем не пуст ли стек + return '\0'; // Возвращаем '\0' если пуст (в таком виде, потому что нужно вернуть char) + } + char value = stack->elements[stack->topIndex]; // Сохраняем верхний элемент + stack->topIndex--; // Уменьшаем индекс + return value; // Возвращаем сохраненный элемент +} + +// Проверяем пуст ли стек (Чтоб не убрать "пустоту") +int StackEmptiness(Stack *stack) { + if (stack->topIndex == -1) { + return 1; // 1 - стек пуст + } else { + return 0; // 0 - стек не пуст + } +} \ No newline at end of file diff --git a/src/hw5_Sort_And_Queue/stack.h b/src/hw5_Sort_And_Queue/stack.h new file mode 100644 index 0000000..a9a024a --- /dev/null +++ b/src/hw5_Sort_And_Queue/stack.h @@ -0,0 +1,51 @@ +// +// File: stack.h +// Author: Alexandra Dolzhenko +// +// Description: Этот модуль предоставляет функции для работы со стеком: +// создание стэка (init_stack), добавление (push), извлечение элементов (pop) и проверка на пустоту (is_empty). +// Нужен для двух задач: Продвинутый баланс скобок и Сортировочная станция +// + +#ifndef TEST_STACK_H +#define TEST_STACK_H +#define STACK_SIZE 1000 // Ограничим максимальный размер стэка до 1000 + + + +// +// Структура для стека +// В ней создаем char массив для хранения элементов длины STACK_SIZE и переменную для хранения индекса верхнего элемента +// +typedef struct { + char elements[STACK_SIZE]; // массив для хранения + int topIndex; // индекс верхнего элемента +} Stack; + +// +// Создание стека +// В качестве параметра берем указатель на стек (для изменения самого стека, а не только копии) +// +void init_stack(Stack *stack); + +// +// Добавление элемента в стек +// Параметр - Указатель на стек и значение элемента для добавления +// +void push(Stack *stack, char value); + +// +// Удаление элемента из стека с проверкой на пустоту +// Параметр - Указатель на стек +// Вернет значение элемента, если есть что удалять, и 0 если нет +// +char pop(Stack *stack); + +// +// Проверка стэка на пустоту +// Параметр - Указатель на стек +// Вернет +// +int StackEmptiness(Stack *stack); + +#endif //TEST_STACK_H \ No newline at end of file From e4588985cd84f22e78984c9fed05385b0f9f42e5 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Thu, 23 Oct 2025 20:22:44 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20sortingStation.?= =?UTF-8?q?c=20=D0=B8=20sortingStation.h=20=D0=B4=D0=BB=D1=8F=20=D0=94?= =?UTF-8?q?=D0=97=5F5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hw5_Sort_And_Queue/sortingStation.c | 113 ++++++++++++++++++++++++ src/hw5_Sort_And_Queue/sortingStation.h | 44 +++++++++ 2 files changed, 157 insertions(+) create mode 100644 src/hw5_Sort_And_Queue/sortingStation.c create mode 100644 src/hw5_Sort_And_Queue/sortingStation.h diff --git a/src/hw5_Sort_And_Queue/sortingStation.c b/src/hw5_Sort_And_Queue/sortingStation.c new file mode 100644 index 0000000..02df9ec --- /dev/null +++ b/src/hw5_Sort_And_Queue/sortingStation.c @@ -0,0 +1,113 @@ +// +// Created by sasha on 23.10.2025. +// + +#include "sortingStation.h" + +#include +#include +#include +#include "stack.h" + +// Проверяем является ли данный нам символ знаком операции (умножения/деления/сложения/вычитания) +int isOperator(char currElem) { + return currElem == '+' || currElem == '-' || currElem == '*' || currElem == '/'; +} + +// Проверяем приоритет данного нам знака (по мат законам у деления/умножения он выше чем у сложения/вычитания) +int priority(char currElem) { + if (currElem == '+' || currElem == '-') { + return 1; + } + if (currElem == '*' || currElem == '/') { + return 2; + } + return 0; +} + + +// Само преобразованиие Дейкстры +void toPostfix(char infix[], char postfix[]) { + Stack stack; + init_stack(&stack); + int postfix_index = 0; + + for (int i = 0; infix[i] != '\0'; i++) { + char currElem = infix[i]; + + // Пропускаем пробелы + if (currElem == ' ') { + continue; + } + + // Если цифра - добавляем в массив postfix, так как числа идут первыми, а потом операции + if (isdigit(currElem)) { + postfix[postfix_index++] = currElem; // Добавляем число в следующий индекс массива + postfix[postfix_index++] = ' '; // Делаем пробелы между символами, чтоб не слипалось + } + + // Если открывающая скобка, то в стек + else if (currElem == '(') { + push(&stack, currElem); + } + + // Закрывающая скобка завершает выражение в скобках. + // Вынимаем из стека все операции пока не найдем открывающую скобку + else if (currElem == ')') { + while (!StackEmptiness(&stack)) { + char operator = pop(&stack); + if (operator == '(') { + break; + } + postfix[postfix_index++] = operator; + postfix[postfix_index++] = ' '; + } + } + // Если операция + else if (isOperator(currElem)) { + // Вынимаем операторы с более высоким или равным приоритетом, так как надо чтобы в выражениях, где важен порядок, они выполнялись быстрее + while (!StackEmptiness(&stack)) { + char lastOperator = stack.elements[stack.topIndex]; + if (lastOperator == '(') { // Останавливаем, если встречаем открывающую скобку + break; + } + if (priority(lastOperator) >= priority(currElem)) { // Сравниваем приоритетность операторов + // Оператор из стека имеет высший или равный приоритет - вынимаем его + pop(&stack); + postfix[postfix_index++] = lastOperator; + postfix[postfix_index++] = ' '; + } else { + // Оператор из стека имеет низший - останаваливаем вынимание + break; + } + } + // Кладем текущий оператор в стек + push(&stack, currElem); + } + } + + // Вынимаем все оставшиеся символы операций из стека + while (!StackEmptiness(&stack)) { + char lastOperator = pop(&stack); + postfix[postfix_index++] = lastOperator; + postfix[postfix_index++] = ' '; + } +} + +int main() { + char infix[500]; + char postfix[500]; + + printf("Введите выражение со скобками, цифрами и операторами "); + fgets(infix, sizeof(infix), stdin); + + + infix[strlen(infix) - 1] = '\0'; + + toPostfix(infix, postfix); + + printf("Инфиксная форма: %s\n", infix); + printf("Постфиксная форма: %s\n", postfix); + + return 0; +} \ No newline at end of file diff --git a/src/hw5_Sort_And_Queue/sortingStation.h b/src/hw5_Sort_And_Queue/sortingStation.h new file mode 100644 index 0000000..0ced9ca --- /dev/null +++ b/src/hw5_Sort_And_Queue/sortingStation.h @@ -0,0 +1,44 @@ + +// +// File: sortingStation.h +// Author: Alexandra Dolzhenko +// +// Description: Этот модуль предоставляет функции для преобразования +// математических выражений из инфиксной формы в постфиксную (обратную польскую запись) +// с использованием алгоритма "сортировочной станции" Э. Дейкстры. +// Поддерживает операции: +, -, *, /, скобки () и цифры. +// + +#ifndef TEST_SORTINGSTATION_H +#define TEST_SORTINGSTATION_H + +// +// Проверяет является ли символ оператором +// Параметр: currElem - символ для проверки +// Возвращает: 1 если оператор, 0 если нет +// +int isOperator(char currElem); + +// +// Определяет приоритет оператора +// Параметр: currElem - оператор +// Возвращает: 2 для * /, 1 для + -, 0 для других символов +// +int priority(char currElem); + +// +// Преобразует инфиксное выражение в постфиксное +// Параметры: +// infix - входное инфиксное выражение +// postfix - выходной буфер для постфиксного выражения +// +// Алгоритм: +// 1. Числа сразу добавляются в выходной массив +// 2. Открывающие скобки помещаются в стек +// 3. Закрывающие скобки выталкивают операторы из стека до открывающей скобки +// 4. Операторы выталкивают из стека операторы с высшим или равным приоритетом +// 5. В конце все оставшиеся операторы выталкиваются из стека +// +void toPostfix(char infix[], char postfix[]); + +#endif //TEST_SORTINGSTATION_H \ No newline at end of file