Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 4

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

13.01.2016, 17:21. Показов 1455. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Очень нужна помощь с задачей:
Вводятся размеры матрицы, состоящей из целых чисел, и её элементы. С этой матрицей произвести указанные действия и вывести результаты.
Память для массивов должна выделяться динамически, потом память должна освобождаться.
Обработку массива (но не вывод) вынести в отдельную функцию, в основной функции оставить ввод, обращение к той функции и вывод. Если в программе требуется нетривиальная (не в один if) проверка отдельных чисел (вроде проверки на простоту), вынести её в отдельную функцию.
Все данные должны передаваться между функциями через результат и параметры, глобальные переменные использовать нельзя.
Текст программы должен быть оформлен с использованием единообразных отступов.
Требуется удалить из матрицы строки, где все числа, средние арифметические цифр которых больше 6, меньше всех простых.
Программа косячная, выглядит пока так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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 строки, потом выдает ошибку, что необходим указатель. Что и как нужно исправить?
Заранее спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2016, 17:21
Ответы с готовыми решениями:

Матрицы. Удалить все строки, все элементы которых больше 34
1) Дана вещественная матрица А(n,m),где n&gt;10, m&lt;10. Разработайте программу, которая удаляет все строки,содержащие только элементы,большие...

Найти n первых простых чисел, сумма цифр у которых меньше заданного числа
Помогите написать программу! Условие: найти n первых простых чисел, сумма цифр у которых меньше заданного m.

Найти средние арифметические всех строк матрицы
Дана матрица и число D. найти все средние арифметические всех строк матрицы. Если все положительные, вывести сообщение, если есть хоть одно...

6
103 / 82 / 78
Регистрация: 11.05.2015
Сообщений: 201
13.01.2016, 19:22
Не знаю почему у Вас ошибка только в 43 строке, у меня проект вообще не скомпилился.
Цитата Сообщение от Stockhausen Посмотреть сообщение
a = malloc(n*m * sizeof(a[0]));
В этой строчке ошибка при выделении памяти для двумерного массива. Правильнее так:
C++
1
2
3
    a = (int**)malloc(n*sizeof(int*));
    for (i=0; i<n; i++)
        a[i] = (int*)malloc(m*sizeof(int));
Функция del принимает 4 аргумента, а не 3.И где объявление переменной resultat?
Цитата Сообщение от Stockhausen Посмотреть сообщение
del (resultat,n,m);
1
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 4
13.01.2016, 19:52  [ТС]
Спасибо за ответ!
У меня программа тоже не действует, просто ближайшую ошибку компилятор видит на 43 строке и вырубается.
До исправления del пока дойти не удалось, теперь поправлено, выделение памяти тоже.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    int **a, n, m, i, j;
    printf("Введите размеры матрицы:\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("Введите элементы вектора:\n");
    for (i= 0; i<= n; i++)
    for (j = 0; j <= m; j++)
        scanf("%d", &a[i][j]);
    del (**a,n,m,*resultat);
    print("Новая матрица: \n");
        for (i= 0; i<= n; i++)
        for (j = 0; j <= m; j++)
            printf(" %d", a[i][j]);
}
main, вроде, исправлен.
0
103 / 82 / 78
Регистрация: 11.05.2015
Сообщений: 201
13.01.2016, 21:56
Все равно ещё есть ошибки. Вот смотрите (немного теории):
есть две операции * - это взятие значения по указателю, & - это получение адреса переменной. Всегда остается верным следующее тождество (a == *(&a)).
Допустим есть переменные
C++
1
2
3
4
5
6
int a;    // целочисленная переменная
int* b;  // указатель на целочисленную переменную
int** c; // указатель на указатель на целочисленную переменную итд
// 
b = &a; // b присваивается адрес переменной a
*b = 2; // в b содержится адрес на a, * - взятие значения по этому адресу, те записи a = 2 и *b==2 эквивалентны
Если посмотреть на, функцию del
C++
1
void del( int **a, int n, int m, int *resultat)
a - двойной указатель
n, m - целочисленные переменные
resultat - указатель
Тогда функция вызывается следующим образом
C++
1
2
3
4
int** a;
int m, n, resultat;
//...
del(a,n,m,&result); // result - переменная типа int, &result - адрес result (тип int*)
Еще немного про массивы:
C++
1
2
3
4
5
6
int** a;
// ... выделение памяти
// a - имеет тип int** (двойной указатель)
// a[0], a[1] ... a[i] - имеют тип int* 
// a[i][j] - имеет тип int
// Вообще двумерный массив это массив из указателей
Добавлено через 26 минут
sa - служит для нахождения строк среднее арифметическое которых больше 6, а что выполняет pr?
0
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 4
14.01.2016, 15:28  [ТС]
Функция pr должна найти минимальное простое число в массиве, но, подозреваю, она крайне корявая и ничего нужного не выполняет.
Начинаю понемногу разбираться в указателях, завтра попробую еще раз перекроить программу.

