-
Notifications
You must be signed in to change notification settings - Fork 0
Hw5 sorting station #4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
dfc6e59
fa6c354
129695f
e458898
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,113 @@ | ||
| // | ||
| // Created by sasha on 23.10.2025. | ||
| // | ||
|
|
||
| #include "sortingStation.h" | ||
|
|
||
| #include <stdio.h> | ||
| #include <ctype.h> | ||
| #include <string.h> | ||
| #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; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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. В конце все оставшиеся операторы выталкиваются из стека | ||
| // | ||
|
Comment on lines
+35
to
+41
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Описать используемый алгоритм -- очень хорошая идея, странно, что кроме Вас никто так не сделал. Ещё хорошо было бы здесь указать, что это алгоритм Сортировочной станции (или Дейкстры). |
||
| void toPostfix(char infix[], char postfix[]); | ||
|
|
||
| #endif //TEST_SORTINGSTATION_H | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 - стек не пуст | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Функции, которые что-то проверяют обычно начинаются с |
||
|
|
||
| #endif //TEST_STACK_H | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Надо удалить лишние файлы из PR. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| #include <stdio.h> | ||
|
|
||
| // Объявление функции | ||
| 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; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| // | ||
| // Created by sasha on 17.10.2025. | ||
| // | ||
|
|
||
| //Напечатать на экран все из диапазона [1;n], | ||
| //которые являются палиндромами в двоичной записи. Выводить в десятичной системе счисления. | ||
|
|
||
| #include <stdio.h> | ||
| #include <string.h> | ||
|
|
||
| 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; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Стайлгайд запрещает использование include guards. Вместо них надо использовать
pragma once.Да и вообще, include guards сейчас используются только в древних проектах, типа стандартной библиотеки C или ядра Linux. Сейчас все стараются переходить на
pragma once.