Удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 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, которая удаляет строки, удовлетворяющие условию. Результат выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д