Другие языки программирования и технологии

двумерный динамический массив в паскале

как организовать чтение/запись двумерного д. массива в паскале?
имеется файл, из него каждое слово это м а каждая буква н. заранее неизвестно сколько слов в файле и сколько букв в каждом слове...
Леонид Казаков
Леонид Казаков
10 596
const
SimSize = 5;
Sim : array [1..SimSize] of Char =
('.', ',', '(', ')', '"');

type
SlovaType = ^tSlovaType;
tSlovaType = record
S : String[20];
K : Integer;
Pred, Next : SlovaType;
end;
var
T : Text;
S : String;
First, Posl : SlovaType;

procedure WriteSpisok;
var
Cur : SlovaType;
begin
if First = Nil then
begin
WriteLn('Список слов пуст! ');
Exit;
end;

Cur := First;
while Cur <> Nil do
begin
WriteLn(Cur^.S, ' ', Cur^.K);

Cur := Cur^.Next;
end;
end; // WriteSpisok

procedure SlovoVSpisok(S : String);
var
Cur, Temp : SlovaType;
procedure AddTemp;
begin
New(Temp);
Temp^.S := S;
Temp^.K := 1;
Temp^.Pred := Nil;
Temp^.Next := Nil;
end;
begin
if First = Nil then
// добавляем в список первое слово
begin
AddTemp;
First := Temp;
Posl := Temp;
Exit;
end;

Cur := First;
if Cur^.S > S then
// Добавляем слово в начало списка
begin
AddTemp;
Temp^.Next := First;
Cur^.Pred := Temp;
First := Temp;

Exit;
end;

// ищем позицию слова из списка >= S
while (Cur <> Nil) And (Cur^.S < S) do
Cur := Cur^.Next;

if Cur = Nil then
// Добавляем слово в конец списка
begin
AddTemp;
Posl^.Next := Temp;
Temp^.Pred := Posl;
Posl := Temp;
Exit;
end;

if Cur^.S = S then
// Увеличиваем счётчик слова
begin
Inc(Cur^.K);
Exit;
end;

// Вставляем слово в середину списка перед Cur
AddTemp;
Temp^.Pred := Cur^.Pred;
Cur^.Pred^.Next := Temp;
Temp^.Next := Cur;
end; // SlovoVSpisok

procedure RazborNaSlova(S : String);
var
Slovo : String;
Probel : Integer;
Simvol : Integer;
N : Integer;
begin
Slovo := '';
//WriteLn(S);
while Length(S) > 0 do
begin
Probel := Pos(' ', S);
case Probel of
0 : // осталось слово целиком
begin
Slovo := S;
S := '';
end;
1 : // в начале строки пробел
S := Copy(S, 2, Length(S) - 1)
else // выделяем слово из строки
begin
Slovo := Copy(S, 1, Probel - 1);
S := Copy(S, Probel + 1, Length(S) - Probel);
end;
end; // Case

if Length(Slovo) > 0 then
// Выделенное слово
begin
// Уберём не относящиеся к словам символы
for N := 1 to SimSize do
begin
Simvol := Pos(Sim[N], Slovo);
while Simvol > 0 do
begin
if Simvol = 1 then
// Символ в начале слова
Slovo := Copy(Slovo, 2, Length(S) - 1)
else if Simvol = Length(S) then
// Символ в конце слова
Slovo := Copy(Slovo, 1, Length(S) - 1)
else // Символ в середине слова
Slovo := Copy(Slovo, 1, Simvol - 1) + Copy(Slovo, Simvol + 1, Length(Slovo) - Simvol - 1);
Simvol := Pos(Sim[N], Slovo);
end;
end;

if Length(Slovo) > 0 then
SlovoVSpisok(Slovo);
end;
end;
end; // RazborNaSlova

var
N : Integer;

begin
Assign(T, 'kot.txt');
Reset(T);
N := 0;
while Not EOF(T) And (N < 10) do // читать 10 строк
begin
Inc(N);
ReadLn(T, S);
RazborNaSlova(S);
end;
WriteSpisok;
end.
Дима Елович
Дима Елович
72 976
Лучший ответ
Леонид Казаков Вау) Спасибо!
Дима Елович Константы:
SimSize - размер массива исключаемых символов
Sim - исключаемые символы (которые не относятся к слову: .,"()) - можно дополнять, увеличивая SimSize
~~~~~~~~~~~~~~~~~~~~~
SlovaType - собственно двунаправленный список слов S, количества слов K и ссылки на предыдущий Pred и следующий Next элемент списка.
~~~~~~~~~~~~~~~~~~~~~
Основная программа:
- Открывается текстовый файл (у меня это kot.txt)
- Считывается до 10 строчек из файла
- Разбираются строки на слова
- Выводится список в виде "Слово Количество"