![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Sahsok |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Исходные данные:
1.квадратная нечетная матрица размернастью (m x m ); Минимальный размер 5х5 максимальный 21х21. 2.начальные элементы матрицы нулевые. 3. троектория обхода матрицы на рисунке Программа должна обеспечивать: 1. Ввод даных с клавиатуры. 2. Вывод заданой матрицы на экран с последующим изображением процесса обхода заданной троектории. 3 Вывод в файл значений обхода матрицы (их координат), при этом имя файла вводится с клавиатуры. П.с. если задать размер отличный от того, который на рисунке,троектория должна возрасти соответственно размерам. P.p.s У меня в субботу пересдача, а меня без этой задачи на экзамен не пустят. Краем глаза видел экзаменационные билеты: ТАКОГО там точно нет. Я не могу понять к чему такие задачи дают на специальности, которые к компам имеют косвенное отношение. Эскизы прикрепленных изображений ![]() |
dushik |
![]()
Сообщение
#2
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
Обход в твоей задаче состоит из четырех частей:
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 - 5.01.2005 14:42 -------------------- На самом деле самого дела нет. В самой деятельности заключена самость дела и наоборот. Наоборот получим оборот на, таким образом перевернем образ...
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Sahsok
Цитата если задать размер отличный от того, который на рисунке,троектория должна возрасти соответственно размерам. Вот в этом-то и проблема... Возрасти траектория может, если задать бОльший размер... А если меньший - ... Интересно было бы увидеть траекторию при M = 5. dushik Ну я же просил проверять программы перед тем, как сюда постить... А проверять - это не только откомпилировать и убедиться, что программа работает при m = 11... Цитата 1.квадратная нечетная матрица размернастью (m x m ); Минимальный размер 5х5 максимальный 21х21. Вводим m = 5... И что имеем? Программа просто виснет (бесконечный цикл). Поэтому-то никто и не торопится сделать программу. |
Sahsok |
![]()
Сообщение
#4
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Действительно 11х11 я сам сделал,а с бОльшим и меньшим размером загвоздки.
Мне видется почему-то такой вариант при м=5, опять же воплатить в жизнь его фантазии не хватает. Эскизы прикрепленных изображений ![]() |
dushik |
![]()
Сообщение
#5
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
А чем вам 5-ка не нравиться, просто без "вертикальной линии" получается.
Думаю она нужна, что бы добраться до середины, для м=5, эта линия равна нулю, потому 5 - минимум. Сообщение отредактировано: dushik - 5.01.2005 19:33 -------------------- На самом деле самого дела нет. В самой деятельности заключена самость дела и наоборот. Наоборот получим оборот на, таким образом перевернем образ...
|
volvo |
![]()
Сообщение
#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 |
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 1:02 |