у меня есть две задачи:
1. Даны два целых числа i и j и файл вещественных чисел, содержащий ненулевую часть верхней треугольной матрицы (по строкам). Вывести порядок матрицы и ее элемент, расположенный в i-й строке и j-м столбце (строки и столбцы нумеруются от 1). Если требуемый элемент находится в нулевой части матрицы, то вывести 0; если элемент отсутствует, то вывести –1.
2. Дано целое число N и текстовый файл с именем Name1, содержащий один абзац текста, выровненный по левому краю. Отформатировать текст так, чтобы его ширина не превосходила N позиций, и выровнять текст по левому краю. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле с именем Name2.
во второй задаче мне нужно в слцчае если вот эти N озиций разрывает слово,то преносить это слово целиком на следующую строку,а если слово такое,что занимает больше всю строку этих N позиций,то просто разорвать его,перенеся лишние символы на следующую строку.
со вторым проблем нет.проблема состоит в том,что у меня не получается сделать так,чтобы переносилось слово целиком,то есть первый случай.
а в первой задаче мне не понятно,как записать в файл вводимые значения верхней ненудевой части матрицы по строкам.
большая просьба помочь)
а как читать из файла посимвольно?
goto http://forum.pascal.net.ru/index.php?showtopic=3584
f : text;
ch : char;
...
while not(eof(f)) do begin
read(f, ch);
writeln(ch);
end;
вот то,что у меня получилось.только я тут не записываю во второй файл пока.
вообще,она компилируется,
но затем выдает ошибку...
вообще-то я делаю на делфи,но может что-то в самой программе неправильно?
а ошибка выдается до того,как выводить на экран результат
(Access violation at adress 004045A0 in module 'Project1.exe'.Read adress FFFFFFF7.)
Может подскажете,что за ошибка?))
Ну, во-первых, у тебя глобальная и локальная переменные имеют одно и то же имя - oneword, и в этом случае ЛОКАЛЬНОЕ имя внутри процедуры имеет преимущество. То есть, из процедуры НИЧЕГО не будет возвращаться...
Или делай так:
procedure getword(VAR oneword:string);или вообще работай только с глобальной переменной, то есть делай getword без параметров...
я исправила,но ошибка остается той же(
А попробуй все-же прогнать вот это (работа со строками)
Вроде работает...
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.
я попробовала сделать так,но
она что-то странное делает с текстом
Ну, не знаю. Я пробовал на своем файле, все отработало, длины всех строк S меньше чем N, что, в принципе, и требовалось... Присоедини свой тестовый файл, я попробую на нем.
ээ...сейчас почему-то ругается на эту строку
while (p > 0) and (st[p] <> ' ') do dec(p);
Значит, что-то изменила в программе. Знаешь, я не телепат. И если ты показываешь какие-то куски, которые у тебя не работают (причем неизвестно с какими входными данными, и какова ВООБЩЕ ПОЛНАЯ программа), то я тебе ничем помочь не могу.
Не хочешь показывать ВЕСЬ код вместе со входными данными - ищи ошибки сама.
разница лишь в том,что я делаю это в делфи,
и я удалила вот эту строку
repeat
writeln('st = ', st); { <---- }
p := n;
вот вся программа в целом
прикрепила заново
Прикрепленные файлы
files.rar ( 3.86 килобайт )
Кол-во скачиваний: 205
Файл заново присоедини - архив битый, ошибка при распаковке...
В следующий раз будь внимательнее при наборе текста, ОК?
Вот что ДОЛЖНО было быть (и я именно это и привел в своей программе), закомментировано - то, что было у тебя:
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;
спасибо,я буду внимательнее...(
но теперь этот "хвост" теряется,но не везде...
всё,спасибо большое))
с этой задачей разобралась))
прошу прощения,но
у меня вновь возникли вопросы..
дело в том что программа не может выполнить
нужные операции для n<12, если я не ошибаюсь.
почему это происходит?
и еще вопрос:а для чего нужно
if (p=0) then p:=pred(n);?
if st<>'' then begin
inc(i);
s[i]:=st;
end;
while not eof(f) do?
....
end;
if (p=0) then p:=pred(n);?
prev := copy(st, succ(p), 255) + ' ';Чтобы не делать лишних If ... Then ... Else, я просто присвоил в p значение N - 1, и это удовлетворяет всем условиям...
if st<>'' then begin
inc(i);
s[i]:=st;
end;
while not eof(f) do?
....
end;
While not eof(f) do
Добавлено:
Так, ну причина того, что это все не работало с N < 12 очень прозаическая - размерности массива S просто напросто не хватало для того, чтобы он мог вместить все строки Поскольку реализация идет на Дельфи - я СВОЙ код переписал с использованием динамических массивов вот так:
varи все заработало (если ты что-то меняла после того, как я привел предыдущий вариант - внеси соответствующие изменения и сюда...)
s: array of string;
...
procedure TForm1.Button2Click(Sender: TObject);
var
i, j, p, n: integer;
st, prev: string;
procedure add_string(str: string);
begin
setlength(s, length(s) + 1);
s[length(s) - 1] := str;
end;
begin
n := StrToInt(Edit1.Text); // n = 10
reset(f);
prev := '';
setlength(s, 0);
while not eof(f) do begin
readln(f, st);
st := prev + st; prev := '';
if length(st) > n then begin
repeat
p := n;
while (p > 0) and (st[p] <> ' ') do dec(p);
if p = 0 then p := pred(n);
add_string( copy(st, 1, p) );
prev := copy(st, succ(p), 255) + ' ';
delete(st, 1, p);
until length(prev) < n;
end
else add_string( st );
end;
if st <> '' then add_string( st );
for j := 0 to length(s) - 1 do
Memo2.Lines.Append(s[j] + inttostr(length(s[j])));
setlength(s, 0); // Освобождаем S
end.
большое спасибо за объяснения!=)
теперь всё понятно=)
я в начале этой темы приводила условие еще одной задачи.
вот то,что я сделала.
но там выдается ошибка о том,что
чтение из файла идет после его закрытия,но
я проверила этот факт.
вроде всё открывается и закрывается в нужных местах...
что не так?посмотрите,пожалуйста...))
Прикрепленные файлы
matrix_file.rar ( 3.58 килобайт )
Кол-во скачиваний: 146
А тебя не смущает тот факт, что ты записываешь в файл одно число, а читать из того же файла пытаешься несколько чисел? ;)
P.S. Все-таки, тему я передвину в Дельфи...
volvo, а можно попросить вас словесно хотя бы кратко объяснить, как
действует программа, которую вы привели , а то вроде бы всё понятно,
а когда начинаю объяснять путаюсь и сама ничего не понимаю.
прошу вас,объясните,а то получается так,что алгоритм
понятен мне только кусками...а хотелось бы хорошо с ним разобраться
спасибо.
уже разобралась сама=)))
ура,ура,ура