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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Задача на Turbo poscal'e

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

somewhere » 12 дек 2006, 12:14

Oleg_Rus, это по-моему к другой задаче

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

Oleg_Rus » 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);

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

somewhere » 12 дек 2006, 11:46

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

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

Oleg_Rus » 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. господа программисты, если увидите ошибку сообщите пожалуйста.

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

Хыиуду » 12 дек 2006, 10:27

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

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

Avet » 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.

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

Хыиуду » 10 дек 2006, 17:04

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

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

Avet » 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:

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

Avet » 10 дек 2006, 12:57

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

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

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

Хыиуду » 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);

Вернуться к началу