Помощь - Поиск - Пользователи - Календарь
Полная версия: Создание двумерного массива из строки...
Форум «Всё о Паскале» > 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
Благодарю!! Буду разбираться дальше.. Спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.