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

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

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

Здравствуйте! Очень нужна помощь с задачей: Вводятся размеры матрицы, состоящей из целых чисел, и её элементы. С этой матрицей произвести указанные действия и вывести результаты. Память для массивов должна выделяться динамически, потом память должна освобождаться. Обработку массива (но не вывод) вынести в отдельную функцию, в основной функции оставить ввод, обращение к той функции и вывод. Если в программе требуется нетривиальная (не в один if) проверка отдельных чисел (вроде проверки на простоту), вынести её в отдельную функцию. Все данные должны передаваться между функциями через результат и параметры, глобальные переменные использовать нельзя. Текст программы должен быть оформлен с использованием единообразных отступов. Требуется удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых. Программа косячная, выглядит пока так:
#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;
}
Пока "работает" до 43 строки, потом выдает ошибку, что необходим указатель. Что и как нужно исправить? Заранее спасибо!

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

  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
Похожие ответы