IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Работа с файлами
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


у меня есть две задачи:

1. Даны два целых числа i и j и файл вещественных чисел, содержащий ненулевую часть верхней треугольной матрицы (по строкам). Вывести порядок матрицы и ее элемент, расположенный в i-й строке и j-м столбце (строки и столбцы нумеруются от 1). Если требуемый элемент находится в нулевой части матрицы, то вывести 0; если элемент отсутствует, то вывести –1.

2. Дано целое число N и текстовый файл с именем Name1, содержащий один абзац текста, выровненный по левому краю. Отформатировать текст так, чтобы его ширина не превосходила N позиций, и выровнять текст по левому краю. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле с именем Name2.

во второй задаче мне нужно в слцчае если вот эти N озиций разрывает слово,то преносить это слово целиком на следующую строку,а если слово такое,что занимает больше всю строку этих N позиций,то просто разорвать его,перенеся лишние символы на следующую строку.
со вторым проблем нет.проблема состоит в том,что у меня не получается сделать так,чтобы переносилось слово целиком,то есть первый случай.

а в первой задаче мне не понятно,как записать в файл вводимые значения верхней ненудевой части матрицы по строкам.

большая просьба помочь)

Сообщение отредактировано: Tribunal -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Tribunal @ 8.04.2006 5:17) *

проблема состоит в том,что у меня не получается сделать так,чтобы переносилось слово целиком,то есть первый случай.

Проблема твоя, мне кажется, абсолютно надумана. Ее вообще нету. То есть она есть, если читать файл строками. Но это делать не нужно, и тогда она просто исчезнет. Просто сделай себе процедуру, скажем, GetWord, которая читает из файла посимвольно, и формирует переменную OneWord типа string, добавляя в конец по символу. При натыкании на пробел или конец строки она останавливается, сформированное слово выводится в новый файл (если нужно, с переводом строки). Как видишь, проблемы просто не стало..

Да, если нужно сохранять число пробелов между словами в строчке, то процедуру GetWord нужно перемежать с процедурой GetSpace, которая читает пробелы и формирует переменную OneSpace, которую тоже нужно писать в файл, если это не переход на другую строку.

Сообщение отредактировано: lapp -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


а как читать из файла посимвольно?


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


goto FAQ : Файлы


f : text;
ch : char;

...

while not(eof(f)) do begin
read(f, ch);
writeln(ch);
end;


- это для текстовых файлов.

Для типизированный ты кроме как покомпонентно больше никак читать не можешь.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(lapp @ 8.04.2006 5:54)
То есть она есть, если читать файл строками. Но это делать не нужно, и тогда она просто исчезнет.

Я бы не стал так критически относиться к чтению текстового файла построчно... Проблема будет существовать только тогда, когда файл читается строками, и эти строки неправильно обрабатываются !!! А вот по скорости все-таки вариант со строками будет предпочтительнее, чем чтение посимвольно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 8.04.2006 10:13) *

Я бы не стал так критически относиться к чтению текстового файла построчно... Проблема будет существовать только тогда, когда файл читается строками, и эти строки неправильно обрабатываются !!! А вот по скорости все-таки вариант со строками будет предпочтительнее, чем чтение посимвольно...

В целом, конечно, чтение строками удобнее, но если говорить о скорости, то лучше читать поблочно, заполнять массив символов, а из него брать символы поштучно.. Так наиболее логично. Но при нормальном кеше скорость и так должна быть неплохая (не проверял smile.gif )


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


вот то,что у меня получилось.только я тут не записываю во второй файл пока.
вообще,она компилируется,
но затем выдает ошибку...
вообще-то я делаю на делфи,но может что-то в самой программе неправильно?
а ошибка выдается до того,как выводить на экран результат
(Access violation at adress 004045A0 in module 'Project1.exe'.Read adress FFFFFFF7.)
Может подскажете,что за ошибка?))

Код
var
   n,m,ln,i,j:byte;
   x:char;
   oneword:string;
   s:array [1..40] of string;
   f:textfile;

   procedure getword(oneword:string);
   begin
    oneword:='';
    repeat
    read(f,x);
    oneword:=oneword+x;
    m:=m+1;
    until (x=' ') or eoln(f);
   end;

begin
read(n);
assign(f,'name1.txt');
reset(f);

ln:=0;
i:=1;
while (not eof(f)) do
  begin
    getword(oneword);
    ln:=ln+m;
    if ln>n then inc(i);
    s[i]:=s[i]+oneword;
         if eoln(f) then inc(i);
  end;
close(f);
for j:=1 to i do
   writeln(s[j]);
end;


Сообщение отредактировано: Tribunal -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ну, во-первых, у тебя глобальная и локальная переменные имеют одно и то же имя - oneword, и в этом случае ЛОКАЛЬНОЕ имя внутри процедуры имеет преимущество. То есть, из процедуры НИЧЕГО не будет возвращаться...

Или делай так:
procedure getword(VAR oneword:string);
или вообще работай только с глобальной переменной, то есть делай getword без параметров...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


я исправила,но ошибка остается той же(


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






А попробуй все-же прогнать вот это (работа со строками) smile.gif
Вроде работает...
var
i, j, p, n: integer;
f: text;
s: array[1 .. 40] of string;
st, prev: string;

begin
n := 25; // readln(n) - для удобства отладки
assign(f,'name1.txt');
reset(f);

prev := ''; i := 0;
while not eof(f) do begin
readln(f, st);
st := prev + st; prev := '';

if length(st) > n then begin

repeat

writeln('st = ', st);
p := n;
while (p > 0) and (st[p] <> ' ') do dec(p);

if p = 0 then p := pred(n);
inc(i); s[i] := copy(st, 1, p);
prev := copy(st, succ(p), 255) + ' ';
delete(st, 1, p);

until length(prev) < n;

end
else begin
inc(i); s[i] := st;
end;
end;

for j := 1 to i do
// length - только для контроля результатов
writeln(s[j], ' len = ', length(s[j]));
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


я попробовала сделать так,но
она что-то странное делает с текстом blink.gif


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Ну, не знаю. Я пробовал на своем файле, все отработало, длины всех строк S меньше чем N, что, в принципе, и требовалось... Присоедини свой тестовый файл, я попробую на нем.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


ээ...сейчас почему-то ругается на эту строку

while (p > 0) and (st[p] <> ' ') do dec(p);


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Значит, что-то изменила в программе. Знаешь, я не телепат. И если ты показываешь какие-то куски, которые у тебя не работают (причем неизвестно с какими входными данными, и какова ВООБЩЕ ПОЛНАЯ программа), то я тебе ничем помочь не могу.

Не хочешь показывать ВЕСЬ код вместе со входными данными - ищи ошибки сама.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


разница лишь в том,что я делаю это в делфи,
и я удалила вот эту строку
repeat
writeln('st = ', st); { <---- }
p := n;


а вот текстовый файл,на котором я всё это тестирую.

я проверяла на паскале.там действительно всё работает.
а у меня нет((


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


вот вся программа в целом

прикрепила заново


Прикрепленные файлы
Прикрепленный файл  files.rar ( 3.86 килобайт ) Кол-во скачиваний: 222


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Файл заново присоедини - архив битый, ошибка при распаковке...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






В следующий раз будь внимательнее при наборе текста, ОК?
Вот что ДОЛЖНО было быть (и я именно это и привел в своей программе), закомментировано - то, что было у тебя:
procedure TForm1.Button2Click(Sender: TObject);
var
n,p,i,j:byte;
st,prev:string;

begin
n:=StrToInt(Edit1.Text);
reset(f);
prev:='';
i:=0;
while not eof(f) do
begin
readln(f,st);
st:= prev+st;

// prev:=prev+st;

prev:='';
if length(st)>n then
begin
// while not eof(f) do begin

repeat

p := n;
while (p > 0) and (st[p] <> ' ') do dec(p);

if p = 0 then p := pred(n);
inc(i);
s[i] := copy(st, 1, p);

prev := copy(st, succ(p), 255) + ' ';
delete(st, 1, p);
until length(prev) < n;
// end;
end
else begin
inc(i);
s[i]:=st;
end;
end;

// Это я добавил позже, сразу не обратил внимание, что теряется "хвост" текста
if st <> '' then begin
inc(i);
s[i] := st;
end;

for j:=1 to i do
Memo2.Lines.Append(s[j]+inttostr(length(s[j])));

end;
Все нормально работает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


спасибо,я буду внимательнее...(

но теперь этот "хвост" теряется,но не везде...

Сообщение отредактировано: Tribunal -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


всё,спасибо большое))
с этой задачей разобралась))


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.12.2024 5:56
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name