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

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

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

 
 Ответить  Открыть новую тему 
> файл с массивом строк, помогите найти ошибку
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Женский

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


хм, вот задачка, найдите, плиз ошибку, я ее мучаю уже несколько недель

Требование:
В программе описать массив строк. Исходный текст считать из файла, созданного в любом текстовом редакторе. Результат обработки вывести на экран, а так же в итоговый текстовый файл.

Задание:
Определить количество слов, поменять местами четные и нечетные слова.

program pr6;
uses crt;

const p=3;
var o1,o2:text;
f:array[1..p] of string;
s,s1:string;
i,j,k,n,m1,m2,l1,l2:integer;
procedure invert(k,l:byte);
var i:byte;
ch:char;
b:boolean;
begin
for i:=k to ((l+k) div 2) do
begin
ch:=s[i];
s[i]:=s[l+k-i];
s[l+k-i]:=ch;
end;
end;

begin
clrscr;

assign(ff,'d:\o1.txt');

reset(ff);
j:=0;
while not eoln(ff) do
begin j:=j+1;
readln(ff,f[j]);writeln(f[j]);
end;
close(ff);

reset(ff);
j:=0;
while not eoln(ff) do
begin j:=j+1;
readln(ff,f[j]);
i:=0;n:=0;
m1:=1;m2:=1;l1:=1;l2:=1;
while i<length(f[j]) do
begin
i:=i+1;
s:=copy(f[j],i,1);
if (s[i]=' ')or(i=length(s)) then
repeat
if s[i+1]=' ' then
begin
delete(s,i,1);
k:=k-1;
b:=false;
end
else b:=true;
until b;
end;

begin
n:=n+1;
if n=1 then
begin
m2:=i-1;
l1:=i+1
end
else
begin
n:=0;
if i=length(s) then l2:=i else l2:=i-1;
invert(m1,m2);invert(l1,l2);invert(m1,l2);
m1:=i+1
end
end
end;

writeln(f[j]);
close(ff);

assign(oo,'d:\o2.txt');
rewrite(oo);
for j:=1 to 3 do
writeln(oo,f[j]);close(oo);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 7
Пол: Женский

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


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


?
***

Группа: Пользователи
Сообщений: 283
Пол: Мужской

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


Вопервых ты обявила масив
f:array[1..p] of string; 
тоесть при копирование их текстового файла будет копиротся строка целиком;
а в этом цикле
while not eoln(ff) do  <<а в этом цикле у тебя стоит eoln (тоесть пока не конец стоки) нада eof(пока не конец файла)
begin j:=j+1;
readln(ff,f[j]);writeln(f[j]);
end;

да и фаловая переменная ff нигде не обявлена?

а дальше тежело разобратся что делает програма 1.gif

Сообщение отредактировано: amega -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


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

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

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


Соблюдай разумный формат, иначе ни ты сама, ни кто либо еще не сможет разобраться в твоем творении. Я (с некоторым трудом) отформатировал - посмотри и постарайся делать в том же духе.
const
p=3;
var
ff,oo: text;
f: array[1..p] of string;
s,s1: string;
i,j,k,n,m1,m2,l1,l2: integer;
b: boolean;

procedure invert(k,l:byte);
var
i:byte;
ch:char;
b:boolean;
begin
for i:=k to ((l+k) div 2) do begin
ch:=s[i];
s[i]:=s[l+k-i];
s[l+k-i]:=ch;
end;
end;

begin
assign(ff,'d:\o1.txt');
reset(ff);
j:=0;
while not eoln(ff) do begin
j:=j+1;
readln(ff,f[j]);
writeln(f[j]);
end;
close(ff);
reset(ff);
j:=0;
while not eoln(ff) do begin
j:=j+1;
readln(ff,f[j]);
i:=0;
n:=0;
m1:=1;
m2:=1;
l1:=1;
l2:=1;
while i<length(f[j]) do begin
i:=i+1;
s:=copy(f[j],i,1);
if (s[i]=' ')or(i=length(s)) then repeat
if s[i+1]=' ' then begin
delete(s,i,1);
k:=k-1;
b:=false;
end
else b:=true;
until b;
end;

n:=n+1;
if n=1 then begin
m2:=i-1;
l1:=i+1
end
else begin
n:=0;
if i=length(s) then l2:=i else l2:=i-1;
invert(m1,m2);invert(l1,l2);invert(m1,l2);
m1:=i+1
end
end;

writeln(f[j]);
close(ff);

assign(oo,'d:\o2.txt');
rewrite(oo);
for j:=1 to 3 do writeln(oo,f[j]);close(oo);
end.

При описании файловой переменной, нужно описывать ее имя, а не имя файла на диске (я исправил). Программа теперь по крайней мере компилируется. Разбирайся дальше. Если будут еще вопросы - приходи.

PS
Да, еще я выкинул зло - uses CRT и ClrScr. Советую избегать использования CRT, где это не жизненно необходимо. А ClrScr - вообще непонятно, зачем. Имеет смысл сохранять прежние результаты для простоты отладки. Если программа отлажена и в эксплуатации, то стирать пользователю экран вообще может оказаться медвежьей услугой. Надо будет - сам сотрет.


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





Группа: Пользователи
Сообщений: 7
Пол: Женский

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


вот что-то переделала:
program pr6;
uses crt;
var f:text;
i,n:integer;
a:array[1..500] of string;
s,sub:string;
begin
assign(f,'c:\o.txt');
reset(f);
n:=0;
while not(eof(f)) do
begin
readln(f,s);
i:=0;
repeat
inc(i);
if (s[i]=' ')and(s[i+1]<>' ') then begin
inc(n);
a[n]:=sub;
sub:='';
end
else if (s[i]<>' ')and(s[i]<>'.') then sub:=sub+s[i];
until length(s)=i;
if sub<>'' then begin
inc(n);
a[n]:=sub;
end;
end;
close(f);
writeln('Всего ',n,' строк');
assign(f,'c:\o1.txt');
rewrite(f);
for i:=1 to n do
if i mod 2=0 then begin
write(a[i],' ',a[i-1],' ');
write(f,a[i],' ',a[i-1],' ');
end;
if n mod 2=1 then begin
write(a[n]);
write(f,a[n]);
end;
close(f);
end.

но мне сказали, что проверку четности мона сделать с помощью odd(x) и т.к. необходим массив строк, то надо сделать 2-мерный массив по строкам и символам в строке. как это сделать?

М
Ставь теги паскалевского кода, а не просто кода, пожалуйста
Lapp

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


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

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

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


Цитата(LyaLya @ 27.12.2008 0:38) *
но мне сказали, что проверку четности мона сделать с помощью odd(x) и т.к. необходим массив строк, то надо сделать 2-мерный массив по строкам и символам в строке. как это сделать?
Я думаю, имелось в виду, что надо работать не с дополнительной строкой s, а непосредственно со строкой-элементом массива a[i]. Тогда обращение к отдельному символу будет таким же, как обращение к двумерному массиву:
a[i][j]
- или даже можно записать так:
a[i,j]

Odd - это тоже просто. Odd в переводе с английского означает "нечетный". Условие :
if n mod 2=1 then ...
- эквивалентно такому:
if Odd(n) then ...
Или, наоборот:
if n mod 2=0 then ...
- эквивалентно такому:
if not Odd(n) then ...

У меня другой вопрос. В условии задачи абсолютно ничего не говорится про предложения. Есть про строки, есть про слова - и ничего про предложения. Однако, в своей программе ты пытаешься обрабатывать точку отдельно от пробела. Почему? Это ты неправильно написала условие ( norespect.gif ), или это ты ошибаешься и делаешь что-то лишнее?..

Вот, смотри, я сделал тебе программу по условию (то есть без учета точек). В ней мне совершенно не потребовалось пользоваться четностью в изначальном смысле - я просто чередую слова.
var
f:text;
i,j,n,p:integer;
a:array[1..500] of string;
s,w1,w2:string;
Letters: set of char;

begin
Letters:=['A'..'Z']+['a'..'z'];
assign(f,'o.txt');
reset(f);

{ считываем файл в массив }
n:=0;
while not(eof(f)) do begin
Inc(n);
readln(f,a[n]);
WriteLn(a[n]) { отладочная печать }
end;
Close(f);
assign(f,'o1.txt');
ReWrite(f);
writeln('Всего ',n,' строк');

