Задача на Turbo poscal'e

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Avet
Сообщения: 4
Зарегистрирован: 09 дек 2006, 21:55

09 дек 2006, 22:00

Уважаемые програмисты, помогите решить задачу:
Ввадится файл строк (file of string). Создать файл целых чисел и записать в каждую строку этого файла числовое значение суммы цифр, находящихся в соответствующей строке первого файла.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

10 дек 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
Сообщения: 4
Зарегистрирован: 09 дек 2006, 21:55

10 дек 2006, 12:57

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

Благадареен за помощь...
и если не затруднит всю программу, а то я только с типизироваными файломи разбираюсь, пока не до конца понимаю как делать что бы файл ввадился)))
Avet
Сообщения: 4
Зарегистрирован: 09 дек 2006, 21:55

10 дек 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 in ['0'..'9']
then count:= count + ord(s) - ord('0');
until eof(f1);
assign(f2, '*txt');
write(f2, count);
writeln(count);
readkey;
end.


Выдаёт ошибку: error 103 file not open (указывая на read(f1, s) ;) ,
Что делать? :confused:
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

10 дек 2006, 17:04

Ну, во-первых с файлом *txt у тебя никто ничего не свяжет. Значок * в имени файла невозможен. Назови файлы, к примеру, in.txt и out.txt.
Во-вторых, как правильно указывает тебе компилятор, мало связать файловую переменную с именем файла, надо этот файл еще и открыть. Если файл открывается для записи - rewrite(f2), а для чтения - reset(f1)
В-третьих, я предпочитаю всегда работать с текстовыми файлами. Не знаю, будет ли компилятор ругаться на строку write(f2, count); если f2 = file of integer, но если он объявлен как текстовый, все пройдет отлично.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Avet
Сообщения: 4
Зарегистрирован: 09 дек 2006, 21:55

10 дек 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 in ['0'..'9']
then count:= count + ord(s) - ord('0');
until eof(f1);
assign(f2, 'out.txt');
{I-}
rewrite(f2);
{I+}
write(f2, count);
writeln(count);
readkey;
end.

Теперь другая ошибка: Disc read erorr.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

12 дек 2006, 10:27

Возможно, компилятор хочет видеть вместо read(f1, s) - readln(f1, s);, возможно, глюк связан с тем, что для типизированных файлов чтение и запись идет через blockwrite/blockread (точно не помню, сто лет с типизированными файлами не работал, все больше с текстовыми). Надо посмотреть хелп по соответствующим процедурам
Кстати, у тебя в файл выведется только сумма цифр в последней строке. Нужно открывать файл f2 сразу после f1, и write(f2, count); поместить внутри цикла, до until eof(f1);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Oleg_Rus
Сообщения: 330
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

12 дек 2006, 11:45

а если рассматривать каждый символ и просматривать его ординату (ord(s)).
Если текущий символ больше 47 и меньше 58 то переносим его в запасную строку.

For i:=1 To Length(s) Do
If (Ord(S)>47) and (Ord(s)<58) Then a:=a+s;
_________________________________________
a - пустая строка(запасная).
Ord - числовое значение символа
почему от 47 до 58?
Числовое значание 0(нуля)=48, а 9=58.
_________________________________________
P.S. господа программисты, если увидите ошибку сообщите пожалуйста.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

12 дек 2006, 11:46

Хыиуду, если файл объявлен как файл из стрингов, то если ты вспомнишь структуру стринга, то поймешь ошибку. В стринге сначала идет байт его длинны, а потом собственно сам стринг. Это уже не текстовый файл.
Аватара пользователя
Oleg_Rus
Сообщения: 330
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

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; //Раcсматриваем i-тый символ текста
If (Letter<>' ') and Flag Then Number:=Number+1;
//Если текущий символ не равен <пробелу> и Flag=1
//то увеличивай количество Слов
Flag:=(Letter=' ');
End;
Close(Input);
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Ответить