Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Проконсультируйте, пожалуйста, по Паскалю... / 11 сообщений из 11, страница 1 из 1
20.02.2008, 14:47
    #35144641
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Привет всем!!!

Делаю лабу по Паскалю. Чтобы не взникало лишних вопросов, нупишу её задание:

Лабораторная работа № 1
Тема: Модульное программирование на языке Паскаль.
Задание: Разработать модуль на языке Паскаль в соответствии с вариантом задания. Написать программу, демонстрирующую использование функций данного модуля.
Варианты заданий:
Определить тип данных «Матрица» и разработать подпрограммы для ввода, вывода, вставки/удаления строки/столбца с заданным номером.

Начал разрабатывать модуль и у меня возник вот такой вопрос. Вставка строки осуществляется командой Insert, а перед тем, как её вставить, надо процедурой GoToXY(X, Y), где X и Y - координаты курсора, указать координаты вставляемой строки матрицы... Вопрос: как запрограммировать эту процедуру, чтобы в любое время пользователь мог вставить строку в матрицу? Может быть стоит создать модуль только из этой процедуры (процедуры вставки/удаления строки/столбца)... ... ... Хотя, если, к примеру, матрица 3х2 превратится в 8х8, и пользователь ещё захочет над ней "издевнуться", и, есть вариант вставки (да и удаления) строки\столбца в середину матрицы, например, между 3-ей и 4-ой, между 5-ой и 6-ой, то как быть тогда?... По-моему, тут поможет оператор for... Будет вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure add_str;
var
  nstr, i, j: integer;
begin
  write('Какой номер новая строка будет иметь в матрице? ');
  read(nstr);
  for j:= 1  to stb do begin
    write ('Введите ',j,'-й элемент новой строки: ');
    read(a[j]);
  end;
  for i:= 1  to str do begin
    for j:= 1  to stb do begin
      GoToXY(i,j);
      InsLine;
      writeln (a[j]);  
    end;
  end;
end;
Может я кое-что тут напортачил, но идея, по-моему, правильная... Если есть какие-нибудь недочёты - прошу исправить... Работоспособность проверить не могу, потому что это у меня только модуль, на основе которого будет созданна программа...

P.S. Подскажите, пожалуйста, процедуру добавление и вставки столбца. В книге у меня приводится пример вставки и удаления строки текста, поэтому вставка и удаление столбца там не описана...

Заранее Благодарю!
...
Рейтинг: 0 / 0
20.02.2008, 14:52
    #35144666
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
parenyokВставка строки осуществляется командой InsertПрошу прощения... Не Insert, а InsLine...
...
Рейтинг: 0 / 0
20.02.2008, 14:55
    #35144685
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Блин... Сам в себе удивляюсь... Нигде не использовал nstr... Подскажите, пожалуйста, как её правильно использовать?...
...
Рейтинг: 0 / 0
20.02.2008, 15:17
    #35144778
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Возможно более правильный вариант цикла вставки строки выглядет так:
Код: plaintext
1.
2.
3.
4.
for j:= 1  to stb do begin
      GoToXY(nstr,j);
      InsLine;
      writeln (a[j]);  
    end;
Правильно?
...
Рейтинг: 0 / 0
20.02.2008, 15:24
    #35144811
Проконсультируйте, пожалуйста, по Паскалю...
parenyokБлин... Сам в себе удивляюсь... Нигде не использовал nstr... Подскажите, пожалуйста, как её правильно использовать?...
Я вот тоже Вам удивляюсь... За столько времени ничего не научиться делать... Вроде уже и на С, и на FoxPro писали... А вопросы все те же.... Пора уже за ум браться... И только потом переходить к визуализации

Итак, начнем с азов.
Матрица = двумерный массив, т.е. массив с двумя измерениями (a[x][y]).
Далее можно поступать так:

1. Определить заранее максимальный размер массива (например, 100х100 элементов) и выдавать ошибку при попытке пользователя добавить 101 строку или 101 столбец. Если номер строки или столбца меньше заданного лимита, то просто пробегаться по строке или столбцу массива и вносить туда данные... Где-то отдельно хранить реальный (сколько использовано строк/столбцов) размер матрицы

2. Работать с указателями (аналогично делается в С/С++). Т.е., например, хранить двумерный массив (матрицу) по строкам. При добавлении новой строки в матрицу создать указатель на строку матрицы, выделить память и ввести данные. В этом случае добавление столбца вызовет определенные трудности, так как надо будет переопределить размер всех ранее введенных строк матрицы, перекопировать существующие данные и освободить память, занятую "устаревшими" строками.

3. Для хранения матрицы использовать связанный список. Это опять работа с указателями. И в этом случае есть свои "подводные камни"...
...
Рейтинг: 0 / 0
20.02.2008, 15:29
    #35144834
zloy den
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
А почему бы не сделать "в лоб"? Создать 2 энкземпляра array of array... и потом при нееобходимости менять размер одного из них и копироваь содержимое второго?
...
Рейтинг: 0 / 0
21.02.2008, 09:40
    #35146287
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Станислав С...кий parenyokБлин... Сам в себе удивляюсь... Нигде не использовал nstr... Подскажите, пожалуйста, как её правильно использовать?...
Я вот тоже Вам удивляюсь... За столько времени ничего не научиться делать... Вроде уже и на С, и на FoxPro писали... А вопросы все те же.... Пора уже за ум браться... И только потом переходить к визуализации Это потому, что изучаю это всё я сам!!! Нету у меня никакой практики, нету у меня возможности часто посещать консультации!!! Посещаю я их от случая к случаю, когда уж совсем застопорюсь или когда перед ней какой-нибудь зачёт или экзамен сдаю, понимаешь?... А так я делаю всё сам!!! Если в книге или в Инете не нахожу решение проблемы или нахожу и не понимаю, то обращаюсь в чат за помощью...
Станислав С...кий
Итак, начнем с азов.
Матрица = двумерный массив, т.е. массив с двумя измерениями (a[x][y]).
Далее можно поступать так:

1. Определить заранее максимальный размер массива (например, 100х100 элементов) и выдавать ошибку при попытке пользователя добавить 101 строку или 101 столбец. Если номер строки или столбца меньше заданного лимита, то просто пробегаться по строке или столбцу массива и вносить туда данные... Где-то отдельно хранить реальный (сколько использовано строк/столбцов) размер матрицы Да знаю я всё это... Это у меня будет в основной программе. Сейчас я привёл отрывок модуля (ОТРЫВОК!!!) - процедуру ввода строки!!!
Станислав С...кий
2. Работать с указателями (аналогично делается в С/С++).Хи... А как ты узнал, что мне тоже самое надо будет в С++ сделать?... Станислав С...кийТ.е., например, хранить двумерный массив (матрицу) по строкам. При добавлении новой строки в матрицу создать указатель на строку матрицы, выделить память и ввести данные.Хм... Спасибо! Над этим надо будет задуматься... А через InsLine не получится?... Станислав С...кийВ этом случае добавление столбца вызовет определенные трудности, так как надо будет переопределить размер всех ранее введенных строк матрицы, перекопировать существующие данные и освободить память, занятую "устаревшими" строками.Ничего себе... Сложно... А в паскале нет процедуры, которая бы добавляла столбец?... Станислав С...кий3. Для хранения матрицы использовать связанный список. Это опять работа с указателями. И в этом случае есть свои "подводные камни"...А более простого решения задачи нет?... К примеру, какие-нибудь процедуры в модуле crt?...
...
Рейтинг: 0 / 0
21.02.2008, 09:42
    #35146292
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
zloy denА почему бы не сделать "в лоб"? Создать 2 энкземпляра array of array... и потом при нееобходимости менять размер одного из них и копироваь содержимое второго?Тоже мысль, которую надо думать...))) Называется, найди 10 решений задачи...)
...
Рейтинг: 0 / 0
22.02.2008, 05:43
    #35149366
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Помогите, пожалуйста, с процедурами вставки\удаления столбца...
...
Рейтинг: 0 / 0
22.02.2008, 06:42
    #35149374
parenyok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Главный вопрос состоит в следующем. Как добиться сдвига столбцов матрицы вправо и на освободившемся месте вписать новые значения (вставка столбца) и сдвига стобцов матрицы влево, что повлечёт удаление предшествующего столбца?... Пожалуйста, помогите...
...
Рейтинг: 0 / 0
22.02.2008, 07:55
    #35149409
RodionGork
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проконсультируйте, пожалуйста, по Паскалю...
Твой вопрос (как я понял) касается того, как тебе симпатичнее организовать данные. Ну могу с радостью заметить, что этот воопрос вообще всегда надо крепко обдумывать перед тем как сесть писать. Правда зачастую окончательное решение созревает в процессе писания.

Ну вот я смотрю тут уже полезные идеи высказаны надо выбирать и детализировать. Сам ты начал делать программу со статическими данными, с размещением матрицы в массиве. В этом случае после добавления строки/столбца нужно двойным циклом сдвинуть оставшуюся (правую или нижнюю) часть матрицы. При этом возникает вопрос, связанный с тем, что матрица должна быть заранее большого размера.

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

Предложения создать для матрицы вообще красивую какую-нибудь динамическую структуру типа списка массивов или списка списков, конечно, хороши, только, как уже замечено, вставлять в них будет удобно или строку, или столбец, но не то и другое одновременно.

За исключением варианта когда это будет настоящая сетка из узлов, имеющих каждый по два равноценных указателя. Выглядеть будет ужасно приятно, главное не глючить, пока пишешь.

А вот насчет этой фразы:
"Это потому, что изучаю это всё я сам!!! Нету у меня никакой практики, нету у меня возможности часто посещать консультации!!! Посещаю я их от случая к случаю, когда уж совсем застопорюсь или когда перед ней какой-нибудь зачёт или экзамен сдаю, понимаешь?... А так я делаю всё сам!!!" - я так скажу... Это похвально, конечно, что "все сам" - только будь уверен, здесь практически все "все сами", поскольку издавна известно что "программированию нельзя научить, а можно только научиться". И многие, гляди ж ты, совершенно самостоятельно и по 10, по 30, по 50 разных языков и систем разработки освоили... И не шумят... ;-)

Удачи!
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Проконсультируйте, пожалуйста, по Паскалю... / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]