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