• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Miller85
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

Miller85

Все задания решил в контрольной, но в этой тупанул конкретно... Не могу и всё... Задание такое... Выяснить, совпадает ли группа символов с начальным отрезком ряда 0123456789...
 
D

DarkKnight

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

Miller85

Да. Все правильно... Только не могу понять как реализовать это. На словах знаю... Но с кодом беда...

Добавлено: Если хотя бы 2 символа совпадают то должно являтся
 
D

DarkKnight

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, Миллер, но такое ограничение это совершенно другой уровень кода... Ты уверен, что преподаватель именно так задал задание???
 
M

Miller85

Я показал ему то задание, он сказал, что я не правильно его понял... Ну и обьяснил, как я и написал... Т.е. Если я ввиду например ав12, то он будет являтся отрезком 0123456789...т.к 12 есть в нем... А если а1в2 то нет... Может он просто решил проверить я ли это решаю? Большая разница в уровнях?
 
D

DarkKnight

Я показал ему то задание, он сказал, что я не правильно его понял... Ну и обьяснил, как я и написал... Т.е. Если я ввиду например ав12, то он будет являтся отрезком 0123456789...т.к 12 есть в нем... А если а1в2 то нет... Может он просто решил проверить я ли это решаю? Большая разница в уровнях?
Просто если первоначальный вариант можно писать впринципи не думаю, то конечный уже стоит поднапряч голову... Я к этому веду...
 
M

Miller85

Понял... Спасибо больше... Не подскажешь какая нормальная литература есть по с++?
 
D

DarkKnight

Сотри быстро то что у тебя после ".или"... ;-))) Пока никто не видит.... ;-))) Хотя сам сотру...


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

Miller85

Дак вот и я про это... Нормальных мало... А Подбельский у меня есть. Обязательно прочту... Спасибо ещё раз за инфу и помощь...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!