Математика, необходимая для смещения столбцов?

#c #linux

#c #linux

Вопрос:

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

Я выполнил большую часть базовой идеи, в основном я просто разделил ширину окна терминала на произвольное число, которое я установил для допустимой длины столбца (в данном случае 22, поэтому количество имен файлов, печатаемых в строке, всегда равно window_width / 22, так что, например, если window_width равно 88, 88/22 равно 4, поэтому в каждой строке будет максимум 4 имени файла, количество пробелов равно разнице между длиной имени файла и 22).

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

Так, например, если в моем каталоге есть

 f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13 
  

тогда он должен распечатать что-то вроде этого:

 f1  f5  f8  f11
f2  f6  f9  f12
f3  f7  f10 f13
f4
  

Я знаю, что как только я распечатаю строку, я не смогу вернуться к ней, поэтому я должен придумать способ напечатать f1 f5 f8 f11 сразу, и то же самое до конца.

Все имена файлов хранятся в массиве, поэтому я подумал о том, чтобы как-то компенсировать это, например, rowWidth (которая в данном случае равна 4), i = 0, arr [i rowWidth * 0] равно f1, arr [i rowWidth * 1] равно f5, но тогда arr [i rowWidth * 2] должно быть f8, так что это означает, что в первом столбце расстояние между первым и вторым элементами равно 4 (что связано с высотой столбца 1), но в каждом другом столбце расстояние составляет всего 3 (потому что все столбцы после 1 имеют высоту 3).

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

Я не совсем уверен, как мне следует с этим справиться, такое ощущение, что эта ситуация требует большого предвидения, поэтому я не хочу снова вмешиваться, пока у меня не будет четкого представления о том, какой метод мне следует использовать.

Комментарии:

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

2. @TomKarzes вы говорите, что я должен хранить каждую строку в массиве с элементами = размер строки? (так, например, в этом случае, поскольку каждая строка содержит 4 элемента, получается массив размером 4?) Это хорошая идея, я думал только об использовании запутанной серии циклов for, но создание нового массива звучит намного проще, спасибо. Моя единственная проблема сейчас заключается в попытке выяснить, как определить высоту столбца, чтобы соответствующим образом смещать каждый элемент (например, расстояние между f1 и f5 равно 4, но f5 и f8 равно 3 ….)

3. О, хорошо, извините, теперь я понимаю, что вы перечисляете записи, идущие вниз по столбцам. В этом случае да, я бы прочитал все это в, затем, основываясь на количестве записей, вы можете решить, сколько строк необходимо, затем вы можете рассчитать ширину столбца, чтобы выровнять записи.

4. Как только вы определите, в какой строке и столбце находится каждая запись, просто просмотрите каждый столбец, чтобы определить максимальную ширину, необходимую для всех записей в этом столбце. Сохраняйте результаты в небольшом массиве целых чисел, индексируемом по номеру столбца. Как только у вас это получится, вы можете просто заполнить каждое поле до максимальной ширины для его столбца.

5. В вашем примере максимальная ширина для первых двух столбцов равна 2, а для вторых двух столбцов равна 3, поэтому ваш массив width будет содержать {2, 2, 3, 3}.