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

Найти первый отрицательный элемент матрицы

18.12.2018, 21:55. Показов 2948. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти первый отрицательный элемент в матрице y[3][3] и сформировать матрицу x[3][3], элементы которой получаются из соответствующих элементов матрицы Y путем деления на первый отрицательный.
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
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <locale.h>
#include <math.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "");
    const int n = 3;
    int dmin, dmax,k=0;
    int y[n][n];
    float x[n][n];
    srand(time(NULL));
    cout << "Введите нижний предел ГСЧ\n";
    cin >> dmin;
    cout << "Bведите верхний предел ГСЧ\n";
    cin >> dmax;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            y[i][j] = rand() % (dmax - dmin + 1) + dmin;
    }
    cout << "\nЗадание 9\nСгенерированная матрица\n";
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << y[i][j] << " ";
        cout << "\n";
    }
    float st_otr=0.0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            if (y[i][j] < 0)
                {
                    st_otr = y[i][j];
                    cout << "\nПервый отрицательный элемент равен " << y[i][j] << ", находится в строчке " << i + 1 << " и столбике " << j + 1;
                    break;
                }
            else
            {
                k++;
                cout << "\nНет отрицательных элементов!";
                break;
            }
        break;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            x[i][j] = y[i][j] / st_otr;
    }
    cout << "\nПолученная матрица\n";
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            if (k == 0)
            {
                if (j < n)
                {
                    cout << x[i][j] << " ";
                }
                else
                    cout << x[i][3] << " \n";
            }
            else
            {
                cout << "\nМатрица не может быть получена!\n";
                break;
            }
    }
}
Вот у меня проблема- Если в 42 строчке(под cout << "\nПервый отрицательный элемент равен " << y[i][j] << ", находится в строчке " << i + 1 << " и столбике " << j + 1 )есть break, то он не ловит отрицательные элементы, если они не находятся на позиции y[0][0]. Убираешь break-начинает триггерить k++ и выводит что матрицу нельзя сгенерировать. Так же проблема с выводом полученной матрицы. Если и получается вывести, то все идет в строчку, уже все что могу и знаю перепробовал.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2018, 21:55
Ответы с готовыми решениями:

