Помощь - Поиск - Пользователи - Календарь
Полная версия: Создание двумерного массива из строки...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
CapFlint
Зрасти всем!)
Не буду выклаывать всю задачу целиком, тк кое что знаю как делать... а вот что не знаю... Думаю вы мне в этом поможете, надеюсь очень smile.gif
В текстовом файле содержится последовательность действительных чисел. ...зделать это, зделать то и так далее...
Хочу представить ету последовательность в виде массива (и вывести его на экран), но не простого, а двумерного, дабы в дальнейшем накручивать на него то что требует задача. Как это зделать? Я не понимаю((.
(нашел решенную заачу в инету, похожую). Но там применена сверх логика, не моего уровня(( Ни че не понял кроме того что крюто все там завернуто wub.gif
Каким образом превратить задуманное в действительлность? буду рад, если хотябы покажите как это будет выглядеть с ономерным массивом.
Спасибо за внимание.

ЗЫ яндех юзал если чо. ни чего более привлекатеьного как задать вопрос тут не нашел
мисс_граффити
А что ты хочешь видеть в двумерном массиве? Одна строка - эти твои действительные числа, а вторая? Пока пустые ячейки, которые потом будешь использовать?
volvo
Что именно непонятно? Как реализовать массив, размеры которого будут задаваться при выполнении программы? Или как прочитать в него данные из файла?

По первому варианту читай здесь: FAQ: Динамические массивы и матрицы

По второму - пользуйся поиском, я где-то на форуме выкладывал несколько вариантов чтения данных из файла (с разными разделителями)...
CapFlint
1 в двумерном массиве я хочу видеть эти самые числа из стоки из файла... тоесть и первая и вторая строка будут одинаковы и буут содержать числа из заданной последовательности
2 непонятно как реализовать массив. количество элементов в стоке соответствует количеству элементов послеовательности из файла.
3 Или как прочитать в него данные из файла? максимум чего я пока добился это вывод на экран последнено элемента последовательности, остальные ге то теряются, я даже краешком мозга понимаю где и в чем дело, но ни как не соображу как и что поправить((
4 ага, спасибо) щас ознакомлюсь со ссылочкой.
Извините что сразу так невнятно накалякал...
мисс_граффити
Раз какой-то код уже есть - может, выложишь его?
CapFlint
да, конечно. я тут кое что прочел полезного на форуме, попытаюсь реализовать... заработает, кину код. не заработает-темболее.
CapFlint
Ниже приписан код.
всегда ссылается на mxArr^[i] := Number; выдавая вот такую ошибку
[Error] Var_5_Zad_03.dpr(39): Incompatible types: 'Real' and 'PVector'
Старался делать как тут - Работа с динамическими матрицами Подскажите пожалуйста в чем я ошибаюсь!


program mxArr;

{$APPTYPE CONSOLE}
{$R-}
uses
SysUtils,
Russian;

type
TType = Real;
type
PVector = ^TVector;
TVector = array[1..1] of TType;
PDynMatrix = ^TDynMatrix;
TDynMatrix = array[1..1] of PVector;

var
TextFile : Text;
TextName : string;
mxArr : PDynMatrix;
Number : Real;
i, j, N : byte;

begin
Writeln; Write(Rus(' Имя Файла: ')); Readln(TextName); Writeln;
Write('N = '); Readln(N); Writeln; // кол-во чисел в послеовательности

Assign(TextFile, TextName);
Reset(TextFile);
GetMem(mxArr, N * SizeOf(PVector));

for i := 1 to N do
while not Eof (TextFile) do
begin
Read(TextFile, Number);
mxArr^[i] := Number;
GetMem(mxArr^[i], N * SizeOf(TType));
end;

for i := 1 to N do
begin
Writeln;
for j := 1 to N do
Write(mxArr^[i]^[j]:3);
end;

for i := 1 to N do
FreeMem(mxArr^[i], N * SizeOf(TType));
FreeMem(mxArr, N * SizeOf(PVector));
Close(TextFile);
Readln;
end.
volvo
А модуль Russian мы должны сами написать?

Добавлено через 8 мин.
Цитата
Старался делать как тут
Ты бы написал наконец, ЧТО ты получить-то хочешь? А то пишешь что

Цитата
и первая и вторая строка будут одинаковы и буут содержать числа из заданной последовательности
, а выделить память пытаешься как минимум для N строк? Если тебе надо двумерный массив из N столбцов и 2-х строк, то вот так:

  Assign(TextFile, TextName);
Reset(TextFile);
GetMem(mxArr, 2 * SizeOf(PVector)); // выделяешь память под указатели 2 строки

for i := 1 to 2 do
GetMem(mxArr^[i], N * SizeOf(TType)); // это - собственно выделение памяти под 2 строки

i := 1;
while not Eof (TextFile) do begin
Read(TextFile, Number);
mxArr^[1]^[i] := Number; // пишешь одно и то же и в первую
mxArr^[2]^[i] := Number; // .. и во вторую строку
inc(i);
end;

for i := 1 to 2 do
begin
Writeln;
for j := 1 to N do
Write(mxArr^[i]^[j]:3);
end;

for i := 1 to 2 do
FreeMem(mxArr^[i], N * SizeOf(TType));
FreeMem(mxArr, 2 * SizeOf(PVector));

CapFlint
Для начала мне было бы здорово понять как из заданной строки создать матрицу с одинаковыми строками и вывести ее на экран. Сколько строк, две или три, не столь вашно, главное что не одна...
volvo, попробывал ваш пример. но на строке mxArr^[2]^[i] := Number; получаю
[Error] Var_5_Zad_03.dpr(44): Constant expression violates subrange bounds

может я что то напутал в разделах TYPE и VAR ? чотя ни чего вроде не забыл.
volvo
Вот этот код только что отработал так, как ты хотел (Delphi 6):

program arr;
{$APPTYPE CONSOLE}
uses
SysUtils;

{$R-}
type
TType = Real;
type
PVector = ^TVector;
TVector = array[1..1] of TType;
PDynMatrix = ^TDynMatrix;
TDynMatrix = array[1..1] of PVector;

var
TextFile : Text;
TextName : string;
mxArr : PDynMatrix;
Number : Real;
i, j, N, count : byte;

begin
// Writeln; Write(Rus(' ??? ?????: ')); Readln(TextName); Writeln;
TextName := 't.txt'; // Поменяй на ввод имени файла
Write('N = '); Readln(N); Writeln;

Assign(TextFile, TextName);
Reset(TextFile);
GetMem(mxArr, 2 * SizeOf(PVector));

for i := 1 to 2 do
GetMem(mxArr^[i], N * SizeOf(TType));

i := 1;
while not SeekEof (TextFile) do begin
Read(TextFile, Number);
j := 1; mxArr^[j]^[i] := Number; // Обманываем компилятор - с переменными это работает
j := 2; mxArr^[j]^[i] := Number;
inc(i);
end;
count := i - 1; // Это - количество чисел, прочитанных из файла, если N вводилось "с запасом"

writeln('count = ', count);
for i := 1 to 2 do
begin
Writeln;
for j := 1 to count do // Печатаем столько, сколько прочли
Write(mxArr^[i]^[j]:6:2);
end;

for i := 1 to 2 do
FreeMem(mxArr^[i], N * SizeOf(TType));
FreeMem(mxArr, 2 * SizeOf(PVector));
Close(TextFile);
Readln;
end.

Это тебе нужно было?
CapFlint
Да, именно то! smile.gif И количество строк в коде можно увеличивать! blink.gif
Благодарю!! Буду разбираться дальше.. Спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.