Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регистр букв, программа для смены регистра букв 
:(
    Опции темы
Ramigo
Дата 20.1.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.1.2007

Репутация: нет
Всего: нет



Встал вопрос вот в чем:что за оператор для замены ргистра буквы в С++?короче надо написать прогу чтоб та меняла регистр т.е. с большой на маленькую и наоборот..перерыл все учебники но не нашел(((помогите плиззз!
PM MAIL   Вверх
szz
Дата 20.1.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: нет
Всего: 33



Код

#include <string>
string myString("HeLlO, WoRlD!");
strupr((char *) myString.c_str());


Добавлено @ 13:52 
http://www.gnu.org/software/libc/manual/ht...Conversion.html


--------------------
PM   Вверх
Ramigo
Дата 20.1.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.1.2007

Репутация: нет
Всего: нет



бошое пасибо!но в силу еще своей неопытности:эт вводится до функции main?первая строка само собой....
PM MAIL   Вверх
bsa
Дата 20.1.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Ramigo @ 20.1.2007,  13:58)
бошое пасибо!но в силу еще своей неопытности:эт вводится до функции main?первая строка само собой....

Внутри main
PM   Вверх
Rockie
Дата 20.1.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Ramigo, toupper, tolower
Код

// 
// toupper.cpp
//
#include <iostream>
int main ()
{
  using namespace std;
  locale loc;
  cout << 'a' << toupper('c') << tolower('F') << endl;
 
  return 0;
}

а вообще для английских букв даже этого не нужно. Английский алфавит в кодировке ASCII располагается последовательно, сначала большие буквы, потом 6 символов, потом маленькие. Поэтому 
 'A'+32 == 'a' и соответсвенно наоборот




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
bsa
Дата 20.1.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Rockie @ 20.1.2007,  14:28)
а вообще для английских букв даже этого не нужно. Английский алфавит в кодировке ASCII располагается последовательно, сначала большие буквы, потом 6 символов, потом маленькие. Поэтому 
 'A'+32 == 'a' и соответсвенно наоборот

Смысл правильный, а вывод нет.
Из маленьких ASCII большие: a = c & 0xDF или a = c & (0xFF ^ 0x20)
Из больших ASCII маленькие: a = c | 0x20
здесь c - любой буквенный символ (регистр значения не имеет)

Кажется, будет работать и с кодировками CP1251/KOI8-R для русских букв, но я не проверял.

Это сообщение отредактировал(а) bsa - 20.1.2007, 17:34
PM   Вверх
Rockie
Дата 20.1.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(bsa @  20.1.2007,  15:06 Найти цитируемый пост)
Смысл правильный, а вывод нет.

почему?

Код
#include<iostream>

int main()
{

  for(char letter='A';letter<'[';letter++)
   {
      std::cout<<letter<<' '<<char(letter+32)<<std::endl;
   }

  std::cin.get();
  return 0;
}


Цитата(bsa @  20.1.2007,  15:06 Найти цитируемый пост)
Из маленьких ASCII большие: a = c & 0xDF[b] или [b]a = c & (0xFF ^ 0x20)Из больших ASCII маленькие: a = c | 0x20

непонятно, но интересно smile А что здесь происходит?




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Axxent
Дата 20.1.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 25.3.2004
Где: Новосибирск

Репутация: 2
Всего: 5



Разница невелика, просто процу быстрее проставить шестой бит в единицу или ноль чем прибавить или отнять 32. Результат одинаков. Что происходит - происходит побитовая установка по маске. a = b & 0xDF - побитовое И с маской 11011111, a = b | 0x20 - побитовое ИЛИ с маской 00100000.

Это сообщение отредактировал(а) Axxent - 20.1.2007, 16:08
PM MAIL ICQ   Вверх
bsa
Дата 20.1.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Axxent @ 20.1.2007,  16:04)
Разница невелика, просто процу быстрее проставить шестой бит в единицу или ноль чем прибавить или отнять 32.

Для меня это открытие. Не знал, что скорость выполнения этих операций разная...
Вариант со сложением я посчитал не очень корректным, так как он неправильно обработает буквы в другом регистре. Т.е. операция с И и ИЛИ более корректно отработают "This simple string", а вот операции сложения/вычитания накосячат.
PM   Вверх
Axxent
Дата 20.1.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 25.3.2004
Где: Новосибирск

Репутация: 2
Всего: 5



Тоже верно. Разница есть, если строк мало то при прочих равных ей можно пренебречь, но все же побитовые операции выполняются чуть-чуть быстрее.
PM MAIL ICQ   Вверх
nickless
Дата 20.1.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Axxent @ 20.1.2007,  15:35)
побитовые операции выполняются чуть-чуть быстрее.

На современных CPU (где-то так начиная с первых пней  smile ) нет разницы в скорости выполнения логических и арифметических операций, они все (причем несколько сразу) выполняются за один такт (ну деление итд слегка дольше).

Это сообщение отредактировал(а) nickless - 20.1.2007, 16:49


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
bsa
Дата 20.1.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Axxent @ 20.1.2007,  16:35)
Тоже верно. Разница есть, если строк мало то при прочих равных ей можно пренебречь, но все же побитовые операции выполняются чуть-чуть быстрее.

Интересно, это как быстрее?!? Скорость сложения (на процессорах Pentium и выше) 1 такт. Скорость операции OR по твоему 0.99 такта?  smile 
Цитата(http://www.ixbt.com/cpu/cpu-microarchitecture-part-2.shtml)
Латентность большинства операций целочисленной арифметики составляет 1 такт, а их суммарный темп исполнения — 2 операции за такт, по одной в устройствах, подсоединённых к портам 0 и 1. Некоторые операции (сложения/вычитания и копирования, а также логические) могут выполняться в устройствах на обоих портах. Также в каждом такте может быть произведено одно считывание из L1-кэша и одна запись в L1-кэш (64-разрядные).
Лень было искать первоисточники, взял первое попавшееся.
PM   Вверх
Axxent
Дата 20.1.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 25.3.2004
Где: Новосибирск

Репутация: 2
Всего: 5



Мда, прокосил smile Прошу у всех прощения. Попутал с умножением и сдвигами smile Впрочем как уже было сказано на современных оно тоже не слишком разнится

Это сообщение отредактировал(а) Axxent - 20.1.2007, 17:10
PM MAIL ICQ   Вверх
Rockie
Дата 20.1.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Axxent @  20.1.2007,  16:04 Найти цитируемый пост)
 a = b & 0xDF - побитовое И с маской 11011111, a = b | 0x20 - побитовое ИЛИ с маской 00100000.

bsaAxxent, а побитовое И чего с чем? что такое a и b?  

Цитата(bsa @  20.1.2007,  16:23 Найти цитируемый пост)
 Т.е. операция с И и ИЛИ более корректно отработают "This simple string", а вот операции сложения/вычитания накосячат.

bsa, в этой строке пробелы, они ведь не переводятся в верхний/нижний регистр. А можно пример кодом где вариант с масками не косячит а сложение/вычитание косячит?

Цитата(Axxent @  20.1.2007,  16:04 Найти цитируемый пост)
Разница невелика, просто процу быстрее проставить шестой бит в единицу или ноль чем прибавить или отнять 32.

imho современный компилятор должен это соптимизировать.

Добавлено @ 17:20 
вообще кажися просветлеваю =)

bsa, имеется ввиду, что при варианте с установкой бита буква 'S' останется 'S'? 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Axxent
Дата 20.1.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 25.3.2004
Где: Новосибирск

Репутация: 2
Всего: 5



a - куда результат помещаем, b - твое число или символ. В двоичном коде допустим А = 0x41 = 01000001b, хочешь сделать маленькой - поставь шестой бит: A | 0x20 = 01000001 | 00100000 = 01100001 = a.
Цитата
The simple string

Мелкие буквы. Большая первая станет маленькой, к остальным еще +32. Получится галиматья.
PM MAIL ICQ   Вверх
Rockie
Дата 20.1.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Axxent, ага, спасибо, уже дошел =) просто
Цитата(bsa @  20.1.2007,  15:06 Найти цитируемый пост)
a = c & 0xDF[b] или [b]a = c & (0xFF ^ 0x20)

для меня не совсем user-friendly. 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
bsa
Дата 20.1.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Забыл слэш поставить. Уже исправил.
Там нет никакого b - это от phpBB (жирный шрифт).  smile 

читать надо так: a = c & 0xDF или a = c & (0xFF ^ 0x20), что тоже самое
Просто 0xFF ^ 0x20 = 0xDF (это для тех, кто не умеет оперировать 16-тиричными числами)
PM   Вверх
Rockie
Дата 20.1.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Кстати интересно, что способ этот работает только по причине того что буквы лежат в том интервале, в котором лежат. Похоже именно ради того, чтобы освободить этот бит буквы располагаются так:

65[10] = 1000001[2] ..   90[10] = 1011010[2]
97[10]=  1100001[2] .. 122[10] = 1111010[2]

и между интервалами добавлены "лишние" символы, чтобы "добить" до 32.

Цитата(bsa @  20.1.2007,  17:39 Найти цитируемый пост)
Там нет никакого b - это от phpBB

бугага smile



Это сообщение отредактировал(а) Rockie - 20.1.2007, 17:50


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1161 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.