Помощь - Поиск - Пользователи - Календарь
Полная версия: Массив в файле.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Яна3773
Доброго времени суток!
Как прочитать и записать массив (двумерный) чисел из файла, причём покомпонентно?
Задача интересная, прыгнуть из одной системы координат в другую. Но как прочитать элемнты массива из файла, а потом поиздевавшись над ними в Паскале, переписать их в другой файл, понятия не имею. Всё время какие-то строки попадаются, а не элементы матрицы. Помогите пожалуйста. Заранее, спасибо.)
Айра
Можно организовать это вот так:
var i,j: integer;
    m: array[1..5,1..5] of integer;
    f: text;
begin
  assign (f, 'input.txt');
  {$I-}
  reset(f);
  {$I+}
  if IoResult = 0 then
    begin
      for i:=1 to 5 do
        for j:=1 to 5 do
          read (f, m[i,j]);  {читаем элементы в массив}
    end;
  close(f);
  {издеваешься над числами}
  assign (f, 'output.txt');
  rewrite(f);
  for i:=1 to 5 do
    begin
      for j:=1 to 5 do
        write(f,m[i,j]:3);  {записываем элементы в файл}
      writeln(f);
    end;
  close(f);
end.

Что непонятно - спрашивай, объясню))

p.s. нескромный вопрос.. так ты все-таки Яна или.. Ян smile.gif
Sozialist
 Var
i,j,n,m:integer;
A,B:array [1..100,1..100] of integer;
f,g:file of integer;

begin
//Создаю массив А
  write('n = ');
  readln(n);
  write('m = ');
  readln(m);
  for i:=1 to n do
   for j:=1 to m do
   readln(a[i,j]);
//Вывожу массив А на экран
  writeln; writeln('Massive:');
  for i:=1 to n do
  begin
   for j:=1 to m do
   write(' ',a[i,j]);
   writeln;
  end;
//Записываю массив А в файл 'file1.dat'
  assign(f,'file1.dat');
  rewrite(f);
  for i:=1 to n do
   for j:=1 to m do
   write(f,a[i,j]);
  close(f);
//Читаю данные из файла 'file1.dat' в некий массив (можно этот же)
  reset(f);
  for i:=1 to n do
   for j:=1 to m do
   read(f,a[i,j]);
  close(f);

//'Издеваюсь' над эл-ми массива, получаю массив В
  for i:=1 to n do
   for j:=1 to m do
   b[i,j]:=a[i,j]+2;

//Записываю массив В в файл 'massive file2.dat'
  assign(g,'file2.dat');
  rewrite(g);
  for i:=1 to n do
   for j:=1 to m do
   begin
   write(g,b[i,j]);
   end;
  close(g);

//Далее снова читаю из файла и вывожу на экран с целью оценки результата
  reset(g);
  for i:=1 to n do
   for j:=1 to m do
   read(g,b[i,j]);
  close(g);

 writeln('Massive B:');
  for i:=1 to n do
  begin
   for j:=1 to m do
   write(' ',b[i,j]);
   writeln;
  end;
readln
end.


Поставил BP. Теперь пашет под Turbo, не думал, что массив из 1000 строк и 1000 столбцов - стишком длинная структура. Извиняйте.
volvo
Sozialist, ты вообще что-ли думать не научился? Как и читать? Ты где постишь? В разделе Паскаль? Будь добр постить программу, которая пройдет компиляцию Турбо Паскалем! dry.gif
Sozialist
volvo
Думать и читать не научился. Да.
Яна3773
Спасибо ребята большоё, как прогу напишу, выставлю.
И ещё, если кому-то нужны книжки с решёнными задачами по численным методам, то тоже скинуть могу, у меня такого добра много, хотя мне кажется тут все знатоки. smile.gif
Яна3773

 Program  _1;
   var
        i, j: integer;
        m:array [1..2, 1..2] of real;
        f:text;
   begin
     assign (f, 'input.txt');
     {$I-}
     reset(f);
     {$I+}
     if IoResult = 0 then
       begin
         for i:=1 to 2 do
           for j:=1 to 2 do
            read (f, m[i,j]);
       end;
     close(f);

         begin
          for i:=1 to 2 do
           for j:=1 to 2 do
         m[i,j]:=(150*i+50*i+100)/2;
       end;

     assign (f, 'uotput.txt');
     rewrite(f);
     For i:=1 to 2 do
       begin
         for j:=1 to 2 do
         write (f, m[i,j]
2);
       writeln(f);
       end;
       close(f);
   end.



Добавлено через 16 мин.
издеваться не получается только над собой. blink.gif
исходный файл с матрицей (0 0; 1 1) должен перейти в файл с матрицей (50 50 ; 150; 150).

Но этого не происходит. Почему, понять не могу, ведь формула не трудная x=(150*i+50*i+100)/2 и изменила я в задаче не много. В общем, середина задачи явно не правильная...не пойму что делать, просветите пожалуйста.
Sozialist
Естественно, головой нужно думать, что простое присваивание элементам матрицы M новых значений в соответствии с приведенной формулой, в которую не входят элементы массива М, не значит "издеваться" над массивом. Правильно так:

begin
   for i:=1 to 2 do
     for j:=1 to 2 do
     m[i,j]:=(150*m[i,j]+50*m[i,j]+100)/2;
end;
Яна3773
точно. Бред я написала.... спасиб)
Sozialist
Яна3773
Смени пол cool.gif
Яна3773

 Program  _Transition;
 const n=3;
   var
        i, j: integer;
        m:array [1..n, 1..2] of real;
        mm:array [1..2, 1..2] of real;
        f,f1:text;
   begin
     assign (f, 'input.txt');
     {$I-}
     reset(f);
     {$I+}
     if IoResult = 0 then
       begin
         for i:=1 to n do
           for j:=1 to 2 do
            read (f, m[i,j]);
       end;
     close(f);

   assign (f1, 'input1.txt');
     {$I-}
     reset(f1);
     {$I+}
     if IoResult = 0 then
       begin
         for i:=1 to 2 do
           for j:=1 to 2 do
          read (f1,mm[i,j]);
       end;
     close(f1);


     begin
       for i:=1 to n do
        for j:=1 to 2 do
      m[i,j]:=(mm[2,1]*m[i,j]-mm[1,1]*m[i,j]+mm[2,1]+mm[1,1])/2;
     end;

     assign (f, 'uotput.txt');
     rewrite(f);
     For i:=1 to n do
       begin
         for j:=1 to 2 do
       write (f, m[i,j]
0 );
       write (f, ' line to');
       writeln(f);
       end;
      close(f);
   end.



Добавлено через 3 мин.
Сменила, но это не помогло. smile.gif
Понимаю, что достала уже всех.
Но есть ещё кое-что.
Как теперь в массив файла UOTPUT.TXT вставить строчку move to вместо line to, да не просто так а в первой строчке массива один раз. Чтобы вот так получилось
50 50 move to
100 75 line to
150 150 line to
У меня постоянно line to выходит, а это явно не то.
volvo
Цитата(Яна3773 @ 21.10.2007 9:46) *
Как теперь в массив файла UOTPUT.TXT вставить строчку move to вместо line to, да не просто так а в первой строчке массива один раз.


Описываешь вот такую константу:
const
  str: array[boolean] of string = ('line', 'move');



и потом ее используешь:
     assign (f, 'uotput.txt');
     rewrite(f);
     for i:=1 to n do begin
       for j:=1 to 2 do
         write (f, m[i,j] :4 :0 );

       { если i = 1, то напечатается str[true], то есть 'move', иначе - 'line'}
       write (f, ' ' + str[i = 1] + ' to');
       writeln(f);
     end;
     close(f);

Яна3773
вот спасибо)
всё понятно и работает good.gif
обязательно посоветую этот сайт своему преподу, так что если какой-то чёкнутый озадачит вас бредовой математической задачей, а потом будет поучать как её лучше написать.... знайте, он уже здесь smile.gif
Яна3773
  
  {$I-}
  reset(f);
  {$I+}
  if IoResult = 0 then



Добавлено через 4 мин.
Айра, извини, что припозднилась с вопросом, но что этот код значит?
в указателе написано, что это проверка ошибок ввода/вывода, но каких конкретно ошибок не сказано.
поиск задачи в текущем каталоге , а потом где придётся, что ли? Объясни пожалуйста.
volvo
Цитата
написано, что это проверка ошибок ввода/вывода
Не проверка, а отключение... Смотри:

  {$I-}
  {
    Здесь отключили контроль ошибок, если ошибка произойдет - ее код вернет
    функция ioResult. Если бы контроль ошибок не отключить, программа просто
    аварийно прервется...
  }
  reset(f); { вот тут МОЖЕТ произойти ошибка (если файла нет, например) }
  {$I+}

  {
    Сразу же после того, как была вызвана функция, которая МОЖЕТ завершиться
    с ошибкой, надо вернуть контроль назад, и проверить, была ли ошибка - через ioResult
  }
  if IoResult = 0 then { если ioResult = 0, значит ошибки НЕ было, и файл открыт }
