Консультация № 178341
12.05.2010, 12:37
42.70 руб.
12.05.2010, 14:30
0 5 1
Доброго времени суток, уважаемые эксперты! Помогите, пожалуйста, со следующей задачей:
Исходный файл содержит информацию: «ab12.34 Gercules small, Big 567»
Из заданного файла получить:
А) все непрерывные цепочки, состоящие из цифр. Результат «12 34 567»
Б) все непрерывные цепочки, состоящие из букв. Результат «ab Gercules small Big»
В) непрерывную цепочку, состоящую из цифр 34. Результат «34»
Г) Цифру 5. Результат «5»
Результаты вывести на экран, разделить пробелами (см. результат). Имя входного файла задать как аргумент командной строки консольного приложения.
По возможности распишите, что к чему! И, если не трудно, для каждого пункта (А, Б, В, Г) напишите отдельный код.

Примечание: ПО - Microsoft Visual C++ 2008 - консольное приложение Win32, предмет - программирование на языке высокого уровня!

Обсуждение

Неизвестный
12.05.2010, 15:26
общий
По подробней обьясните задание.Не очень понятно.Вам надо числа к числам а слова к словам?Что вы имете ввиду в В и Г?
Неизвестный
12.05.2010, 15:49
общий
Там имеется ввиду, что для пунктов В) и Г) из исходной информации (ab12.34 Gercules small, Big 567) нужно получить только 34 и 5 соответственно.
для В) от ab12.34 Gercules small, Big 567 должно остаться 34
для Г) только 5.
Неизвестный
12.05.2010, 19:29
общий
Баженов Павел Андреевич:
Т.е. в задании В результатом может быть "3434343434"? Если таковая последовательность будет во входном файле.
А вот в Г не понятно. Получается вам надо просто проверить наличие цифры "5" в тексте?
Неизвестный
12.05.2010, 19:55
общий
Цитата: 24686
Т.е. в задании В результатом может быть "3434343434"? Если таковая последовательность будет во входном файле.
А вот в Г не понятно. Получается вам надо просто проверить наличие цифры "5" в тексте?

именно! по всем пунктам задание Вы поняли правильно!
Неизвестный
12.05.2010, 23:20
общий
это ответ
Здравствуйте, Баженов Павел Андреевич.
Программа. С++. MS VS 2008.
Код:
#pragma warning(disable:4800)

#include <locale>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <functional>

using namespace std;

// Имя файла
const wchar_t* const FILE_NAME=L"input.txt";

// Синонимы для используемых типов
typedef void (*parser_t)(const wstring&);

// Ф-я для нахождения непрерывной последовательности чисел
void digit_parser(const wstring& str);
// Ф-я для нахождения непрерывной последовательности букв
void alpha_parser(const wstring& str);
// Ф-я для поиска подстроки "34"
void thirty_four_parser(const wstring& str);
// Ф-я для поиска подстроки "5"
void five_parser(const wstring& str);
// Ф-я для фыполнения с файлом требуемых действий
void parse_file(const wchar_t* const file_name,parser_t checker);

int main()
{
locale::global(locale(""));

// Вариант А
parse_file(FILE_NAME,digit_parser);

// Вариант Б
parse_file(FILE_NAME,alpha_parser);

// Вариант Г
parse_file(FILE_NAME,thirty_four_parser);

// Вариант Д
parse_file(FILE_NAME,five_parser);

_getwch();

return 0;
};

void parse_file(const wchar_t* const file_name,parser_t parser)
{
// Открываем файл
wifstream in(file_name);
if(!in)
{
wcout<<L"Не могу открыть файл"<<endl;
}
wstring str;
// Читаем по строкам
getline(in,str);
while(in)
{
// Разбираем каждую строку
parser(str);
getline(in,str);
}
}

typedef bool (*predicate_t)(wchar_t);

// Поиск группы элементов удовлетворяющих предикату
void find_group(const wstring& str,predicate_t predicate)
{
wstring::const_iterator begin_word,end_word=str.begin(),end_str=str.end();
while((begin_word=find_if(end_word,end_str,predicate))!=end_str)
{
end_word=find_if(begin_word,end_str,not1(pointer_to_unary_function<wchar_t,bool>(predicate)));
wcout<<wstring(begin_word,end_word)<<L' ';
}
wcout<<endl;
}

// Поиск последовательности str2 в str1
void find_sequence(const wstring& str1,const wstring& str2)
{
wstring::const_iterator begin=str1.begin(),end_str1=str1.end(),begin_str2=str2.begin(),end_str2=str2.end();
wstring::size_type str2_len=str2.length();
while((begin=search(begin,end_str1,begin_str2,end_str2))!=end_str1)
{
wcout<<str2<<L' ';
begin+=str2_len;
}
wcout<<endl;
}

// Предикат для чисел
inline bool digit_pred(wchar_t arg)
{
return iswdigit(arg);
}

// Предикат для букв
inline bool alpha_pred(wchar_t arg)
{
return iswalpha(arg);
}

// Ф-я для нахождения непрерывной последовательности чисел
inline void digit_parser(const wstring& str)
{
find_group(str,digit_pred);
}

// Ф-я для нахождения непрерывной последовательности букв
inline void alpha_parser(const wstring& str)
{
find_group(str,alpha_pred);
}

// Ф-я для поиска подстроки "34"
inline void thirty_four_parser(const wstring& str)
{
find_sequence(str,L"34");
}

// Ф-я для поиска подстроки "5"
inline void five_parser(const wstring& str)
{
find_sequence(str,L"5");
}

Пример работы:
Код:
12 34 567
ab Gercules small Big
34
5

Прикреплен архив с проектом для VS 2008.
Прикрепленные файлы:
5
Форма ответа