Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для Зума
3 / 3 / 1
Регистрация: 12.03.2010
Сообщений: 28

Выбрать в каждой строке файла наибольшую последовательность идущих подряд цифр

12.03.2010, 18:27. Показов 1888. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, у меня проблема. Суть задачи такова: нужно создать текстовый файл, а потом обработать его, выбрав в каждой строке наибольшую последовательность идущих подряд цифр и записав её во второй файл.
Т.е. если в исходном файле было
Code
1
2
3
раздва23457три
56четырепять7853
34298
то в новый файл должно записаться
Code
1
2
3
23457
7853
34298
.
Вот что я наваял:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
procedure numtofile(name,namenew:string);
type digit=set of '0'..'9';
var f,fnew:text;
b:boolean;
s,ss:string;
i,k:integer;
dig:digit;
begin
dig:=['0'..'9'];
assign(f,name);
assign(fnew,namenew);
{$I-}
reset(f);
{$I+}
if ioresult=0 then begin
   {$I-}
   rewrite(fnew);
   {$I+}
   if ioresult=0 then begin
while not(eof(f)) do begin
    readln(f,s);
    b:=false;
        ss:='';
        write('str: ',s,' ');
        write('Length= ',length(s),' ');
    for i:=1 to length(s) do begin
        writeln('i: ',i:3);
        writeln('s:',s[i]);
        if s[i] in dig then begin
            if b then begin
                k:=0;
                while (s[i] in dig) and (i<=length(s)) do begin
                    i:=i+1; k:=k+1;
                end;
                if k>length(ss) then ss:=copy(s,i-1,i);
            end
            else begin
                b:=true;
                repeat and (i<=length(s)) ss:=ss+s[i]; i:=i+1; until not (s[i] in dig) or (i>length(s));
            end;
        end;
                writeln(' ss: ',ss);
 
    end;
                        if b then writeln(fnew,ss);
        writeln;
end;
   close(fnew);
end;
close(f);
end;
end;
Программа входит в бесконечный цикл, при этом I меняется в совершенно безумных пределах: от минус двадцати тысяч до плюс двадцати тысяч. Что я делаю не так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2010, 18:27
Ответы с готовыми решениями:

В каждой строке выделить наибольшую последовательность цифр
создать текстовый файл, строка которого содержит цифры и символы. В каждой строке выделить наибольшую последовательность цифр. Длины этих...

Определить наибольшую сумму подряд идущих чисел, образующих возрастающую последовательность
Пусть дан файл целых чисел.Определить наибольшую сумму подряд идущих чисел, образующих возрастающую последовательность

В каждой строке текстового файла f найти самую длинную последовательность цифр
В каждом рядке текстового файла f найти самую длинную последовательность цифр. Создать новый текстовый файл , каждый рядок которого будет...

3
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
12.03.2010, 20:13
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Предлагаю такое решение:
В реализации алгоритма функции GetMaxSeq() применена идея уважаемого Inadequate.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(*Выбирает из строки максимально длинную последовательность цифр.*)
function GetMaxSeq(const aStr : String) : String;
const
  Dig = ['0'..'9'];
var
  StrTmp, StrRes : String;
  i : Integer;
begin
  StrRes := '';
  StrTmp := '';
  for i := 1 to Length(aStr) do begin
    if aStr[i] in Dig then StrTmp := StrTmp + aStr[i];
    if ( not (aStr[i] in Dig) or (i = Length(aStr)) ) and (StrTmp <> '') then begin
      if Length(StrTmp) > Length(StrRes) then StrRes := StrTmp;
      StrTmp := '';
    end;
  end;
  GetMaxSeq := StrRes;
end;
 
const
  FnIn = 'in.txt';
  FnOut = 'out.txt';
var
  FIn, FOut : Text;
  StrTmp, StrRes : String;
