Advertisement
PIBogdanov

Sequence without modifications

Nov 8th, 2024
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.65 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #pragma warning(disable : 4996)
  5.  
  6. /*
  7.     Деклариране на процедура с 1 параметър.
  8.         - Указател към променлива от тип size_t
  9.     Процедурата служи за въвеждане на брой числа
  10. */
  11. void inputTheNumbersCount(size_t*);
  12.  
  13. /*
  14.     Деклариране на процедура с 2 параметъра.
  15.         - Указател към променлива от тип int
  16.         - Променлива от тип size_t
  17.     Процедурата служи за въвеждане на числа в едномерен int масив
  18. */
  19. void inputNumbersInTheSequence(int*, size_t);
  20.  
  21. /*
  22.     Деклариране на процедура с 2 параметъра.
  23.         - Указател към променлива от тип int
  24.         - Променлива от тип size_t
  25.     Процедурата служи за изкарване на едномерен int масив в конзолата
  26. */
  27. void printSequence(int*, size_t);
  28.  
  29. /*
  30.     Деклариране на процедура с 2 параметъра.
  31.         - Указател към променлива от тип int
  32.         - Променлива от тип size_t
  33.     Процедурата служи за извикането на процедурата за намирането на края на първата поредица
  34.     и при случай на намиране на край, извиква процедурата за пренареждането едномерния int масив
  35. */
  36. void orderTheNumbersInTheSequenceAndCheckIfTheyAreCorrect(int*, size_t);
  37.  
  38. /*
  39.     Деклариране на процедура с 2 параметъра.
  40.         - Указател към променлива от тип int
  41.         - Променлива от тип size_t
  42.     Процедурата служи за намирането на края на първата поредица в едномерен int масив
  43. */
  44. void orderSequence(int*, size_t);
  45.  
  46. /*
  47.     Деклариране на процедура с 2 параметъра.
  48.         - Указател към променлива от тип int
  49.         - Променлива от тип size_t
  50.     Процедурата служи за изместване на всеки елемент от едномерен int масив с 1 индекс надясно
  51. */
  52. void shiftToTheRightWithOneIndex(int*, size_t);
  53.  
  54. // Главна функция
  55. int main(void)
  56. {
  57.     /*
  58.         Деклариране на променлива от тип unsigned long long
  59.         (Също може да се зададе със запазената дума "size_t". Този тип данни съдържа стойности
  60.         От 0 до 18 446 744 073 709 551 615, това е 2 на 64 степен - 1)
  61.         и е зададена начална стойност 0
  62.     */
  63.     size_t numbersCount = 0;
  64.  
  65.     // Въвеждане на броя елементи на масива
  66.     inputTheNumbersCount(&numbersCount);
  67.  
  68.     fputc('\n', stdout);
  69.  
  70.     // Заделяне на памет с въвъдения брой елементи за масива от тип int
  71.     int *sequence = (int*)malloc(numbersCount * sizeof(int));
  72.  
  73.     // Въвеждане на стойности за всеки елемент от масив
  74.     inputNumbersInTheSequence(sequence, numbersCount);
  75.  
  76.     orderTheNumbersInTheSequenceAndCheckIfTheyAreCorrect(sequence, numbersCount);
  77.  
  78.     // Освобождаване на заделената памет
  79.     free(sequence);
  80.  
  81.     return 0;
  82. }
  83.  
  84. // Дефиниране на процедура, която служи за въвеждане на брой числа
  85. void inputTheNumbersCount(size_t *numbersCount)
  86. {
  87.     fputs("Input the elements' count in the sequence ( > 1 ): ", stdout);
  88.  
  89.     // Преглеждане на въведената стойност, докато е по-малка от 2
  90.     while ((*numbersCount) < 2)
  91.     {
  92.         scanf("%llu", numbersCount);
  93.     }
  94. }
  95.  
  96. // Дефиниране на процедура, която служи за въвеждане на числа в едномерен int масив
  97. void inputNumbersInTheSequence(int *sequence, size_t numbersCount)
  98. {
  99.     fputs("Input elements in the sequence:\n\n", stdout);
  100.  
  101.     // Въвеждане на стойност за всеки елемент от масива
  102.     for (size_t i = 0; i < numbersCount; i++)
  103.     {
  104.         fprintf(stdout, "sequence[%llu] = ", i);
  105.         scanf("%d", &sequence[i]);
  106.     }
  107. }
  108.  
  109. // Дефиниране на процедура, която служи за изкарване на едномерен int масив в конзолата
  110. void printSequence(int *sequence, size_t numbersCount)
  111. {
  112.     // Извеждане на стойностите на всеки елемент от масива
  113.     for (size_t i = 0; i < numbersCount; i++)
  114.     {
  115.         fprintf(stdout, "%d ", sequence[i]);
  116.     }
  117. }
  118.  
  119. /*
  120.     Дефиниране на процедура, която служи
  121.     за извикането на процедурата за намирането на края на първата поредица
  122.     и при случай на намиране на край, извиква процедурата за пренареждането едномерния int масив
  123. */
  124. void orderTheNumbersInTheSequenceAndCheckIfTheyAreCorrect(int *sequence, size_t numbersCount)
  125. {
  126.     // Извеждане на масива в първоначалния му вариант
  127.     fputs("\n\nBefore:\n", stdout);
  128.     printSequence(sequence, numbersCount);
  129.  
  130.     // Извикване на процедура, която служи за намирането на края на първата поредица в едномерен int масив
  131.     orderSequence(sequence, numbersCount);
  132.  
  133.     // Извеждане на масива след сортировката, ако е имало
  134.     fputs("\nAfter:\n", stdout);
  135.     printSequence(sequence, numbersCount);
  136.  
  137.     fputc('\n', stdout);
  138. }
  139.  
  140. // Дефиниране на процедура, която служи за намирането на края на първата поредица в едномерен int масив
  141. void orderSequence(int *sequence, size_t numbersCount)
  142. {
  143.     for (size_t i = 1; i < numbersCount; i++)
  144.     {
  145.         if (sequence[i] < sequence[i - 1])
  146.         {
  147.             shiftToTheRightWithOneIndex(sequence, i);
  148.  
  149.             break;
  150.         }
  151.     }
  152. }
  153.  
  154. // Дефиниране на процедура, която служи за изместване на всеки елемент от едномерен int масив с 1 индекс надясно
  155. void shiftToTheRightWithOneIndex(int *sequence, size_t dividerIndex)
  156. {
  157.     for (size_t i = dividerIndex; i > 0; i--)
  158.     {
  159.         /*
  160.             Разменят се елементите на позициите i и i - 1
  161.  
  162.             Обяснение:
  163.                 Тук се използва битовият оператор XOR за размяната на текущия елемент с предходния.
  164.  
  165.             Забележка:
  166.                 Методът XOR работи само ако стойностите в масива са цели числа.
  167.                 Ако числата са дробни, ще е нужно да се използва помощна променлива.
  168.         */
  169.         sequence[i] ^= sequence[i - 1];
  170.  
  171.         sequence[i - 1] ^= sequence[i];
  172.  
  173.         sequence[i] ^= sequence[i - 1];
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement