Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ekzamenatsionnye_Voprosy_Programmirovanie_Sua_2...doc
Скачиваний:
5
Добавлен:
26.11.2019
Размер:
533.5 Кб
Скачать

Логические операции (&& и ||)

Операнды логических операций И (&&) и ИЛИ (||) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true).

Результатом логической операции является true или false. Результат операции логическое Иимеет значение true только если оба операнда имеют значение true. Результат операциилогическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.

Условная операция (?:)

Эта операция тернарная, то есть имеет три операнда.

Ее формат:

операнд_1 ? операнд_2 : операнд_3

Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный пулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора if.

#include int main(){ int a = 11, b = 4, max; max = (b > a) ? b : a; printf("Наибольшее число: %d", max); return 0; }

Результат работы программы:

Наибольшее число: 11

Другой пример применения условной операции. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает п, а иначе принимала значение 1:

i = (1 < n) ? i + 1: 1;

  1. Перевод чисел из двоичной системы счисления в десятичную и наоборот.

Перевод чисел из двоичной системы счисления в десятичную

Не трудно заметить, что в двоичной системе счисления длины чисел с увеличением значения растут быстрыми темпами. Как определить, что значит вот это: 10001001? Непривычный к такой форме записи чисел человеческий мозг обычно не может понять сколько это. Неплохо бы уметь переводить двоичные числа в десятичные.В десятичной системе счисления любое число можно представить в форме суммы единиц, десяток, сотен и т.д. Например:

1476 = 1000 + 400 + 70 + 6

Можно пойти еще дальше и разложить так:

1476 = 1 * 103 + 4 * 102 + 7 * 101 + 6 * 100

Посмотрите на эту запись внимательно. Здесь цифры 1, 4, 7 и 6 - это набор цифр из которых состоит число 1476. Все эти цифры поочередно умножаются на десять возведенную в ту или иную степень. Десять – это основание десятичной системы счисления. Степень, в которую возводится десятка – это разряд цифры за минусом единицы.

Аналогично можно разложить и любое двоичное число. Только основание здесь будет 2:

10001001 = 1*27 + 0*26 + 0*25 + 0*24 + 1*23 + 0*22 + 0*21 + 1*20

Если посчитать сумму составляющих, то в итоге мы получим десятичное число, соответствующее 10001001:

1*27 + 0*26 + 0*25 + 0*24 + 1*23 + 0*22 + 0*21 + 1*20 = 128 + 0 + 0 + 0 + 8 + 0 + 0 + 1 = 137

Т.е. число 10001001 по основанию 2 равно числу 137 по основанию 10. Записать это можно так:

100010012 = 13710

  1. Восьмеричная и шестнадцатеричная системы счисления. Алгоритмы перевода в двоичную систему и наоборот.

Итак, современное «железо понимает» лишь двоичную систему счисления. Однако человеку трудно воспринимать длинные записи нулей и единиц с одной стороны, а с другой – переводит числа из двоичной в десятичную систему и обратно, достаточно долго и трудоемко. В результате, часто программисты используют другие системы счисления: восьмеричную и шестнадцатеричную. И 8 и 16 являются степенями двойки, и преобразовывать двоичное число в них (так же как и выполнять обратную операцию) очень легко.

В восьмеричной системе счисления используется восемь знаков-цифр (от 0 до 7). Каждой цифре соответствуют набор из трех цифр в двоичной системе счисления:

000 – 0

001 – 1

010 – 2

011 – 3

100 – 4

101 – 5

110 – 6

111 – 7

Для преобразования двоичного числа в восьмеричное достаточно разбить его на тройки и заменить их соответствующими им цифрами из восьмеричной системы счисления. Разбивать на тройки нужно начинать с конца, а недостающие цифры в начале заменить нулями. Например:

1011101 = 1 011 101 = 001 011 101 = 1 3 5 = 135

Т.е число 1011101 в двоичной системе счисления равно числу 135 в восьмеричной системе счисления. Или 10111012 = 1358.

Обратный перевод. Допустим, требуется перевести число 1008 (не заблуждайтесь! 100 в восьмеричной системе – это не 100 в десятичной) в двоичную систему счисления.

1008 = 1 0 0 = 001 000 000 = 001000000 = 10000002

Перевод восьмеричного числа в десятичное можно осуществить по уже знакомой схеме:

6728 = 6 * 82 + 7 * 81 + 2 * 80 = 6 * 64 + 56 + 2 = 384 + 56 + 2 = 44210 1008 = 1 * 82 + 0 * 81 + 0 * 80 = 6410

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

В шестнадцатеричной системе счисления используются цифры от 0 до 9 и шесть первых латинских букв – A (10), B (11), C (12), D (13), E (14), F (15).

При переводе двоичного числа в шестнадцатеричное, первое разбивается на группы по четыре разряда, начиная с конца. В случае, если количество разрядов не делится нацело, то первая четверка дописывается нулями впереди. Каждой четверке соответствует цифра шестнадцатеричной системе счисления:

Например: 10001100101 = 0100 1100 0101 = 4 C 5 = 4C5

Если потребуется, то число 4C5 можно перевести в десятичную систему счисления следующим образом (C следует заменить на соответствующее данному символу число в десятичной системе счисления – это 12):

4C5 = 4 * 162 + 12 * 161 + 5 * 160 = 4 * 256 + 192 + 5 = 1221

Максимальное двухразрядное число, которое можно получить с помощью шестнадцатеричной записи - это FF.

FF = 15 * 161 + 15 * 160 = 240 + 15 = 255

255 – это максимальное значение одного байта, равного 8 битам: 1111 1111 = FF. Поэтому с помощью шестнадцатеричной системы счисления очень удобно кратко (с помощью двух цифр-знаков) записывать значения байтов. Внимание! Состояний у 8-ми битного байта может быть 256, однако максимальное значение – 255. Не забывайте про 0 – это как раз 256-е состояние.

  1. Целый тип данных, его представление в компьютере и особенности выполнения операций.

Целые числа – это простейшие числовые типы данных, с которыми оперирует компьютер. Для представления целых чисел используются специально для них предназначенные типы данных.

Специальные типы для целых чисел вводятся для:

· эффективного расходования памяти;

· повышения быстродействия;

· введения операции деления нацело с остатком вместо приводящего к потере точности обычного деления вещественных чисел.

В подавляющем большинстве задач, решаемых с помощью ЭВМ, многие действия сводятся к операциям над целыми числами. Сюда относятся задачи экономического характера, при решении которых данными служат количества акций, сотрудников, деталей, транспортных средств и т.д. Целые числа используются для обозначения даты и времени, и для нумерации различных объектов: элементов массивов, записей в базах данных, машинных адресов и т.д.

Для компьютерного представления целых чисел обычно используется несколько различных типов данных, отличающихся друг от друга количеством разрядов. Чаще всего используется восьми-, шестнадцати– и тридцатидвухразрядное представление чисел (один, два или четыре байта соответственно).

Для целых чисел существуют два представления: беззнаковое (только для неотрицательных целых чисел) и со знаком. Очевидно, что отрицательные числа можно представлять только в знаковом виде.

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

Например, в байте (8 разрядов) можно представить беззнаковые числа от 0 до 255.

Максимальное число, записанное в восьми разрядах ячейки соответствует восьми единицам и равно:

11111111= 1*27 + 1*26 + 1*25 + 1*24 + 1*23 + 1*22 + 1*21 + 1*20 = 255.

Таким образом, для беззнаковых типов нижняя граница диапазона значений всегда равна 0, а верхнюю границу диапазона допустимых значений можно подсчитать, зная количество разрядов, занимаемых элементами данного типа.

Верхняя граница диапазона допустимых значений для беззнаковых типов рассчитывается по формуле 2k – 1, где k – количество разрядов в ячейке

Знаковые положительные числа в байте можно представить только от 0 до 127.

Старший (левый) разряд отводится под знак числа, остальные

7 разрядов под само число. Максимальное число в знаковом представлении соответствует семи единицам и равно:

11111112 = 1*26 + 1*25 + 1*24 + 1*23 + 1*2 + 1*21 + 1*20 = 127.

Поэтому, если известно, что некоторая числовая величина является неотрицательной, то лучше рассматривать ее как беззнаковую.

Диапазон допустимых значений для знаковых типов рассчитывается по формулам:

Нижняя граница допустимых значений: 2k-1;

Верхняя граница допустимых значений: 2k-1 – 1, где k – количество разрядов в ячейке.

Рассмотрим алгоритм представления в компьютере целых положительных чисел.

Пример: Требуется получить внутреннее 8-разрядное представление десятичного числа 54.

1. Для этого целое положительное число переводится в двоичную систему счисления.

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

3. Двоичное число дополняется, если это необходимо, слева нулями до соответствующего числа разрядов (8-ми, 16-ти, 32-х и более);

Мы рассмотрели компьютерное представление целых положительных чисел.

Следующий вопрос: как представляются в компьютере целые отрицательные числа.

В ЭВМ в целях упрощения выполнения арифметических операций применяютспециальные коды для представления чисел. Использование кодов позволяет свести операцию вычитания чисел к операции поразрядного сложения кодов этих чисел.

Применяются прямой, обратный и дополнительный коды чисел.

К кодам выдвигаются следующие требования:

1) Разряды числа в коде жестко связаны с определенной разрядной сеткой.

