Имя: Пароль:
1C
 
Матрица по спирали
0 BBF765
 
21.04.19
08:29
Нужен цикл для заполнения матрицы по спирали,с первой строки, количество строк и колонок задается пользователем, нужен именно пример цикла, пока сам не могу прийти к этому, не силен в таких вещах((
1 DJ Anthon
 
21.04.19
08:48
1000 руб.
2 EkaterinaS
 
21.04.19
09:26
В интернете есть примеры на других языках. https://renkport.ru/java/primer/zapolnenie-dvumernogo-massiva-po-spirali/
3 rphosts
 
21.04.19
09:33
(0) это задача мне попалась на экзамене по фортрану (после первого семестра), а казалась бы не программирование а лишь прикладная математика.... 1990г
"Эх, народец нынче хилый".
4 BBF765
 
21.04.19
09:36
Я тоже решал такие задачи будучи студентом, но это давно и свою форму я давно растерял, пытался перевести с языков Java и C++, но успехов это не принесло((
5 vde69
 
21.04.19
10:22
(4) так напиши алгоритм РУССКИМ языком, а потом уже переводи в код
6 RomanYS
 
21.04.19
10:47
Как вараинт: обошел периметр, далее рекурсия
7 rphosts
 
21.04.19
11:18
(6) любая рекурсия заменяется циклом
8 RomanYS
 
21.04.19
11:24
(7) Это понятно, но (0) возможно циклы ещё не освоил)
Я бы начал так
Повороты = Новый Структура("Верх,Право,Низ,Лево", "Право", "Низ", "Лево", "Верх");
Шаги = Новый Структура("Верх,Право,Низ,Лево"
    , Новый Структура("X,Y", 1, 0)
    , Новый Структура("X,Y", 0, 1)
    , Новый Структура("X,Y", -1, 0)
    , Новый Структура("X,Y", 0, -1));
Границы = Структура("Верх,Право,Низ,Лево", 0, Колонок - 1, Строк - 1, 0);

ТекАдрес = Новый Структура("X,Y", 0, 0);
Пока (Границы.Верх < Границ.Низ) И (Границы.Лево < Границ.Право) Цикл
    ...
КонецЦикла;
9 BBF765
 
21.04.19
11:47
(8)Это то понятно я сам цикл не могу разобрать, неправильно выводит(
10 ЕщеОдин Программист
 
21.04.19
13:23
(7) не любая, а только в данном контексте. Ветвящаяся нет.
11 dmt
 
21.04.19
14:23

    у = 4;
    х = 5;
    
    м = Новый Массив(у, х);
    
    Для к = 0 по у-1 Цикл
        Для й = 0 По х-1 Цикл
            м[к][й] = к*х + й;
        КонецЦикла;
    КонецЦикла;
    
    Сообщить("---------------------");
    
    стКоординаты = Новый Структура();
    стКоордината = Новый Структура("Тек,Нач,Кон", 0, 0, у-1);
    стКоординаты.Вставить("у", стКоордината);
    стКоордината = Новый Структура("Тек,Нач,Кон", 0, 0, х-1);
    стКоординаты.Вставить("х", стКоордината);
    
    соНаправления = Новый Соответствие;
    соНаправления.Вставить(0, Новый Структура("Координата,Знак", "х", 1));
    соНаправления.Вставить(1, Новый Структура("Координата,Знак", "у", 1));
    соНаправления.Вставить(2, Новый Структура("Координата,Знак", "х", -1));
    соНаправления.Вставить(3, Новый Структура("Координата,Знак", "у", -1));
    
    текНаправление = 0;
    текКоордината = соНаправления[текНаправление].Координата;
    
    колПоворотов = 0;
    к = стКоординаты[текКоордината].Нач;
    
    Пока к <= стКоординаты[текКоордината].Кон Цикл
            
        Если соНаправления[текНаправление].Знак = 1 Тогда
            стКоординаты[текКоордината].Тек = к;
        Иначе
            стКоординаты[текКоордината].Тек = (стКоординаты[текКоордината].Кон + стКоординаты[текКоордината].Нач) - к;
        КонецЕсли;
        
        Сообщить(м[стКоординаты.у.Тек][стКоординаты.х.Тек]);
        
        Если к = стКоординаты[текКоордината].Кон Тогда
            колПоворотов = колПоворотов + 1;
            
            текНаправление = текНаправление + 1;
            Если текНаправление > 3 Тогда
                текНаправление = 0;
            КонецЕсли;
            
            текКоордината = соНаправления[текНаправление].Координата;
            
            Если соНаправления[текНаправление].Знак = 1 Тогда
                стКоординаты[текКоордината].Нач = стКоординаты[текКоордината].Нач + 1;
            Иначе
                стКоординаты[текКоордината].Кон = стКоординаты[текКоордината].Кон - 1;
            КонецЕсли;
            
            к = стКоординаты[текКоордината].Нач;
            
        Иначе
            к = к + 1;
        КонецЕсли;
        
    КонецЦикла;

12 Сияющий в темноте
 
22.04.19
11:33
у нас прямоугольник bottom,left,right,top
направления слева направо по верху
свеху вниз справа
справа налево по низу
снизу вверх слева
проверяем,что есть,что заполнять
слева направо это по top от left до right потом top++
сверху вниз это по right от top до bottom потом right--
справа налево это по bottom от right до left потом bottom--снизу вверх это по left от bottom до top потом left++
условие окончания это right<left или bottom<top