Только учти, что проверять ioResult надо сразу же, и после первого обращения к этой функции ее результат обнулится, то есть второй вызов ioResult выдаст 0 всегда, даже если при Reset(f) была ошибка...
Яна3773
ух ты!
вроде уложилось. Ещё раз спасибо.)
Яна3773

 Program  _Transition;
   var
        x: real;
        f,f1 : text;

   begin
    assign (f, 'f.txt');
    reset (f);
    assign (f1, 'f1.txt');
    rewrite (f1);
    while  not EOF  (f) do
     begin
       read (f, x);
       x:=x*2;
         begin
         write (f1,x:4:0);
         end;
      end;
     close(f);
     close(f1);
    end.



Добавлено через 1 мин.
Возращение blink.gif
Задача работала прекрасно, но у моего препода личная неприязнь к массивам…сказал их убрать, да и проверку пустой файл или нет тоже . Я убрала, но как теперь из двух столбцов (причём количество строк этой матрицы не известно) в входном файле сделать те же 2 столбца в выходном ( при этом, умножив каждую компоненту на 2), понятия не умею. В выходном файле опять строчки получаются, а нужно сохранить оформление под матрицу.
Вот такая вот…. математика. Помогите пож.)
volvo
Так:
Program  _Transition;
var
  x: real;
  f, f1 : text;
  b: boolean;

begin
  assign (f, 'f.txt');
  reset (f);
  assign (f1, 'f1.txt');
  rewrite (f1);

  b := true;
  while  not EOF  (f) do begin
    read (f, x);
    x:=x*2;

    write (f1,x:6:0);
    b := not b;
    if b then writeln(f1);
  end;

  close(f);
  close(f1);
end.

?
Яна3773
Спасибки, но я ещё вернусь !:)
Яна3773


Program  _Transition;
var
  x,xx,y,yy,a,b,c,d: real;
  f, f1, f3 : text;
 begin
  assign (f1, 'f1.txt');
  reset (f1);
  assign (f3, 'f3.txt');
  reset (f3);
  assign (f, 'f.txt');
  rewrite (f);
  while  not EOF  (f1) do begin
    read (f1, x, y);
  while  not EOF  (f3) do begin
    readln (f3, a, b, c, d );
    xx:=(c*x-a*x+a+c)/2;
    yy:=(d*y-b*y+d+b)/2;
    write (f,xx:6:0, yy:6:0);
    write(f);
    end;
  end;

  close(f);
  close(f1);
  close (f3);
 end.



Добавлено через 2 мин.
Опять пишу что-то неправильное. 2 входных файла, в первом координаты с неизвестным числом строк, во втором просто 4 числа- a,b,c,d. В выходном файле должна быть такая же матрица как и в первом входном, но преобразованная по формуле x=(c*x-a*x+a+c)/2 и y соответственно. Массивом мне уже помогли сделать, спасибо. Но как это сделать без массива, не пойму, у меня только первая строчка выходит правильная, а остальные 3 куда-то исчезают. Полтергейст. Или просто из меня очень плохой программист… wacko.gif
volvo
Цитата
остальные 3 куда-то исчезают.

Ну, допустим исчезают у тебя не 3, а 2 - это как максимум: файл F1 содержит 3 строки, на выходе - одна. Внимание, вопрос: сколько не хватает?

А не хватает - потому, что из F3 надо переменные A, B, C и D читать один раз (еще до захода в цикл по всему F1), а не внутри этого цикла...

Да и WriteLn(f) неплохо было бы поставить, вместо Write(f)... А то опять все будет в одну строку...
Sozialist
 Program  _Transition;
var
  x,xx,y,yy,a,b,c,d: real;
  f, f1, f3 : text;
 begin
  assign (f1, 'f1.txt');
  reset (f1);
  assign (f3, 'f3.txt');
  reset (f3);
  assign (f, 'f.txt');
  rewrite (f);
  readln(f3,a,b,c,d);
  while  not EOF  (f1) do
  begin
    readln (f1, x, y);
    xx:=(c*x-a*x+a+c)/2;
    yy:=(d*y-b*y+d+b)/2;
    writeln (f,xx:3:0, yy:3:0);
  end;

  close(f);
  close(f1);
  close (f3);
 end.


Хехе, собственно, получилось то же, что сказал /volvo/
Яна3773
2 конечно... пропадали.
до меня дошло, получилось. Всем спасибо smile.gif
Яна3773

Program  _Transition;
var
  x,xx,y,yy,a,b,c,d: real;
  f, f1, f3 : text;
  xz:word;
  s:string;
 begin
  assign (f1, 'func.txt');
  reset (f1);
  assign (f3, 'coord.txt');
  reset (f3);
  assign (f, 'curve.txt');
  rewrite (f);
  readln (f3, a, b, c, d );
  while  not EOF  (f1) do begin
    readln (f1, x, y, s);
    xx:=(c*x-a*x+a+c)/2;
    yy:=(d*y-b*y+d+b)/2;
    xz:=Pos ( ' line to',s);
    if xz<>0  then
     begin
      Delete (s, xz, Length (' line to'));
      Insert (' move to', s ,xz);
     end;
    writeln(s);
    writeln (f, xx:6:1, yy:6:1, s);
  end;
  close(f);
  close(f1);
  close (f3);
 end.



Добавлено через 1 мин.
Последнее. Честное слово. smile.gif
line to нужно поменять на move to, причём ровно один раз в первой строчке.
У меня просто line to меняет на move to. Полностью и беcповоротно. Как объяснить ему, что изменять нужно только первую строчку?
Яна3773
попробывала как volvo в первый раз посоветывал, с массивами через ввоод str, но у меня количество строк не известно, как указать на первую не пойму.... mega_chok.gif
volvo
Собственно, почему надо сначала везде наштамповать "line to", а потом - менять? Не проще там, где эти "line to" добавляются - поменять в первой строке на "move to"? Или сначала создадим себе сложности, а потом героически их преодолеем?
Яна3773

Program Func;

     var
         a, b, h, y, x : real;
         n, i          : integer;
         f1:text;

     Function f( x : real) : real;
           begin
               f := x*x
           end;

    begin
        write('Vvedite nachalnoe znachenie y0=');
        readln(a);
        write('Vvedite conecnoe znachenie yn=');
        readln(b);
        write('Vvedite chislo razbienij n=');
        readln(n);
        h := (b - a)/n;
         assign (f1, 'func.txt');
         rewrite (f1);
        for i := 0 to n do
           begin
               x := a + i*h;
               y := f(x);
               write(f1, x:7:4, y:7:4, ' line to');
               writeln(f1);
          end;
         close(f1);
       end.



Добавлено через 2 мин.
конечно проще. Создаётся входной файл с помощью такой задачи. Но вопрос остаётся то же...
line на move поменять в первой строчке.


Добавлено через 3 мин.
у меня не получается героически преодолеть...
массивы использовать нельзя. Запретили.
volvo
Я уже в этой теме где-то показывал использование Boolean, или тебе и это запретили?

Program Func;

     var
         a, b, h, y, x : real;
         n, i          : integer;
         f1:text;
         b: boolean; { <--- !!! }

     Function f( x : real) : real;
           begin
               f := x*x
           end;

    begin
        write('Vvedite nachalnoe znachenie y0=');
        readln(a);
        write('Vvedite conecnoe znachenie yn=');
        readln(b);
        write('Vvedite chislo razbienij n=');
        readln(n);
        h := (b - a)/n;
         assign (f1, 'func.txt');
         rewrite (f1);

        b := true; { <--- Первая строка - будем добавлять "move to" }
        for i := 0 to n do
           begin
               x := a + i*h;
               y := f(x);
               write(f1, x:7:4, y:7:4);
               if b then writeln(f1, ' move to')
               else writeln(f1, ' line to');
               b := false; { <--- В любом случае следующая строка - НЕ первая }
          end;
         close(f1);
       end.
Яна3773
нет, не запретили. Даже очень разрешили. Ещё немного и я бы чёкнулась.
спасиб. give_rose.gif give_rose.gif give_rose.gif give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.