Ищите решение для взаимодействия между массивами и cout в C ++ - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу, чтобы функция или цикл выполнялись через массив и выводили каждый элемент, пока он не напечатал 10 элементов. В этом случае начинается новая строка и печать продолжается. например. 1 2 3 4 5 6 7 8 9 10

Это для программы, которая работает с массивом, как домохозяйка 50-х годов, выполняя множество вычислений и изменений в указанном массиве.

Это моя текущая атака налогика, стоящая за моей проблемой.

int main()
    {
test = new int[100];
        for (int i = 0; i < 100; i++){                      
//Set array to rand
            test[i] = rand() % 44 + 55;
        }

        printf("original List\n");
        for (int i = 0; i < 100; i++){          
// print original order
            printf("%d\n", test[i]);
        }


        sortArr;                
// function call sort array ascend

        printf("\Sorted List\n");
            for (int i = 0;i < 100;i++) {           
// print sorted order

                printf("%d , ", test[i]);
                int temp;
//temp counter for width of printout

for (temp = 0;temp < 10;temp++) cout<< "\n" << endl;


sum += test[i];

            }

Ожидается блок вывода, состоящий из 100 элементов массива в сетке с шириной 10 элементов в строке.

Фактический результат - беспорядокновая линия петли и дальнейшая головная боль для меня.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Самое простое решение - распечатать разделитель (i%10 == 0) ? "\n" : ", ". Вы правильно поняли, что брать остаток на каждой итерации цикла неэффективно, и хотели написать такой, который бы печатал десять элементов, за которыми следовала бы новая строка.

Хитрость заключается в том, чтобы написать внутренний цикл с шагом в секунду. counter, j, сделайте все выходные данные во внутреннем цикле, а затем обновите i в нижней части внешнего цикла. Упрощенный пример:

#include <array>
#include <iostream>
#include <stdlib.h>
#include <time.h>

using std::cout;

int main()
{
  constexpr size_t ARRAY_LEN = 100;
  std::array<int, ARRAY_LEN> test;

  {
    // Quick and dirty initialization of the random seed to the lowest 30
    // or so bits of the system clock, which probably does not really have
    // nanosecond precision.  It’ll do for this purpose.

    timespec current_time;
    timespec_get( &current_time, TIME_UTC );
    srand(current_time.tv_nsec);
  }

  for (int i = 0; i < test.size(); i++){
    //Set array to rand
    test[i] = rand() % 44 + 55;
  }

  for ( int i = 0, j = 0;
        i < test.size();
        i += j ) {
    for ( j = 0; j < 10 && i + j < test.size(); ++j ) {
      cout << test[i + j] << ' ';
    }

    cout << '\n';
  }

  return EXIT_SUCCESS;
}

Обратите внимание, что версия, которую вы написали, не инициализирует случайное начальное число стандартной библиотеки, поэтому вы получаете те же (плохо распределенные) случайные числа. Вы могли бы написать версию, которая использует гораздо лучшие генераторы случайных чисел STL и, возможно, <chrono> вместо версий на C, но это немного выходит за рамки вашего вопроса.

1 голос
/ 04 ноября 2019

Довольно распространенная проблема, просто используйте модуль, основанный на индексе i:

for (int i = 0;i < 100;i++) {           
    printf("%d , ", test[i]);
    if ((i + 1) % 10 == 0) {
        printf("\n");
    }
}

Если вы хотите красиво отформатированный вывод, вам понадобятся:

#include <iomanip>

и

std::cout << std::setw(/*max_len*/) << test[i];
...