IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на 2х мерный массив, Для первого курса %)))
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Исходные данные:
1.квадратная нечетная матрица размернастью (m x m ); Минимальный размер 5х5 максимальный 21х21.
2.начальные элементы матрицы нулевые.
3. троектория обхода матрицы на рисунке


Программа должна обеспечивать: 1. Ввод даных с клавиатуры. 2. Вывод заданой матрицы на экран с последующим изображением процесса обхода заданной троектории. 3 Вывод в файл значений обхода матрицы (их координат), при этом имя файла вводится с клавиатуры.


П.с. если задать размер отличный от того, который на рисунке,троектория должна возрасти соответственно размерам.

P.p.s У меня в субботу пересдача, а меня без этой задачи на экзамен не пустят. Краем глаза видел экзаменационные билеты: ТАКОГО там точно нет. Я не могу понять к чему такие задачи дают на специальности, которые к компам имеют косвенное отношение.


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


Обход в твоей задаче состоит из четырех частей:
1. "бугорки" внизу матрицы.
2. Вертикальная "палка" слева (хотя это обходом можно и не считать).
3. "Ступеньки" в левом верхнем углу.
4. И треугольник вверху.

Я зделал первые три пункта, последний, скажу честно, лень. Просто вижу никто не торопится тебе делать задачу, так что на хотя бы это:
Код

Uses CRT;

Const
   m = 11;

Var
   mat   : Array [1..m, 1..m] of Byte;
   FName : String;
   F     : Text;
   i, j  : Integer;
   n, k  : Integer;
   l     : Integer;
   flag  : Boolean;

Begin
   ClrScr;
   Write('File Name: ');
   ReadLn(FName);
   Assign(F, FName);
   ReWrite(F);
   For i := 1 to m do
   Begin
       For j := 1 to m do
       Begin
           mat[i, j] := 0;
       End;
   End;
   n    := Round(m / 4);
   i    := m;
   j    := m;
   flag := True;
   l    := 0;
   While (j > 0) do               {obhod 1}
   Begin
       if (flag) Then
       Begin
       if (l = 0) Then
       Begin
           for k := i DownTo i-n+1 do
           Begin
               mat[k, j] := 1;
               j := j - 1;
           End;
           i := k+1;
       End
           Else
       Begin
           for k := i DownTo i-n+2 do
           Begin
               mat[k, j] := 1;
               j := j - 1;
               WriteLn(F, '(', k, ';', j, ')');
           End;
           i := k+1;
       End;
       End
           Else
       Begin
           for k := i To m do
           Begin
               mat[k, j] := 1;
               j := j - 1;
               l := l + 1;
               WriteLn(F, '(', k, ';', j, ')');
           End;
           i := k - 1;
       End;
       flag := not flag;
   End;                           {konez 1-ogo obhoda}

   n := (m div 2) + 1;            {2-oy obhod}
   j := 1;
   for i := k DownTo n do
   Begin
       mat[i, j] := 1;
       WriteLn(F, '(', i, ';', j, ')');
   End;

   l := n - 1;                    {3-iy obhod}
   for k := 1 to l do
   Begin
       for j := 1 to n do
       Begin
           mat[i, j] := 1;
           WriteLn(F, '(', i, ';', j, ')');
       End;
       i := i - 1;
       n := n - 1;
   End;
   mat[1, 1] := 1;
   WriteLn(F, '(1;1)');

   For i := 1 to m do
   Begin
       WriteLn;
       For j := 1 to m do
       Begin
           if (mat[i, j] = 1) Then
               TextColor(Green)
           Else
               TextColor(White);
           Write(mat[i, j], '|');
       End;
   End;
   ReadLn;
   Close(F);
End.


Сообщение отредактировано: dushik -


--------------------
На самом деле самого дела нет. В самой деятельности заключена самость дела и наоборот. Наоборот получим оборот на, таким образом перевернем образ...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Sahsok
Цитата
если задать размер отличный от того, который на рисунке,троектория должна возрасти соответственно размерам.

Вот в этом-то и проблема... Возрасти траектория может, если задать бОльший размер... А если меньший - ... Интересно было бы увидеть траекторию при M = 5.

dushik
Ну я же просил проверять программы перед тем, как сюда постить... А проверять - это не только откомпилировать и убедиться, что программа работает при m = 11...
Цитата
1.квадратная нечетная матрица размернастью (m x m ); Минимальный размер 5х5 максимальный 21х21.

Вводим m = 5... И что имеем? Программа просто виснет (бесконечный цикл). Поэтому-то никто и не торопится сделать программу.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Действительно 11х11 я сам сделал,а с бОльшим и меньшим размером загвоздки.
Мне видется почему-то такой вариант при м=5, опять же воплатить в жизнь его фантазии не хватает.


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


А чем вам 5-ка не нравиться, просто без "вертикальной линии" получается.
Думаю она нужна, что бы добраться до середины, для м=5, эта линия равна нулю, потому 5 - минимум.

Сообщение отредактировано: dushik -


--------------------
На самом деле самого дела нет. В самой деятельности заключена самость дела и наоборот. Наоборот получим оборот на, таким образом перевернем образ...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Sahsok
В общем сделал я универсальный алгоритм, заполняющий матрицу так, как тебе нужно... Но боюсь сложновато будет для первокурсника... Будут вопросы - задавай.
Код

Uses Crt;

Const
 m = {11}5;

Var
 mat: Array[1 .. m, 1 .. m] Of Byte;
 f_name: String;
 f: Text;

 T, n, j, curr_x, curr_y: integer;
 up, back: boolean;
 count, started: integer;

procedure printmatrix(cx, cy: integer);
 var i, j: integer;
 begin
   clrscr;
   for i := 1 to m do
     begin
       for j := 1 to m do
         begin
           (* Это только для проверки работоспособности *)
             if mat[i, j] = 0 then textcolor(lightgray)
             else textcolor(mat[i, j] + 1);
           (* проверка *)

           write(mat[i, j]:2);

           (* Это только для проверки работоспособности *)
           textcolor(lightgray);
           (* проверка *)
         end;
       writeln
     end;
   writeln(f, '(', cx, ',', cy, ')');
   readln
 end;

begin
 ClrScr;
 Write('File Name: '); ReadLn(f_name);
 Assign(f, f_name);
 ReWrite(f);

 FillChar(mat, sizeof(mat), 0);

 { Здесь должен быть ввод значений }

 { Part I }
 n := Trunc(Sqrt(m));
 up := True;
 count := 0;
 curr_x := m; curr_y := m;
 While curr_x > 0 Do
   Begin
     mat[curr_y, curr_x] := 1; T := curr_y;
     printmatrix(curr_y, curr_x);

     Inc(count);
     If count = n Then
       Begin
         count := 1;
         up := not up
       End;
     Dec(curr_x); Inc(curr_y, 1 - 2*Byte(up))
   end;

 { Part II }
 For j := Pred(T) DownTo Succ(Succ(m) div 2) Do
   Begin
     mat[j, 1] := 2; printmatrix(j, 1)
   End;

 { Part III }
 For curr_y := Succ(m) div 2 DownTo 1 Do
   For curr_x := 1 To curr_y Do
     Begin
       mat[curr_y, curr_x] := 3;
       printmatrix(curr_y, curr_x)
     End;

 { Part IV }
 n := Pred(m) div 2;

 up := False; back := False;
 count := 0; started := 2;
 curr_x := started; curr_y := 1;
 While True Do
   Begin

     If back Then
       Begin
         While curr_x > Succ(started) Do
           Begin
             Dec(curr_x);
             mat[curr_y, curr_x] := 4;
             printmatrix(curr_y, curr_x)
           End;
         back := False; Dec(n, 2); Inc(started, 2);
         Inc(curr_x); Inc(curr_y); up := False; count := 0
       End;

     If n = 0 Then Break
     Else
       If n = 1 Then
         Begin
           mat[curr_y, curr_x] := 4;
           printmatrix(curr_y, curr_x);
           break
         End;

     mat[curr_y, curr_x] := 4;
     printmatrix(curr_y, curr_x);

     Inc(count);
     If count = n Then
       Begin
         count := 1;
         If up Then
           Begin
             back := true;
             continue
           End;
         up := not up
       End;
     Inc(curr_x); Inc(curr_y, 1 - 2*Byte(up))
   End;

 Close(f)
end.


Примечания:
1) данные в матрицу не вводятся, основной задачей было создание необходимой траектории обхода;
2) 4 участка траектории обозначаются соответствующими цифрами;
3) после вывода очередной цифры - нажимаем "Enter" для продолжения;
4) в текущей директории создается текстовый файл с введенным именем, содержащий координаты точек траектории.

Вроде бы всё... :D
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 19:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name