{ работаем с массивом строк }
for j:=1 to n do begin
i:=1;
s:='';
while i<Length(a[j]) do begin
{ пропуск небуквенных символов и копирование их в новую строку }
while (i<=Length(a[j])) and not (a[j,i] in Letters) do begin
s:=s+a[j][i];
Inc(i)
end;
{ запоминаем позицию }
p:=i;
{ чтение первого слова }
w1:='';
while (i<=Length(a[j])) and (a[j][i] in Letters) do begin
w1:=w1+a[j][i];
Inc(i)
end;
{ пропуск небуквенных символов и копирование их в новую строку }
while (i<=Length(a[j])) and not (a[j][i] in Letters) do begin
s:=s+a[j][i];
Inc(i)
end;
{ чтение второго слова }
w2:='';
while (i<=Length(a[j])) and (a[j][i] in Letters) do begin
w2:=w2+a[j][i];
Inc(i)
end;
{ обработка ситуации непарного слова в конце строки }
if w2='' then begin
w2:=w1;
w1:=''
end;
{ вставка второго слова в запомненную позицию }
Insert(w2,s,p);
{ добавление первого слова }
s:=s+w1
end;
WriteLn(f,s); { запись выходного файла }
WriteLn(s) { отладочная печать }
end;
close(f);
end.



PS
вставил комменты..
PPS
еще добавил комментариев..

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


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





Группа: Пользователи
Сообщений: 7
Пол: Женский

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


условие и требования с методички dry.gif , листинг проверил препод blink.gif -сказал, что не нужно открывать и закрывать файл - сразу выводить на экран данные с файла, а потом, т.к. необходимо работать с массивом строк(возможно строки и будут содержать предложения), то циклы должны идти и по символам в строке, и по строкам. А еще, кажется, переменная s там лишняя... wacko.gif
как переделать??? mega_chok.gif очень жду помощи blush.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


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

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

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


Цитата(LyaLya @ 27.12.2008 4:33) *
как переделать??? mega_chok.gif очень жду помощи blush.gif
А ты вообще смотришь, что тебе пишут?.. blink.gif
В моем коде все именно так и сделано. Из того, что ты неверно трактуешь условие, вовсе не следует, что другие делают так же.
Вывод на экран вообще убери - про него в условии нету, он только для отладки. Переменная s в том виде, как я сделал - вряд ли лишняя. Но в принципе, можно и без нее - только в условии про это не сказано. Про массив - сказано, потому я с ним и сделал..

Только помогать тебе, когда ты больше половины пропускаешь мимо ушей, как-то желание пропадает.. dry.gif


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





Группа: Пользователи
Сообщений: 7
Пол: Женский

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


Lapp, я все прочитала, спасибки огромное, просто препод смотрел мой тот листинг, вот я к нему и пристала... а прога, которую вы мне написали меняет местами только слова в первой строчке...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


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

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

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


Цитата(LyaLya @ 27.12.2008 16:31) *
прога, которую вы мне написали меняет местами только слова в первой строчке...
Постарайся запомнить: если ты замечаешь в программе "неправильное функционирование" (взято в кавычки, потому что на этом этапе это только твое мнение), то прежде, чем делать выводы (типа "меняет слова только в первой строчке") либо разберись в вопросе сама, либо приведи фактический материал.

Вот, я тебе привожу результат ее работы:

файл o.txt :
Код
Humpty Dumpty sat on a wall.
Humpty Dumpty had a great fall.
All the king's horses and all the king's men
Couldn't put Humpty together again.


файл o1.txt :
Код
Dumpty Humpty on sat wall a.
Dumpty Humpty a had fall great.
the All s'king and horses the all s'king men
t'Couldn Humpty put again together.


Как видишь - слова меняются местами во всех четырех строках! Если тебя не затруднит и не отвлечет от более важных дел, не могла бы ты сделать так же со своим примером, в котором у тебя, как ты думаешь, ошибка..

Подозреваю, что ты сделала свою вторую строчку из цифр. А цифры не входят в множество букв.. хотя и похожи на них внешне smile.gif. Если хочешь, чтоб входили - включи. Также можешь включить и апостроф ('), если хочешь, чтобы, например, "king's" считалось одним словом, а не двумя.


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

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

 





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