Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
1

Выяснить, имеются ли в матрице ненулевые элементы и, если имеются, вывести их индексы

26.04.2014, 17:57. Показов 1692. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Задача следующая - дается матрица n x n (n=1...15). Необходимо выяснить, имеются ли в матрице ненулевые элементы и, если имеются, вывести их индексы.
Я составил программу, которая создает матрицу, заполняет ее случайными числами и ищет среди них отличные от нуля. Так же она должна вроде бы как выводить индексы этих ненулевых элементов, но каждый раз, если такие элементы имеются, программа выводит следующие числа:
i=2686780
j=2686776
Не понимаю, в чем ошибка, ведь максимальный возможный индекс может быть 15x15, а тут получается 2686780 x 2686776. Нужна ваша помощь, чтобы вставить в программу фрагмент, при помощи которого на экран бы выводились индексы ненулевых элементов массива.
Ниже приведена составленная мною программа:
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
#include <stdio.h>//  îáúÿâëåíèå  çàãîëîâî÷íûõ ôàéëîâ
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <locale.h>
#define SIZE 15
int main()// ãëàâíàÿ ôóíêöèÿ: íà÷àëî ïðîãðàììû
{
    setlocale(LC_ALL,"Russian");// ôóíêöèÿ, íåîáõîäèìàÿ äëÿ îòîáðàæåíèÿ ðóññêîãî ÿçûêà â êîíñîëè
    int i, j, n, a[SIZE][SIZE]; // îáúÿâëåíèå ïåðåìåííûõ öåëîãî òèïà è öåëî÷èñëåííîãî äâóìåðíîãî ìàññèâà
    printf("Ââåäèòå ÷èñëî îò 1 äî 15 \n");// âûâîä òåêñòà íà ýêðàí
    scanf("%d",&n); // çàïèñü äàííûõ â ïåðåìåííóþ n
    if((n<0)||(n>15))
    {
    printf("Íåîáõîäèìî ââåñòè ÷èñëî n â ïðåäåëàõ îò 0 äî 15");
    getch();
    return 0;
    }
    else
    
     srand(time(NULL));
    for (i=0;  i<n; i++)// âûïîëíåíèå öèêëà îò íóëÿ äî (n-1) ñ øàãîì 1
 
    {
        for (j=0;  j<n;  j++)// âûïîëíåíèå öèêëà îò íóëÿ äî (n-1) ñ øàãîì 1
     {
            a[i][j]=rand()%100; // ôîðìóëà äëÿ çàïîëíåíèÿ ìàññèâà ñëó÷àéíûìè ÷èñëàìè
            //printf("%4d", a[i][j]);
        }
        //printf("\n");
    }
    if (a[i][j]!=0)
    {printf("i=%d\n",&i);
    printf("j=%d\n",&j);
    }
    
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2014, 17:57
Ответы с готовыми решениями:

Построить матрицу , Выяснить имеются ли в матрице нулевые элементы. Если имеются, то вывести их индексы
Написал программу, но что-то не так:c Может кто поможет, я буду очень благодарен :) Вот условие...

Выяснить, имеются ли в заданных матрицах ненулевые элементы. Если имеются, то указать их индексы
Даны две целочисленные квадратные матрицы порядка 15. Выяснить, имеются ли в матрицах ненулевые...

Выяснить, имеются ли в матрице ненулевые элементы
дана действительная квадратная матрица порядка 15. выяснить,имеются ли в матрице ненулевые...

Выяснить, имеются ли в матрице ненулевые элементы
Дана целочисленная квадратная матрица 15 и 20, выяснить имеются ли в матрице ненулевые элементы,...

15
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
26.04.2014, 18:10 2
Цитата Сообщение от zaqwerty Посмотреть сообщение
Не понимаю, в чем ошибка, ведь максимальный возможный индекс может быть 15x15, а тут получается 2686780 x 2686776.
C++
1
2
printf("i=%d\n",&i);
printf("j=%d\n",&j);
Должно быть
C++
1
2
printf("i=%d\n",i);
printf("j=%d\n",j);
0
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
26.04.2014, 18:13  [ТС] 3
pav1uxa, тогда получается, что выводятся не индексы элементов, а то число, которое я ввожу (то есть число n, задающее порядок матрицы).
0
7 / 4 / 14
Регистрация: 05.02.2014
Сообщений: 131
26.04.2014, 18:44 4
zaqwerty, через цикл ищи все числа равные 0, запоминай их индексы и выводи значения с нужными индексами
0
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
26.04.2014, 18:58  [ТС] 5
Fear1911, мне нужно не сами значения элементов вывести, а их индексы. Хотя, возможно, я не все понимаю, можно поподробнее?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
26.04.2014, 18:59 6
Лучший ответ Сообщение было отмечено zaqwerty как решение

