Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2021, 22:18   #1
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию Посимвольное уменьшение строки. Возможно?

Добрый день.

Подскажите Посимвольное уменьшение строки (Не удалять последний символ), а именно уменьшение. Возможно?

Суть задачи

Есть 2 строки

string num, num2;

num = 333
num2 = 300

Нужно получить значения 333, 332, 331, 330..... до 300

Был бы int, делал бы циклом num--

pop_back не предлагать, думаю понятно.

Есть какой то метод для этого?

В программе у меня string. Так как это диапазон может быть АН333АК до АА444ВЕ

и нужно получить все значения от меньшего к большему, или от большего к меньшему, тут без разницы, но нужны все значения диапазона.

По каждому из существующих значений диапазона, я буду делать проверку, если ли эта строка в списке и выводить значения из базы согласно номер ТС

Код:
cout << " Поиск протокола по диапазону номеров ТС:" << endl;
	cout << "------------------------" << endl;
	string num, num2;
	cout << "Начальный номер ТС: "; getline(cin, num);
	cout << "Конечный номер ТС: "; getline(cin, num2);
Есть соображения как это провернуть со string ?
Farlep вне форума Ответить с цитированием
Старый 07.07.2021, 22:54   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Использовать int перебирать значения, каждое значение делать строкой, у которой нужные символы до и после цифр.
Если надо перебирать и буквы, тогда опять-таки int, но генерить строку с переменной системой счисления для разных разрядов.
В крайнем случае напрямую увеличивать каждую букву, при переполнении переходить к следующей и тд.

Последний раз редактировалось waleri; 07.07.2021 в 22:57.
waleri вне форума Ответить с цитированием
Старый 08.07.2021, 00:16   #3
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Не понимаю, как я должен свои строки сделать int, перебрать, а потом обратно сделать string.

Переписывать классы под int не буду. Так как здесь нужно использовать string.

Можно кодом показать как выше написанное сделать?

num = 333
num2 = 300

Нужно получить значения 333, 332, 331, 330..... до 300

Но это все string
Farlep вне форума Ответить с цитированием
Старый 08.07.2021, 06:34   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Farlep Посмотреть сообщение
Можно кодом показать как выше написанное сделать?
Берете самое правое значение и увеличиваете на единицу. Если вышли за пределы диапазона для этой позиции, тогда значение сбрасывается до "нулевого" и переходим к следующему разряду.

Например:
Код:
char a = str[3];
a = a + 1;
if ('9' < a)
{
   str[3] = '0';
   a = str[2];
   a = a + 1;
   // И так далее и естественно циклом.
}
waleri вне форума Ответить с цитированием
Старый 08.07.2021, 13:20   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Так ему же уменьшать надо...
Если длина строки фиксированная (именно 3) и старшая всегда '3', то можно при необходимости без цикла повторить этот перформанс ещё раз.
Давно Си не занимался, не помню: а разве прямо с элементом массива char нельзя производить операции ? Что индексация в Си идёт с 0, ещё помню.
Код:
  str[2] = str[2] - 1;
  if (str[2] < '0') 
     {
        str[2] = '9' ;
        str[1] = str[1] - 1
      }
Следить за тем, чтобы строка не вышла за < '300' должен внешний оператор.

Последний раз редактировалось digitalis; 08.07.2021 в 13:40.
digitalis вне форума Ответить с цитированием
Старый 09.07.2021, 18:23   #6
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

Спасибо за помощь. Глупый был у меня вопрос.

Забыл одну мелочь. У меня бинарное дерево )

И все номера уже лежат упорядочены.

Осталось передать в функцию на печать 2 ключа и печатать то что =>первого и <= второго

Перед этим делаю swap. Что бы ключи приходили в нужном мне порядке.

Код:
void printD(const TKey& key, const TKey& key1)
	{			

		if (left != nullptr) left->printD(key, key1);
		
		if (this->key >= key1 && this->key <= key)
			cout << value;
		
		if (right != nullptr) right->printD(key, key1);			

	}
Farlep вне форума Ответить с цитированием
Старый 06.08.2021, 12:46   #7
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Преобразовать в число, вычесть 1, снова преобразовать в строку.
Код:
int StringToInt(std::string s)
{
 size_t L;
 size_t i;
 int r;
 r=0;
 for (i=1, L=s.length(); i<=L; ++i)
 {
  r*=10;
  switch (s[i])
  {
   case '1': r+=1;
   break;
   case '2': r+=2;
   break;
   case '3': r+=3;
   break;
   case '4': r+=4;
   break;
   case '5': r+=5;
   break;
   case '6': r+=6;
   break;
   case '7': r+=7;
   break;
   case '8': r+=8;
   break;
   case '9': r+=9;
   break;
  } 
 }
 return r;
}
std::string IntToString(int i)
{
 std::string r;
 bool f;
 if (i<0)
 {
  f=true;
  i=-i;
 }
 else
 {
  f=false;
 }
 r.clear();
 while (i!=0)
 {
  switch (i%10)
  {
   case 0: r="0"+r;
   break;
   case 1: r="1"+r;
   break;
   case 2: r="2"+r;
   break;
   case 3: r="3"+r;
   break;
   case 4: r="4"+r;
   break;
   case 5: r="5"+r;
   break;
   case 6: r="6"+r;
   break;
   case 7: r="7"+r;
   break;
   case 8: r="8"+r;
   break;
   case 9: r="9"+r;
   break;
  }
  i/=10;
 }
 if (f)
 {
  r="-"+r;
 }
 return r;
}
...
s=IntTOString(StringToInt(s)-1);
Цитата:
Сообщение от Farlep Посмотреть сообщение
Есть какой то метод для этого?
А зачем Вам именно метод?

Последний раз редактировалось BDA; 06.08.2021 в 15:27.
taras-proger77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уменьшение размера изображения на php уменьшение качества картинки пример class php jpeg gif png xzxz PHP 2 19.11.2012 11:11
посимвольное считывание salwator C++ Builder 0 14.12.2011 20:38
Автоматическое добавление строки или условное копирование формул. Возможно ли? PhilAT Microsoft Office Excel 8 24.04.2010 23:15
посимвольное считывание DeFace Общие вопросы C/C++ 4 05.04.2009 23:11