begin
  (*Создаём файл с входными данными.*)
  Assign(FIn, FnIn);
  (*Создаём/пересоздаём файл и открываем его для записи.*)
  Rewrite(FIn);
  Writeln(FIn, 'xxxxxxx1xxxx12xxxxxxx123xxxx');
  Writeln(FIn, 'xxxxxxx1234xxxx12xxxxxxx123xxxx');
  Writeln(FIn, 'xxxxxxx123xxxx12345xxxxxxx123xxxx');
  Writeln(FIn, 'xxxxxxx123456xxxx12xxxxxxx123xxxx');
  Writeln(FIn, 'xxxxxxx1xxxx12xxx1234567xxxx123xxxx');
  Writeln(FIn, 'xx12345678xxxxx1xxxx12xxxxxxx123xxxx');
 
  (*Открываем входной файл для чтения.*)
  Reset(FIn);
 
  Assign(FOut, FnOut);
  (*Создаём/персоздаём выходной файл и открываем его для записи.*)
  Rewrite(FOut);
 
  (*Читаем построчно входной файл. Извлекаем из каждой прочитанной строки
  максимально длинную последовательность цифр и записываем её в выходной файл.*)
  Writeln('Входной файл:');
  while not Eof(FIn) do begin
    Readln(FIn, StrTmp);
    Writeln(StrTmp);
    StrRes := GetMaxSeq(StrTmp);
    Writeln(FOut, StrRes);
  end;
 
  (*Распечатываем выходной файл.*)
  Writeln('Выходной файл:');
  Reset(FOut);
  while not Eof(FOut) do begin
    Readln(FOut, StrTmp);
    Writeln(StrTmp);
  end;
 
  (*Закрываем файлы.*)
  Close(FIn);
  Close(FOut);
 
  Readln;
end.
0
 Аватар для Зума
3 / 3 / 1
Регистрация: 12.03.2010
Сообщений: 28
12.03.2010, 21:24  [ТС]
Да, так намного проще. Спасибо за помощь.
И, да. Думаю, вы заметили вот этот кусок:
Pascal
1
2
3
{$I-}
reset(f);
{$I+}
У нас в институте это называют "корректным открытием". Не подскажете смысл этого шаманства? Оно обязательно?
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.03.2010, 02:54
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Это метод пререхвата ошибок ввода/ввывода, применяющийся в Pascal. Смысл перехвата в том, чтобы избежать неконтролируемого аварийного завершения программы. Если ошибка перехвачена, то можно выполнить какие-то осознанные действия - либо по устранению проблем, либо, хотябы, можно известить пользователя об условиях, в которых произошла ошибка.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{$I-} (*Это директива (команда) компилятору - отключить контроль ошибок ввода/вывода.
При этом, если возникают ошибки ввода/вывода, то останова программы не происходит. Сведения
о коде ошибки записываются в переменную Ioresut.*)
reset(f); //Попытка открыть файл.
{$I+} (*Директива компилятору - вновь включить контроль ошибок ввода/вывода.*)
//Обработка ошибок.
if Ioresult <> 0 then begin
  (*В качестве реакции на возникшую ошибку (обработка исключительной ситуации) извещаем пользователя о проблемах
  с открытием файла. Затем, завершаем выполнение программы через Exit.*)
  Writeln('Ошибка! Не удалось открыть файл! Программа прервана.');
  Writeln('Код ошибки = ', Ioresult);
  Writeln('Для выхода нажмите любую клавишу.');
  Readln;
  Exit;
  (*В качестве обработки этой исключительной ситуации можно было реализовать
  более сложные действия - например, попросить пользователя ввести новое имя
  файла и попытаться его открыть. Такие действия следует реализовывать, если
  это действительно нужно в контексте задачи.*)
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2010, 02:54
Помогаю со студенческими работами здесь

Найти наибольшую сумму подряд идущих элементов
Даны целые числа n, a1, a2,…, an. Найти наибольшую сумму подряд идущих элементов:)

Подсчитать самую длинную последовательность подряд идущих букв а.
Дана строка. Подсчитать самую длинную последовательность подряд идущих букв а. Желательно весь текст проги.

Найти наибольшее количество идущих подряд цифр
Дан текст . Найти наибольшее количество идущих подряд цыфр . Добавлено через 17 часов 15 минут Я думаю так. uses crt; var ...

Дана строка. Подсчитать самую длинную последовательность подряд идущих букв а.
Дана строка. Подсчитать самую длинную последовательность подряд идущих букв а.

Найти наибольшее количество цифр идущих в тексте подряд
Дан текст, найти наибольшее количество цифр идущих в нем подряд.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru