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

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

Форум «Всё о Паскале» _ Задачи _ Help - Работа с файлами

Автор: ursus 1.06.2006 20:59

Помогите решить!!!!!!!!!!!, please!!!!
Для зачета 1 осталась:
Число компонент файла f, компонентами которого являются целые числа кратно 10. Преписать компоненты файла f в файл g, изменяя порядок чисел в каждой десятке так, чтобы вначале шли отрицательные числа десятки, а за ними - неотрицательные

Автор: Clon 1.06.2006 23:12

Ну вот примерно так, если, конечно, я правильно понял задание

program ubu(input,output);
var
a:array[1..100] of integer;
i,n,c,j,k,u,m:integer;
g,f:file of integer;
y:char;
procedure vvod;
begin
write('vvedite chislo komponent:');
readln(n);
if (n mod 10)=0 then
begin
rewrite(f);
writeln('vvedite komponenti');
for i:=1 to n do
begin
read©;
write(f,c);
end;
close(f);
end
else
begin
writeln('input error');
vvod;
end;
end;
procedure print;
begin
reset(f);
while not eof(f) do
begin
read(f,c);
write©;
write(' ');
end;
close(f);
end;
procedure active;
begin
k:=1;
m:=1;
rewrite(g);
reset(f);
while not eof(f) do
begin
for j:=1 to 10 do
begin
read(f,c);
if c>0 then
begin
a[k]:=c;
k:=k+1;
end;
if c<0 then
begin
write©;
write(' ');
end;
end;
for u:=1 to k-1 do
begin
write(a[u]);
write(' ');
end;
k:=1;
end;
close(f);
close(g);
end;
begin
assign(f,'f');
assign(g,'g');
writeln('hotite vvesti noviy file?y/n');
readln(y);
if y='y' then vvod;
writeln;
writeln('PRINT');
writeln;
print;
writeln;
writeln('OUTPUT');
writeln;
active;
end.

Автор: volvo 1.06.2006 23:35

Clon, у тебя жестоко нарушена структура программы. В частности, описания процедур внутри блока If ... Then ... Else blink.gif blink.gif

Автор: Clon 1.06.2006 23:51

Тьфу, сорри, выложил по ошибке не то. Сейчас поправил

Автор: Malice 2.06.2006 0:45

Цитата(Clon @ 1.06.2006 20:51) *
Тьфу, сорри, выложил по ошибке не то. Сейчас поправил

Все равно что-то не то, ни одного write(g,..) нет, как результат сохраняется ?
Я думаю вот такой основной блок надо:
nn:=0; reset(q); rewrite(w);
repeat
a:=0; s:=9;
for i:=0 to 9 do begin
read(q,k);
if k<0 then
begin seek(w,10*nn+a); write (w,k); inc(a); end
else
begin seek(w,10*nn+s); write (w,k); dec(s); end;
end;
inc(nn);
until eof(q);

Правда все положительные числа в обратном порядке встанут, ну и что, это не оговаривалось smile.gif

Автор: Clon 2.06.2006 2:22

Ну не знаю, у меня все работает. Сначала пишет содержимое файла, а потом его отсортированный вариант.

Автор: volvo 2.06.2006 2:46

Clon, а ты на размер файла G после прогона твоей программы посмотреть не хочешь?
А задание было:

Цитата
Преписать компоненты файла f в файл g, изменяя порядок чисел в каждой десятке <...>
smile.gif

Автор: Clon 2.06.2006 20:27

volvo Ой... mega_chok.gif
Ну тогда так

program ubu(input,output);
var
a:array[1..100] of integer;
i,n,c,j,k,u,m:integer;
g,f:file of integer;
y:char;
procedure vvod;
begin
write('vvedite chislo komponent:');
readln(n);
if (n mod 10)=0 then
begin
rewrite(f);
writeln('vvedite komponenti');
for i:=1 to n do
begin
read©;
write(f,c);
end;
close(f);
end
else
begin
writeln('input error');
vvod;
end;
end;
procedure print;
begin
reset(f);
while not eof(f) do
begin
read(f,c);
write©;
write(' ');
end;
close(f);
end;
procedure active;
begin
k:=1;
m:=1;
rewrite(g);
reset(f);
while not eof(f) do
begin
for j:=1 to 10 do
begin
read(f,c);
if c>0 then
begin
a[k]:=c;
k:=k+1;
end;
if c<0 then
begin
write©;
write(g,c);
write(' ');
end;
end;
for u:=1 to k-1 do
begin
write(a[u]);
write(g,a[u]);
write(' ');
end;
k:=1;
end;
close(f);
close(g);
end;
begin
assign(f,'f');
assign(g,'g');
writeln('hotite vvesti noviy file?y/n');
readln(y);
if y='y' then vvod;
writeln;
writeln('PRINT');
writeln;
print;
writeln;
writeln('OUTPUT');
writeln;
active;
end.

Автор: Unknown 3.06.2006 19:45

Всем доброго времени суток!
У меня похожее задание:
Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле g те компоненты файла f, которые являются четными.
Но я чего-то вообще не догоняю, как работать с файлами...
Мне всю прогу не надо, а хотя бы первую часть, т.е. заполнить файл f, даже не рандомно, а вручную, чтоб разобраться. Вот, что пишу я:

Код

var f:file of integer; a,i:integer;
begin
assign(f,'file.dat');
rewrite(f);
repeat
write(f,a);
until eof(f)
end.

По идее, юзер вводит последовательность целых чисел до тех пор, пока не будет нажата комбинация Ctrl+Z и Enter, и вся эта последовательность сохраняется в файле с именем file.dat. Все верно? Или я что-то не так понял? Не работает...
Имеет ли значение, работаю я в Турбо или в Борланд Паскале?

Автор: volvo 3.06.2006 20:15

Unknown, во-первых, где ты получаешь значение от пользователя? Нету этого, добавь...

А во-вторых, перед завершением программы не забудь сделать Close(f), чтобы все внесенные значения гарантированно записались в файл, иначе все записанное в буфер просто будет потеряно...

Автор: Гость 3.06.2006 20:30

volvo, сорри, close(f) я просто забыл написать, а, т.к. я - гость, редактировать посты не могу...
Проблема в том, что при прогоне программы она никак не взаимодействует с юзером(просто мигает экран и все): на строке write(f,a); ничего не происходит, а на строке until eof(f) условие считается выполненным, несмотря на то, что Ctrl+Z не нажаты...
Еще раз повторю вопрос: имеет значение, пишу я на Турбо Паскале или на Борланд Паскале? Просто некоторые различия у них есть, может различия есть и в работе с файлами?

Автор: Гость 3.06.2006 20:33

volvo, а разве строка write(f,a); не отвечает за "получение значения от пользователя"? За что тогда отвечает эта строка?

Автор: volvo 3.06.2006 21:04

Эта строка пишет содержимое переменной a в файл... А вот где ты запрашиваешь то значение, которое будет записываться?

Кстати, я сейчас еще кое-что заметил: eof(f) будет истиной сразу же, поэтому после записи первого значения цикл у тебя закончится... Для того, чтобы продолжать цикл до нажатия Ctrl+Z тебе надо сделать

until not eof; { <--- С клавиатуры !!! }


Возможно, в Турбо и Борланд Паскале и есть какие-то отличия, но здесь разницы абсолютно нет.

Автор: Гость 3.06.2006 21:15

Ага... Кажется, понял! Огромное спасибо!