Типы данных и их вывод
В этом уроке мы познакомимся с особенностями функции printf() и типами данных: целыми и вещественными числами, символами, массивами и строками. Это далеко не все допустимые в C типы. Есть еще указатели, структуры, объединения, перечисления, также в C есть возможность определять собственные типы данных.
Вывод символов на экран, а точнее в стандартный поток вывода, осуществляется в языке C помощью функции printf(). Эта функция выводит на экран строку, переданную первым аргументом, предварительно заменив в ней специальные комбинации символов преобразованными в символы данными, переданными последующими аргументами. Следующие после первой строки данные могут быть строками, символами, целыми или вещественными числами, а также указателями. У каждого типа данных имеется свое обозначение — своя спецификация формата.
На прошлом уроке мы выводили строку «Hello World» вот так:
Однако то же самое можно было получить так:
Здесь %s — это спецификация строкового формата, т. е. вместо %s будет подставлен следующий аргумент, данные которого должны быть строкой. Вывод целого числа может выглядеть так:
Вместо числа 5 может стоять переменная целочисленного типа. Функция printf() может принимать произвольное число аргументов:
При выводе данные подставляются по очередности следования: 3 на место первой спецификации, dogs на место второй и т.д. То есть следует строго соблюдать соответствие форматов и последующих данных.
Под выводимые данные можно выделять больше знакомест, чем необходимо. Для этого между знаком % и буквой формата прописывается целое число, обозначающие ширину поля, например так: %10d. По умолчанию выравнивание происходит по правому краю. Для выравнивания по левому краю перед числом ставится знак минус.
Напишите программу, которая выводила бы на экране данные примерно так, как на картинке. При этом используйте возможность задать ширину поля, а также выравнивание по левому и правому краям.
Литералы с плавающей точкой
Числа с плавающей точкой представляют десятичные значения с дробной частью. Число можно записать в двух вариантах — в стандартной и научной форме записи. Стандартная форма — целое число, за которым следуют десятичная точка и дробная часть (например, 3.14). Научная форма записи использует стандартную форму записи числа с плавающей точкой, к которой добавлен суффикс, указывающий степенную функцию числа 10, на которую нужно умножить данное число. Для указания экспоненциальной функции используют символ E или e, за которыми следует десятичное число (положительное или отрицательное). Например, 5.07E12.
По умолчанию литералам с плавающей точкой присвоен тип double. Если вам нужен тип float, то нужно дописать символ F или f. Кстати, для double можно использовать суффиксы D или d, но в этом нет необходимости.
Также возможна запись шестнадцатиричных литерал с плавающей точкой, но на практике я не встречал подобную запись. В этом случае вместо E используется P (или p) — 0x14.3p2.
Может ли тип данных char содержать числа?
Тип данных CHAR хранит любую строку букв, цифр и символов. Он может хранить однобайтовые и многобайтовые символы в зависимости от языкового стандарта базы данных.
Представление символов в памяти ЭВМ
В памяти ЭВМ каждый символ (например, буква, цифра, знак препинания) закодирован в виде беззнакового целого двоичного числа. Кодировка символов – это соглашение об однозначном соответствии каждому символу одного беззнакового целого двоичного числа, называемого кодом символа.
Для русского алфавита существует несколько кодировок (табл. 5.3).
Таблица 5.3. Кодировки букв алфавита русского языка
Кодировка | Операционная система | Количество кодируемых символов | Размер кода одного символа, байт |
MS DOS | |||
1251 (Win-1251, CP-1251) | Windows | ||
КОИ-8 (КОИ-8Р) | Unix | ||
Unicode | Windows |
В кодировках 866, 1251, КОИ-8 и Unicode первые 128 символов (цифры, заглавные и строчные латинские буквы, знаки препинания) со значениями кодов от 0 до 127 одни и те же и определяются стандартом ASCII (American Standard Code for Information Interchange – американский стандартный код для обмена информацией). Цифры 0, 1, . 9 имеют соответственно коды 48, 49, . 57; прописные латинские буквы A, B, . Z (всего 26 букв) – коды 65, 66, . 90; строчные латинские буквы a, b, . z (всего 26 букв) – коды 97, 98, . 122.
Вторые 128 символов со значениями кодов от 128 до 255 кодировок 866, 1251, КОИ-8 содержат символы псевдографики, математические операции и символы алфавитов, отличных от латинского. Причем разные символы разных алфавитов имели один и тот же код. Например, в кодировке 1251 символ русского алфавита Б имеет тот же код, что и символ Á в стандартной кодировке ASCII. Такая неоднозначность вызывала проблемы с кодировкой текста. Поэтому была предложена двухбайтовая кодировка Unicode, которая позволяет закодировать символы многих нелатинских алфавитов.
Десятичные значения кодов букв русского алфавита в кодировках 866, 1251 и Unicode приведены в табл. 5.4.
Таблица 5.4. Значения кодов букв русского алфавита
Кодировка | Коды русских букв | ||
А-Я (без Ё) | а-я (без ё) | Ё | ё |
128-159 | 160-175 (а-п) 224-239(р-я) | ||
192-223 | 224-255 | ||
Unicode | 1040-1071 | 1072-1103 |
В кодировке КОИ-8 (табл. 5.5) коды букв русского алфавита упорядочены не по расположению букв в алфавите, а по соответствию их буквам латинского алфавита. Например, коды латинских букв А, В, С имеют соответственно десятичные значения 65, 66, 67, а русских букв А, Б, Ц – значения 225, 226, 227.
Таблица 5.5. Значения кодов букв русского алфавита
в кодировке КОИ-8
A | К | Х | а | к | х |
Б | Л | Ц | б | л | ц |
В | М | Ч | в | м | ч |
Г | Н | Ш | г | н | ш |
Д | О | Щ | д | о | щ |
Е | П | Ъ | е | п | ъ |
Е | Р | Ы | ё | р | ы |
Ж | С | Ь | ж | с | ь |
З | Т | Э | з | т | э |
И | У | Ю | и | у | ю |
Й | Ф | Я | й | ф | я |
Глава 6. ЛОГИЧЕСКИЕ ОСНОВЫ ЭВМ
6.1. Алгебра высказываний.
Понятие, высказывание, умозаключение
Принципы работы ЭВМ основываются на законах математической логики, поэтому ее элементы широко используются для поиска и обработки информации и при разработке схем электронных устройств.
Математическая логика – это наука о формах и способах мышления и их математическом представлении.
Существуют три формы мышления:
Понятие объединяет совокупность объектов, обладающими некоторыми существенными признаками, которые отличают их от других объектов. Например, понятие «звезда» объединяет множество светящихся газовых шаров. Это понятие трудно спутать с таким понятием как, например, «автомобиль». Объекты, соответствующие одному понятию, образуют множество.
Понятие имеет две характеристики:
Содержание понятия – это совокупность существенных признаков, выделяющих объекты, соответствующие данному понятию, среди других объектов. Например, содержание понятия «человек» можно раскрыть так: «Общественное существо, обладающее сознанием и разумом».
Объем понятия «человек» определяется численностью людей, живущих в мире.
Высказывание (суждение, утверждение) – это повествовательное предложение, в котором утверждаются или отрицаются свойства реальных предметов и отношения между ними. Поэтому высказывание может быть истинным или ложным.
Истинным называется высказывание, в котором связь понятий правильно отражает свойства и отношения реальных вещей, например: «Москва – столица России». Истинность высказывания кодируется единицей (1) и имеет значение «истина».
Ложным высказывание будет в том случае, когда оно не соответствует реальной действительности, например: «Париж – столица США». Ложность высказывания кодируется нулем (0) и имеет значение «ложь».
Обычно высказывания обозначаются логическими переменными – заглавными латинскими буквами с индесом или без, например, A = «Сегодня идет дождь». Логические переменные принимают только два значения 0 и 1.
Умозаключение позволяет из известных фактов (истинных высказываний) получать новые факты. Например, из факта «Все углы треугольника равны» следует истинность высказывания «Этот треугольник равносторонний».
Высказывания и логические операции над ними образуют алгебру высказываний (булеву алгебру), предложенную английским математиком Джорджем Булем.
Логические операции
Основные логические операции над высказываниями, используемыми в ЭВМ, включают отрицание, конъюнкцию, дизъюнкции, стрелку Пирса и штрих Шеффера. Рассмотрим эти логические операции.
1. Отрицание (обозначается также ØX, ~X).
Отрицание (NOT, читается «не X») – это высказывание, которое истинно, если X ложно, и ложно, если X истинно.
2. Конъюнкция XY (X&Y, XÙY).
Конъюнкция XY (AND, логическое умножение, «X и Y») – это высказывание, которое истинно только в том случае, если X истинно и Y истинно.
3. Дизъюнкция X+Y (XÚY).
Дизъюнкция X+Y (OR, логическая сумма, «X или Y или оба») – это высказывание, которое ложно только в том случае, если X ложно и Y ложно.
4. Стрелка Пирса X ¯ Y.
Стрелка Пирса X ¯ Y (NOR (NOT OR), ИЛИ-НЕ) – это высказывание, которое истинно только в том случае, если X ложно и Y ложно.
5. Штрих Шеффера X | Y.
Штрих Шеффера X | Y (NAND (NOT AND), И-НЕ) – это высказывание, которое ложно только в том случае, если X истинно и Y истинно.
Определить значения логических операций при различных сочетаниях аргументов можно из таблицы истинности (табл. 6.1)
Таблица 6.1. Таблица истинности для основных логических операций, используемых в ЭВМ
X | Y | XY | X + Y | X ¯ Y | X | Y |
Чтобы определить значение операции 0 + 1 в таблице истинности, необходимо на пересечении столбца X + Y (определяет операцию) и строки, где X = 0 и Y = 1 (так первый аргумент равен 0, а второй – 1), найти значение 1, которое и будет являться значением операции 0 + 1.
В алгебре высказываний существуют две нормальные формы: конъюнктивная нормальная форма (КНФ) и дизъюнктивная нормальная форма (ДНФ).
КНФ – это конъюнкция конечного числа дизъюнкций нескольких переменных или их отрицаний (произведение сумм). Например, формула X(Y + Z) находится в КНФ.
ДНФ – это дизъюнкция конечного числа конъюнкций нескольких переменных или их отрицаний (сумма произведений). Например, формула X + YZ находится в ДНФ.
Логические операции обладают свойствами, сформулированными в виде равносильных формул.
Снятие двойного отрицания (отрицание отрицания): =X. (6.1) Коммутативность: XY=YX. (6.2) X+Y=Y+X. (6.3) Ассоциативность: (XY)Z=X(YZ). (6.4) (X+Y)+Z=X+(Y+Z). (6.5) Дистрибутивность: X(Y+Z)=XY+XZ. (6.6) X+YZ=(X+Y)(X+Z). (6.7) Законы де Моргана: . (6.8) . (6.9) Идемпотентность: X+X=X. (6.10) X×X=X. (6.11) Закон противоречия: X× =0. (6.12) | Закон «исключения третьего»: X+ =1. (6.13) Свойства констант: X×1=X. (6.14) X×0=0. (6.15) X+1=1. (6.16) X+0=X. (6.17) Элементарные поглощения: X+XY=X. (6.18) X+ Y=X+Y. (6.19) X(X+Y)=X. (6.20) X( +Y)=XY. (6.21) Преобразование стрелки Пирса: X¯Y= . (6.22) Преобразование штриха Шеффера: X | Y= . (6.23) |
Правило 6.1. (порядок применения формул при преобразованиях) Перечисленные формулы рекомендуется применять в следующем порядке:
1) преобразование стрелки Пирса (6.22) и штриха Шеффера (6.23);
2) законы де Моргана (6.8)-(6.9);
3) формулы дистрибутивности (6.6)-(6.7);
4) элементарные поглощения (6.18)-(6.21).
Обычно формула приводится к ДНФ, а затем отдельные слагаемые поглощаются.
Программа Java, чтобы получить символ из строки
Для заданной строки String задача состоит в том, чтобы получить определенный символ из этой строки по определенному индексу.
Ниже приведены различные способы сделать это:
- Используя метод String.charAt () :
- Получить строку и индекс
- Получить определенный символ, используя метод String.charAt (index).
- Вернуть определенный символ.
Ниже приведена реализация вышеуказанного подхода:
// Java-программа для получения определенного символа
// из заданной строки по определенному индексу
// Функция для получения конкретного символа
public static char
getCharFromString(String str, int index)
public static void main(String[] args)
String str = «GeeksForGeeks» ;
// Получить конкретный символ
char ch = getCharFromString(str, index);
System.out.println( «Character from » + str
+ » at index » + index
- Получить строку и индекс
- Преобразуйте строку в массив символов с помощью метода String.toCharArray ().
- Получить определенный символ по определенному индексу массива символов.
- Вернуть определенный символ.
Ниже приведена реализация вышеуказанного подхода:
// Java-программа для получения определенного символа
// из заданной строки по определенному индексу
// Функция для получения конкретного символа
public static char
getCharFromString(String str, int index)
public static void main(String[] args)
String str = «GeeksForGeeks» ;
// Получить конкретный символ
char ch = getCharFromString(str, index);
System.out.println( «Character from » + str
+ » at index » + index
- Получить строку и индекс
- Преобразуйте String в IntStream с помощью метода String.chars ().
- Преобразуйте IntStream в Stream с помощью метода IntStream.mapToObj ().
- Преобразуйте Stream в Character [], используя метод toArray ().
- Получить элемент по определенному индексу из этого массива символов.
- Вернуть определенный символ.
Ниже приведена реализация вышеуказанного подхода:
// Java-программа для получения определенного символа
// из заданной строки по определенному индексу
// Функция для получения конкретного символа
public static char
getCharFromString(String str, int index)
// Преобразовать строку в IntStream
// Преобразовать IntStream в Stream
.mapToObj(ch -> ( char )ch)
// Преобразуем Stream в Character []
// и получить элемент по указанному индексу
.toArray(Character[] :: new )[index];
public static void main(String[] args)
String str = «GeeksForGeeks» ;
// Получить конкретный символ
char ch = getCharFromString(str, index);
System.out.println( «Character from » + str
+ » at index » + index
- Получить строку и индекс
- Получите значение ASCII для конкретного символа по указанному индексу, используя метод String.codePointAt ().
- Преобразуйте это значение ASCII в символ, используя приведение типов.
- Вернуть определенный символ.
Ниже приведена реализация вышеуказанного подхода:
// Java-программа для получения определенного символа
// из заданной строки по определенному индексу
// Функция для получения конкретного символа
public static char
getCharFromString(String str, int index)
return ( char )str.codePointAt(index);
public static void main(String[] args)
String str = «GeeksForGeeks» ;
// Получить конкретный символ
char ch = getCharFromString(str, index);
System.out.println( «Character from » + str
+ » at index » + index
- Получить строку и индекс
- Создайте пустой массив символов размера 1
- Скопируйте элемент по указанному индексу из String в char [], используя метод String.getChars ().
- Получить конкретный символ по индексу 0 массива символов.
- Вернуть определенный символ.
Ниже приведена реализация вышеуказанного подхода:
// Java-программа для получения определенного символа
// из заданной строки по определенному индексу
Вывести на экран соответствий между символами и их численными обозначениями в памяти компьютера java
+7 (499) 444-90-36 Отдел заботы о пользователях
Москва, Ленинский проспект, дом 6, строение 20
- Участник Skolkovo
- Премии Рунета 2018, 2019, 2020
Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies