Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример обработки строк






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

Уровень 0

Œ Задача string. Задан текст. Распечатать слова, начинающиеся с заданной буквы.

Уточнения. Пусть текст - множество строк (в обычном смысле, а также в смысле языков Паскаль, Си) длины не более 40 символов. Ограничение необходимо, так как до ввода строки ее длина неизвестна, а поле памяти под строку должно быть зарезервировано до ввода. Пусть число строк заранее неизвестно.

Слова в строках будем разделять пробелами. Первый символ строки - не пробел.

Пусть переносов в словах нет.

 Входные данные представим в наиболее общем виде, отложив вопрос реализации в языке до разработки метода.

Пусть символьная let - заданная буква.

Пусть все данные записаны в одном файле. Имя этого файла передадим как первый параметр программы.

 

 

Входная форма:

< let>

< строка 1>

< строка 2>

......

< строка k>

......

 

Ž Выходные данные

Будем выводить искомые слова по мере нахождения. Имя выходного файла зададим как второй параметр программы.

Для идентификации программы выведем ее имя (нулевой параметр программы).

Выходная форма:

обр1 Program < argv[0]>

обр2 Поиск слов, начинающихся с буквы < let>

1 строка: < строка 1>

обр3

Найденные слова:

< cлово 1>

обр4 < cлово 2>

....

обр5 отсутствуют

2 строка: < cтрока 2>

обр3

Найденные слова:

< cлово 1>

обр4 < cлово 2>

.....

обр5 отсутствуют

.............................

 

 Аномалии входных данных в примере рассматривать не будем.

 Функциональный тест

let='s';

№ строки   Исследуемый текст Ожидаемый результат: найденные слова
  Mr. Priestley has Отсутствуют
  Some students at his house Some, students
  For lessons. Отсутствуют
  There are six of them in all. Six

 

Метод

Построчно обрабатываем файл, пока он не исчерпан, и выводим искомые слова по мере нахождения.

Возможны два варианта структур данных для представления множества строк: организация массива строк (в этом случае придется ограничить число строк текста) либо обработка без использования массива. Выберем второй вариант как более универсальный.

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

Пусть:

строка - символьный массив из 41 символа (последний - '\0'): char str[41];

k - текущий номер строки,

dat, res - указатели на входной и выходной файлы.

Схема решения:

Вывод заголовка по обр1;

ввод и вывод let по обр2;

{построчная обработка файла}

k: =1;

пока не достигнут конец файла:

- ввод строки;

- вывод строки с пояснительным текстом по обр3;

Вх.: str, res; вых.: res

Обработка строки с выводом найденных слов по обр4

А0.1 или текста по обр5 в случае отсутствия искомых слов

 

- k: = k +1;

кц;

 

Для отладки ввода-вывода строк на этом этапе подзадачу А0.1 заменим заглушкой, выводящей для каждой строки текст " word " и номер строки.

 

Текст программы с заглушкой: файл str_dbg.cpp

 

//Отладочный вариант функции main с заглушкой обработки строки

#include< stdio.h>

#include< string.h>

const int lenmax=41; //типизированная константа - граница массива

void main(int argc, char* argv[ ])

{

char let, str[lenmax];

FILE *dat, *res;

int k;

//Открытие файлов с проверкой результатов открытия

if((dat=fopen(argv[1], " r"))==NULL)

printf(" Файл данных не открыт");

if((res=fopen(argv[2], " w"))==NULL)

printf(" Файл результатов не открыт ");

//Вывод заголовков и ввод let

fprintf(res, " Program %s \n", argv[0]); // argv[0] - заголовок программы fscanf(dat, " %c\n", & let); //не забывайте про &!

fprintf(res, " Поиск слов, начинающихся с буквы %c \n", let);

// Построчная обработка файла

k=1;

while(! feof(dat))

{

fgets(str, 41, dat); //неформатированный ввод строки; вводит все символы до '\n'; //fscanf cо спецификатором %s вводит до первого ' ' или '\n'

fprintf(res, " \n %d строка: %s \n", k, str); // форматированный вывод - выводит

//все символы до '\0', т.е. как надо

fprintf(res, " Найденные слова: \n");

// А0.1. Обработка строки. Заглушка: печать только слова “word” и номера строки

fprintf(res, " %s %d \n", " word", k);

k++;

}

}


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.011 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал