Перейти к содержимому

Фото
- - - - -

Русские буквы как значения для оператора switch...case

C/C++

Лучший Ответ Володька, 19 марта 2015 - 21:20

Я в этом деле тоже не спец, поэтому может жесть получилась. У меня вроде как прокатывает такой код, хоть и ругается в некоторых местах.

Spoiler

Текст для проверки выбрал: аА - англ, аА - рус, ну и zZяЯ - соответственно.

В симуляторе вроде как в каждый case заходил когда надо.

Перейти к полному сообщению


  • Вы не можете создать новую тему
  • Please log in to reply
38 ответов в этой теме

#31 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 21 марта 2015 - 11:22

Сделай свой калькулятор с блекджеком и т.д - вначале регистрируй те русские буквы, которые будешь юзать в таблицу (для пущей эффективности память можешь выделять динамически - malloc, realloc), и при подсчёте длины строки запрашивай таблицу - есть ли буква в таблице и если есть, то отнимай 2 (или какой там у нее sizeof), если нет, отнимай 1 и это всё дело в цикле пока не дойдешь от sizeof(phrase) до 0 - инкрементируй счётчик.

 

Какой смысл сего действа?

 

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

1. Изначально правильно определить количество символов в строке и инициализировать массив исходя из этих данных.

 (не получается сделать потому, что невозможно вызвать никакую свою функцию подсчета до инициализации. Компилятор ругается)

 

2. После создания массива убрать у него последние n записей, где n - количество utf-8 символов. 

(Не разобрался еще как это сделать и  возможно ли).

 

3. Крутить цикл вывода на экран ровно столько раз, сколько значимых символов есть в массиве. Наплевав на пустое место в конце. 

(Пока попытка реализовать это не принесла успеха).

 

А то что ты предлагаешь отнимать 1 или 2 уже сделано. Я добавил еще одну переменную в которой храню позицию записи в массив. и меняю её в зависимости от того был ли символ одно, или двух-байтовым. (переменная p в последнем коде.)


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#32 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 21 марта 2015 - 11:36

Какой смысл сего действа?

 

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

1. Изначально правильно определить количество символов в строке и инициализировать массив исходя из этих данных.

 (не получается сделать потому, что невозможно вызвать никакую свою функцию подсчета до инициализации. Компилятор ругается)

 

2. После создания массива убрать у него последние n записей, где n - количество utf-8 символов. 

(Не разобрался еще как это сделать и  возможно ли).

 

3. Крутить цикл вывода на экран ровно столько раз, сколько значимых символов есть в массиве. Наплевав на пустое место в конце. 

(Пока попытка реализовать это не принесла успеха).

 

А то что ты предлагаешь отнимать 1 или 2 уже сделано. Я добавил еще одну переменную в которой храню позицию записи в массив. и меняю её в зависимости от того был ли символ одно, или двух-байтовым. (переменная p в последнем коде.)

Как какой? Разве это не то, что тебе надо? 

Ну а по поводу первого способа - само собой. Можешь инициализировать на месте массива указатель и уже в функции main выделить ему память и забить данными как надо, и дальше использовать где надобно. 

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


Сообщение изменено: Akhenaton (21 марта 2015 - 11:37 )

  • 0

Вначале делаю, потом думаю :)


#33 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 21 марта 2015 - 11:52

Ну а по поводу первого способа - само собой. Можешь инициализировать на месте массива указатель и уже в функции main выделить ему память и забить данными как надо, и дальше использовать где надобно. 
 

 

Про указатели вчера читал, но пока ничего толком не понял. На эксперименты времени не было пока.


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#34 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 21 марта 2015 - 16:41

Про указатели вчера читал, но пока ничего толком не понял. На эксперименты времени не было пока.

Тебе Серджио писал, как динамически разместить массив.

Посчитай длину и размести to_display нужного размера. Указатель тупо инкрементируй при каждом присвоении. Все, вся магия. Не зубадь сохранить оригинальный указатель на начало.


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

 

Не считая того, что ты делаешь два почти одинаковых прохода. Зачем дважды решать, 1 или 2 байта занимает символ, если можно это сделать единожды?


По любому, у него есть память в объеме sizeof(phrase) - ведь ситуация, когда все буквы английские - допустима, тогда потребуется to_display наибольшего размера. Если б были все русские - вдвое меньшего, а так sizeof - верхняя граница.

 

Значит, пусть размещает этот объем, раз может.

 

Делает один проход, и ВСЕ.

 

У него все равно есть счетчик позиции записи в to_display. Это и есть длина строки, еще один проход не нужен вообще.


  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#35 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 21 марта 2015 - 21:20

 

 

У него все равно есть счетчик позиции записи в to_display. Это и есть длина строки, еще один проход не нужен вообще.

 

Это понятно. Что дальше с этим делать непонятно... 

еще один массив создать уже по этой размерности и скопировать в него значимые элементы длинного?

Что такое указатель и как оно работает я пока не вкурил. Не забывайте что программист я сильно начинающий, а в С++ вообще полный нуб.


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#36 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 21 марта 2015 - 22:21

еще один массив создать уже по этой размерности и скопировать в него значимые элементы длинного?

Зачем? У тебя есть массив с информацией на вывод. Ты знаешь, сколько элементов - значимые. Ну и все, выводи, радуйся жизни, потом освобождай весь массив. У тебя же среда однозадачная? Значит, память больше никому не нужна, а то что там "хвост" - неважно в данном случае, т.к. если б все буквы были английскими, хвоста бы не было. Т.е. этот объем памяти у тебя все равно должен быть.


  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#37 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 21 марта 2015 - 22:31

 Ну и все, выводи, радуйся жизни, потом освобождай весь массив. .

 

Так сейчас и делаю. Это самые первые костыли которые пришли на ум. 

Искалось решение красивое и правильное.


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu


#38 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 21 марта 2015 - 23:28

Это правильное решение. И рациональное, без лишних проходов.

Если бы у тебя был класс "строка", которых хранил бы длину - одно дело. А раз длину надо определять проходом, то ну его нафиг второй проход.


  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#39 BiHiTRiLL

BiHiTRiLL
  • Пользователь
  • 396 сообщений

Отправлено 21 марта 2015 - 23:43

Ну, будем считать вопрос решенным. Огромное спасибо всем кто помогал. Тут было помощи гораздо больше, чем на профильных форумах! 


  • 0

¡ʁɐнεɐd ɐно - ɐɓʚɐdu