Решение

Цитата Сообщение от zaqwerty Посмотреть сообщение
pav1uxa, тогда получается, что выводятся не индексы элементов, а то число, которое я ввожу (то есть число n, задающее порядок матрицы).
А так вы вообще выводите ссылку на переменные i и j, судя по заданию Вам это точно не надо) Я лишь показал как правильно функцией printf отображать значение переменных. Чтобы увидеть индексы всех ненулевых элементов массива, достаточно засунуть строки
C++
1
2
3
4
if (a[i][j]!=0)
    {printf("i=%d\n",i);
    printf("j=%d\n",j);
    }
в цикл перебора всех элементов массива...
1
7 / 4 / 14
Регистрация: 05.02.2014
Сообщений: 131
26.04.2014, 19:01 7
zaqwerty, да, не понимаешь, перечитай.

если нужно вывести индексы, так выводи индексы)
0
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
26.04.2014, 19:36  [ТС] 8
Fear1911, pav1uxa, у меня получился такой код:
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
#include <stdio.h>//  îáúÿâëåíèå  çàãîëîâî÷íûõ ôàéëîâ
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <locale.h>
#define SIZE 15
int main()// ãëàâíàÿ ôóíêöèÿ: íà÷àëî ïðîãðàììû
{
    setlocale(LC_ALL,"Russian");// ôóíêöèÿ, íåîáõîäèìàÿ äëÿ îòîáðàæåíèÿ ðóññêîãî ÿçûêà â êîíñîëè
    int i, j, n, a[SIZE][SIZE]; // îáúÿâëåíèå ïåðåìåííûõ öåëîãî òèïà è öåëî÷èñëåííîãî äâóìåðíîãî ìàññèâà
    printf("Ââåäèòå ÷èñëî îò 1 äî 15 \n");// âûâîä òåêñòà íà ýêðàí
    scanf("%d",&n); // çàïèñü äàííûõ â ïåðåìåííóþ n
    if((n<0)||(n>15))
    {
    printf("Íåîáõîäèìî ââåñòè ÷èñëî n â ïðåäåëàõ îò 0 äî 15");
    getch();
    return 0;
    }
    else
    
     srand(time(NULL));
    for (i=0;  i<n; i++)// âûïîëíåíèå öèêëà îò íóëÿ äî (n-1) ñ øàãîì 1
 
    {
        for (j=0;  j<n;  j++)// âûïîëíåíèå öèêëà îò íóëÿ äî (n-1) ñ øàãîì 1
     {
            a[i][j]=rand()%100; // ôîðìóëà äëÿ çàïîëíåíèÿ ìàññèâà ñëó÷àéíûìè ÷èñëàìè
            
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }
    
        for (i=1;  i<=n; i++)// âûïîëíåíèå öèêëà îò íóëÿ äî (n-1) ñ øàãîì 1
 
    {
        for (j=1;  j<=n;  j++)// âûïîëíåíèå öèêëà îò íóëÿ äî (n-1) ñ øàãîì 1
     {
            if (a[i][j]!=0)
    {printf("i=%d\n",i);
    printf("j=%d\n",j);
    }
        }
        printf("\n");
    }
    }
Программа стала выводить индексы (я так понял, что индексы - это i и j). Я так же вывел матрицу на экран и сравнил выведенные программой индексы с полученной матрицей. В итоге получается, что программа выводит не все индексы отличных от нуля элементов. Как это можно исправить? А то я уже совсем запутался
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
26.04.2014, 19:50 9
Цитата Сообщение от zaqwerty Посмотреть сообщение
А то я уже совсем запутался
Почему при заполнении у Вас
C++
1
2
for (i=0;  i<n; i++)
for (j=0;  j<n;  j++)
А при поиске ненулевых элементов
C++
1
2
for (i=1;  i<=n; i++)
for (j=1;  j<=n;  j++)
То есть вы проверяете не весь массив, а начиная со второй строки и второго столбца, заканчивая предпоследней строкой и предпоследним столбцом
1
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
26.04.2014, 20:16  [ТС] 10
pav1uxa, то есть нужно оставить так?
C++
1
2
for (i=0;  i<n; i++)
for (j=0;  j<n;  j++)
Но тогда получается следующий исход. Например, при n=2 я получил следующую матрицу:
62 7
38 69
Все эти элементы отличны от нуля, то есть программа должна вывести следующее:
i=1
j=1
i=1
j=2
i=2
j=1
i=2
j=2
Но она выводит следующее:
i=0
j=0
i=0
j=1

i=1
j=0
i=1
j=1

Добавлено через 2 минуты
Я понял, здесь ноль принимается за первую строку, а единица - за вторую строку. Но как тогда привести к тому, чтобы первая строка обозначалась единицей, а не нулем, а вторая - двойкой, а не единицей?

Добавлено через 4 минуты
Как я думаю, нужно оставить так:

C++
1
2
for (i=1;  i<=n; i++)
for (j=1;  j<=n;  j++)
Ведь когда у нас было i=0; i<n, то при, к примеру, n=15 мы имели 15 элементов (от 0 до 14), а при таком цикле мы получаем так же пятнадцать элементов от единицы вплоть до пятнадцати. Я правильно мыслю или опять ошибаюсь?

Добавлено через 7 минут
Да, все получилось. Спасибо за помощь)
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
26.04.2014, 20:31 11
Цитата Сообщение от zaqwerty Посмотреть сообщение
Я правильно мыслю или опять ошибаюсь?
Конечно ошибаетесь. Вы задаете элементы массива начиная с нулевого. Так почему Вы хотите проверять их начиная с первого?
Если n = 15, то
for (i=0; i<n; i++) это 15 итераций
for (i=1; i<n; i++) это 14 итераций (то есть первую строку и столбец вы не проверяете вообще в таком случае)

