Ребята. помогите моему студенту плиз. Ну и мне интересно стало.
По условиям ТЗ нужно заполнить прямоугольный массив натуральными числами.
Поиск решения привёл к такому:
#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 на с++ и на с
, без него в будущем никуда, расставляйте обязательно скобки, потому что именно они показывают вложенность. Это важная штука
Полностью соглашусь с вами, без нормального оформления кода, зачастую не понятно, что вообще происходит. Хотел еще вам бы посоветовать такую тему как спортивное программирование. Как по мне очень интересное направление программирование и дает возможность быстро развить логику и выучить базовые элементы языка.