Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Файлы

Автор: Talya 6.04.2007 14:55

Очень нужна ваша помощь! как можно решить данную задачу? Заранее огромное спасибо!
В текстовом файле подсчитать количество строк, которые начинаются и оканчиваются одной и той же буквой.

Автор: мисс_граффити 6.04.2007 15:12

идешь по файлу, построчно считываешь...
если первая и последняя буква одинаковые - прибавляешь 1 к переменной-счетчику.
в чем сложность?

Автор: Tan 6.04.2007 15:21

Вот о чём тебе говорит мисс_граффити :

uses crt;
Const filename = 'MyFile.txt';
var f : TEXT;
S : string;
sum,a : integer;
begin
assign (f,filename); {связываем виртуальный и физический файлы}
reset (f);
sum:=0;
while not eof(f) do {пока не конец файла читаем строки}
begin
readln (f,s);
a:=Length(s);
if S[1] = S[a] then inc (sum); {cравниваем 1й символ строки и последний если да, в копилку}
end;
Close (f);
writeln (sum); {содержание копилки на экран}
readkey;
end.

Автор: мисс_граффити 7.04.2007 13:12

 a:=Length(s);
if S[1] = S[a]

а зачем нам дополнительная переменная а?
if S[1] = S[length(s)]

Автор: Tan 7.04.2007 15:13

да, я сам заметил, когда уже запостил, но не изменил, так как не смертельно smile.gif

Автор: sintanial 23.05.2008 0:01

Эмм вот тоже задали это же. Я её сделал сначало с типом стринг однако потом я понял что так не верно на самом деле так как стринг имеет всего 255 символов, а если строка будет больше в файле ? то она вся не поместится в переменную. Вот поэтому задаю вопрос как быть ? У меня вот такая идея: создать две переменные типа чар и в одну записывать начало строки в другую конец строки. Однако у меня появилась трудность на практике. Помогите плиз
1) начало строки записать труда не составляет, а вот как одновременно, во вторую записать конец строки?. Потому что я когда в цикле записываю в первую переменную литеру, то одновременно записывается литера и во вторую. А как сделать так что бы в первую записалась первая литера этой строки а во вторую конец это строки, я не могу понять =) ?
2) когда я во вторую переменную записываю конец строки то записывается одна из цифр вот этих записей #13#10 - я так понял что это означает перейти на другую строку, однако как сделать так что бы это не записывалось ? в мою переменную. (я так думаю может функцией seekeoln однако как тогда быть с пунктом 1 =)
3) Слушайте а как в текстовом файле сразу перейти на конец строки?

Автор: samec 23.05.2008 0:23

надо завести три переменных типа char (ch1, ch2 и ch3 например). Сначала считываешь в первую переменную (ch1) самый первый символ строки. Приравниваешь значение второй переменной, значению первой (ch2:=ch1) Потом начинается цикл. В нём читаешь следующий символ в третью переменную (в ch3). Проверяешь, не равен ли считанный символ #13 (ch3<>#13 ???), если условие выполнено (тоесть ch3<>#13) то приравниваешь значение второй переменной, значению третьей (сh2:=ch3) и переходишь к следующей итерации цикла. Если же условие не выполнено (тоесть ch3=#13), то выходим из цикла и получаем следующее: первый символ строки - в первой переменной (ch1), последний символ строки во второй переменной (ch2). Сравниваем их, при равенстве увеличиваем счётчик и переходим к следующей строке. Затем всё повторяется от и до smile.gif

Автор: Client 23.05.2008 0:44

А можно со строкой и переменной типа char обойтись

Автор: samec 23.05.2008 0:50

вот что то подобное должно получиться:


uses crt;
Const filename = 'MyFile.txt';
var f : TEXT;
ch1,ch2,ch3:char;
sum: integer;
begin
assign (f,filename); {связываем виртуальный и физический файлы}
reset (f);
sum:=0;
while not eof(f) do {пока не конец файла читаем его посимвольно}
begin
read(f,ch1);
ch2:=ch1;
repeat
read(f,ch3);
if(ch3<>#13)and(ch3<>#26) then ch2:=ch3; {#26 - символ конца файла}
until(ch3=#13)or(ch3=#26);
if ch1 = ch2 then inc (sum); {cравниваем 1й символ строки и последний если да, в копилку}
read(f,ch3); {считываем символ #10}
end;
Close (f);
writeln (sum); {содержание копилки на экран}
readkey;
end.end.

Автор: sintanial 23.05.2008 1:42

А я сделал попроще =)

var x:real; s1,s2:char; f:text; 
begin
assign(f,'te.txt');
reset(f);
while not eof(f) do
begin
read(f,s1);
while seekeoln(f) do
read(f,s2);
readln(f);
if s1=s2 then
x:=x+1;
end;
close(f);
writeln(x);
end.