1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 18
1

Определить номера и количество столбцов матрицы, содержащих хотя бы один элемент из указанного диапазона

25.02.2020, 21:52. Показов 1258. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программа каждый раз выдаёт странный результат и я не могу его никак исправить. Помогите мне найти ошибку(скорее ошибки) и исправить.
Задание:
Дана целочисленная прямоугольная матрица. Определить номера и количество столбцов, содержащих хотя бы один элемент из указанного диапазона.
Мой код:
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <malloc.h>
#include <time.h>
 
int main()
{
    setlocale(LC_ALL,"Rus");
    int **arr;
    int i,j,n,m,d;
    printf("Введите количество строк: ");
    scanf("%d",&n);
    printf("Введите количество столбцов: ");
    scanf("%d",&m);
    printf("Введите длину диапазона: ");
    scanf("%d",&d);
    arr = (int**)malloc(n * m * sizeof(int*));
 
    for(int i = 0; i < n * m; i++)
        {
            arr[i] = (int*)malloc(n * m * sizeof(int));
            if (!arr[i]) {
            for (int j = 0; j < i; j++)
                free(arr[j]);
            free(arr);
            return 0;
        }
 
        }
 
    srand(time(NULL));
 
    for(i = 0;i<n;i++)
    {
        for(j = 0;j<m;j++)
        {
            *(*(arr + i)+j)=rand() % 20 + 1;
            printf("%4d",*(*(arr + i) + j));
        }
        printf("\n");
    }
    int h,o;
    for(int i = 0;i < m;i++) {
        for(int j = 0;j < n;j++) {
            for(int t = 0;t < d;t++) {
                if(*(*(arr + i) + j) == t)
                {
                    o = i+1;
                    printf("В столбце №%d есть один из элементов диапазона\n",o);
                    h++;
                    break;
 
                }
            }
        }
    }
    printf("Всего таких столбов №%d",h);
    return 0;
}
Результат:
Введите количество строк: 3
Введите количество столбцов: 4
Введите длину диапазона: 5
19 9 9 6
7 14 1 2
12 11 2 5
В столбце №1 есть один из элементов диапазона
В столбце №3 есть один из элементов диапазона
Всего таких столбов №4201424
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2020, 21:52
Ответы с готовыми решениями:

Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент
Дана целочисленная прямоугольная матрица. Определить: 1. количество столбцов, содержащих хотя бы...

Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент
Определить: • Количество столбцов, Содержащих хотя бы один нулевой элемент. • Номер строки, в...

Определить количество столбцов, содержащих хотя бы один нулевой элемент
Написать программу, содержащую пользовательскую функцию, решающую сформулированную ниже задачу. Во...

Определить номер последнего из столбцов матрицы, содержащих хотя бы один положительный элемент
Определить номер последнего из столбцов, содержащих хотя бы один положительный элемент.

6
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
25.02.2020, 22:42 2
Цитата Сообщение от Sketchy Посмотреть сообщение
*(*(arr + i)+j)
Зачем так мудрёно писать? Можно же проще: arr[i][j].

В 44 строке:
Цитата Сообщение от Sketchy Посмотреть сообщение
for(int i = 0;i < m;i++) {
Разве не i < n должно быть?

Ну и создание двумерного динамического массива у вас неверно реализовано, неверно указаны размеры выделяемой памяти. Хотя на работу программы это, вроде бы, не должно влиять.
0
1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 18
26.02.2020, 10:24  [ТС] 3
Я обычно и делал через arr[i][j], но теперь нужно обязательно через указатели.
А в 44 строке i < m потому что я хотел чтобы цикл проходил по всем строкам в столбце, а затем переходил на следующий.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
26.02.2020, 10:33 4
Цитата Сообщение от Sketchy Посмотреть сообщение
А в 44 строке i < m потому что я хотел чтобы цикл проходил по всем строкам в столбце, а затем переходил на следующий.
Тогда i - это индекс столбца, а j - строки, и обращении к элементу матрицы в цикле это нужно учитывать: a[j][i]
1
1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 18
26.02.2020, 11:36  [ТС] 5
Спасибо! Проблема почти решилась, но как сделать так чтобы он не учитывал повторно один и тот же столбец.
Я думал, что мне поможет break в 52 строке, но мне кажется он не работает.
0
Модератор
2637 / 1750 / 919
Регистрация: 16.10.2013
Сообщений: 5,065
Записей в блоге: 14
26.02.2020, 12:00 6
Лучший ответ Сообщение было отмечено Sketchy как решение

Решение

Sketchy, зачем городить третий цикл, пробегаясь по каждому значению диапазона? Если можно простую проверку принадлежности числа диапазону влепить:

C
1
2
3
4
5
6
int a_ij = *(*(arr + i) + j);
if( a_ij > 0 && a_ij < d ) { // возможно нужно нестрогое сравнение, чтобы захватить границы диапазона
    printf("В столбце №%d есть один из элементов диапазона\n",o);
    h++;
    break;
}
Добавлено через 7 минут
оператор break прерывает выполнение того цикла, в котором он вызван. Т.е. вы выполняете проверку чисел диапазона, наткнувшись на одно из удовлетворяющих условию, перестаете смотреть остальные числа диапазона. Но цикл по столбцам у вас не прерывается.
1
1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 18
26.02.2020, 12:09  [ТС] 7
Всё проблема решена, спасибо вам !
0
26.02.2020, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2020, 12:09
Помогаю со студенческими работами здесь

Определить номер первого из столбцов матрицы, содержащих хотя бы один нулевой элемент
Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих хотя бы...

Определить номер первого из столбцов матрицы, содержащих хотя бы один нулевой элемент
Задание:Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих...

Определить номер первого из столбцов матрицы, содержащих хотя бы один нулевой элемент
Задача с двумерным массивом на C (не C++). Дана целочисленная прямоугольная матрица. Определить...

Дана целочисленная прямоугольная матрица. Определить количество столбцов, содержащих хотя бы один нулевой элемент; номер
Дана целочисленная прямоугольная матрица. Определить количество столбцов, содержащих хотя бы один...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru