PDA

Просмотр полной версии : Задача на Turbo poscal'e



Avet
09.12.2006, 22:00
Уважаемые програмисты, помогите решить задачу:
Ввадится файл строк (file of string). Создать файл целых чисел и записать в каждую строку этого файла числовое значение суммы цифр, находящихся в соответствующей строке первого файла.

Хыиуду
10.12.2006, 12:32
Открытие файлов, объявление переменных писать не буду


repeat
readln(f1,s);
count=0;
for i:=1 to length(s) do
if s[i] in ['0'..'9']
then count:=count+ord(s[i])-ord('0');
until eof(f1);
writeln(f2,count);

Avet
10.12.2006, 12:57
Я так понимаю:
fi : file of string;
f2: file of integer;
а что count - ?
и s -?

Благадареен за помощь...
и если не затруднит всю программу, а то я только с типизироваными файломи разбираюсь, пока не до конца понимаю как делать что бы файл ввадился)))

Avet
10.12.2006, 14:25
Значит вот что я получил:
uses crt;
var f1: file of string;
f2: file of integer;
count, i: integer;
s: string;
begin
assign(f1, '*txt');
repeat
read(f1, s);
count:=0;
for i:=1 to length(s) do
if s[i] in ['0'..'9']
then count:= count + ord(s[i]) - ord('0');
until eof(f1);
assign(f2, '*txt');
write(f2, count);
writeln(count);
readkey;
end.


Выдаёт ошибку: error 103 file not open (указывая на read(f1, s);),
Что делать? :confused:

Хыиуду
10.12.2006, 17:04
Ну, во-первых с файлом *txt у тебя никто ничего не свяжет. Значок * в имени файла невозможен. Назови файлы, к примеру, in.txt и out.txt.
Во-вторых, как правильно указывает тебе компилятор, мало связать файловую переменную с именем файла, надо этот файл еще и открыть. Если файл открывается для записи - rewrite(f2), а для чтения - reset(f1)
В-третьих, я предпочитаю всегда работать с текстовыми файлами. Не знаю, будет ли компилятор ругаться на строку write(f2, count); если f2 = file of integer, но если он объявлен как текстовый, все пройдет отлично.

Avet
10.12.2006, 18:33
теперь задача приняла вид:

uses crt;
var f1: file of string;
f2: file of integer;
count, i: integer;
s: string;
begin
assign(f1, 'in.txt');
{I-}
reset(f1);
{I+}
repeat
read(f1, s);
count:=0;
for i:=1 to length(s) do
if s[i] in ['0'..'9']
then count:= count + ord(s[i]) - ord('0');
until eof(f1);
assign(f2, 'out.txt');
{I-}
rewrite(f2);
{I+}
write(f2, count);
writeln(count);
readkey;
end.

Теперь другая ошибка: Disc read erorr.

Хыиуду
12.12.2006, 10:27
Возможно, компилятор хочет видеть вместо read(f1, s) - readln(f1, s);, возможно, глюк связан с тем, что для типизированных файлов чтение и запись идет через blockwrite/blockread (точно не помню, сто лет с типизированными файлами не работал, все больше с текстовыми). Надо посмотреть хелп по соответствующим процедурам
Кстати, у тебя в файл выведется только сумма цифр в последней строке. Нужно открывать файл f2 сразу после f1, и write(f2, count); поместить внутри цикла, до until eof(f1);

Oleg_Rus
12.12.2006, 11:45
а если рассматривать каждый символ и просматривать его ординату (ord(s[i])).
Если текущий символ больше 47 и меньше 58 то переносим его в запасную строку.

For i:=1 To Length(s) Do
If (Ord(S[i])>47) and (Ord(s[i])<58) Then a:=a+s[i];
_________________________________________
a - пустая строка(запасная).
Ord - числовое значение символа
почему от 47 до 58?
Числовое значание 0(нуля)=48, а 9=58.
_________________________________________
P.S. господа программисты, если увидите ошибку сообщите пожалуйста.

somewhere
12.12.2006, 11:46
Хыиуду, если файл объявлен как файл из стрингов, то если ты вспомнишь структуру стринга, то поймешь ошибку. В стринге сначала идет байт его длинны, а потом собственно сам стринг. Это уже не текстовый файл.

Oleg_Rus
12.12.2006, 11:57
А если так:


Assign(Input,'Input.txt); Reset(Input);
Number:=0; // Обнуление Данных
Flag:=True;
Read(Text)
For i:=1 to Length(Text) Do //Цикл По-Буквенно
Begin
Letter:=Text[i]; //Раcсматриваем i-тый символ текста
If (Letter<>' ') and Flag Then Number:=Number+1;
//Если текущий символ не равен <пробелу> и Flag=1
//то увеличивай количество Слов
Flag:=(Letter=' ');
End;
Close(Input);

somewhere
12.12.2006, 12:14
Oleg_Rus, это по-моему к другой задаче