Удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Очень нужна помощь с задачей: Вводятся размеры матрицы, состоящей из целых чисел, и её элементы. С этой матрицей произвести указанные действия и вывести результаты. Память для массивов должна выделяться динамически, потом память должна освобождаться. Обработку массива (но не вывод) вынести в отдельную функцию, в основной функции оставить ввод, обращение к той функции и вывод. Если в программе требуется нетривиальная (не в один if) проверка отдельных чисел (вроде проверки на простоту), вынести её в отдельную функцию. Все данные должны передаваться между функциями через результат и параметры, глобальные переменные использовать нельзя. Текст программы должен быть оформлен с использованием единообразных отступов. Требуется удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых. Программа косячная, выглядит пока так:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int pr(int **a, int n, int m, int *min)
  4. {
  5. int i, j, x, l;
  6. for ( i = 0; i <= n; i++ )
  7. {
  8. for (j= 0; j <=m; j++)
  9. if ( a[i][j]>3);
  10. {
  11. for (x=2; x<=a[i][j]; x++)
  12. {
  13. if (x=2) l=a[i][j];
  14. if (a[i][j]/x=0 & a[i][j]<l) l=a[i][j];
  15. }
  16. }
  17. }
  18. *min = l;
  19. }
  20. int sa(int **a, int n, int m, int *ar)
  21. {
  22. int i, j, c, k, s;
  23. for ( i = 0; i <= n; i++ )
  24. for (j= 0; j <=m; j++)
  25. {
  26. c=a[i][j];
  27. s=0;
  28. while (c>0)
  29. {
  30. s+=c%10;
  31. c=c%10;
  32. k+=1;
  33. }
  34. s=s/k;
  35. }
  36. *ar = s;
  37. }
  38. void del( int **a, int n, int m, int *resultat)
  39. {
  40. int i,j,ar,min,g = 0;
  41. for (i = 0; i <= m; i++)
  42. for (j = 0; j <= n; j++)
  43. if ( ( sa(*a[i][j],n,m,*ar) ) > 6 & a[i]<(pr(*a,n,m,*min) ) ) a[g++] = a[i];
  44. else free( a[i] );
  45. *resultat= g;
  46. }
  47. int main()
  48. {
  49. int **a, n, m, i, j;
  50. printf("Введите размеры матрицы:\n");
  51. scanf("%d %d", &n, &m);
  52. a = malloc(n*m * sizeof(a[0]));
  53. printf("Введите элементы вектора:\n");
  54. for (i= 0; i<= m; i++)
  55. for (j = 0; j <= n; j++)
  56. scanf("%d", &a[i][j]);
  57. del (resultat,n,m);
  58. print("Новая матрица: \n");
  59. for (i= 0; i<= m; i++)
  60. for (j = 0; j <= n; j++)
  61. printf(" %d", a[i][j]);
  62. return 0;
  63. }
Пока "работает" до 43 строки, потом выдает ошибку, что необходим указатель. Что и как нужно исправить? Заранее спасибо!

Решение задачи: «Удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int isSimple(int x) // если x - простое то возвращается 1 иначе 0
  5. {
  6.     int i;
  7.     for (i=2; i<x; i++)
  8.         if (x%i == 0)
  9.             return 0;
  10.     return 1;
  11. }
  12.  
  13. int isSimpleNumbersLessCompositeNumbers(int* v, int m)  // если простые числа боьше больше составных чисел то 1 иначе 0
  14. {
  15.     int maxCompositeNumber = 0, minSimpleNumber = 0, i;
  16.     int flag;
  17.     int flagSimple = 1, flagComposite = 1;
  18.     for (i=0; i<m; i++)
  19.     {
  20.         flag = isSimple(v[i]);                  // flag == 1 если простое, 0 - составое
  21.         if (flag && (flagSimple || minSimpleNumber>v[i]))
  22.         {
  23.             flagSimple = 0;
  24.             minSimpleNumber = v[i];             // минимальное простое число
  25.         }
  26.         else if (!flag && (flagComposite || maxCompositeNumber<v[i]))
  27.         {
  28.             flagComposite = 0;
  29.             maxCompositeNumber = v[i];          // максимальное составное
  30.         }
  31.     }
  32.     return maxCompositeNumber<minSimpleNumber; 
  33. }
  34.  
  35. int getSumString(int *v, int m)     // возвращает сумму всех элементов в строке матрицы
  36. {
  37.     int i, sum = 0;
  38.     for (i= 0; i <m; i++)
  39.         sum += v[i];
  40.     return sum;
  41. }
  42.  
  43. void del( int **a, int n, int m)
  44. {
  45.     int i;
  46.     for (i = 0; i < n; i++)
  47.         if (getSumString(a[i],m) > 6*m && isSimpleNumbersLessCompositeNumbers(a[i],m))
  48.             // если среднее арифметическое чисел в строке i меньше 6
  49.             // и все простые числа больше всех составных
  50.             // то удаляем i-ую строку
  51.         {
  52.             free( a[i] );
  53.             a[i] = 0;
  54.         }
  55. }
  56.  
  57. int main()
  58. {
  59.     int **a, n, m, i, j;
  60.     printf("Enter size matrix:\n");
  61.     scanf("%d %d", &n, &m);
  62.     a = (int**)malloc(n*sizeof(int*));
  63.     for (i=0; i<n; i++)
  64.         a[i] = (int*)malloc(m*sizeof(int));
  65.     printf("Enter matrix:\n");
  66.     for (i= 0; i< n; i++)
  67.         for (j = 0; j < m; j++)
  68.             scanf("%d", &a[i][j]);
  69.     del (a,n,m);
  70.     printf("New matrix: \n");
  71.     for (i= 0; i<m; i++)
  72.     {
  73.         if (a[i] == 0) continue;
  74.         for (j = 0; j < n; j++)
  75.             printf(" %d", a[i][j]);
  76.         printf("\n");
  77.     }
  78.     system("pause");
  79.     return 0;
  80. }

Объяснение кода листинга программы

Код представляет собой функцию, которая удаляет строки из матрицы, удовлетворяющие условию: сумма чисел в строке больше 6 * m и все числа в строке - простые, а все составные числа меньше всех простых.

  1. Простые числа: функция isSimple(int x) проверяет, является ли число x простым числом. Если число простое, функция возвращает 1, иначе 0.
  2. Составные числа: функция isSimpleNumbersLessCompositeNumbers(int* v, int m) проверяет, являются ли простые числа в массиве v больше составных чисел. Если это так, функция возвращает 1, иначе 0.
  3. Сумма строки: функция getSumString(int *v, int m) вычисляет сумму всех чисел в строке матрицы.
  4. Удаление строк: функция del(int **a, int n, int m) проходит по всем строкам матрицы и удаляет строки, удовлетворяющие условию. Для этого используется функция isSimpleNumbersLessCompositeNumbers и функция getSumString. Если условие выполняется, строка удаляется с помощью функции free.
  5. Ввод-вывод: в функции main() пользователь вводит размер матрицы и значения для всех ячеек. Затем вызывается функция del, которая удаляет строки, удовлетворяющие условию. Результат выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы