Символьные строки C++ Вывести алфавит с помощью цикла for

  • Задание: Используйте цикл-for для вывода на экран алфавита. Задание выполнять на символьных строках.
Тема строк в C++ немного такая, разветвлённая, что ли. Связана эта ветвистость с эволюцей типов, работающих со строками. Язык C++ является надмножеством языка C и многое, но совсем не всё, в языке C++ работает как и в языке C. В первых версиях языка C++ не было специальных типов для работы со строками, но потом появились такие библиотеки, как STL, типы std::string, std::wstring. До того, как появились специальные типы работы со строками, программисты обрабатывали строки как массивы символов.
  • Строка, представляемая в коде как массив символов, называется Си-строкой или символьной строкой.
Работа с символьными строками малость неудобна, вас иногда будуть ругать за их использование, учить работать со string. Тем не менее, работать с символьными строками возможно и уметь надо.
Объявить символьную строку можно двумя способами:

Первый способ — это объявление обычного массива, хранящего 255 символов. Во втором показанном способе используется ручное выделение памяти. Сложности у начинающих программистов начинаются почти сразу при использовании таких строк. Обычное присвоение работает неправильно, сложить строки нормальным образом нельзя, в общем, проблемы есть. В первом случае нельзя расширить строку, во втором можно словить утечку памяти. Проблем хватает.
Поскольку указатели — тема сложно поддающаяся новичкам, описывать их не буду, использую первый, более понятный, способ. До массивов мы ещё не дошли, но ничего страшного.

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

К сожалению, буквой 'Ё' Borland C++ 3.1 обделён. В современных компиляторах можно вывести весь русский алфавит.

В листинге #1.б добавилась проверка на букву 'Ж'. Важно только поймать момент, чтобы правильно вставить нашу 'Ё'. Поскольку 'Ё' идёт перед 'Ж', нужно выводить 'Ё' до вывода 'Ж'.
Вы можете своими силами изменить подход к вставке 'Ё': ставьте её после 'Е', попробуйте.
Для тех, кому необходимо объяснить на пальцах: внутри круглых скобок for-цикла есть переменная letter. Эта переменная увеличивается на единицу при каждом новом проходе. Символьные переменные типа char относятся к целочисленным переменным, т. е. фактически все символы — числа. То, что мы видим символы как символы, — следствие работы объекта cout. Русские символы в таблице идут по алфавиту, исключение составляет наша 'Ё', поэтому взяв начальное значение 'А', можно пройтись по всем символам до 'Я', за исключением 'Ё', для которой в лиcтинге #1.б выполнена дополнительная проверка. Символьная строка представляет собой массив. По массиву бегает своебразный курсор, выбирающий номер позиции. Этот номер позиции называется индексом массива. Роль бегунка на себя берёт объявляемая нами переменная, именованная index. На каждом проходе бегунок указывает на индекс массива, в которую мы сохраняем текущее значение символа-буквы letter, после чего letter подбирает новое значение, и бегунок, бегающий по массиву, смещается на одну позицию. Подобные манипуляции необходимы для того, чтобы не затереть значимые данные. После завершения цикла в символьную строку добавляется обязательный признак окончания строки.
Кому не понятны манипуляции, попробую достучаться: два бегунка бегают, каждый по своему маршруту: первый по алфавиту, второй по нумерам ячеек символьной строки. Оба бегут с одинаковой скоростью. Бегунок, бегающий по алфавиту, кричит компилятору: "Забирай эту букву", компилятор её подбирает, а бегунок, бегающий по строке, кричит компилятору: "Сюда её, сюда!". Компилятор туда её и кладёт. На этом мои силы объяснений исчерпаны.

