fork download
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct {
  6. int *values; // Values to sort
  7. int index; // Row or column index
  8. int size; // Number of elements in the row or column
  9. int order; // Sort order: 1 for ascending, 0 for descending
  10. } SortTask;
  11.  
  12. int **matrix;
  13. int rows, cols, studentIDEnd;
  14. long totalSum = 0;
  15. pthread_mutex_t sumMutex;
  16.  
  17. void *sortAndSum(void *arg);
  18. void quickSort(int *arr, int low, int high, int ascending);
  19. int partition(int *arr, int low, int high, int ascending);
  20. void swap(int *a, int *b);
  21. void initializeMatrix();
  22. void displayMatrix(int **mat, int rows, int cols);
  23.  
  24. int main() {
  25. initializeMatrix();
  26. pthread_mutex_init(&sumMutex, NULL);
  27.  
  28. int numThreads = (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) ? cols : rows;
  29. pthread_t threads[numThreads];
  30. SortTask tasks[numThreads];
  31.  
  32. for (int i = 0; i < numThreads; i++) {
  33. tasks[i].size = (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) ? rows : cols;
  34. tasks[i].values = malloc(tasks[i].size * sizeof(int));
  35. tasks[i].index = i;
  36. tasks[i].order = (studentIDEnd == 0 || studentIDEnd == 1 || studentIDEnd == 2 || studentIDEnd == 6 || studentIDEnd == 7);
  37.  
  38. for (int j = 0; j < tasks[i].size; j++) {
  39. tasks[i].values[j] = (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) ? matrix[j][i] : matrix[i][j];
  40. }
  41.  
  42. pthread_create(&threads[i], NULL, sortAndSum, &tasks[i]);
  43. }
  44.  
  45. for (int i = 0; i < numThreads; i++) {
  46. pthread_join(threads[i], NULL);
  47. for (int j = 0; j < tasks[i].size; j++) {
  48. if (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) {
  49. matrix[j][tasks[i].index] = tasks[i].values[j];
  50. } else {
  51. matrix[tasks[i].index][j] = tasks[i].values[j];
  52. }
  53. }
  54. free(tasks[i].values);
  55. }
  56.  
  57. pthread_mutex_destroy(&sumMutex);
  58.  
  59. printf("Sorted matrix:\n");
  60. displayMatrix(matrix, rows, cols);
  61. printf("Total sum of all elements: %ld\n", totalSum);
  62.  
  63. for (int i = 0; i < rows; i++) {
  64. free(matrix[i]);
  65. }
  66. free(matrix);
  67.  
  68. return 0;
  69. }
  70.  
  71. void initializeMatrix() {
  72. printf("Enter dimensions of the matrix (rows x cols): ");
  73. scanf("%d %d", &rows, &cols);
  74. printf("Enter the last digit of your student ID: ");
  75. scanf("%d", &studentIDEnd);
  76.  
  77. matrix = (int**) malloc(rows * sizeof(int*));
  78. for (int i = 0; i < rows; i++) {
  79. matrix[i] = (int*) malloc(cols * sizeof(int));
  80. printf("Enter %d elements for row %d: ", cols, i + 1);
  81. for (int j = 0; j < cols; j++) {
  82. scanf("%d", &matrix[i][j]);
  83. }
  84. }
  85.  
  86. printf("Initial matrix:\n");
  87. displayMatrix(matrix, rows, cols);
  88. }
  89.  
  90. void *sortAndSum(void *arg) {
  91. SortTask *task = (SortTask *)arg;
  92. quickSort(task->values, 0, task->size - 1, task->order);
  93.  
  94. long sum = 0;
  95. for (int i = 0; i < task->size; i++) {
  96. sum += task->values[i];
  97. }
  98.  
  99. pthread_mutex_lock(&sumMutex);
  100. totalSum += sum;
  101. pthread_mutex_unlock(&sumMutex);
  102. pthread_exit(NULL);
  103. }
  104.  
  105. void quickSort(int *arr, int low, int high, int ascending) {
  106. if (low < high) {
  107. int pi = partition(arr, low, high, ascending);
  108. quickSort(arr, low, pi - 1, ascending);
  109. quickSort(arr, pi + 1, high, ascending);
  110. }
  111. }
  112.  
  113. int partition(int *arr, int low, int high, int ascending) {
  114. int pivot = arr[high];
  115. int i = low - 1;
  116. for (int j = low; j < high; j++) {
  117. if ((ascending && arr[j] <= pivot) || (!ascending && arr[j] >= pivot)) {
  118. i++;
  119. swap(&arr[i], &arr[j]);
  120. }
  121. }
  122. swap(&arr[i + 1], &arr[high]);
  123. return i + 1;
  124. }
  125.  
  126. void swap(int *a, int *b) {
  127. int temp = *a;
  128. *a = *b;
  129. *b = temp;
  130. }
  131.  
  132. void displayMatrix(int **mat, int rows, int cols) {
  133. for (int i = 0; i < rows; i++) {
  134. for (int j = 0; j < cols; j++) {
  135. printf("%2d ", mat[i][j]);
  136. }
  137. printf("\n");
  138. }
  139. }
  140.  
Success #stdin #stdout 0.01s 5280KB
stdin
9
8
stdout
Enter dimensions of the matrix (rows x cols): Enter the last digit of your student ID: Enter 8 elements for row 1: Enter 8 elements for row 2: Enter 8 elements for row 3: Enter 8 elements for row 4: Enter 8 elements for row 5: Enter 8 elements for row 6: Enter 8 elements for row 7: Enter 8 elements for row 8: Enter 8 elements for row 9: Initial matrix:
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
Sorted matrix:
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0 
Total sum of all elements: 0