6.01.2011 / 22:23 | |
XakepPRO Пользователь
| Алгоритм заполнения массива по спирали на Pascal: uses crt;
const nmax=50; {максимальный размер}
var a:array[1..nmax, 1..nmax]of integer;{матрица}
n:integer; {размер матрицы}
i,j:integer; {координаты ячейки}
num:integer; {число в ячейке, счетчик (при N=4 от 1 до 16)}
add:integer; {шаг =+1 при движении вправо и вниз,
=-1 при движении влево и вверх}
begin
clrscr;
repeat
write('n=')readln(n);
until (n>1) and (n<=nmax); {проверяем правильность размера}
x:=0;
y:=1;
num:=1;
add:=n;
dir:=1;
while (add<>0) do
begin
i:=0
while (i<>add) do {вправо}
begin
x:=x+dir;
a[y,x]:=num;
num:=num+1;
i:=i+1;
end;
i:=0;
add:=add-1;
while (i<>add) do {вниз}
begin
y:=y+dir;
a[y,x]:=num;
num:=num+1;
i:=i+1;
end;
dir:=dir*(-1); {меняем знак и тоже самое влево и вверх}
end;
for i:=1 to n do
begin
for j:=1 to n do
write (a[i,j]:4);
writeln;
end;
end.
Текст программы можно и укоротить, но сейчас это бесмысленно. Вводится значение переменной N, после чего идёт заполнение массива. Однако, если его вывести на экран, то он будет выглядеть так:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
|
6.01.2011 / 22:35 | |
XakepPRO Пользователь
| Вот. Писал на телефоне. Под одеялом. С фонариком. Замучился. Щас на бейсике буду писать.
|
6.01.2011 / 22:37 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| XakepPRO, Ну раз на телефоне, то лови +
__________________
let live |
6.01.2011 / 23:03 | |
XakepPRO Пользователь
| CLS Nmax=50 'Максимальный размер матрицы
WHILE N<1 AND N>Nmax INPUT ''Введите размер матрицы: '', N WEND
'Проверяем правильность
DIM a(1 TO N, 1 TO N)
X=0 : Y=1 'Координаты элемента массива NUM=1 'Значение элемента массива (Х,У), счетчик. (при N=4 колеблется от 1 до 16) ADD=n 'Длина отрезка от поворота до поворота DIR=1 'шаг, направление движения. Равен +1, при движении вправо и вниз; равен -1, при движении влево и вверх
WHILE ADD<>0 I=0 WHILE I=ADD 'вправо X=X+DIR a(X,Y)=NUM NUM=NUM+1 I=I+1 WEND I=0 ADD=ADD-1 WHILE I<>ADD 'вниз Y=Y+DIR A(Y,X)=NUM NUM=NUM+1 I=I+1 WEND DIR=DIR*(-1) 'меняем знак, и поэтому направление при следующем повторе цикла будет влево и вверх WEND
'Вывод матрицы
FOR I=1 TO N FOR J=1 TO N PRINT USING ''####''; A(X,Y); NEXT J PRINT NEXT I
END
Все комменты такие же.
|
6.01.2011 / 23:44 | |
XakepPRO Пользователь
| Последней задачей является конкатенировать все строки массива, т.е. счцепить, склеить всё в один линейный массив (либо сразу отправить на экран). Из предыдущих алгоритмов получилось, что массив у нас получился не так: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 Как хотелось бы: 1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7 Что нам нужно сделать? Как сказал один человек: ''Вытянуть руки и включить моск''. В данном случае пройтись по матрице и занести все значения элементов так, чтобы подходило по условию задачи. Мы будем считывать все значения элементов матрицы двигаясь следующим образом: C=1 'Счетчик
FOR I=1 TO N
FOR J=1 TO N
B(C)=A(J,I)
C=C+1
NEXT J
NEXT I
Массив B объявляем заранее: -------- Pascal Var B:array [1..Nmax*Nmax] of integer;
C:integer;
C:=1;
for i:=1 to N do
for j:=1 to N do
begin
B[C]:=A[j,i];
C+=1;
end;
За малым осталось вывести линейный массив на экран. Немножко изменений/добавлений кода и программа готова. |
6.01.2011 / 23:49 | |
LPzhelud Пользователь Сейчас: Offline
Имя: Коля Откуда: Москва Регистрация: 02.06.2010
| XakepPRO, лови плюс
__________________
Эль Презеденте |
7.01.2011 / 00:23 | |
XakepPRO Пользователь
| Задача annimon.com/forum/?act=post&id=42819 ещё в силе.
|
7.01.2011 / 01:18 | |
Freddy Пользователь Сейчас: Offline
Имя: Игорь Откуда: Воронеж Регистрация: 30.01.2010
| Ладно, на C я больше писать не буду |
7.01.2011 / 04:56 | |
Dabann Пользователь Сейчас: Offline
Имя: Дeнис Откуда: Серпухов Регистрация: 06.06.2010
| XakepPRO (06.01.2011/17:43) Хмм.. Еще одна интересная, теперь уже простая задача.Задана строка символов. Среди литер этого текста особую роль играет знак #, появление которого означает отмену предыдущей литеры текста; k знаков оТ.к. знаю только МВ, код писал на нем: 10 INPUT "введите текст",T$
20 PRINT "ждите...":SLEEP 250
30 T%=LEN(T$)
40 I%=1
50 IF LEFT$(T$,1)="#" THEN T$=MID$(T$,2,T%-1):GOTO 30
60 IF MID$(T$,I%,1)="#" THEN T2$=LEFT$(T$,I%-2):T$=T2$+MID$(T$,I%+1,T%-I%):GOTO 30
70 I%=I%+1
80 IF I%>T% THEN GOTO 100
90 GOTO 50
100 CLS
110 PRINT T$
А вот сама прога:
Прикрепленные файлы: t0#exxa##t.jar (32.48 кб.) Скачано 296 раз |
7.01.2011 / 05:58 | |
Dabann Пользователь Сейчас: Offline
Имя: Дeнис Откуда: Серпухов Регистрация: 06.06.2010
| ^ | Как я вовремя успел-то Кстати, я чуть-чуть обманул... Я еще разум немного знаю, но эт не считается... Изменено Dabann (7.01 / 05:59) (всего 1 раз) |