10 комментариев на «“Символьные строки C++ Вывести алфавит с помощью цикла for”»

  1. Anonymous:

    Спасибо большое за ваши труды =) Все очень понятно, то что нужно новичку)По этой статье: Вы написали, что во время выполнения цикла переменная index увеличивается, но в самом коде увеличения нет. Программка отказывалась работать, пока не дописала туда index++. После этого вроде как заработало )

    Автор сайта отвечает:
    В этой статье написан пример из книги и в нем ошибок нет. Я сейчас проверил. Возможно при переписывании внутри цикла for перед буквой "Я" вы написали "Меньше" вместо "Меньше или равно", поэтому цикл проходил на один шаг меньше чем вы ожидали. Не видя чужой код трудно угадать что именно происходит

  2. Владимир:

    У меня не вводиться русские буквы, сделал на латинице — все получилось.
    Как сделать русскую раскладку?

    Автор сайта отвечает:
    Я переключаю нажатием на правый ctrl, обратно тоже на правый ctrl Только это не у всех так

  3. Аноним:

    добавьте в main() строчку setlocale(0,"");

    Автор сайта отвечает:
    У тех, у кого стоит Windows XP и С++ (dos),
    для вывода на экран русских символов иногда помогает сворачивание окна. Когда вы находитесь в режиме редактора кода, нажмите alt+Enter, редактор кода должен перейти в оконный режим, из такого режима запустите программу на выполнение.
    ================================
    У тех, у кого стоит Visual Studio, для вывода на экран консоли русских символов, можно использовать system(«chcp 1251») и установить в свойствах окна консоли шрифт Lusidia Console. Для тех, кто не знает как ->
    Дописываете в начало (внутри main) system(«chcp 1251»);
    Запускаете программу
    Кликаете правой кнопкой мыши на заголовок окна и жмете свойства.
    Выбираете шрифт Lusidia Console вместо точечного. Жмете ОК

    Кракозабры должны приобрести читаемый вид.
    пример (запустили и меняйте шрифт)

    ================
     

    Frida говорит:
    Когда так сделала, в консоли сначала вылезла строка с инфой про что-то текущее и кодовое, а потом уже алфавит..
    Не то, чтобы очень она мешала, но все-таки… захотелось поделиться)
    А для Visual Studio 2010 есть еще способ, кому интересно:
    1. Добавляете в программу инструкцию #include
    2. В начале функции main() указываете номера кодовых страниц для вывода и ввода русскоязычного текста:
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    3. Опять-таки в свойствах консоли выбираете Lusidia Console.
    Честно говоря, практически не знаю С++, но, судя по набору цифр, суть с вашим способом приблизительно одна.. а может и нет..

    Автор сайта отвечает:
    а можно еще

    Способы русификации не мои.
    Этот запомнить проще.

  4. Максим:

    и в линуксе код не рабочий, в некоторых кодировках русские буквы разорваны, в данном случае потеряна буква ё так что вам достаточно было массива размером 33 даже с учётом null.
    лучше всё-таки не залезать в дебри и простые вещи показывать на стандартизованной части аски.

    Автор сайта отвечает:
    это учебный пример из какой-то книги. Он не заточен под универсальность, а просто демонстрирует часть возможностей языка.

     
    В Linuxe этот код вполне рабочий. Только Линуксоиды крутые вроде. Взялись за Linux, продвинутыми себя считают. А если считают себя продвинутыми, то и проблем с кодировками у них быть не должно.

    Этот код с сайта почти ничем не отличается от кода для Linux

    Буква Ё пропускается. Можно, конечно и массивом задавать алфавит, но эффект другой и показан здесь не просто проход по массиву, а такая возможность C++, которая была использована.
     

    Максим говорит:
    линуксоиды не просто крутые они на семибитные промежуточные ретрансляторы рассчитывали, чтобы потеряв старший бит сообщение на русском превращалось в транслит и его можно было бы прочитать. в результате чего в kio8-r русские буквы не попорядку раскиданы, ты же коды символов сравниваешь, от чего код и не рабочий если кодировка koi8. тебе выдаст что-то вроде абцдифгхийклмнопя на том и конец.
    был бы пример на стандартезованной части аски проблем бы не было и код работал бы везде и новичкам было бы понятно.

    Автор сайта отвечает:
    напишут себе конвертер и не умрут. Или напишут обычный проход по массиву.
    я не планировал новичкам пудрить мозг Линуксом.

    Где UTF8 кодировка – там код рабочий. Захотят посмотреть, сохранят в UTF8
    В другом случае или меня поправят или спросят если нужно будет, а не будут лезти с кучей предъяв и претензий.

  5. Ivan:

    В Линухе код рабочий. Просто нужно в текстовом редакторе кодировку win-1251 выставить вместо UTF-8, ну и в терминале эту же кодировку выставить.

    Русские символы в UTF-8 немножко не char.

  6. Марина:

    Я наверно совсем тупая — новичок, но объясните, пожалуйста, код поподробнее.
    Я наверно совсем тупая – новичок, но объясните, пожалуйста, код поподробнее.

    Для чего нужно считывание? не пойму работу index

    Для чего нужно считывание? не пойму работу index

    вот этот кусок кода не ясен, объясните, пожалуйста!

    • Алгоритм примера формирует символьный массив. Символьный массив — это строка. Эта строка в будущем будет строкой-алфавитом.
      Этот index обозначает номер символа в строке. На каждой новой итерации цикла происходит index++;, что обозначает, что следующий символ в строке будет равен i
      С++ хранит символы в памяти не как символы, а как числа.

      index (0)
      i (i сейчас а)
      На первой итерации Index=0, значит первый символ в строке будет A
      A__________________________ (34 позиции выделено для строки)
      index++ (index стал 1)
      i++ (i стало б)

      На второй итерации index=1, значит уже на позиции второго символа в строке будет Б
      AБ_________________________ (34 позиции выделено для строки)
      index++ (index стал 2)
      i++ (i стало в)

      На третьей итерации index=2, значит уже на позиции третьего символа в строке будет В
      AБВ________________________ (34 позиции выделено для строки)
      и так для всех итераций.

      Важно, чтобы последний символ строки был признаком окончания строки. Это обязательно.

  7. Ira:

    • С буквами очевиднее

      С включением Ё 🙂

  8. ффф:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/elena-andreeva-6005715/programmirovanie-eto-tak-prosto-programmirovanie-eto-tak-slozhno-sovremennyy-uchebnik-programmirovaniya-11647619/?lfrom=15589587
Яндекс.Метрика