Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Файлы input.txt и output.txt (http://www.tehnari.ru/f41/t93116/)

Aksinia 15.12.2013 14:49

Файлы input.txt и output.txt
 
Задача: взять строку из файла input.txt, удалить из нее лишние знаки(текст самой программы приведен ниже) и вывести новую строку в файл output.txt.

program Main2;
var str:string; a:char;

function NewStr(str:string;a:char):string;
var s:string;
begin
s:=str;
while Pos(a + a,s) > 0 do delete(s, Pos(a + a,s), 1);
NewStr:=s;
end;

begin
readln(str);
a:=chr(33);
writeln(NewStr(str, a));
readln;
end.

Николай_С 15.12.2013 15:09

Ни тебе "здрасте", ни "просю помощи"...
А что, собственно, требуется?
Дописать в имеющуюся прогу недостающие строки по работе с файлами? ;)

Aksinia 15.12.2013 15:27

Да. Нужно взять строку из файла, удалить из нее лишние восклицательные знаки и вывести в другой файл.

Николай_С 15.12.2013 18:13

Стесняюсь спросить...
Приведенный код - это всё, чему Вы научились за семестр по языку Pascal?
С такими знаниями Вам сессию никак не сдать. :(
Пока не поздно, наймите репетитора.

Vladimir_S 15.12.2013 18:56

Цитата:

Сообщение от Николай_С (Сообщение 981296)
Стесняюсь спросить...
Приведенный код - это всё, чему Вы научились за семестр по языку Pascal?
С такими знаниями Вам сессию никак не сдать. :(
Пока не поздно, наймите репетитора.

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

program Main2;
var
 S:string;
 A:char;
 f1,f2:Text;

function NewStr(NS:string;NA:char):string;
var T:string;
begin
 T:=NS;
 while Pos(NA,T) > 0 do delete(T, Pos(NA,T), 1);
 NewStr:=T;
end;

begin
 Assign(f1,'Input.txt');
 ReSet(f1);
 Assign(f2,'Output.txt');
 ReWrite(f2);
 A:='!';
 Repeat
  Readln(f1,S);
  Writeln(f2,NewStr(S,A));
 Until EoF(f1);
 Close(f1);
 Close(f2);
end.

А так программа, в целом, составлена грамотно, вот только в аргументах функции Pos какая-то галиматья. И еще, Аксинья, одно замечание. Обозначать формальные и фактические параметры процедур и функций одинаково хоть и допускается, но нежелательно: приводит к путанице. Поэтому я там кое-что переобозначил. Кроме того, старайтесь не использовать зарезервированные слова языка программирования в качестве идентификаторов: могут возникнуть ошибки. Так, "Str" - это имя стандартной процедуры преобразования числа в строку. Не нужно так обозначать переменную.

Николай_С 15.12.2013 19:54

Владимир, Вам, конечно, видней, но открыть/закрыть поток, причитать/записать в него - этому учат на первых лекциях и практических занятиях. А тут до конца семестра осталось 2 недели!

Vladimir_S 15.12.2013 19:58

Цитата:

Сообщение от Николай_С (Сообщение 981324)
А тут до конца семестра осталось 2 недели!

Аж целых!!! :D:D:D

Николай_С 15.12.2013 20:07

Удивляюсь я Вашему оптимизму!
А как же остальной "непройденный" материал?

Aksinia 15.12.2013 20:47

Николай, спасибо за совет, но сессию мне, к счастью, сдавать не нужно.
Владимир, большое спасибо. В аргументах функции Pos "галиматья", потому что мне нужно удалить не все восклицательные знаки, а только повторяющиеся(т.е. в количестве больше одного).
При запуске программы возникает ошибка "RunError(2)", хотя текстовые файлы находятся в той же папке, что и программа. Не могли бы Вы подсказать в чем ошибка, пожалуйста?

Aksinia 15.12.2013 20:55

Не могли бы Вы подсказать в чем ошибка, пожалуйста?

Vladimir_S 15.12.2013 21:46

Цитата:

Сообщение от Aksinia (Сообщение 981346)
Не могли бы Вы подсказать в чем ошибка, пожалуйста?

Затрудняюсь. Естественно, прежде, чем выложить, я программу тестировал, и у меня никаких ошибок. Впрочем, файлы я создавал на электронном диске, и адрес был "D:\input.txt". Перед выкладыванием диск я убрал. Попробуйте и Вы прописать полные пути к файлам - вдруг в этом заморочка?
А насчет "галиматьи" - приношу извинения: просто Вы так невнятно сформулировали задание... но если повторяющиеся - тогда да, правильно. И даже остроумно.

Aksinia 15.12.2013 22:12

Вложений: 2
Видимо, нет.

Vladimir_S 15.12.2013 22:18

Цитата:

Сообщение от Aksinia (Сообщение 981385)
Видимо, нет.

О, Боже! А что это за система? Какой транслятор? А то у меня, знаете ли, обычный DOS Free Pascal, он такой... без затей.
На всякий случай спрошу: а Вы входной файл не забыли подготовить?

Aksinia 15.12.2013 22:47

Вложений: 1
Конечно, все текстовые файлы есть.
Пишу в лазарусе, но, на всякий случай, проверила и в паскале.

Aksinia 15.12.2013 22:51

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

Aksinia 15.12.2013 22:58

Можно ли как то преобразовать программу, чтобы удалялись не только восклицательные знаки, но еще и запятые?tehno014

Николай_С 15.12.2013 23:51

"Носите женщин на руках. На шею они сами заберутся!" (С) :))

Aksinia 16.12.2013 01:04

Николай, ехидный Вы.:tehnari_ru_267:

Aksinia 16.12.2013 01:10

Дописать программу. Функция
 
Здравствуйте!
Есть программа, удаляющая лишние восклицательные знаки из строки.(Они считаются лишними, если их подряд больше одного).
Помогите дописать ее так, чтобы она удаляла еще и другие лишние знаки, например, запятые. Заранее спасибо за помощь.

program Main2;
var S:string;
a:char;
f1,f2:text;

function NewStr(S:string;a:char):string;
var T:string;
begin
T:=S;
while Pos(a + a,T) > 0 do delete(T, Pos(a + a,s), 1);
NewStr:=T;
end;

begin
assign(f1, 'E:\Input.txt');
reset(f1);
assign(f2, 'E:\Output.txt');
rewrite(f2);
a:=chr(33);
readln(f1,s);
writeln(f2,NewStr(s, a));
close(f1);
close(f2);
end.

Николай_С 16.12.2013 02:37

Это точно! Но прозорливый... ;)

Vladimir_S 16.12.2013 09:37

Цитата:

Сообщение от Aksinia (Сообщение 981406)
Можно ли как то преобразовать программу, чтобы удалялись не только восклицательные знаки, но еще и запятые?

А почему нет? Вставьте в функцию еще одну строку с Pos, Delete, аналогичную той, что для "!", но для запятых.
P.S. А всё-таки в чём была проблема с запуском программы? Уж поделитесь, не побьём. Любопытно...

P.P.S. Немного модераторской воркотни. Абсолютно ни к чему ради этих запятых новую тему создавать. Давайте уж здесь.Тем более, что в листинге - ошибки: в функции во втором Pos вместо "T" стоит "s", что приводит к сбою.

Короче говоря, так:
Код:

program Main2;
var
 S:string;
 a,b:char;
 f1,f2:text;

function NewStr(S:string;q,p:char):string;
var T:string;
begin
 T:=S;
 while Pos(q+q,T) > 0 do delete(T, Pos(q+q,T), 1);
 while Pos(p+p,T) > 0 do delete(T, Pos(p+p,T), 1);
 NewStr:=T;
end;

begin
 assign(f1, 'D:\Input.txt');
 reset(f1);
 assign(f2, 'D:\Output.txt');
 rewrite(f2);
 a:=chr(33);
 b:=chr(44);
 readln(f1,S);
 writeln(f2,NewStr(S,a,b));
 close(f1);
 close(f2);
end.

P.P.P.S. А вот хотел бы я знать, на кой пёс Вы используете задание удаляемых символов через коды? Чтобы "красивше" было? Почему бы не просто a:='!'; b:=',';. Впрочем, тут "вольному воля", можно и так...


Aksinia 16.12.2013 20:09

А зачем вводить новую переменную для нового знака? А если я захочу удалить много знаков - будет много переменных? Может быть, так лучше?
PHP код:

program Main2;
var 
S:string;
  
a:char;
  
f1,f2:text;


function 
NewStr(S:string;a:char):string;
var 
T:string;
begin
  T
:=S;
  while 
Pos(a,T) > do delete(TPos(a,s), 1);
  
NewStr:=T;
end;

begin
  assign
(f1'E:\Input.txt');
  
reset(f1);
  
assign(f2'E:\Output.txt');
  
rewrite(f2);
  
a:=chr(33);
  
readln(f1,s);
  
s:=NewStr(sa);
  
a:=chr(44);
  
writeln(f2,NewStr(sa));
  
close(f1);
  
close(f2);
end


Vladimir_S 16.12.2013 20:41

Цитата:

Сообщение от Aksinia (Сообщение 981855)
А зачем вводить новую переменную для нового знака? А если я захочу удалить много знаков - будет много переменных? Может быть, так лучше?

Аксинья, Вы меня просто поражаете. Как бы это поделикатнее... Ну так:
1. Я для кого в красном абзаце указываю на ошибку: в функции в ОБОИХ Pos должна фигурировать строка "T", а не в первом случае - "T", а во втором - "s"? Всё мимо, продолжаете тащить ошибку.
2. Непонятно, в какой мере эта программа решает задачу "удалить много знаков"? По-моему, совсем не решает. И вообще это просто старый листинг, да еще и, как сказано выше, с ошибкой. Удаляет (после исправления ошибки) только дубли восклицательного знака.

Задачу "удаления многих знаков" можно организовать по-разному. Например, вводить удаляемый символ по запросу с клавиатуры. Но тогда программу необходимо зациклить, и при этом организовать перезапись файла Output в Input после каждого удаления. Или можно организовать массив удаляемых символов, а в теле функции организовать цикл по этому массиву.

Aksinia 16.12.2013 20:59

PHP код:

program project1;
var 
S:string;
  
a:char;
  
f1,f2:text;


function 
NewStr(S:string;a:char):string;
var 
T:string;
begin
  T
:=S;
  while 
Pos(a,T) > do delete(TPos(a,T), 1);
  
NewStr:=T;
end;

begin
  assign
(f1'Input.txt');
  
reset(f1);
  
assign(f2'Output.txt');
  
rewrite(f2);
  
a:=chr(33);
  
readln(f1,s);
  
s:=NewStr(sa);
  
a:=chr(44);
  
writeln(f2,NewStr(sa));
  
close(f1);
  
close(f2);
end


Vladimir_S 17.12.2013 09:24

Пожалуй. Хороший вариант.

Aksinia 18.12.2013 18:07

Проверьте, пожалуйста. Первое слово строки должно начинаться с буквы. Функция должна удалять все предшествующие букве символы. Эта удаляет лишь половину(из за того, что к i всегда прибавляется единица). Как это исправить?
PHP код:

 function BeginOfLine(S:string):string;
  var 
O:string;i:integer;
    
begin
      O
:=S;
      
i:=1;
      while 
not (((ord(O[i])>64) and (ord(O[i])<91)) or ((ord(O[i])>96) and (ord(O[i])<123))) do begin
      delete
(O,(i-1),1);
      
i:=i+1;
      
end;
    
BeginOfLine:=O;
    
end


Aksinia 18.12.2013 20:16

Получилось)


Часовой пояс GMT +4, время: 10:48.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.