Добавлено через 11 секунд
Цитата Сообщение от zaqwerty Посмотреть сообщение
Но она выводит следующее:
i=0
j=0
i=0
j=1
i=1
j=0
i=1
j=1
Все правильно выводит.
0
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
26.04.2014, 20:34  [ТС] 12
pav1uxa, почему же, я же пишу
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
Прошу обратить внимание на то, что i<=n, а не i<n. Тогда получится как раз 15 интераций
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
26.04.2014, 20:47 13
Цитата Сообщение от zaqwerty Посмотреть сообщение
Прошу обратить внимание на то, что i<=n, а не i<n. Тогда получится как раз 15 интераций
Но ведь когда устанавливаете массив у вас i=0 j=0.

В общем в таких случаях все-таки лучше всего использовать
C++
1
2
for(i=0; i<n; i++)
for(j=0; j<n; j++)
И в выводе просто прибавлять единицу к индексу, если не хотите видеть нулевых индексов...
C++
1
2
printf("i=%d\n",i+1);
printf("j=%d\n",j+1);
1
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
27.04.2014, 09:19  [ТС] 14
pav1uxa, извините, забыл сказать, что использовал этот цикл не только при выводе индексов, но и при составлении матрицы:
C++
1
2
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
С такими циклами у меня программа работает правильно. Но все же спасибо, ваш совет (по добавлению единицы к индексу) тоже очень ценен, я не догадался.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
27.04.2014, 12:40 15
Цитата Сообщение от zaqwerty Посмотреть сообщение
С такими циклами у меня программа работает правильно. Но все же спасибо, ваш совет (по добавлению единицы к индексу) тоже очень ценен, я не догадался.
Просто дело в том, что вот эти строки
C++
1
2
#define SIZE 15
int a[SIZE][SIZE];
Создают двумерный массив, в котором 15 строк и 15 столбцов. Но они начинаются с нуля. То есть индексы этих строк и столбцов от 0 до 14, и если вы в этой программе введете число 15 при инициализации массива, и попытаетесь заполнить 15-ый элемент, то выдаст ошибку, так как максимальный индекс в данном массиве - 14...
1
2 / 2 / 2
Регистрация: 14.12.2013
Сообщений: 120
29.04.2014, 15:59  [ТС] 16
pav1uxa, да, так и есть - при введении пятнадцати программа выдает ошибку. Сейчас внесу изменения. Спасибо
0
29.04.2014, 15:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2014, 15:59
Помогаю со студенческими работами здесь

Выяснить, имеются ли в матрице ненулевые элементы
1)дана действительная квадратная матрица порядка 15. выяснить,имеются ли в матрице ненулевые...

Выяснить имеются ли в матрице ненулевые элементы
дана квадратичная матрица.выяснить имеются ли в ней ненулевые элементы,и если да то указать индекс...

Выяснить, имеются ли в матрицах ненулевые элементы
Даны две целочисленные квадратные матрицы порядка 15. Выяснить, имеются ли в матрицах ненулевые...

Имеются ли в матрице ненулевые элементы
Помогите, пожалуйста, решить) 3)Дана целочисленная квадратная матрица порядка 15. Выяснить,...


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

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