Ребята. помогите моему студенту плиз. Ну и мне интересно стало.
По условиям ТЗ нужно заполнить прямоугольный массив натуральными числами.
Поиск решения привёл к такому:
#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
  
 
 
 
  Спасибо. Но они ещё не проходили автоматическое заполнение. 1сем. 1курс...
 
 
 
  kosmos440o
  8.12.2019, 19:19
  
 
  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
 
 
 
 
  сайт онлайн выполнения программ
https://rextester.com/l/cpp_online_compiler_gccна разных языках программирования 
и есть другие компиляторы онлайн
сохраняя программу и вычисления 
https://rextester.com/JRGX29275пример: компьютер угадал число
 
 
 
 
 
  экспорт, спасибо. Передам сыну.
Задачку решили. Правила пришлось тестировать и отлаживать, но вроде бы на разных размерах работает. Помогал мой знакомый IT-шник. Проблема была с вычислением кол-ва интераций и условиями для "for". Ходов выбрали 4 шт. - верх слева-направо горизонт/справа сверху-вниз вертикаль/низ справа-налево горизонт/ слева снизу-вверх вертикаль (по часовой стрелке).
Блин. Увлекательная штука однако. Жаль нет времени на это.
 
 
 
  экспорт
  10.12.2019, 11:49
  
 
  программы на форуме легко найти 
ища слово using
и получив результаты как сообщения
 
 
 
  экспорт
  11.12.2019, 20:25
  
 
  сегодня на форуме программистов: 
решено через онлайн компилятор 
на доселе неизвестном языке 
используя знания яп 21-го века 
решить математическое выражение 
https://programmersforum.ru/showthread.php?t=333190ссылки оттуда: 
https://rosettacode.org/wiki/Category:Javahttps://rextester.com/l/java_online_compilerсочиняем и пишем и проверяем онлайн 
https://rextester.com/KTOV72745Учим C# зная Basic & Excel & qb64
https://programmersforum.ru/showthread.php?t=327446
  
 
 
  dmytrokushpel
  28.1.2020, 22:35
  
 
  Цитата(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
  29.1.2020, 20:33
  
 
  Цитата
Cоветую почитать code convention на с++ и на с
, без него в будущем никуда, расставляйте обязательно скобки, потому что именно они показывают вложенность. Это важная штука
Полностью соглашусь с вами, без нормального оформления кода, зачастую не понятно, что вообще происходит. Хотел еще вам бы посоветовать такую тему как спортивное программирование. Как по мне очень интересное направление программирование и дает возможность быстро развить логику и выучить базовые элементы языка.