Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #pragma warning(disable : 4996)
- /*
- Деклариране на процедура с 1 параметър.
- - Указател към променлива от тип size_t
- Процедурата служи за въвеждане на брой числа
- */
- void inputTheNumbersCount(size_t*);
- /*
- Деклариране на процедура с 2 параметъра.
- - Указател към променлива от тип int
- - Променлива от тип size_t
- Процедурата служи за въвеждане на числа в едномерен int масив
- */
- void inputNumbersInTheSequence(int*, size_t);
- /*
- Деклариране на процедура с 2 параметъра.
- - Указател към променлива от тип int
- - Променлива от тип size_t
- Процедурата служи за изкарване на едномерен int масив в конзолата
- */
- void printSequence(int*, size_t);
- /*
- Деклариране на процедура с 2 параметъра.
- - Указател към променлива от тип int
- - Променлива от тип size_t
- Процедурата служи за извикането на процедурата за намирането на края на първата поредица
- и при случай на намиране на край, извиква процедурата за пренареждането едномерния int масив
- */
- void orderTheNumbersInTheSequenceAndCheckIfTheyAreCorrect(int*, size_t);
- /*
- Деклариране на процедура с 2 параметъра.
- - Указател към променлива от тип int
- - Променлива от тип size_t
- Процедурата служи за намирането на края на първата поредица в едномерен int масив
- */
- void orderSequence(int*, size_t);
- /*
- Деклариране на процедура с 2 параметъра.
- - Указател към променлива от тип int
- - Променлива от тип size_t
- Процедурата служи за изместване на всеки елемент от едномерен int масив с 1 индекс надясно
- */
- void shiftToTheRightWithOneIndex(int*, size_t);
- // Главна функция
- int main(void)
- {
- /*
- Деклариране на променлива от тип unsigned long long
- (Също може да се зададе със запазената дума "size_t". Този тип данни съдържа стойности
- От 0 до 18 446 744 073 709 551 615, това е 2 на 64 степен - 1)
- и е зададена начална стойност 0
- */
- size_t numbersCount = 0;
- // Въвеждане на броя елементи на масива
- inputTheNumbersCount(&numbersCount);
- fputc('\n', stdout);
- // Заделяне на памет с въвъдения брой елементи за масива от тип int
- int *sequence = (int*)malloc(numbersCount * sizeof(int));
- // Въвеждане на стойности за всеки елемент от масив
- inputNumbersInTheSequence(sequence, numbersCount);
- orderTheNumbersInTheSequenceAndCheckIfTheyAreCorrect(sequence, numbersCount);
- // Освобождаване на заделената памет
- free(sequence);
- return 0;
- }
- // Дефиниране на процедура, която служи за въвеждане на брой числа
- void inputTheNumbersCount(size_t *numbersCount)
- {
- fputs("Input the elements' count in the sequence ( > 1 ): ", stdout);
- // Преглеждане на въведената стойност, докато е по-малка от 2
- while ((*numbersCount) < 2)
- {
- scanf("%llu", numbersCount);
- }
- }
- // Дефиниране на процедура, която служи за въвеждане на числа в едномерен int масив
- void inputNumbersInTheSequence(int *sequence, size_t numbersCount)
- {
- fputs("Input elements in the sequence:\n\n", stdout);
- // Въвеждане на стойност за всеки елемент от масива
- for (size_t i = 0; i < numbersCount; i++)
- {
- fprintf(stdout, "sequence[%llu] = ", i);
- scanf("%d", &sequence[i]);
- }
- }
- // Дефиниране на процедура, която служи за изкарване на едномерен int масив в конзолата
- void printSequence(int *sequence, size_t numbersCount)
- {
- // Извеждане на стойностите на всеки елемент от масива
- for (size_t i = 0; i < numbersCount; i++)
- {
- fprintf(stdout, "%d ", sequence[i]);
- }
- }
- /*
- Дефиниране на процедура, която служи
- за извикането на процедурата за намирането на края на първата поредица
- и при случай на намиране на край, извиква процедурата за пренареждането едномерния int масив
- */
- void orderTheNumbersInTheSequenceAndCheckIfTheyAreCorrect(int *sequence, size_t numbersCount)
- {
- // Извеждане на масива в първоначалния му вариант
- fputs("\n\nBefore:\n", stdout);
- printSequence(sequence, numbersCount);
- // Извикване на процедура, която служи за намирането на края на първата поредица в едномерен int масив
- orderSequence(sequence, numbersCount);
- // Извеждане на масива след сортировката, ако е имало
- fputs("\nAfter:\n", stdout);
- printSequence(sequence, numbersCount);
- fputc('\n', stdout);
- }
- // Дефиниране на процедура, която служи за намирането на края на първата поредица в едномерен int масив
- void orderSequence(int *sequence, size_t numbersCount)
- {
- for (size_t i = 1; i < numbersCount; i++)
- {
- if (sequence[i] < sequence[i - 1])
- {
- shiftToTheRightWithOneIndex(sequence, i);
- break;
- }
- }
- }
- // Дефиниране на процедура, която служи за изместване на всеки елемент от едномерен int масив с 1 индекс надясно
- void shiftToTheRightWithOneIndex(int *sequence, size_t dividerIndex)
- {
- for (size_t i = dividerIndex; i > 0; i--)
- {
- /*
- Разменят се елементите на позициите i и i - 1
- Обяснение:
- Тук се използва битовият оператор XOR за размяната на текущия елемент с предходния.
- Забележка:
- Методът XOR работи само ако стойностите в масива са цели числа.
- Ако числата са дробни, ще е нужно да се използва помощна променлива.
- */
- sequence[i] ^= sequence[i - 1];
- sequence[i - 1] ^= sequence[i];
- sequence[i] ^= sequence[i - 1];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement