Консультация № 181164
08.12.2010, 12:21
55.01 руб.
0 11 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Задача:задан текст произвольной длины строки разделяются одними или несколькими символами называемыми разделителями (разделитель конца предложения"..",конец текста "!?")Текст заканчивается комбинацией двух специальных символов отличных от разделителя.Выполнить над текстом последовательность действий указанную в задании: определить считая от начала теста координаты (номер строки и номер символа в строке)символов которые задаются в исходных данных,и сформировать новый текст состоящий из строк заданного теста в каждой из которых любой заданных символов встречается не более одного раза.

Приложение:
Чтение из файла и запись в файл обязательно,использование процедур и функций.
Данный текст читается из файла-Текст:"О,себе"..Здравствуйте,друзья.Меня зовут Артем..Мне 18 лет.Я закончил школу в 2010году..Сейчас я учусь в Югоском филиале Санкт-петербурского электротехнического универститета..Я закончу учебу в 2015году..Я студент первого курса дневного отделения..У нас очень хорошая группа студентов..В группе учится 13 студентов..Учеба мне очень нравится..Спасибо за внимание!?

Обсуждение

давно
Профессионал
304622
583
10.12.2010, 15:39
общий
1) Если разделителями строк считается "..", то предполагать ли наличие нормального разбиения на строки? Или считать, что весь текст записан в одну строку?
2) Зачем нужен "?!", если всё равно есть стандартный end of file?
давно
Старший Модератор
31795
6196
10.12.2010, 20:38
общий
это ответ
Здравствуйте, Посетитель - 349343!

Смотрите приложение.
Текст "О,себе"... Спасибо за внимание!? находится в файле i181164.txt, результат работы по заданию №2 записывается в файл o181164.txt.
Процедура Check_A выводит на экран информацию о количестве вхождений в строку заданых символов и номер строки.
Функция Check_B проверяет каждый символ из контрольной строки задания и считает количество его вхождений в строку. В строке Check_B:= (c<2) and Check_B(a,b) проверяется условие не более одного раза, т.е. меньше 2-х и производится рекурсивный вызов самой себя, но с обновленными входными значениями: в проверяемой строке удалены все вхождения уже проверенного символа, в контрольной строке проверенный символ тоже удален.

Вопросы по программе задавайте в мини-форуме.
Удачи!

Приложение:
program q181164;
var
control_A,control_B,str_Line:string;
f_in,f_out:text;
Index_Line:integer;
{
процедура ввода строки с контрольными символами для обоих заданий
}
procedure Input_control(var a:string;b:char);
begin{}
repeat
write('Enter control_',b,' simbol(',#27,'s):');
readln(a);
if length(a)=0 then writeln('!!!!! E R R O R !!!!!');
until length(a)>0;
end;
{
процедура контроля задания №1:
определить считая от начала теста координаты (номер строки и номер
символа в строке)символов которые задаются в исходных данных
}
procedure Check_A(a,b:string);
var
c:integer;
begin{}
if pos(b,a)>0 then
begin
c:=0;
write('line:',index_Line:3,', position:');
while pos(b,a)>0 do
begin{}
write((pos(b,a)+c):4);{выводим позицию найденных символов с коррекцией}
delete(a,pos(b,a),length(b));{удаляем проверенный символ(ы)}
c:=c+length(b);{корректируем на длину проверенных символов}
end;
writeln;
end;{}
end;{}
{
функция контроля задания №2:
сформировать новый текст состоящий из строк заданного теста в каждой из которых
любой заданных символов встречается не более одного раза.
}
function Check_B(a,b:string):boolean;
var c:integer;
begin
if length(b)>0 then{условие выхода из рекурсии}
begin
c:=0;
while pos(b[1],a)>0 do{пока проверяемый символ встречается в строке}
begin{}
delete(a,pos(b[1],a),1);{удаляем его и увеличиваем счетчик}
inc(c);
end;{}
delete(b,1,1);{удаляем проверенный символ в контрольной строке}
Check_B:= (c<2) and Check_B(a,b);{проверяем количество вхождений в
строку и вызываем функцию контроля с другими параметрами}
end
else Check_B:=true;
end;
{
функция чтения одной строки из файла
}
function GetOneLine:string;
var
a:string;
b:char;
begin
a:='';{сбрасываем строку}
{в цикле считываем данные из файла, пока}
while not EOF(f_in)and{нет конца файла}
(copy(a,length(a)-1,2)<>'..')and{нет разделителя из двух точек}
(copy(a,length(a)-1,2)<>'!?')do{нет признака окончания текста}
begin{счтываем один символ и добавляем в строку}
read(f_in,b);
a:=a+b;
end;
GetOneLine:=a;{записываем результат работы}
end;
begin
{открываем файл для чтения}
assign(f_in,'i181164.txt');
reset(f_in);
{открываем файл для записи}
assign(f_out,'o181164.txt');
rewrite(f_out);
{вводим контрольные символы, для обоих заданий}
Input_control(control_A,'A');
Input_control(control_B,'B');
Index_Line:=0;
while(not EOF(f_in))and(copy(str_Line,length(str_Line)-1,2)<>'!?')do
begin{A}
Inc(index_Line);{увеличиваем счетчик строк}
str_Line:=GetOneLine;{считываем одну строку}
{
проверяем считаную строку в соответсвии с заданием №1
}
Check_A(str_Line,control_A);
{
проверяем считаную строку в соответсвии с заданием №2, если истина записываем строку
}
if Check_B(str_Line,control_B) then writeln(f_out,str_Line);
end;{A}
{закрываем фыйлы и выходим}
close(f_in);
close(f_out);
readln;
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессионал
304622
583
11.12.2010, 14:39
общий
Адресаты:
Мне запустить программу сейчас техника не позволяет, но по тексту хочу отметить вот что.

У Вас весь файл считывается посимвольно: "read(f_in,b)". Это должно привести к тому, что концы строк -- #13#10 -- тоже будут прочитаны и включены в результат GetOneLine. Это не приведёт к ложному опознанию, но испортит нумерацию символов в строке.
давно
Старший Модератор
31795
6196
11.12.2010, 15:37
общий
Адресаты:
Цитата: Сергей Бендер
Это не приведёт к ложному опознанию, но испортит нумерацию символов в строке.


Цитата: из вопроса
задан текст произвольной длины строки разделяются одними или несколькими символами называемыми разделителями (разделитель конца предложения"..",конец текста "!?")

Строкой считается, набор символов(их кодов) в конце которой есть либо "..", либо "!?". Все, что не эти две группы есть символами строки, даже если это все нули. Правильно?

Конечно, можно удалять из строк все служебные символы, такие как: #13#10 и им подобные до 20h, а также 7Fh, но в условии только текст произвольной длины и больше ничего.
Посмотрим на реакцию спрашивающего на мой ответ, а вопросы будут, т.к. нужно будет ещё рекурсию раскрывать или переделывать её в итерацию.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.12.2010, 13:55
общий
Нужно изменить эту программу так что бы она определяла координаты 3-х символов в исходных данных, выводить считываемый текст из файла в окно выполнения программы и показать уже новый текст тоже в окне выполнения программы параллельно записывая его в файл для записи. Спасибо!
давно
Старший Модератор
31795
6196
14.12.2010, 14:00
общий
Цитата: 349343
Нужно изменить эту программу так что бы она определяла координаты 3-х символов в исходных данных,

Исходные данные откуда брать?
Символы проверять отдельно или группой?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.12.2010, 17:47
общий
program q181164;
var
control_A,control_B,str_Line:string;
f_in,f_out:text;
Index_Line:integer;
{
процедура ввода строки с контрольными символами для обоих заданий
}
procedure Input_control(var a:string;b:char);
begin{}
repeat
write('Enter control_',b,' simbol(',#27,'s):');
readln(a);
if length(a)=0 then writeln('!!!!! E R R O R !!!!!');
until length(a)>0;
end;
{
процедура контроля задания №1:
определить считая от начала теста координаты (номер строки и номер
символа в строке)символов которые задаются в исходных данных
}
procedure Check_A(a,b:string);
var
c:integer;
begin{}
if pos(b,a)>0 then
begin
c:=0;
write('line:',index_Line:3,', position:');
while pos(b,a)>0 do
begin{}
write((pos(b,a)+c):4);{выводим позицию найденных символов с коррекцией}
delete(a,pos(b,a),length(b));{удаляем проверенный символ(ы)}
c:=c+length(b);{корректируем на длину проверенных символов}
end;
writeln;
end;{}
end;{}
{
функция контроля задания №2:
сформировать новый текст состоящий из строк заданного теста в каждой из которых
любой заданных символов встречается не более одного раза.
}
function Check_B(a,b:string):boolean;
var c:integer;
begin
if length(b)>0 then{условие выхода из рекурсии}
begin
c:=0;
while pos(b[1],a)>0 do{пока проверяемый символ встречается в строке}
begin{}
delete(a,pos(b[1],a),1);{удаляем его и увеличиваем счетчик}
inc(c);
end;{}
delete(b,1,1);{удаляем проверенный символ в контрольной строке}
Check_B:= (c<2) and Check_B(a,b);{проверяем количество вхождений в
строку и вызываем функцию контроля с другими параметрами}
end
else Check_B:=true;
end;
{
функция чтения одной строки из файла
}
function GetOneLine:string;
var
a:string;
b:char;
begin
a:='';{сбрасываем строку}
{в цикле считываем данные из файла, пока}
while not EOF(f_in)and{нет конца файла}
(copy(a,length(a)-1,2)<>'..')and{нет разделителя из двух точек}
(copy(a,length(a)-1,2)<>'!?')do{нет признака окончания текста}
begin{счтываем один символ и добавляем в строку}
read(f_in,b);
a:=a+b;
end;
GetOneLine:=a;{записываем результат работы}
end;
begin
{открываем файл для чтения}
assign(f_in,'i181164.txt');
reset(f_in);
{открываем файл для записи}
assign(f_out,'o181164.txt');
rewrite(f_out);
{вводим контрольные символы, для обоих заданий}
Input_control(control_A,'A');
Input_control(control_B,'B');
Index_Line:=0;
while(not EOF(f_in))and(copy(str_Line,length(str_Line)-1,2)<>'!?')do
begin{A}
Inc(index_Line);{увеличиваем счетчик строк}
str_Line:=GetOneLine;{считываем одну строку}
{
проверяем считаную строку в соответсвии с заданием №1
}
Check_A(str_Line,control_A);
{
проверяем считаную строку в соответсвии с заданием №2, если истина записываем строку
}
if Check_B(str_Line,control_B) then writeln(f_out,str_Line);
end;{A}
{закрываем фыйлы и выходим}
close(f_in);
close(f_out);
readln;
end.

Нужно изменить эту программу так что бы она определяла координаты 3-х символов в исходных данных, выводить считываемый текст из файла в окно выполнения программы и показать уже новый текст тоже в окне выполнения программы параллельно записывая его в файл для записи. Спасибо!

давно
Старший Модератор
31795
6196
14.12.2010, 18:05
общий
по моему мы друг друга не понимаем:
Три эти символа где брать: вводить с клавиатуры, читать из файла?
Символы должны встречатся вместе или каждый отдельно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.12.2010, 18:20
общий
вводить с клавиатуры и символы должны встречаться отдельно и не больше одного раза
давно
Старший Модератор
31795
6196
16.12.2010, 21:11
общий
переделал.
[code h=200]program q181164;
var
check:boolean;{флаг проверки условия неболее оного раза}
f_in,f_out:text;{указатели на файлы}
index_line:integer;{счетчик строк}
str_control:string;{строка контрольных символов}
str_line:string;{строка текущей линии}
{функция ввода контрольных символов}
function GetStr:string;
var
a:string;
begin{get str}
repeat
write('Enter control simbol',chr(39),'s:');
readln(a);
until length(a)>0;
GetStr:=a;
writeln;
end;{get str}
{функция получения одной строки}
function GetOneLine:string;
var
a:string;
b:char;
begin{Get One Line}
a:='';
while not EOF(f_in)and{конец файла}
(copy(a,length(a)-1,2)<>'..')and{первый разделитель}
(copy(a,length(a)-1,2)<>'!?')do{второй разделитель}
begin
read(f_in,b);{считываем символ}
if b>=chr($20) then a:=a+b;{формируем строку без служебных символов}
end;
GetOneLine:=a;
end;{Get One Line}
{функция посчета одного символа в строке}
function check_line(a:string;b:char):integer;
var
c:integer;
begin
c:=0;
while pos(b,a)>0 do
begin
write(' ',index_line,':',pos(b,a)+c);{выводим позицию}
delete(a,pos(b,a),1);{удаляем найденый символ}
inc(c){увеличиваем счетчик}
end;
check_line:=c;
end
{функция проверки контрольных символов в строке};
procedure control(a,b:string;var c:boolean);
var
d:integer;
begin{control}
c:=true;
while(length(b)>0)and c do
begin
if pos(b[1],a)>0 then
begin
write(' simbol:',b[1],' pos:');{выводим пролверяемый символ}
d:=check_line(a,b[1]);{получаем число символов в строке}
end;
delete(b,1,1);{удаляем проверенный контрольный символ}
c:=c and (d<2);{проверем условие цикла и наличие мение 2-х одинаковых символов}
end;
end;{control}
begin{main}
{открываем файл}
assign(f_in,'i181164.txt');
reset(f_in);
{открываем файл}
assign(f_out,'o181164.txt');
rewrite(f_out);
str_control:=GetStr;
{сбрасываем счетчик и в цикле проверяем текст}
index_line:=0;
while not EOF(f_in)and(copy(str_line,length(str_line)-1,2)<>'!?')do
begin
inc(index_line);
str_line:=GetOneLine;{получаем строку}
write(index_line,':',str_line);{выводим её и номер}
control(str_line,str_control,check);{контролируем саму строку}
if check then
begin
writeln(f_out,str_line);{записываем строку в файл}
write(' - save in file');{выводим на экран признак записи}
end;
writeln;
end;
{закрываем файлы}
close(f_in);
close(f_out);
readln;
end.{main}[/code]
Вид экрана при работе:
Enter control simbol's:qwert
1:qwertyuiopasdfghjklzxcvbnm.. simbol:q pos: 1:1 simbol:w pos: 1:2 simbol:e pos: 1:3 simbol:r pos: 1:4 simbol:t pos: 1:5 - save in file
2:qwwertyuiopasdfghjklzxcvbnm.. simbol:q pos: 2:1 simbol:w pos: 2:2 2:3
3:qweertyuiopasdfghjklzxcvbnm.. simbol:q pos: 3:1 simbol:w pos: 3:2 simbol:e pos: 3:3 3:4
4:qwerrtyuiopasdfghjklzxcvbnm1? simbol:q pos: 4:1 simbol:w pos: 4:2 simbol:e pos: 4:3 simbol:r pos: 4:4 4:5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.12.2010, 16:50
общий
спасибо
Форма ответа