Вывод номеров строк двумерного массива, содержащих только положительные числа

Почитай Массивы в C++ на практике. Полезно.

И еще, как сделать вывод номеров строк с положительными элементами?

Это можно понимать по разному: либо как "в строке присутствует хотя бы один положительный элемент«, либо как » все элементы строки положительны". Второй вариант интереснее. Но надо все-таки уточнить.

Внешний цикл — по номерам строк. Внутренний цикл — по строке (по одномерному массиву). Во внутреннем цикле анализируешь строку и устанавливаешь или сбрасываешь переменную-флаг (типа bool). По окончании цикла в зависимости от переменной-флага выводишь или не выводишь номер строки (т.е. текущее содержимое переменной-счетчика внешнего цикла).

Фтьiкай, смотри, почти все готово, только не могу я правильно применить bool.. Не догоняю как(

#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main()
{
    setlocale(LC_ALL, "rus");
    srand(time(NULL));
    int a, b;
    cout << "Введите число a: ";
    cin >> a;
    cout << "Введите число b: ";
    cin >> b;

    int matrix[11][11];

    for (int counter_rows = 0; counter_rows < 11; counter_rows++)
        for (int counter_columns = 0; counter_columns < 11; counter_columns++)
            matrix[counter_rows][counter_columns] = a + rand() % b;

    cout << endl;
    cout << "Наш массив 11x11" << endl;

    for (int counter_rows = 0; counter_rows < 11; counter_rows++)
    {
        for (int counter_columns = 0; counter_columns < 11; counter_columns++)
            cout << setw(6) << matrix[counter_rows][counter_columns];
        cout << endl;
    }

    int str_positive = matrix[0][0] > 0;
    int str_number;

    for (int counter_rows = 0; counter_rows < 11; counter_rows++)
    {
        for (int counter_columns = 0; counter_columns < 11; counter_columns++)
        {
            if (matrix[counter_rows][counter_columns] > str_positive)
            {
                str_positive = matrix[counter_rows][counter_columns];
                str_number = counter_rows;
            }
        }
    }

    cout << "\nНомер строки с положительными элементами: " << (str_number + 1) << endl;
    system("pause");
    return 0;
}

Тут я встрял..

mychernenko, так

matrix[counter_rows][counter_columns] = a + rand() % b;

вы не заполните массив рандомными числами от a до b, т.к. выражение a + rand() % b переводится следующим образом: генерировать числа от a до a + (b — 1).

Эту задачу предлагаю решить так:

#include <iostream>
using std::cout;
using std::cin;

#include <iomanip>
using std::setw;

#include <cstdlib>
using std::rand;
using std::srand;

#include <ctime>
using std::time;

const int STR = 11;
const int COL = 11;

int main()
{
    setlocale(LC_ALL, "rus");

    int a, b;
    cout << "Введите число соответствующее началу отрезка: ";
    cin >> a;
    cout << "Введите число соответствующее концу отрезка: ";
    cin >> b;

    if (a > b){         // если a > b, то поменять значения местами
        int temp = a;
        a = b;
        b = temp;
    }

    int numCount = 0;

    while ((a + numCount++) < b)    // посчитать кол-во цифр между a и b, включая a и b
        ;

    cout << "Количество цифр в отрезке от " << a << " до " << b << ": " << numCount << '\n';

    srand(static_cast<unsigned int>(time(0)));

    int matrix[::STR][::COL];

    for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
        for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
            matrix[counter_rows][counter_columns] = a + rand() % numCount;
            cout << setw(4) << matrix[counter_rows][counter_columns];
        }
        cout << '\n';
    }

    return 0;
}

А теперь программу можно переписать так:

#include <iostream>
using std::cout;
using std::cin;

#include <iomanip>
using std::setw;

#include <cstdlib>
using std::rand;
using std::srand;

#include <ctime>
using std::time;

const int STR = 11;
const int COL = 11;

int main()
{
    setlocale(LC_ALL, "rus");

    int a, b;
    cout << "Введите число соответствующее началу отрезка: ";
    cin >> a;
    cout << "Введите число соответствующее концу отрезка: ";
    cin >> b;

    if (a > b){         // если a > b, то поменять значения местами
        int temp = a;
        a = b;
        b = temp;
    }

    int numCount = 0;

    while ((a + numCount++) < b)    // посчитать кол-во цифр между a и b, включая a и b
        ;

    cout << "Количество цифр в отрезке от " << a << " до " << b << ": " << numCount << '\n';

    srand(static_cast<unsigned int>(time(0)));

    int matrix[::STR][::COL];

    for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
        for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
            matrix[counter_rows][counter_columns] = a + rand() % numCount;
            cout << setw(4) << matrix[counter_rows][counter_columns];
        }
        cout << '\n';
    }

    bool posStr[::STR], flag = true;
    int numPosStr = 0;

    for (int i = 0; i < ::STR; i++)
        posStr[i] = false;

    for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
        for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
            if (matrix[counter_rows][counter_columns] < 0){ // проверяем строку на наличие отриц. чисел
                flag = false;
                break;
            }
        }

        if (flag){
            posStr[counter_rows] = true;    // запоминаем строку в которой нет отриц. чисел
            numPosStr++;                    // считаем кол-во строк
        }
        flag = true;
    }

    if (numPosStr){

        if (1 == numPosStr){
            cout << "В строке ";
        }
        else{
            cout << "В строках ";
        }

        for (int i = 0; i < ::STR; i++){

            if (posStr[i]){
                cout << i + 1;
                if (--numPosStr){
                    cout << ", ";
                }
            }

        }

        cout << " нет ни одного отрицательного числа.\n";
    }
    else{
        cout << "Во всех строках есть отрицательные числа.\n";
    }

    return 0;
}
while ((a + numCount++) < b)    // посчитать кол-во цифр между a и b, включая a и b
    ;

wtf?

Почему сразу на свалку? :)
Croessmah, вы перед тем как куда-то посылать, объяснили бы причину по которой посылаете.

Чем идея посчитать количество чисел между a и b в цикле, хуже формулы (b + 1) - a?

Чем идея посчитать количество чисел между a и b в цикле, хуже формулы (b + 1) — a?

хотя бы производительностью и читабельностью, не?

С учетом замечаний Croessmah и наглядности отображения строк, перепишем программу так:

#include <iostream>
using std::cout;
using std::cin;
using std::left;
using std::right;

#include <iomanip>
using std::setw;

    #include <cstdlib>
    using std::rand;
    using std::srand;

    #include <ctime>
    using std::time;

    const int STR = 11;
    const int COL = 11;

    int main()
    {
        setlocale(LC_ALL, "rus");

        int a, b;
        cout << "Введите число соответствующее началу отрезка: ";
        cin >> a;
        cout << "Введите число соответствующее концу отрезка: ";
        cin >> b;

        if (a > b){         // если a > b, то поменять значения местами
            int temp = a;
            a = b;
            b = temp;
        }

        int numCount = (b + 1) - a;     // посчитать кол-во цифр между a и b, включая a и b

        cout << "Количество цифр в отрезке от " << a << " до " << b << ": " << numCount << '\n';

        srand(static_cast<unsigned int>(time(0)));

        int matrix[::STR][::COL];

        for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
            cout << "Строка #" << setw(4) << left << counter_rows + 1;
            for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
                matrix[counter_rows][counter_columns] = a + rand() % numCount;
                cout << setw(4) << right << matrix[counter_rows][counter_columns];
            }
            cout << '\n';
        }

        bool posStr[::STR], flag = true;
        int numPosStr = 0;

        for (int i = 0; i < ::STR; i++)
            posStr[i] = false;

        for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
            for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
                if (matrix[counter_rows][counter_columns] < 0){ // проверяем строку на наличие отриц. чисел
                    flag = false;
                    break;
                }
            }

            if (flag){
                posStr[counter_rows] = true;    // запоминаем строку в которой нет отриц. чисел
                numPosStr++;                    // считаем кол-во строк
            }
            flag = true;
        }

        if (numPosStr){

            if (1 == numPosStr){
                cout << "В строке ";
            }
            else{
                cout << "В строках ";
            }

            for (int i = 0; i < ::STR; i++){

                if (posStr[i]){
                    cout << i + 1;
                    if (--numPosStr){
                        cout << ", ";
                    }
                }

            }

            cout << " нет ни одного отрицательного числа.\n";
        }
        else{
            cout << "Во всех строках есть отрицательные числа.\n";
        }

        cin.get();

        return 0;
    }

С учетом замечаний Croessmah и наглядности отображения строк, перепишем программу так:

include <iostream>

using std::cout;
using std::cin;
using std::left;
using std::right;

include <iomanip>

using std::setw;

#include <cstdlib>
using std::rand;
using std::srand;

#include <ctime>
using std::time;

const int STR = 11;
const int COL = 11;

int main()
{
    setlocale(LC_ALL, "rus");

    int a, b;
    cout << "Введите число соответствующее началу отрезка: ";
    cin >> a;
    cout << "Введите число соответствующее концу отрезка: ";
    cin >> b;

    if (a > b){         // если a > b, то поменять значения местами
        int temp = a;
        a = b;
        b = temp;
    }

    int numCount = (b + 1) - a;     // посчитать кол-во цифр между a и b, включая a и b

    cout << "Количество цифр в отрезке от " << a << " до " << b << ": " << numCount << '\n';

    srand(static_cast<unsigned int>(time(0)));

    int matrix[::STR][::COL];

    for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
        cout << "Строка #" << setw(4) << left << counter_rows + 1;
        for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
            matrix[counter_rows][counter_columns] = a + rand() % numCount;
            cout << setw(4) << right << matrix[counter_rows][counter_columns];
        }
        cout << '\n';
    }

    bool posStr[::STR], flag = true;
    int numPosStr = 0;

    for (int i = 0; i < ::STR; i++)
        posStr[i] = false;

    for (int counter_rows = 0; counter_rows < ::STR; counter_rows++){
        for (int counter_columns = 0; counter_columns < ::COL; counter_columns++){
            if (matrix[counter_rows][counter_columns] < 0){ // проверяем строку на наличие отриц. чисел
                flag = false;
                break;
            }
        }

        if (flag){
            posStr[counter_rows] = true;    // запоминаем строку в которой нет отриц. чисел
            numPosStr++;                    // считаем кол-во строк
        }
        flag = true;
    }

    if (numPosStr){

        if (1 == numPosStr){
            cout << "В строке ";
        }
        else{
            cout << "В строках ";
        }

        for (int i = 0; i < ::STR; i++){

            if (posStr[i]){
                cout << i + 1;
                if (--numPosStr){
                    cout << ", ";
                }
            }

        }

        cout << " нет ни одного отрицательного числа.\n";
    }
    else{
        cout << "Во всех строках есть отрицательные числа.\n";
    }

    cin.get();

    return 0;
}

Можно мне тоже вставить свои пять копеек?

#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

const int MAX_ROW = 11;
const int MAX_COL = 11;

int main()
{
    setlocale(LC_ALL, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
    int a, b;
    do
    {
        cout << "Введите число a: ";
        cin >> a;
        cout << "Введите число b: ";
        cin >> b;
        if (a >= b)
            cout << "Число a должно быть меньше числа b! Попробуйте снова.\n" << endl;
    } while (a >= b);

    int matrix[MAX_ROW][MAX_COL];

    for (int counter_rows = 0; counter_rows < MAX_ROW; counter_rows++)
    for (int counter_columns = 0; counter_columns < MAX_COL; counter_columns++)
        matrix[counter_rows][counter_columns] = a + rand() % (b - a + 1);

    cout << endl;
    cout << "Наш массив " << MAX_ROW << "x" << MAX_COL << endl;

    for (int counter_rows = 0; counter_rows < MAX_ROW; counter_rows++)
    {
        for (int counter_columns = 0; counter_columns < MAX_COL; counter_columns++)
            cout << setw(6) << matrix[counter_rows][counter_columns];
        cout << endl;
    }

    bool str_is_positive;
    cout << "\nНомера строк все элементы которых положительны:" << endl;;
    for (int counter_rows = 0; counter_rows < MAX_ROW; counter_rows++)
    {
        str_is_positive = true;
        for (int counter_columns = 0; counter_columns < MAX_COL; counter_columns++)
        {
            if (matrix[counter_rows][counter_columns] < 0)
            {
                str_is_positive = false;
                break;
            }
        }
        if (str_is_positive)
            cout << setw(4) << counter_rows + 1;
    }
    cout << endl;

    system("pause");
    return 0;
}

Доброе время суток форумчане!
Пожалуй и я вставлю свои пять копеек. :) Croessmah, затронул тему производительности.

Чем идея посчитать количество чисел между a и b в цикле, хуже формулы (b + 1) — a?

хотя бы производительностью и читабельностью, не?

Всегда лучше сделать один раз вычисление, чем повторять его в цикле на каждой итерации. Ваш участок кода, Фтьiкай, этому противоречит.

for (int counter_rows = 0; counter_rows < MAX_ROW; counter_rows++)
    for (int counter_columns = 0; counter_columns < MAX_COL; counter_columns++)
        matrix[counter_rows][counter_columns] = a + rand() % (b - a + 1);

Лучше написать так

int numCount = (b + 1) - a;

for (int counter_rows = 0; counter_rows < MAX_ROW; counter_rows++)
       for (int counter_columns = 0; counter_columns < MAX_COL; counter_columns++)
           matrix[counter_rows][counter_columns] = a + rand() % numCount;

Сразу отвечу и beginner, почему лучше произвести сразу арифметическое вычисление по поиску количества элементов ряда, чем вычислять его в цикле.

Чем идея посчитать количество чисел между a и b в цикле, хуже формулы (b + 1) — a?

Запустите две тестовые программы по поиску количества элементов между двумя числами.
Одна из них

#include <iostream>

typedef long long ll;

using namespace std;

int main(){

    ll a = 100;
    ll b = 10000000000;

    ll counter = 0;

    counter = (b + 1) - a;

    cout << "Counter: " << counter << '\n';

    return 0;
}

вторая

#include <iostream>

typedef long long ll;

using namespace std;

int main(){

    ll a = 100;
    ll b = 10000000000;

    ll counter = 0;

    while ((a + counter++) < b)
        ;

    cout << "Counter: " << counter << '\n';

    return 0;
}

и вы сами увидите производительность каждой из них.

и вы сами увидите производительность каждой из них.

К слову. gcc фрагмент

while ((a + counter++) < b)
    ;

не смог оптимизировать, тогда как

for ( int x = a ; x <=b ; ++x )
    numCount++ ;

превратился в

subl %edx, %eax
addl $1, %eax

Всегда лучше сделать один раз вычисление, чем повторять его в цикле на каждой итерации. Ваш участок кода, Фтьiкай, этому противоречит.

Я не стал вдаваться в столь тщательную оптимизацию )))

Но в принципе, полностью согласен.

Оптимизирующие компиляторы — это, с одной стороны, хорошо: программы быстрее работают и занимают меньше памяти. Но с другой стороны, появляется некая недетерминированность: заранее неизвестно сможет компилятор соптимизировать (читай, исправить недочёт кодера) некий фрагмент, или нет. А с третьей стороны, вера (слепая вера!) в оптимизирующий компилятор приводит к снижению мотивации к повышению уровня знаний и опыта кодера (типа: «написал говнокод — ерунда, компилятор соптимизирует»).

Отсюда вывод: на компилятор надейся, а сам не плошай. Что бы повысить качество конечного продукта, необходимо писать качественный код. Тогда компилятор с большей вероятностью сделает необходимые оптимизации. Вообще, по моему мнению, оптимизирующий компилятор предназначен для оптимизаций сгенерированного (самим компилятором!) машинного кода, а не для исправления ляпов кодера.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.