2) Для записи кода знака в разрядной сетке отводится фиксированный, строго определенный разряд.

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

Прямой код

Прямой код двоичного числа совпадает по изображению с записью самого числа. Значение знакового разряда для положительных чисел равно 0, а для отрицательных чисел 1.

Пример. В случае, когда для записи кода выделен один байт, для числа +1101 прямой код 0,0001101, для числа -1101 прямой код 1,0001101.

Обратный код

Обратный код для положительного числа совпадает с прямым кодом.

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

Пример.

Для числа +1101 прямой код 0,0001101; обратный код 0,0001101.

Для числа -1101 прямой код 1,0001101; обратный код 1,1110010.

Дополнительный код

Дополнительный код положительного числа совпадает с прямым кодом.

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

Пример.

Для числа +1101 Для числа -1101

прямой код 0,0001101; 1,0001101;

обратный код 0,0001101; 1,1110010.

дополнительный код:   0, 0001101 1,1110011

Итак, все целые отрицательные числа в компьютере представляются дополнительным кодом.

  1. Целые типы языка С/С++.

Для определения данных целого типа используются различные ключевые слова, которые определяют диапазон значений и размер области памяти, выделяемой под переменные (табл. 6).

Таблица 6

Тип

Размер памяти в байтах

Диапазон значений

char

1

от -128 до 127

int

Для IBM XT,AT,SX,DX 2

short

2

от -32768 до 32767

long

4

от -2 147 483 648 до 2 147 483 647

unsigned shar

1

oт 0 до 255

unsigned int

Для IBM XT,AT,SX,DX 2

unsigned short

2

от 0 до 65535

unsigned long

4

от 0 до 4 294 967 295

Отметим, что ключевые слова signed и unsigned необязательны. Они указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Например:

unsigned int n; unsigned int b; int c; (подразумевается signed int c ); unsigned d; (подразумевается unsigned int d ); signed f; (подразумевается signed int f ).

Отметим, что модификатор-типа char используется для представления символа (из массива представление символов) или для объявления строковых литералов. Значением объекта типа char является код (размером 1 байт), соответствующий представляемому символу. Для представления символов русского алфавита, модификатор типа идентификатора данных имеет вид unsigned char, так как коды русских букв превышают величину 127.

Следует сделать следующее замечание: в языке программирования С не определено представление в памяти и диапазон значений для идентификаторов с модификаторами-типа int и unsigned int. Размер памяти для переменной с модификатором типа signed int определяется длиной машинного слова, которое имеет различный размер на разных машинах. Так, на 16-ти разрядных машинах размер слова равен 2-м байтам, на 32-х разрядных машинах соответственно 4-м байтам, т.е. тип int эквивалентен типам short int, или long int в зависимости от архитектуры используемой ПЭВМ. Таким образом, одна и та же программа может правильно работать на одном компьютере и неправильно на другом. Для определения длины памяти занимаемой переменной можно использовать операцию sizeof языка программирования С, возвращающую значение длины указанного модификатора-типа.

Например:

a = sizeof(int); b = sizeof(long int); c = sizeof(unsigned long); d = sizeof(short);

Отметим также, что восьмеричные и шестнадцатеричные константы также могут иметь модификатор unsigned. Это достигается указанием префикса u или U после константы, константа без этого префикса считается знаковой.

Например:

0xA8C (int signed ); 01786l (long signed ); 0xF7u (int unsigned );

  1. Вещественный тип данных, его представление в компьютере и особенности выполнения операций.

Вещественный (действительный) тип данных

Вещественный тип данных - это множество значений с десятичной точкой.

Операции вещественного типа

Операциями вещественного типа могут быть все арифметические операции. Операция деления является операцией только вещественного типа даже в том случае, если в качестве результат вычисления подразумевается целое значение. Также результат вычисления будет иметь строго вещественное значение при использовании функции квадратного корня sqrt.

Рассмотрим несколько примеров:

  • 25 / 5 = 5,0;

  • 10 / 2,5 = 4,0;

  • sqrt (25) = 5,0;

  • sqrt (100 - 19) = 9,0.

Во всех приведенных выше примерах результат вычисления выражения подразумевает значение целого типа, но как было сказано ранее операция деления и функция квадратного корня sqrt являются операциями исключительно вещественного типа. Таким образом значения выражений приведенных примеров будут отнесены к вещественному типу данных.

В предыдущей теме мы говорили, что результат вычисления выражения относится к целому типу в том случае, когда все переменные выражения имеют значения целого типа. В противном случае результат вычисления будет отнесен к вещественному типу, например:

  • 1 + 0,5 = 1,5;

  • 5,0 * 3 = 15,0;

  • 2 - 0,0 = 2,0.

  1. Вещественные типы языка С/С++.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]