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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2011, 18:58   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
соединить их и получится без выделения "лишней" памяти
У меня вроде итак ничего лишнего не выделяется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.08.2011, 22:21   #12
Kingdom_Reborn
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 130
По умолчанию

можно решить не используя вообще ни одной дополнительной переменной...
Kingdom_Reborn вне форума Ответить с цитированием
Старый 22.08.2011, 22:25   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
можно решить не используя вообще ни одной дополнительной переменной...
и без переменной цикла?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.08.2011, 22:29   #14
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Код:
и без переменной цикла?
если тока эту самую переменную в эту строку загнать.
без цикла эта задача не решается
Lesha вне форума Ответить с цитированием
Старый 22.08.2011, 22:30   #15
Kingdom_Reborn
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 130
Сообщение

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
и без переменной цикла?
с ней конечно, даже с двумя
я имел ввиду, что для обмена значений двух переменных дополнительная переменная не нужна

Код:
void proc(char *&s)
{
	register unsigned int i, j;
	for (i = 0; i < strlen(s) - 1; i++)
		for (j = i + 1; j < strlen(s); j++)
			if (isdigit(s[i]) && isalpha(s[j]))
			{
				s[i] ^= s[j];
				s[j] ^= s[i];
				s[i] ^= s[j];
			}
}
P.S. А вообще мне кажется, что подобные алгоритмы с обменами эту задачу не решают. Пример: строка "12a3" таким алгоритмом перейдёт в "a213", а не в "a123", как должно быть. Нужно в таких случаях либо сдвигать мешающие цифры вправо, для чего как минимум нужен ещё один вложенный цикл, либо не париться и просто собрать результат в новую строку без всякой сортировки.

Последний раз редактировалось Kingdom_Reborn; 23.08.2011 в 00:03. Причина: Дописал P.S.
Kingdom_Reborn вне форума Ответить с цитированием
Старый 23.08.2011, 10:17   #16
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию

Работаем с char[]. Ограничения на количетсво циклов нет, по крайней мере не оговаривалось.
Программу реализовал, но вот насчет эффективности сомневаюсь. Быстрее и чатабельнее вариант с выделением памяти и управляемся за один цикл + копирование строки.
to Kingdom_Reborn: Да, обменом у меня тоже не получилось - всегда нарушается порядок.
MrGukk вне форума Ответить с цитированием
Старый 23.08.2011, 13:41   #17
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

MrGukk

Написать функию, которая принимает на вход строку как аргумент (напр. 1b32apo94), ничего не возвращает, а строку меняет т.о. чтобы сначала стояли буквы, а потом цифры, при этом порядок в котором буквы и цифры встречаются в строке не менять.

В C++ это делается одной строкой, вида

Код:
std::string s = ...
std::stable_partition(s.begin(), s.end(), [](char ch) { return !std::isdigit(ch, std::locale("")); } );
Хоть примерный алгоритм.

залезть в исходники STL и украсть алгоритм stable_partition
Rififi вне форума Ответить с цитированием
Старый 23.08.2011, 15:56   #18
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от MrGukk Посмотреть сообщение
Работаем с char[]. Ограничения на количетсво циклов нет, по крайней мере не оговаривалось.
Программу реализовал, но вот насчет эффективности сомневаюсь. Быстрее и чатабельнее вариант с выделением памяти и управляемся за один цикл + копирование строки.
to Kingdom_Reborn: Да, обменом у меня тоже не получилось - всегда нарушается порядок.
попробуйте время работы обоих программ измерьте , и увидите что быстрее.
в наше время преимущество надо отдавать скорости выполнения.
проверьте на нескольких строках ( и здоровенных тоже) .
onewho вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51
задача ksk Microsoft Office Excel 2 17.02.2011 23:08
Задача Dog Помощь студентам 3 20.09.2009 18:09