• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Паскаль. Обработка таблицы

Montespan

Новые
Регистрация
1 Ноя 2009
Сообщения
13
Реакции
0
Баллы
0
Паскаль. Обработка таблицы

Помогите, пожалуйста, написать следующую программу..
Задание: Найти минимальный среди максимальных элементов столбцов таблицы.

Требуется написать подпрограмму обработки прямоугольной таблицы вещественных чисел. Подпрограмма должна реализовывать вычислительный алгоритм, который получает саму таблицу и ее размеры (т.е. количество строк и столбцов) в качестве входных параметров, а в качестве выходного параметра – результат вычислений. Кроме того, должна быть написана программа, которая позволяет создать таблицу заказанных пользователем размеров, вызвать подпрограмму обработки и вывести на экран результат вычислений.
Вот требования:
1. Таблица хранится в виде двумерного статического массива достаточно больших размеров. Определен тип «таблица» (это нужно для того, чтобы передать таблицу в подпрограмму). Максимальные индексы массива, используемые при описа-нии типа, хранятся в виде констант.
2. Основная подпрограмма не содержит операций ввода-вывода. Параметры подпрограммы: таблица (по ссылке), факти-ческие размеры таблицы (по значению), основной результат – по ссылке. Подпрограмма содержит описание спецификации (в виде комментария под заголовком).
3. Работа тестирующей программы организована в виде простейшего меню, позволяющего создавать таблицу, выпол-нять ее обработку, показывать результат и заканчивать работу.
4. Фактические размеры таблицы указываются пользователем. Заполнение таблицы осуществляется двумя способами (по выбору пользователя) с клавиатуры (простейший последовательный ввод элементов) и случайным образом.
5. Алгоритм реализован без создания вспомогательной таблицы (при необходимости можно пользоваться вспомогатель-ным одномерным массивом).

Буду очень благодарна за помощь
 
Самое главное забыла.. Паскаль.
Начало я написала.
program tablica;
uses crt;
const max_s= 50;
max_d= 50;
k=100;
var a:array[1..max_d,1..max_s] of integer;
d, s, i, j, z: integer;
begin
d:=-1;
s:=-1;

repeat
clrscr;
writeln ('Введите длину таблицы. Максимальное значение ' ,max_d);
read (d)
until (d>=1) and (d<= max_d);
{clrscr; }
repeat
clrscr;
writeln ('Введите ширину таблицы. Максимальное значение ' ,max_s);
read (s)
until (s>=1) and (s<= max_s);
repeat
clrscr;
writeln ('Выберете способ ввода значений таблицы');
writeln ('1- если хотите выполнить ввод с клавиатуры');
writeln ('2- для случайного вводa');
readln (z);
until (z=1) or (z=2);

if z=1 then
begin
for i:=1 to d do
begin
for j:=1 to s do
begin
writeln('Введите значение ячейки таблицы a[',i,',',j,']');
readln (a[i,j]);
end;
end;
end;

if z=2 then
begin randomize;
for i:=1 to d do
for j:=1 to s do
a[i,j]:=random (k);
writeln (a[i,j]);
end;

clrscr;
for i:=1 to d do
begin
for j:=1 to s do
write(a[i,j],' ');
writeln;
end;
readln;
end.
а дальше как?
 
Последнее редактирование:
Самое главное забыла.. Паскаль.
Начало я написала.
а дальше как?

А дальше (и вообще всё вместе) например, так:

program tablica;
uses crt;
const
max_s= 50;
max_d= 50;
k=99;
TYPE
AR=array[1..max_d,1..max_s] of integer;
var
a:AR;
MVcol:ARRAY[1..max_s] of integer;
d, s, i, j, Min_Max: integer;

PROCEDURE Table_Inp(Dti,Sti:INTEGER; VAR Ati:AR);
VAR
i,j,z:INTEGER;
BEGIN
repeat
clrscr;
writeln ('Choose the method of table infilling');
writeln ('1- from keyboard');
writeln ('2- random values');
readln (z);
until (z=1) or (z=2);

if z=1 then
begin
for i:=1 to Dti do
begin
for j:=1 to Sti do
begin
write('Enter the value a[',i,',',j,'] ');
readln (Ati[i,j]);
end;
end;
end;

if z=2 then
begin
randomize;
for i:=1 to Dti do
for j:=1 to Sti do
Ati[i,j]:=random (k);
end;

clrscr;
for i:=1 to Dti do
begin
for j:=1 to Sti do
write(Ati[i,j]:3);
writeln;
end;
readln;
END; {Table_Inp}


begin
d:=-1;
s:=-1;

repeat
clrscr;
write('Enter the table length. Maximum value is ' ,max_d,' ');
readln(d)
until (d>=1) and (d<= max_d);
{clrscr; }
repeat
clrscr;
write('Enter the table width. Maximum value is ' ,max_s,' ');
readln(s)
until (s>=1) and (s<= max_s);

Table_Inp(d,s,a);

FOR j:=1 TO s DO
begin
MVcol[j]:=a[1,j];
FOR i:=2 TO d DO
IF a[i,j]>MVcol[j] THEN MVcol[j]:=a[i,j];
end;


Min_Max:=MVcol[1];
FOR i:=2 TO s DO
IF Min_Max>MVcol THEN Min_Max:=MVcol;

Writeln('Minimum value is ',Min_Max);
ReadLn;
end.

Пояснение. Надписи заменены английскими, чтобы избежать проблем с кодировками кириллицы при переходе WINDOWS-DOS и обратно. Если надо, можете восстановить русские надписи.
 
Vladimir_S, огромное Вам спасибо!
 
Vladimir_S,
program tablica;
uses crt;
const
max_s= 50;
max_d= 50;
k=99;
TYPE
AR=array[1..max_d,1..max_s] of integer;
var
a:AR;
MVcol:ARRAY[1..max_s] of integer;
d, s, i, j, Min_Max: integer;

PROCEDURE Table_Inp(Dti,Sti:INTEGER; VAR Ati:AR);
VAR
i,j,z:INTEGER;
Поясните, пожалуйста, Dti и Sti - это длина и ширина таблицы соответственно? Почему нельзя использовать s и d, описанные в глобальных переменных программы? Ati - это имя массива?
Заранее спасибо!
 
Vladimir_S,
Поясните, пожалуйста, Dti и Sti - это длина и ширина таблицы соответственно? Почему нельзя использовать s и d, описанные в глобальных переменных программы? Ati - это имя массива?
Заранее спасибо!

Можно. Это, как бы сказать, чистой воды эстетство. Просто предпочитаю для параметров процедуры и глобальных переменных программы использовать разные идентификаторы. IMHO дисциплинирует и повышает читабельность. Потому и добавил "ti" - сокращение от имени процедуры "Table_Inp".
 
Разобралась, спасибо большое. Не могли бы вы помочь выполнить еще несколько требований к этой же программе?
1. В подпрограмме выполняется проверка входных параметров на допустимость. Подпрограмма возвращает код завер-шения по ссылке или в качестве значения функции, который показывает, правильно ли выполнилась подпрограмма.
2. Возможность заполнения таблицы из типизированного (или нетипизированного) файла с проверкой корректности имени файла и его содержимого. При этом размеры таблицы хранятся в начале того же файла.
3. Делается проверка корректности ввода чисел, т.е. защита от ввода вместо чисел посторонних символов.
4. Таблица реализована как двумерный динамический массив с использованием механизма указателей.
 
Разобралась, спасибо большое. Не могли бы вы помочь выполнить еще несколько требований к этой же программе?
1. В подпрограмме выполняется проверка входных параметров на допустимость. Подпрограмма возвращает код завер-шения по ссылке или в качестве значения функции, который показывает, правильно ли выполнилась подпрограмма.
2. Возможность заполнения таблицы из типизированного (или нетипизированного) файла с проверкой корректности имени файла и его содержимого. При этом размеры таблицы хранятся в начале того же файла.
3. Делается проверка корректности ввода чисел, т.е. защита от ввода вместо чисел посторонних символов.
4. Таблица реализована как двумерный динамический массив с использованием механизма указателей.

За пункт 4 точно не возьмусь - я в своих программах указателями и динамическими переменными почти не пользуюсь, знаю их плохо. Насчет остальных - поразмыслю. Скоро не обещаю. А когда нужно?
 
Vladimir_S, нужно до воскресенья. Спасибо большое!
 
Разобралась, спасибо большое. Не могли бы вы помочь выполнить еще несколько требований к этой же программе?
1. В подпрограмме выполняется проверка входных параметров на допустимость. Подпрограмма возвращает код завер-шения по ссылке или в качестве значения функции, который показывает, правильно ли выполнилась подпрограмма.
2. Возможность заполнения таблицы из типизированного (или нетипизированного) файла с проверкой корректности имени файла и его содержимого. При этом размеры таблицы хранятся в начале того же файла.
3. Делается проверка корректности ввода чисел, т.е. защита от ввода вместо чисел посторонних символов.
4. Таблица реализована как двумерный динамический массив с использованием механизма указателей.

Так, ну сделал кое-что. Но, увы, далеко не всё.
По пункту 1 - я "пас". Дело в том, что тут предполагается использование т.н. внешних процедур. Такие процедуры обычно пишутся на Ассемблере, вызываются командой "Exec", и тогда функция DosExitCode (в модуле Dos) возвращает код, отображающий корректность выполнения вызываемой процедуры. Я ничем подобным, извините, не занимался, так что опыта - 0.
По пункту 4 я уже отмечал - когда-то использовал динамические переменные, указатели и т.п., но это было давно и сейчас прочно забыто. В принципе, ничего сложного. Только уж лучше Вы сами... На всякий случай, дам одну ссылку, где про это вроде толково написано: http://klax.tula.ru/~zet/frames/thm_pointers.html
По пунктам 2 и 3 - вроде как сделано. Структура внешнего файла: первая строка - количество строк таблицы (длина), вторая строка - количество столбцов (ширина), дальше (без пустых строк!) сама таблица. Навтыкал всюду, где можно, проверки правильности операций ввода. Вот:

Код:
{$I-}
program tablica;
uses crt;
const
 max_s= 50;
 max_d= 50;
 k=99;
TYPE
 AR=array[1..max_d,1..max_s] of integer;
var
 a:AR;
 MVcol:ARRAY[1..max_s] of integer;
 d, s, i, j, Min_Max,z: integer;
 IOR:WORD;
 f:TEXT;
 F_Name:STRING;

PROCEDURE Table_Inp(Zti,Dti,Sti:INTEGER; VAR Ati:AR);
{$I-}
 VAR
  i,j:INTEGER;
  IORti:WORD;
 BEGIN
  if Zti=1 then
   begin
    for i:=1 to Dti do
     begin
      for j:=1 to Sti do
       repeat
        write('Enter the value a[',i,',',j,'] ');
        readln (Ati[i,j]);
        IORti:=IOResult;
        IF IORti>0 THEN WriteLn('Wrong value!');
       until IORti=0;
     end;
   end;

  if Zti=2 then
   begin
    randomize;
    for i:=1 to Dti do
     for j:=1 to Sti do
      Ati[i,j]:=random (k);
   end;

  clrscr;
  for i:=1 to Dti do
   begin
    for j:=1 to Sti do
     write(Ati[i,j]:3);
    writeln;
   end;
  readln;
 END; {Table_Inp}


begin
 repeat
  clrscr;
  writeln ('Choose the method of table infilling');
  writeln ('1- from keyboard');
  writeln ('2- random values');
  writeln ('3- from file');
  readln (z);
  IOR:=IOResult;
 until (IOR=0) AND ((z=1) or (z=2) or (z=3));

 IF z=3 THEN
  begin
   repeat
    WriteLn('Enter full path file name:');
    ReadLn(F_Name);
    Assign(f,F_Name);
    ReSet(f);
    IOR:=IOResult;
    IF IOR>0 THEN
     WriteLn('File Name is wrong!');
   until IOR=0;
   ReadLn(f,d);
   ReadLn(f,s);
   FOR i:=1 TO d DO
    begin
     FOR j:=1 TO s DO
      Read(f, A[i,j]);
     Readln(f);
    end;
   IOR:=IOResult;
   IF IOR>0 THEN
    begin
     WriteLn('Wrong data in the file! Press "Enter" to exit.');
     ReadLn;
     Halt;
    end;
   Close(f);
  end ELSE

  begin
   d:=-1;
   s:=-1;

   repeat
    clrscr;
    write('Enter the table length. Maximum value is ' ,max_d,' ');
    readln(d);
    IOR:=IOResult;
   until (IOR=0) and (d>=1) and (d<= max_d);
   {clrscr; }
   repeat
    clrscr;
    write('Enter the table width. Maximum value is ' ,max_s,' ');
    readln(s);
    IOR:=IOResult;
   until (IOR=0) and (s>=1) and (s<= max_s);

   Table_Inp(z,d,s,a);
  end;

 FOR j:=1 TO s DO
  begin
   MVcol[j]:=a[1,j];
   FOR i:=2 TO d DO
    IF a[i,j]>MVcol[j] THEN MVcol[j]:=a[i,j];
  end;


 Min_Max:=MVcol[1];
 FOR i:=2 TO s DO
  IF Min_Max>MVcol[i] THEN Min_Max:=MVcol[i];

 Writeln('Minimum value is ',Min_Max);
 ReadLn;
end.
 
Я могу дать разъяснения по работе с динамической памятью(указателями), если потребуется.
 
Vladimir_S, огромное Вам спасибо! Это же такой труд...
Long Cat, спасибо! Завтра буду с этим разбираться.
 
Vladimir_S, огромное Вам спасибо! Это же такой труд...
Long Cat, спасибо! Завтра буду с этим разбираться.

Черт, сейчас глянул в текст программы, обнаружил одну неряшливость. Переменную "z" из описания параметров ПРОЦЕДУРЫ нужно убрать (в сообщении поправлено). В принципе это ни на что не влияет, она там "пустышка", но так, для блезиру.
 
Назад
Сверху