Добавлено через 15 часов 36 минут
Не дано мне нормально что-то сделать... вроде теорию, что да как с указателем в функции, понимаю, а на практике ее применить не получается. В сороковой строке выдает по две следующих ошибки на функцию:
warning: assignment makes pointer from integer without a cast (эту еще выдает на пятьдесят седьмой строке)
warning: assignment makes integer from pointer without a cast,
т. е., там перепутаны целые с указателями. Никак не могу это исправить...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdlib.h>
int pr(int *a, int n, int *min) 
{
    int i, x, l;
    for ( i = 0; i <= n; i++ ) 
        if ( a[i]>3);
        {
            for (x=2; x<=a[i]; x++)
            {
                if (x=2) l=a[i];
                if (a[i]&x=0 && a[i]<l) 
                    l=a[i];
            }
        }
    *min = l;
}
int sa(int *a, int n, int *ar)
{
    int i, c, k, s;
    for ( i = 0; i <= n; i++ ) 
    {
        c=a[i];
        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 i,j,ar,min,g = 0;
    for (i = 0; i <= *n; i++) 
    for (j = 0; j <= m; j++)
        if ( ( sa(a[i],n,ar) ) > 6 && a[i][j]<( pr(a[i],n,min) ) )
            a[g++] = a[i];
        else free( a[i] );
    *n= g;
}
int main()
{
    int **a, n, m, i, j;
    printf("Введите размеры матрицы:\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("Введите элементы вектора:\n");
    for (i= 0; i<= n; i++)
    for (j = 0; j <= m; j++)
        scanf("%d", &a[i][j]);
    del (a,n,m);
    printf("Новая матрица: \n");
        for (i= 0; i<= n; i++)
        for (j = 0; j <= m; j++)
            printf(" %d", a[i][j]);
return 0;
}
0
103 / 82 / 78
Регистрация: 11.05.2015
Сообщений: 201
14.01.2016, 16:40
Лучший ответ Сообщение было отмечено Stockhausen как решение

Решение

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

Добавлено через 14 минут
Странно, почему-то работает только с квадратной матрицей 2х2

Добавлено через 4 часа 43 минуты
Все, удалось найти и исправить все неполадки. Работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2016, 23:53
Помогаю со студенческими работами здесь

Вывести на печать исходный массив в виде матрицы и средние арифметические каждой строки матрицы с указанием номера строки
О великие знатоки паскаля, прошу у вас помощи Задача : Ввести двумерный массив 3х3. Вывести на печать исходный массив в виде матрицы и...

Найти и вывести все числа в интервале от 1 до N-1, где сумма всех цифр совпадает с суммой цифр данного числа
Дано натуральное число N.Написать функцию,которая находит и выводит все числа в интервале от 1 до N-1,у которых сумма всех цифр совпадает с...

Найти и вывести все числа в интервале от 1 до N-1, у которых сумма всех цифр совпадает с суммой цифр данного числа.
Дано натуральное число N. Найти и вывести все числа в интервале от 1 до N-1, у которых сумма всех цифр совпадает с суммой цифр данного...

Найти и вывести все числа в интервале от 1 до N–1, у которых произведение всех цифр совпадает с произведением цифр данного числа
Дано натуральное число N. Найти и вывести все числа в интервале от 1 до N–1, у которых произведение всех цифр совпадает с произведением...

Найти и вывести все числа в интервале от 1 до N - 1, у которых сумма всех цифр совпадает с суммой цифр данного числа
Дано натуральное число N. Найти и вывести все числа в интервале от 1 до N - 1, у которых СУММА ВСЕХ ЦИФР совпадает с СУММОЙ цифр данного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru