С++ вывод столбцами через cout

89
30 октября 2021, 07:40

Есть такая задача: сгенерировать матрицу NxN случайными числами, найти в каждом столбце полученной матрицы максимум, из выборки максимумов найти минимум. Поначалу пришло такое, вроде как, простое решение:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <conio.h>
#define N 6
#define RAND() rand() % 100 // [0;99]
#define SIZE setw(4)
using namespace std;
ofstream fout("result.txt");
void print(const char* str)
{
    cout << str;
    fout << str;
}
void print(int number)
{
    cout << SIZE << number;
    fout << SIZE << number;
}
int main(int argc, char** argv)
{
    srand(time(NULL));
    setlocale(LC_ALL, "Russian");
    int d2arr[N+1][N]; // доп строка для максимумов столбцов
    int min = 100;
    for (int i = 0; i < N; i++)
        d2arr[N][i] = -1;
    print("Вывод сгененированной матрицы:\n");
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            d2arr[i][j] = RAND();
            if (d2arr[i][j] > d2arr[N][j])
                d2arr[N][j] = d2arr[i][j];
            print(d2arr[i][j]);
        }
        print("\n");
    }
    print("\nВывод максимумов для столбцов:\n");
    for (int i = 0; i < N; i++)
    {
        if (d2arr[N][i] < min)
            min = d2arr[N][i];
        print(d2arr[N][i]);
    }
    print("\n\nМинимум из выборки:");
    print(min);
    fout.close();
    _getch();
    return 0;
}

однако хотелось бы оптимизировать программу и избавиться от второго цикла, идея такая (псевдо):

int min = 100, max=-1;
int d2arr[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            d2arr[j][i] = RAND(); // генерируем по столбцам
            if (d2arr[j][i] > max)
                max = d2arr[j][i];
            print(d2arr[j][i]);
        }
        if (max < min) min = max;
        print("\n");
    }

Собственно проблема: как выводить сразу же такие данные? Допустим я выведу первый столбец, перенося строку после каждого элемента. Как вернуться к началу консоли? Желательно без консольхендлей и SetConsoleCursorPosition, а с использованием чего-то попроще (простая универовская лаба, просто интересно сделать по-другому).
P.S.: в программе используется fstream, и там должно выводиться тоже самое.
OS винда, Visual studio

Answer 1

По поводу вывода: нативными средствами возврата на строку назад добиться нельзя... Но, есть библиотеки, которые позволяют организовать подобный вывод в консоли. Я говорю об ncurses (она также компилируется под windows, но с этим могут возникнуть проблема, так что в этом случае используйте pdcurses - api тоже самое, за исключением редких моментов)

READ ALSO
Не работает муравей ленгтона на c++

Не работает муравей ленгтона на c++

Написал муравья ленгтона на c++, для визуализации использовал функции winapiМуравей ходит нормально ровно до того момента когда он должен начать...

254
Книги и учебные ресурсы по фундаментальным знаниям и навыкам разработчика

Книги и учебные ресурсы по фундаментальным знаниям и навыкам разработчика

Рекомендуемая литература и документация по знаниям и навыкам разработки, не привязанным к конкретным языкам и платформам

157
SFML, View и отрисовка

SFML, View и отрисовка

Подскажите, пожалуйста, отрисовывает ли SFML то, что находится за пределами используемого вида?

81