Найти первый отрицательный элемент в каждой строке матрицы
Дан двухмерный массив целых чисел.В каждой его строке найти : а) первый отрицательный элемент(принять, что отрицательные элементы есть в...

Удалить столбец матрицы содержащий первый отрицательный элемент
Дан двумерный целочисленный массив A размерностью NxM. Удалить столбец, содержащий первый отрицательный элемент Спасибо

Заменить первый встречный отрицательный элемент матрицы на максимальный
Здравствуйте.Дана матрица С. Найти и вывести минимальный и максимальный элементы матрицы. Если их произведение меньше 0, то в каждом...

4
0 / 0 / 0
Регистрация: 09.07.2014
Сообщений: 40
19.12.2018, 12:35  [ТС]
bump
0
 Аватар для Kaitangata
5 / 2 / 3
Регистрация: 19.12.2018
Сообщений: 7
19.12.2018, 22:48
Лучший ответ Сообщение было отмечено Korrako как решение

Решение

Строка 63: j никогда не примет значение большее n. Поэтому всё в строчку. Сделал бы как в первый раз.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <iomanip>
 
#define maxHeight 3
#define maxWidth 3
#define currentPrecision 2
int main()
{
    int array [maxHeight][maxWidth];
    int lowerLimit,
        upperLimit,
        firstNegativeValue  = 0,
        FNV_posY            = 0,
        FNV_posX            = 0,
        field               = currentPrecision,
        temp;
    bool  searchNegative   = false,
        continueProgramState= true;
    std::string notification= "";
    while(continueProgramState)
    {
        srand(time(0));
        while(true)
        {
            std::cout << notification;
            std::cout << "Enter the lower limit: ";
            std::cin  >> lowerLimit;
            std::cout << "Enter the upper limit: ";
            std::cin  >> upperLimit;
            if (lowerLimit >= upperLimit){
                notification = "The lower limit cannot be greater than or equal to the upper limit.\nRe-enter, please.\n";
                system("cls");
                continue;
            }
            notification = "";
            break;
        }
        temp = upperLimit;
        while(temp)
        {
            temp /= 10;
            field++;
        }
        if(lowerLimit < 0 || upperLimit < 0){
            field++;
            searchNegative = true;
        }
        while(true)
        {
            std::cout << "Generated array:\n";
            for(int i = 0; i < maxHeight; i++)
            {
                for(int j = 0; j < maxWidth; j++)
                {
                    array[i][j] = rand()%(upperLimit - lowerLimit + 1) + lowerLimit;
                    if (!firstNegativeValue && array[i][j] < 0){
                        firstNegativeValue = array[i][j];
                        FNV_posY = i + 1;
                        FNV_posX = j + 1;
                    }
                    std::cout << std::setw(field - 1) << array[i][j];
                }
                std::cout << '\n';  
            }
            if(!firstNegativeValue && searchNegative){
                system("cls");
                continue;
            }
            break;
        }
        std::cout   << "First negative value: " << firstNegativeValue << ".\n" 
                    << "Position: x = " << FNV_posX << ", "
                    << "Position: y = " << FNV_posY << ".\n";
                    
        if(firstNegativeValue){
            std::cout << "Final array:\n";
            for(int i = 0; i < maxHeight; i++)
            {
                for(int j = 0; j < maxWidth; j++)
                {
                    std::cout   << std::setw(field) 
                                << std::setprecision(currentPrecision) << 1.0 * array[i][j] / firstNegativeValue;
                }
                std::cout << '\n';  
            }
        } else {
            std::cout << "The final array cannot be formed because the specified range does not contain negative numbers.\n";
        }
        std::cout << "If you want to re-enter press \'r\'...\n";
        std::cin.ignore(10, '\n');
        int choise = getch();
        if(choise == 170 || choise == 114){
            system("cls");
            firstNegativeValue  = 0;
        } else {
            continueProgramState = false;
        }
    }
    std::cout << "Press any button to quit...\n";
    getchar();
    return 0;
}
Добавлено через 26 минут
Строка 38: исходя из условия получается, что цикл завершится после первого же проверенного элемента. Если его значение положительно или равно нулю, то увеличится К, что будет означать отсутствие отрицательных элементов (что может не соответствовать истине); если отрицательно, то - запись и выход. Так или иначе весь массив не пройдет.
0
0 / 0 / 0
Регистрация: 09.07.2014
Сообщений: 40
19.12.2018, 22:51  [ТС]
Цитата Сообщение от Kaitangata Посмотреть сообщение
Строка 38: исходя из условия получается, что цикл завершится после первого же проверенного элемента. Если его значение положительно или равно нулю, то увеличится К, что будет означать отсутствие отрицательных элементов (что может не соответствовать истине); если отрицательно, то - запись и выход. Так или иначе весь массив не пройдет.
А что нужно изменить в моем коде, чтобы он все эл-ты проверил?
0
 Аватар для Kaitangata
5 / 2 / 3
Регистрация: 19.12.2018
Сообщений: 7
20.12.2018, 11:15
Лучший ответ Сообщение было отмечено Korrako как решение

Решение

Цитата Сообщение от Korrako Посмотреть сообщение
А что нужно изменить в моем коде, чтобы он все эл-ты проверил?
Поправлю: не все, а до первого отрицательного.

1) со строки 35:
C++
1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        if (y[i][j] < 0 && !st_otr){
            st_otr = y[i][j];
            cout << "\nПервый отрицательный элемент равен " << st_otr 
                   << ", находится в строчке " << i + 1 << " и столбике " << j + 1;
            break;
        }
    }
}
Комментарий: в st_otr у тебя хранится найденное значение. Условие в строке 5 будет выполнено в том случае, если текущий элемент массива отрицательный и st_otr равно нулю (изначально это так). При первом же вхождении в тело условия st_otr примет значение отличное от нуля, что не позволит выполниться условию вновь независимо от значения текущего элемента массива.
Можно еще добавить условие во внешний цикл, чтобы он просто так не крутился. Но правильнее было бы сделать проверку в первом цикле. Т.е. можешь эту часть удалить, а условие перенести в тело цикла в строке 30 (убрав лишнее, разумеется) и поднять определение st_otr за этот цикл (выше строки 30).
2) со строки 57:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if (st_otr){
        cout << "\nПолученная матрица\n";
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                    cout << x[i][j] << " ";
            }
                cout << '\n';
        }
    } else {
        cout << "\nМатрица не может быть получена!\n";
    }
    return 0;
}
Добавлено через 23 минуты
3) Не знаю на сколько обоснованным мой совет будет в отношении main(), но раз функция возвращает значение, то возьмите за правило писать return;. Компилятор ругаться не будет, но вряд ли Вы получите то, что хотите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2018, 11:15
Помогаю со студенческими работами здесь

Массив: Найти первый отрицательный элемент в каждой строке и последний четный элемент в каждом столбце.
Дан двумерный массив двухбайтовых знаковых целочисленных элементов 5*8. Полагаем,что в каждой строке хотя бы 1 элемент отрицательный,а в...

Удалить столбец матрицы, в котором находится первый четный отрицательный элемент
1. Дан двумерный массив размером 5*8, заполненный случайным образом. Удалить столбец, в котором находится первый четный отрицательный...

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

Как найти первый отрицательный элемент в массиве
Здравствуйте, помогите составить код чтобы найти первый(второй и т.д.)отрицательный элемент в массиве.

Найти первый и последний отрицательный элемент массива
Организовать одномерный массив с вещественными числами и найти первый и последний отрицательный элемент массива; Добавлено через 4...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru