Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Массив в файле.

Автор: Яна3773 20.10.2007 1:52

Доброго времени суток!
Как прочитать и записать массив (двумерный) чисел из файла, причём покомпонентно?
Задача интересная, прыгнуть из одной системы координат в другую. Но как прочитать элемнты массива из файла, а потом поиздевавшись над ними в Паскале, переписать их в другой файл, понятия не имею. Всё время какие-то строки попадаются, а не элементы матрицы. Помогите пожалуйста. Заранее, спасибо.)

Автор: Айра 20.10.2007 4:00

Можно организовать это вот так:

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 20.10.2007 4:18

 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 20.10.2007 4:29

Sozialist, ты вообще что-ли думать не научился? Как и читать? Ты где постишь? В разделе Паскаль? Будь добр постить программу, которая пройдет компиляцию Турбо Паскалем! dry.gif

Автор: Sozialist 20.10.2007 4:38

volvo
Думать и читать не научился. Да.

Автор: Яна3773 20.10.2007 14:44

Спасибо ребята большоё, как прогу напишу, выставлю.
И ещё, если кому-то нужны книжки с решёнными задачами по численным методам, то тоже скинуть могу, у меня такого добра много, хотя мне кажется тут все знатоки. smile.gif

Автор: Яна3773 20.10.2007 19:31


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]3.gif2);
writeln(f);
end;
close(f);
end.



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

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


Прикрепленные файлы
Прикрепленный файл  input.txt ( 9 байт ) Кол-во скачиваний: 219

Автор: Sozialist 20.10.2007 20:41

Естественно, головой нужно думать, что простое присваивание элементам матрицы 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 20.10.2007 20:50

точно. Бред я написала.... спасиб)

Автор: Sozialist 20.10.2007 20:55

Яна3773
Смени пол cool.gif

Автор: Яна3773 21.10.2007 14:46


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]4.gif0 );
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 выходит, а это явно не то.


Прикрепленные файлы
Прикрепленный файл  input.txt ( 27 байт ) Кол-во скачиваний: 220
Прикрепленный файл  input1.txt ( 17 байт ) Кол-во скачиваний: 244

Автор: volvo 21.10.2007 16:37

Цитата(Яна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 21.10.2007 17:12

вот спасибо)
всё понятно и работает good.gif
обязательно посоветую этот сайт своему преподу, так что если какой-то чёкнутый озадачит вас бредовой математической задачей, а потом будет поучать как её лучше написать.... знайте, он уже здесь smile.gif

Автор: Яна3773 21.10.2007 23:21

  
{$I-}
reset(f);
{$I+}
if IoResult = 0 then



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

Автор: volvo 21.10.2007 23:41

Цитата
написано, что это проверка ошибок ввода/вывода
Не проверка, а отключение... Смотри:

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

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

Автор: Яна3773 21.10.2007 23:51

ух ты!
вроде уложилось. Ещё раз спасибо.)

Автор: Яна3773 23.10.2007 14:00


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), понятия не умею. В выходном файле опять строчки получаются, а нужно сохранить оформление под матрицу.
Вот такая вот…. математика. Помогите пож.)



Прикрепленные файлы
Прикрепленный файл  f.txt ( 17 байт ) Кол-во скачиваний: 216
Прикрепленный файл  F3.TXT ( 136 байт ) Кол-во скачиваний: 220

Автор: volvo 23.10.2007 14:20

Так:

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 23.10.2007 14:33

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

Автор: Яна3773 23.10.2007 15:42



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


Прикрепленные файлы
Прикрепленный файл  f1.TXT ( 30 байт ) Кол-во скачиваний: 249
Прикрепленный файл  f3.txt ( 17 байт ) Кол-во скачиваний: 236

Автор: volvo 23.10.2007 16:01

Цитата
остальные 3 куда-то исчезают.

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

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

Да и WriteLn(f) неплохо было бы поставить, вместо Write(f)... А то опять все будет в одну строку...

Автор: Sozialist 23.10.2007 16:13

 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 23.10.2007 16:18

2 конечно... пропадали.
до меня дошло, получилось. Всем спасибо smile.gif

Автор: Яна3773 23.10.2007 18:55


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поворотно. Как объяснить ему, что изменять нужно только первую строчку?



Прикрепленные файлы
Прикрепленный файл  FUNC.TXT ( 2.37 килобайт ) Кол-во скачиваний: 178
Прикрепленный файл  coord.txt ( 21 байт ) Кол-во скачиваний: 192

Автор: Яна3773 23.10.2007 20:38

попробывала как volvo в первый раз посоветывал, с массивами через ввоод str, но у меня количество строк не известно, как указать на первую не пойму.... mega_chok.gif

Автор: volvo 23.10.2007 20:54

Собственно, почему надо сначала везде наштамповать "line to", а потом - менять? Не проще там, где эти "line to" добавляются - поменять в первой строке на "move to"? Или сначала создадим себе сложности, а потом героически их преодолеем?

Автор: Яна3773 23.10.2007 21:02


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 23.10.2007 21:40

Я уже в этой теме где-то показывал использование 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 23.10.2007 21:46

нет, не запретили. Даже очень разрешили. Ещё немного и я бы чёкнулась.
спасиб. give_rose.gif give_rose.gif give_rose.gif give_rose.gif