Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 18:24   #1
Nexen
 
Регистрация: 16.01.2009
Сообщений: 3
По умолчанию Изменяющийся массив

Допустим дана задача :
Пользователь вводит N (= 10..1000) кол-во учеников, затем в каждой строке вводит фамилию и класс. Отсеять из них всех людей выше 5 класса и вывести в хронологическом порядке.

Проблема заключается в том, что, если решать эту задачу (допустим) двумерным массивом, где верхняя строка - фамилия, нижняя - номер класса, то проблем с порядком не будет, однако, есть проблема с самим массивом... ведь до ввода N в read(n) кол-во учеников не известно, а значит нельзя использовать a: array [1..2,1..N] of string, т.к такое можно делать только при известном N (аля const n=30).

Вопрос состоит в следующем : как задать массив на заранее не известное кол-во ячеек, т.е, массив, который изменится (или перезадастся/обновится/создастся) уже по ходу действия программы, после нужного мне подсчета определенной переменной?

p.s Если рассматривать задачу с классами, то нужно что-то типо такого :
Код:
var a:array [1..2,1..n] of string; i,n,k:integer
readln(n);
for I:=1 to n do
begin
read(a[1,i]);
read(a[2,i]);
end;
k:=0;
for i:=1 to n do
if a[2,i] > 5 then k:=k+1 else a[2,i-k]:=a[2,i];
После чего получиться массив, в котором последнии ячейки не нужны.

p.p.s Можно ли считать переменную NА потом перепрыгнуть label'ом на строку перед var'ом, чтобы у нас сразу же была задана переменная N после этого в массиве [1..2,1..N].

Последний раз редактировалось Stilet; 20.04.2011 в 10:36.
Nexen вне форума Ответить с цитированием
Старый 19.04.2011, 18:53   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
как задать массив на заранее не известное кол-во ячеек
взгляните в сторону динамических массивов
Цитата:
Можно ли считать переменную NА потом перепрыгнуть label'ом на строку перед var'ом
нет нельзя
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 19.04.2011, 19:00   #3
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

А что мешает сделать так
Код:
var a:array [1..2,1..10000] of string; i,n,k:integer
readln(n);
for I:=1 to n do
begin
read(a[1,i]);
read(a[2,i]);
end;
k:=0;
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 19.04.2011, 19:07   #4
Ermowkin
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 23
По умолчанию

Код:
var x:array of string; i,n,k:integer
readln(n);
for I:=1 to n do
begin
read(a[1,i]);
read(a[2,i]);
end;
k:=0;

Или так.
Ermowkin вне форума Ответить с цитированием
Старый 20.04.2011, 09:54   #5
Nexen
 
Регистрация: 16.01.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
взгляните в сторону динамических массивов
нет нельзя
Что за "сторона динамических массивов"?

p.s GetMax, слишком много памяти расходуется и мне нужен четкий массив, без лишних ячеек.
Ermowkin, такой синтаксис невозможен (x:array of string).
Nexen вне форума Ответить с цитированием
Старый 20.04.2011, 10:51   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

решайте задачу обычным односвязным списком.
примеров реализации - полно (в т.ч. и на данном форуме).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.04.2011, 11:17   #7
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Динамический массив это то что написали вам в посте 4 правда синтаксис неверен должно быть
Код:
 x:array of string[100]
все остальное вы легко почитаете если вобьете в гугл "динамические массивы паскаль"
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 20.04.2011, 13:37   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Mad_Cat
Код:
 x:array of string[100]
Mad_Cat, если речь идёт действительно про Паскаль (который обычный паскаль - он же TurboPascal), то никаких динамических массивов в нём не было.
Совсем!



Добавлено

можно было обмануть Паскаль и эмулировать динамический массив через указатели.
Но я бы категорически не рекомендовал использовать подобные хакерские приёмы в программах..

Вот код, как можно (НО НЕ НУЖНО!) сэмулировать дин.массив:
Код:
type
  string_array=array[0..0] of string;
  pdin_string_array=^string_array;

var
  i: integer;
  size : longint;
  dsa  : pdin_string_array;
  s1, s2 : string;

begin
  s1 := 'xxxxx';
  s2 := 'yyyyyyyy';
  size:=  256 * 2; {выделить память под две строки!}
{или можно и так }
  size:= sizeof(string_array) * 2; {выделить память под две строки!}

  Getmem(dsa, size);

{$R-}
  i := 0;
  dsa^[i] := s1;
  i := 1;
  dsa^[i] := s2;

  WriteLn('______________________  содержимое массива _________');
  for i:=0 to 1 do
    WriteLn(dsa^[i]);

  FreeMem(dsa, size);

  Readln;
end.

Последний раз редактировалось Serge_Bliznykov; 20.04.2011 в 14:17.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.04.2011, 16:40   #9
Nexen
 
Регистрация: 16.01.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Mad_Cat, если речь идёт действительно про Паскаль (который обычный паскаль - он же TurboPascal), то никаких динамических массивов в нём не было.
Совсем!



Добавлено

можно было обмануть Паскаль и эмулировать динамический массив через указатели.
Но я бы категорически не рекомендовал использовать подобные хакерские приёмы в программах..

Вот код, как можно (НО НЕ НУЖНО!) сэмулировать дин.массив:
Код:
type
  string_array=array[0..0] of string;
  pdin_string_array=^string_array;

var
  i: integer;
  size : longint;
  dsa  : pdin_string_array;
  s1, s2 : string;

begin
  s1 := 'xxxxx';
  s2 := 'yyyyyyyy';
  size:=  256 * 2; {выделить память под две строки!}
{или можно и так }
  size:= sizeof(string_array) * 2; {выделить память под две строки!}

  Getmem(dsa, size);

{$R-}
  i := 0;
  dsa^[i] := s1;
  i := 1;
  dsa^[i] := s2;

  WriteLn('______________________  содержимое массива _________');
  for i:=0 to 1 do
    WriteLn(dsa^[i]);

  FreeMem(dsa, size);

  Readln;
end.
Но что же тогда делать, если задачу можно решить только с использованием динамического массива, иначе же придется придумывать какой-то обходной путь (на ум ничего не приходит... ведь изначально не известно кол-во будущих учеников, а значит и массив не задать ;|, а если работать без него, то каким образом записать данные о учениках, чтобы потом выкинуть у них >5 (это можно сделать и при считывании, а вот второе...) и расположить в хронологическом порядке... это не сделать при первичном считывании... Есть варианты, как сделать расстановку в хронологическом порядке без использования массива (по причине не существования оного)?
p.s Да, речь шла о Turbo Pascal.
Nexen вне форума Ответить с цитированием
Старый 20.04.2011, 17:23   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Nexen
Но что же тогда делать, если задачу можно решить только с использованием динамического массива, иначе же придется придумывать какой-то обходной путь
Вы мои посты через один читаете? Пост #6 видели?
Можно решить Вашу проблему через использование динамического списка.
Это раз.

Цитата:
ведь изначально не известно кол-во будущих учеников
Второе. Вы не правы. Известно. Вам прямо в условии задачи задано это количество.
цитирую: "N (= 10..1000 ) "
Это подразумевает, что больше тысячи учеников быть не может!
Т.е. если учеников 1001 - Ваша программа может смело говорить пользователю о нарушении правил её использования и либо закрываться совсем, либо обрабатывать первую тысячу (это уж Вы, как программист, можете сами решить!)
Подобые ограничения могут быть записаны так:
Код:
type
  SchoolBoyRecord = record
    FIO : string[50];
    ClassNumber : integer
  end;

var StudArray : array[1..1000] of SchoolBoyRecord;
  i, n : longint;
begin
  WriteLn('Введите, сколько учеников: ');
  ReadLn(n);
  if (n<1) or (n>1000) then begin
    WriteLn('Нельзя столько обрабатывать! До свидания!');
    Halt(1);
  end;

  StudArray[1].FIO := 'Иванов';
  StudArray[1].ClassNumber := 6;

  for i:=1 to n do Readln(..StudArray[i] ....)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W leha_demi Помощь студентам 2 24.09.2011 18:12
Изменяющийся выпадающий список EugeneK78 Microsoft Office Excel 7 28.03.2010 20:37
Access 2003: как сделать изменяющийся список выбора в зависимости от значения в соседнем поле tanchikb Microsoft Office Access 14 14.01.2010 10:46
Одномерный массив. Q basic - Построить новый массив из элементов исходного ,которые больше P. Marishkaa Помощь студентам 2 12.01.2010 16:54
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06