Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Заполните прямоугольный массив числами в С++
Диалог специалистов АВОК > ОБЩИЙ ФОРУМ > Песочница
327
Ребята. помогите моему студенту плиз. Ну и мне интересно стало.

По условиям ТЗ нужно заполнить прямоугольный массив натуральными числами.
Поиск решения привёл к такому:


#include <iostream>
using namespace std;

int main()
{
int const n=11;
int A[n][n];
int i=1,j,k,p=n/2;
for(k=1;k<=p;k++)/*Цикл по номеру витка*/
{
for (j=k-1;j<n-k+1;j++) A[k-1][j]=i++;/*Определение значений верхнего гор столбца*/
for (j=k;j<n-k+1;j++) A[j][n-k]=i++;/* --//-- По правому вертикальному столбцу*/
for (j=n-k-1;j>=k-1;--j) A[n-k][j]=i++;/* --//-- по нижнему горизонтальному столбцу*/
for (j=n-k-1;j>=k;j--) A[j][k-1]=i++;/* --//-- по левому вертикальному столбцу*/
}
if (n%2==1) A[p][p]=n*n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf(" %4d ",A[i][j]);
if(j==n-1) printf("\n");
}
}

Разобрался, что массив 11х11 (прямоугольник не получается сделать), что i- это начало отсчёта и значение первого числа.
По остальному непонятно. Что такое, и откуда взялись: k,j,p.

Можно тезисно, или где про это почитать? Для себя нарисовал систему координат, но сын говорит, что так не верно рассуждать. Мне логика непонятна - но я и не программер ни разу.....
Большое спасибо.
Юрий_Нд
Цитата(327 @ 8.12.2019, 16:25) *
for(k=1;k<=p;k++)
for (j=k-1;j<n-k+1;j++)
Что такое, и откуда взялись: k,j,p.

k=1
j=k-1
экспорт
Помощь студентам
https://programmersforum.ru/forumdisplay.php?f=31

все переменные прокомментируйте для себя

но зачем что-то делать со столбцами
и со строками ... непонятно

заполнение прямоугольного массива:
2 вложенных цикла

натуральные если последовательные
то просто счётчик независимо от циклов


qb64 в 1 строку сжато

Код
dim x(7,5):S=9:for i=1 to 7:for j=1 to 5:s=s+1:x(i,j)=s:next:next:for i=1 to 7:for j=1 to 5:?x(i,j);:next:?:next' abok.bas


результат:
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



Помощь студентам
https://programmersforum.ru/forumdisplay.php?f=31
327
Спасибо. Но они ещё не проходили автоматическое заполнение. 1сем. 1курс...
kosmos440o
int const n=11; объявляется константа n = 11; // для удобства, чтоб потом можно было менять только в одном месте. Для единичного случая можно всё заменить тупо на число 11. Тип целое, в памяти резервируется 16, 32 или 64 бит в зависимости от процессора.

int i=1,j,k,p=n/2;
//резервируется место под переменную i, тип целое, i присваивается начальное значение 1. это будет тупо первое число. потом к этой переменной будет прибавляться 1, результат будет сохраняться в памяти и записываться в таблицу вывода в определённых строке и столбце.
//резервируется место под переменные j, k, тип целое. Они будут потом счётчиками цикла. переменные инициализируются по ходу программы.
//резервируется место под переменную p, тип целое, p присваивается начальное значение n/2 == 5. Переменная будет ограничивать цикл на проходы. В таком виде, чтобы не писать дополнительно ещё и здесь, когда выбирается n пользователем, так как число зависит от n.
Непонятно, почему такие сложности. Если каких-то требований к порядку заполнения таблицы нет, то можно сделать построчно, как это сделано в разделе вывода на экран. Но тут заполнение разделено на 4 прямоугольника и в каждом заполняется по своему. Я бы использовал в этом случае if-else внутри вложенного цикла, было бы понятней.
Наверно учитель хотел завизуализировать мудрёный порядок обхода.


Вот образец простого заполнения таблицы.
int main()
{
int const n=11; // вставьте тут размер желаемого квадрата
int A[n][n]; // инициализация массива с размером n ширины и n высоты.
int i=1,j,k,p=n/2; // комментарий см. выше
for(j=0; j<n; j++) // цикл заполнения строк от 1 до n
..{ // желательно отделять тела функций скобками, это предотвращает неправильное выполнение компилятором и делает программу более понятной
....for(k=0; k<n; k++) // цикл заполнения элементов строки
......{
......A[j][k]=i++; Присвоение текущему элементу значения
......if (n%2==1) A[p][p]=n*n; // тут какой-то особый случай. Если квадрат несимметричный, центральная точка заполняется числом n^2.
.............................................// Нехорошо выполнять эту проверку каждый раз, но для простоты пойдёт.
......printf(" %4d ",A[j][k]); // сразу вывод на печать
......if(k==n-1) printf("\n"); // если строка заполнена, перенос строки
......} // end for k
..} // end for j
} // end main
327
Цитата(kosmos440o @ 8.12.2019, 19:19) *
.............


Спасибо.
экспорт
сайт онлайн выполнения программ
https://rextester.com/l/cpp_online_compiler_gcc
на разных языках программирования

и есть другие компиляторы онлайн

сохраняя программу и вычисления
https://rextester.com/JRGX29275
пример: компьютер угадал число
327
экспорт, спасибо. Передам сыну.

Задачку решили. Правила пришлось тестировать и отлаживать, но вроде бы на разных размерах работает. Помогал мой знакомый IT-шник. Проблема была с вычислением кол-ва интераций и условиями для "for". Ходов выбрали 4 шт. - верх слева-направо горизонт/справа сверху-вниз вертикаль/низ справа-налево горизонт/ слева снизу-вверх вертикаль (по часовой стрелке).

Блин. Увлекательная штука однако. Жаль нет времени на это.
экспорт
программы на форуме легко найти
ища слово using
и получив результаты как сообщения
экспорт
сегодня на форуме программистов:
решено через онлайн компилятор

на доселе неизвестном языке
используя знания яп 21-го века

решить математическое выражение
https://programmersforum.ru/showthread.php?t=333190

ссылки оттуда:
https://rosettacode.org/wiki/Category:Java
https://rextester.com/l/java_online_compiler

сочиняем и пишем и проверяем онлайн
https://rextester.com/KTOV72745

Учим C# зная Basic & Excel & qb64
https://programmersforum.ru/showthread.php?t=327446
dmytrokushpel
Цитата(327 @ 8.12.2019, 17:25) *
Ребята. помогите моему студенту плиз. Ну и мне интересно стало.

По условиям ТЗ нужно заполнить прямоугольный массив натуральными числами.
Поиск решения привёл к такому:


#include <iostream>
using namespace std;

int main()
{
int const n=11;
int A[n][n];
int i=1,j,k,p=n/2;
for(k=1;k<=p;k++)/*Цикл по номеру витка*/
{
for (j=k-1;j<n-k+1;j++) A[k-1][j]=i++;/*Определение значений верхнего гор столбца*/
for (j=k;j<n-k+1;j++) A[j][n-k]=i++;/* --//-- По правому вертикальному столбцу*/
for (j=n-k-1;j>=k-1;--j) A[n-k][j]=i++;/* --//-- по нижнему горизонтальному столбцу*/
for (j=n-k-1;j>=k;j--) A[j][k-1]=i++;/* --//-- по левому вертикальному столбцу*/
}
if (n%2==1) A[p][p]=n*n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf(" %4d ",A[i][j]);
if(j==n-1) printf("\n");
}
}

Разобрался, что массив 11х11 (прямоугольник не получается сделать), что i- это начало отсчёта и значение первого числа.
По остальному непонятно. Что такое, и откуда взялись: k,j,p.

Можно тезисно, или где про это почитать? Для себя нарисовал систему координат, но сын говорит, что так не верно рассуждать. Мне логика непонятна - но я и не программер ни разу.....
Большое спасибо.


Советую почитать code convention на с++ и на с, без него в будущем никуда, расставляйте обязательно скобки, потому что именно они показывают вложенность. Это важная штука
homapavlenko

Цитата
Cоветую почитать code convention на с++ и на с, без него в будущем никуда, расставляйте обязательно скобки, потому что именно они показывают вложенность. Это важная штука


Полностью соглашусь с вами, без нормального оформления кода, зачастую не понятно, что вообще происходит. Хотел еще вам бы посоветовать такую тему как спортивное программирование. Как по мне очень интересное направление программирование и дает возможность быстро развить логику и выучить базовые элементы языка.
327
Спасибо. Передам сыну.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.