Удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых - C (СИ)
Формулировка задачи:
Здравствуйте! Очень нужна помощь с задачей:
Вводятся размеры матрицы, состоящей из целых чисел, и её элементы. С этой матрицей произвести указанные действия и вывести результаты.
Память для массивов должна выделяться динамически, потом память должна освобождаться.
Обработку массива (но не вывод) вынести в отдельную функцию, в основной функции оставить ввод, обращение к той функции и вывод. Если в программе требуется нетривиальная (не в один if) проверка отдельных чисел (вроде проверки на простоту), вынести её в отдельную функцию.
Все данные должны передаваться между функциями через результат и параметры, глобальные переменные использовать нельзя.
Текст программы должен быть оформлен с использованием единообразных отступов.
Требуется удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых.
Программа косячная, выглядит пока так:
Пока "работает" до 43 строки, потом выдает ошибку, что необходим указатель. Что и как нужно исправить?
Заранее спасибо!
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- int pr(int **a, int n, int m, int *min)
- {
- int i, j, x, l;
- for ( i = 0; i <= n; i++ )
- {
- for (j= 0; j <=m; j++)
- if ( a[i][j]>3);
- {
- for (x=2; x<=a[i][j]; x++)
- {
- if (x=2) l=a[i][j];
- if (a[i][j]/x=0 & a[i][j]<l) l=a[i][j];
- }
- }
- }
- *min = l;
- }
- int sa(int **a, int n, int m, int *ar)
- {
- int i, j, c, k, s;
- for ( i = 0; i <= n; i++ )
- for (j= 0; j <=m; j++)
- {
- c=a[i][j];
- s=0;
- while (c>0)
- {
- s+=c%10;
- c=c%10;
- k+=1;
- }
- s=s/k;
- }
- *ar = s;
- }
- void del( int **a, int n, int m, int *resultat)
- {
- int i,j,ar,min,g = 0;
- for (i = 0; i <= m; i++)
- for (j = 0; j <= n; j++)
- if ( ( sa(*a[i][j],n,m,*ar) ) > 6 & a[i]<(pr(*a,n,m,*min) ) ) a[g++] = a[i];
- else free( a[i] );
- *resultat= g;
- }
- int main()
- {
- int **a, n, m, i, j;
- printf("Введите размеры матрицы:\n");
- scanf("%d %d", &n, &m);
- a = malloc(n*m * sizeof(a[0]));
- printf("Введите элементы вектора:\n");
- for (i= 0; i<= m; i++)
- for (j = 0; j <= n; j++)
- scanf("%d", &a[i][j]);
- del (resultat,n,m);
- print("Новая матрица: \n");
- for (i= 0; i<= m; i++)
- for (j = 0; j <= n; j++)
- printf(" %d", a[i][j]);
- return 0;
- }
Решение задачи: «Удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- int isSimple(int x) // если x - простое то возвращается 1 иначе 0
- {
- int i;
- for (i=2; i<x; i++)
- if (x%i == 0)
- return 0;
- return 1;
- }
- int isSimpleNumbersLessCompositeNumbers(int* v, int m) // если простые числа боьше больше составных чисел то 1 иначе 0
- {
- int maxCompositeNumber = 0, minSimpleNumber = 0, i;
- int flag;
- int flagSimple = 1, flagComposite = 1;
- for (i=0; i<m; i++)
- {
- flag = isSimple(v[i]); // flag == 1 если простое, 0 - составое
- if (flag && (flagSimple || minSimpleNumber>v[i]))
- {
- flagSimple = 0;
- minSimpleNumber = v[i]; // минимальное простое число
- }
- else if (!flag && (flagComposite || maxCompositeNumber<v[i]))
- {
- flagComposite = 0;
- maxCompositeNumber = v[i]; // максимальное составное
- }
- }
- return maxCompositeNumber<minSimpleNumber;
- }
- int getSumString(int *v, int m) // возвращает сумму всех элементов в строке матрицы
- {
- int i, sum = 0;
- for (i= 0; i <m; i++)
- sum += v[i];
- return sum;
- }
- void del( int **a, int n, int m)
- {
- int i;
- for (i = 0; i < n; i++)
- if (getSumString(a[i],m) > 6*m && isSimpleNumbersLessCompositeNumbers(a[i],m))
- // если среднее арифметическое чисел в строке i меньше 6
- // и все простые числа больше всех составных
- // то удаляем i-ую строку
- {
- free( a[i] );
- a[i] = 0;
- }
- }
- int main()
- {
- int **a, n, m, i, j;
- printf("Enter size matrix:\n");
- scanf("%d %d", &n, &m);
- a = (int**)malloc(n*sizeof(int*));
- for (i=0; i<n; i++)
- a[i] = (int*)malloc(m*sizeof(int));
- printf("Enter matrix:\n");
- for (i= 0; i< n; i++)
- for (j = 0; j < m; j++)
- scanf("%d", &a[i][j]);
- del (a,n,m);
- printf("New matrix: \n");
- for (i= 0; i<m; i++)
- {
- if (a[i] == 0) continue;
- for (j = 0; j < n; j++)
- printf(" %d", a[i][j]);
- printf("\n");
- }
- system("pause");
- return 0;
- }
Объяснение кода листинга программы
Код представляет собой функцию, которая удаляет строки из матрицы, удовлетворяющие условию: сумма чисел в строке больше 6 * m и все числа в строке - простые, а все составные числа меньше всех простых.
- Простые числа: функция isSimple(int x) проверяет, является ли число x простым числом. Если число простое, функция возвращает 1, иначе 0.
- Составные числа: функция isSimpleNumbersLessCompositeNumbers(int* v, int m) проверяет, являются ли простые числа в массиве v больше составных чисел. Если это так, функция возвращает 1, иначе 0.
- Сумма строки: функция getSumString(int *v, int m) вычисляет сумму всех чисел в строке матрицы.
- Удаление строк: функция del(int **a, int n, int m) проходит по всем строкам матрицы и удаляет строки, удовлетворяющие условию. Для этого используется функция isSimpleNumbersLessCompositeNumbers и функция getSumString. Если условие выполняется, строка удаляется с помощью функции free.
- Ввод-вывод: в функции main() пользователь вводит размер матрицы и значения для всех ячеек. Затем вызывается функция del, которая удаляет строки, удовлетворяющие условию. Результат выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д