Advertisement
193030

Strypes Homework #2 array rotation

Oct 31st, 2021
830
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. /*
  2.  *
  3.  * 1.
  4. Напишете процедура на езика C, която обръща съдържанието на участък от целочислен (int) масив.
  5. Параметри на процедурата трябва да са масивът и индексите p и q, такива, че е вярно p ≤ q.
  6. Индексите задават полуотворен интервал [p,q), съдържанието на който трябва да се обърне.
  7. Например, ако p = 3 и q = 7, а масивът съдържа 1 2 3 4 5 6 7 8 9 10, процедурата трябва да го промени на 1 2 3 7 6 5 4 8 9 10.
  8. Процедурата трябва да работи „на място" - без да използва друг масив.
  9. 0 1 2 3 4 5 6 7 8 9
  10. 1 2 3 4 5 6 7 8 9 10
  11. 1 2 3 7 6 5 4 8 9 10.
  12.  
  13. >=3 <7
  14.  
  15. 2.
  16. Като използвате процедурата от т.1 напишете процедура, която разменя съдържанието на два съседни участъка в целочислен масив.
  17. Параметри на процедурата трябва да са масивът и индексите p, q и r, такива, че е вярно p ≤ q ≤ r.
  18. Индексите задават полуотворените интервали [p,q) и [q,r), които трябва да разменят местата си.
  19. Например, ако p = 4, q = 7 и r = 9, а масивът съдържа 1 2 3 4 5 6 7 8 9 10, процедурата трябва да го промени на 1 2 3 4 8 9 5 6 7 10.
  20. Процедурата трябва да работи „на място" - без да използва друг масив.
  21.  
  22.  */
  23. #include <stdio.h>
  24. #define Arraysize(a) (sizeof(a)/sizeof(a[0]))
  25. void PrintArray(int a[], int n)
  26. {
  27.     for (int i = 0; i < n; i++)
  28.         printf("%d ", a[i]);
  29.     printf("\n");
  30. }
  31.  
  32. void swap(int *a, int *b)
  33. {
  34.     int temp = *a;
  35.     *a = *b;
  36.     *b = temp;
  37. }
  38. void reverseArray(int arr[], int n)
  39. {
  40.     int nMax = n-1;
  41.     for(int i=0; i<5;i++)
  42.     {
  43.         swap(&arr[i], &arr[nMax--]);
  44.     }
  45. }
  46.  
  47. // Reverse subarray with indexes [p,q)
  48. void reverseArrayPart(int arr[], int n, int p, int q)
  49. {
  50.     int nMax = q - 1;
  51.     int range = (q - p) / 2;
  52.     for (int i = p; i < p+range; i++)
  53.     {
  54.         swap(&arr[i], &arr[nMax--]);
  55.     }
  56. }
  57.  
  58. // Rotating subarray to left one time
  59. void leftRotateByOneSubRange(int arr[], int begin, int end)
  60. {
  61.     int temp = arr[begin];
  62.     for (int i = begin; i < end - 1; i++)
  63.     {
  64.         arr[i] = arr[i + 1];
  65.     }
  66.     arr[end- 1] = temp;
  67. }
  68.  
  69. // Rotating the arr with range [p-r)
  70. void rotateSubArray(int arr[], int n, int p, int q, int r)
  71. {
  72.     p = p - 1;
  73.     int steps = q - p - 1;
  74.     for (int i = 0; i < steps; i++)
  75.     {
  76.         leftRotateByOneSubRange(arr, p+1,r);
  77.     }
  78. }
  79.  
  80. int main()
  81. {
  82.  
  83.     int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  84.     int array2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // second array for the second procedure
  85.  
  86.     int arrSize = Arraysize(array);
  87.     PrintArray(array, arrSize);
  88.    
  89.     reverseArrayPart(array, arrSize,3,7); // Task 1
  90.     PrintArray(array, arrSize);
  91.    
  92.     rotateSubArray(array2, arrSize,4,7,9); // Task 2
  93.     PrintArray(array2, arrSize);
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement