ВОПРОС · Q&A

Задача: Обработка символьных данных[последовательность символов]

28 ответов 15,8 тыс.
Статус
Закрыто для дальнейших ответов.
Кстати по поводу обработки символьных данных... Там надо было что бы допустим если вводим abc0123. то он является отрезком 0123456789 т.к 0123 отрезок 0123456789... А если a0b1c2 то нет... Вот щас над этим голову ломаю
Все равно не совсем понял....
Ты хочешь что бы если буквенная часть стоит или в конце или в начале то она отбрасывалась??? И если же в перемешку (к примеру через 1 символ) и буква и цифра - то вообще не считать последовательностью??? Или как?
 
Да. Все правильно... Только не могу понять как реализовать это. На словах знаю... Но с кодом беда...

Добавлено: Если хотя бы 2 символа совпадают то должно являтся
 
C++:
/*
... Выяснить, совпадает ли группа символов с начальным отрезком ряда 0123456789... 
*/
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>
using namespace std;

void main(void)
{
char Str[4096]; //Вводима строка
char Iskom[4096]={0}; //Искомая последовательность
char Buffer[128]; //Буферная строка для перевода из int To char*
setlocale(LC_ALL,"Russian");
cout<<"Введите свою строку(последовательность чисел) : "<<endl;
gets(Str);
for (int i=0; strlen(Iskom)<strlen(Str);i++) //Обойдем все числа от 0..до того момента пока длина искомой послед. строки не достигнит длины строки введенной
{
itoa(i,Buffer,10); //Переведем int в char*
strcat(Iskom,Buffer); //Объединим строки
}
//Добавим обработку искомой строки
//Вообщем думаю что нужно сделать так, сначало ищим в строке первое вхождение цифры isdigit
bool FindDigitLine = false; //Флаг найденой циферной последовательности
bool GoodDigit = true; // Флаг Введена верная циферная последовательность (мы пока от противного пойдем), Предположим, что ввели верную последовательность
bool StrAfterDigit = false; //флаг Чередования цифры или символа (фактор для принятия решения о ложной последовательности)

char *ptr = Str; //Заведем указатель, который указывает на Str (введеную нами строку)
for (int i = 0; i<strlen(Str); i++) //Обойдем всю введеную нами строку
{
if (!FindDigitLine) //Пока флаг найденой циферной последовательности = False
{
if (isdigit((unsigned char)Str[i])) //Проверим является ли текущий символ цифрой
{
FindDigitLine = true; //Если является выставим флаг, значит последовательность циферная начилась
ptr+=i; //Сдвинем указатель, отбросив тем самым не нужные символы из начала строки (до первой цифры)
}
}
else //Если же флаг уже выставлен, то
{
if (!isdigit((unsigned char) Str[i])) //Если текущий сивол не цифра
{
StrAfterDigit = true; //Выставим флаг что после циферной последовательности есть символы(не цифры), если хоть раз еще мы найдем цифру, то ввод был не верен
Str[i] = 0; //Обрежим строку поставив нулевой символ
}
else if (StrAfterDigit) //Если же появилась цифра после того как основная циферная послед. определена, и выставлен флаг входимости символа, то значит ввод - ошибочен
{
GoodDigit = false; //Выставим флаг
break; //Да и выйдим из цикла
}
}
}
strcpy(Str,ptr); //Скопируем в Str нашу строку на которую указывает указатель

char *Result = strstr(Iskom,Str); //Введем указатель на субстроку (можно и без него) Result = Iskom (Если субстрока совпадает с началом)

if (GoodDigit) //Если ввод верен
{
if (Result == Iskom)
cout<<"Строка '"<<Str<<"' "<<"является началом последовательности '"<<Iskom<<"...'"<<endl;
else
cout<<"Строка '"<<Str<<"' "<<"не является началом последовательности '"<<Iskom<<"...'"<<endl;
}
//Иначе выведим сообщение об ошибке
else cout << "Ошибка: Введена неверная последовательность " << endl;
}
Miller85, Миллер, но такое ограничение это совершенно другой уровень кода... Ты уверен, что преподаватель именно так задал задание???
 
Я показал ему то задание, он сказал, что я не правильно его понял... Ну и обьяснил, как я и написал... Т.е. Если я ввиду например ав12, то он будет являтся отрезком 0123456789...т.к 12 есть в нем... А если а1в2 то нет... Может он просто решил проверить я ли это решаю? Большая разница в уровнях?
 
Я показал ему то задание, он сказал, что я не правильно его понял... Ну и обьяснил, как я и написал... Т.е. Если я ввиду например ав12, то он будет являтся отрезком 0123456789...т.к 12 есть в нем... А если а1в2 то нет... Может он просто решил проверить я ли это решаю? Большая разница в уровнях?
Просто если первоначальный вариант можно писать впринципи не думаю, то конечный уже стоит поднапряч голову... Я к этому веду...
 
Понял... Спасибо больше... Не подскажешь какая нормальная литература есть по с++?
 
Сотри быстро то что у тебя после ".или"... ;-))) Пока никто не видит.... ;-))) Хотя сам сотру...


Добавлено: Ты знаешь, была когда то книжка Подбельский В.В. Язык C++ ... Очень умный и граммотный дядька.... Стоит ее почитать...
Потом книжку... Блин не помню точно автор на Л как то... Толи Лафре толи что то с этим связанно... В свое время очень понравилась....
Ну а дальше можно Страусштрупа полистать..... Для закрепления и расширения материала... А вообще литературы очень много... Правда зачастую плохо написана....
 
Дак вот и я про это... Нормальных мало... А Подбельский у меня есть. Обязательно прочту... Спасибо ещё раз за инфу и помощь...
 
sax_ol, ты думаешь преподы еще так заморачиваются??? ;-))
 
Статус
Закрыто для дальнейших ответов.