Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Кодирование беззнаковых и знаковых целых чисел. Кодирование действительных чисел. Кодирование символов и строк.






 

• Беззнаковые целые числа:

• Переводятся в бинарные, записываются последовательно в младшие разряды, старшие заполняются нулями.

• Положительные знаковые целые числа:

• Самый старший бит не заполняется, в остальном как беззнаковые целые.

• Отрицательные знаковые целые числа:

• Бинарный код модуля инвертируется, добавляется бинарная единица, код записывается как беззнаковые целые.

• Действительные числа:

• В старшие биты записывается мантисса, в младшие - порядок.

• Чем больше порядок, тем меньше точность.

• Символы:

• Однобайтовые: ASCII;

• Двухбайтовые: Unicode;

• Многобайтовые: другие варианты.

• Беззнаковые целые представляют только неотрицательные числа, при этом все разряды кода используются для представления значения числа и максимальное число соответствует единичным значениям кода во всех разрядах: 111…111. m-байтовая переменная целого типа без знака, очевидно, принимает значения от 0 до +28m− 1.

• Однако для большинства современных процессоров обычным представлением чисел со знаком является дополнительный код. Максимальное положительное число представляется двоичным кодом 0111…111, максимальное по модулю отрицательное кодом 1000…000, а код 111…111 соответствует − 1. Такое представление чисел соответствует наиболее простой реализации арифметических логических устройств процессора на логических вентилях и позволяет использовать один и тот же алгоритм сложения и вычитания как для беззнаковых чисел, так и для чисел со знаком (отличие — только в условиях, при которых считается, что наступилоарифметическое переполнение).

• Для кодирования действительных чисел используют 80-разрядное кодирование. При этом число предварительно преобразуется в нормализованную форму: 3, 1415926 = 0, 31415926 · 101 300 000 = 0, 3 · 106 123 456 789 = 0, 123456789 · 109. Первая часть числа называется мантиссой, а вторая – характеристикой (порядком). Большую часть из 80 бит отводят для хранения мантиссы (вместе со знаком) и некоторое фиксированное количество разрядов отводят для хранения характеристики (тоже со знаком).

• Кодировка символов (часто называемая также кодовой страницей) – это набор числовых значений, которые ставятся в соответствие группе алфавитно-цифровых символов, знаков пунктуации и специальных символов.
Для кодировки символов в Windows используется таблица ASCII (American Standard Code for Interchange of Information).
В ASCII первые 128 символов всех кодовых страниц состоят из базовой таблицы символов. Первые 32 кода базовой таблицы, начиная с нулевого, размещают управляющие коды. Символы с номерами от 128 до 255 представляют собой таблицу расширения и варьируются в зависимости от набора скриптов, представленных кодировкой символов. Набор символов таблицы расширения различается в зависимости от выбранной кодовой страницы. Юникод (Unicode) — стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков. Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода».

• В Unicode используются 16-битовые (2-байтовые) коды, что позволяет представить 65536 символов.

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

• Для представления символьных данных в кодировке Unicode используется символьный тип wchar_t.

 

2. Понятие о типах данных в C и C++. Базовые типы данных. Переменные в C и C++. Описание (объявление) переменных.

 

Тип данных - это показатель, позволяющий правильно интерпретировать выделенный объем памяти.

 

Основными типами данных являются:

 

назв. байт диапазон описание

 

bool 1 0 / 255 целочисл., 0 = false, 1-255 = true

char 1 0 / 255 целочисл., число указывает на символ

 

short 2 +-32767 целочисл.

int 4 -2 млн целочисл.

long 4 +-2 млн целочисл.

 

float 4 3.4*10^+-38 с пл. точкой, точность до 7 знаков

double 8 1.7*10^+-308 с пл. точкой, точность до 15 знаков

long double 8 1.7*10^+-308 с пл. точкой, точность до 15 знаков

 

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

 

Переменные - это выделенные с указанием типа данных участки памяти.

 

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

 

3. Выражения в языке в C и C++. Основные операции. Понятие оператора в C и C++. Выражение и оператор присваивания.

 

Выражение в C/C++ - описания последовательности действий, приводящей к формированию значения определенного типа.

Операндами служат переменные одного и того же типа (или приведенные к одному и тому же типу).

Для произведения действий с операндами ставятся символы-операторы.

Операторы бывают унарными (действующими с одной переменной) и бинарными (действующими с двумя переменными).

 

Простейшие операции:

 

a=b присваивание

a+b сложение

a-b вычитание

+a унарный плюс

-a унарный минус

a*b умножение

a/b деление

a%b взятие остатка

++a префиксный инкремент

a++ суффиксный инкремент

--a префиксный декремент

a-- суффиксный декремент

a==b равенство

a! =b неравенство

a> b больше

a< b меньше

a> =b больше или равно

a< =b меньше или равно

! a логическое НЕТ

a& & b логическое И

a||b логическое ИЛИ

~a побитовая инверсия

a& b побитовое И

a|b побитовое ИЛИ

a^b исключающее ИЛИ

a< < b побитовый сдвиг влево

a> > b побитовый сдвиг справо

a+=b присваивание с суммированием (или любым другим действием)

a[b] обращение к элементу массива

*a непрямое обращение

& a ссылка

a-> b обращение к члену структуры

a.b обращение к члену структуры

 

Выражения с оператором присваивания «=» вида a=b+c позволяют присвоить правую часть выражения левой. Слева от оператора присваивания может стоять только одиночная переменная для присваивания в неё результата.

 

4. Массивы и указатели в C и C++. Имя массива, как идентификатор указателя. Присваивание для указателей. Оператор выделения новой памяти в C++. Понятие об утечки памяти, оператор удаления.

 

Указатели - это переменные, содержащие адрес некоторой области памяти.

Указатели определяют, как следует интерпретировать содержимое этой области.

 

Получение адреса: & a (получение адреса значения)

Разыменование: *a (получение значения по адресу)

 

Присваивание: b=*a; c=& b; и наоборот.

 

Новый участок памяти можно выделить при помощи оператора new, например:

int a;

a = new int(5);

 

При выделении памяти этот оператор генерирует конструктор класса с указанными элементами («5» в примере).

 

Любую динамически выделенную память (т.е. при помощи new) необходимо освобождать оператором delete для предотвращения утечки:

delete a;

 

Утечка памяти - уменьшение объема памяти из-за неосвобожденных (ненужных) участков памяти или ошибок в программе.

 

Массив - это область памяти, в которой последовательно хранится несколько однотипных значений.

Массив инициализируется либо сразу с известным количеством значений:

int a[10]; //статический массив

либо с подстановкой переменной по необходимости:

num=10;

int *a=new int[num]; //динамический массив

 

Сама переменная без квадратных скобок (операторов) является указателем на начало (первый элемент) массива.

 

Данные в массив заносятся либо на этапе инициализации массива, например:

int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

либо по необходимости отдельно в каждую ячейку:

int a[10];

a[0]=1;

...

 

Если массив сгенерирован динамически, после работы с ним необходимо освободить память: delete[] a;

 

5. Символьные строки в C и C++.

 

Для работы с символьными строками предусмотрен класс string, который в сущности представляет собой массив char[].

 

Стандартными функциями ввода-вывода являются scanf(" ", < переменные>) и printf(" ", переменные), позволяющие считывать форматированный текст.

При наличии класса iostream также для ввода-вывода можно использовать операторы cin и cout.

 

Для работы с переменными типа string применяются следующие функции:

• strlen длина строки

• strcat(c1, c2) конкатенация

• atoi(c) перевод в целое число

• atof(c) перевод в число с пл. точкой

 

6. Оператор условного выполнения в C и C++.

 

if (< условие>) {<...> };

else {<...> };

В условии применяются операторы сравнения.

7. Метки и переходы в C и C++. Возможность организации цикла с помощью меток и переходов. Цикл в C и C++.

 

Метки:

a:

 

Переход к меткам:

goto a;

 

Метки позволяют «перескакивать» в более раннюю или позднюю точку выполнения программы.

Без условия обычно не используются, так как могут зациклить программу.

 

Цикл - это повторяющееся выполнение ряда инструкций.

Простейшая реализация цикла с метками:

 

int b=5; bool c=false;

a:

if (b> 3) {b--; c=true}; else c=false;

if (c==true) goto a;

 

Более удобные реализации циклов в C++:

while (< условие>) {<..> };

do {<...> } while (< условие>);

for (< начальное условие>; < условие>; < шаг>) {<...> };

 

8. Потоки данных в C и C++. Файловые потоки, входной и выходной потоки программы. Функции открытия и закрытия файловых потоков. Функции ввода данных из потоков в C и C++. Преобразование данных при вводе.

 

Поток - это последовательность байтов. Поток может представлять содержимое файлов.

Потоки для работы с файлами создаются как объекты следующих классов:

 

ofstream - для вывода (записи) данных в файл;

ifstream - для ввода (чтения) данных из файла;

fstream - для чтения и для записи данных (двунаправленный обмен).

 

Создание потока:

ofstream F;

 

В общем случае оператор открытия потока будет иметь вид:

F.open(«file», mode);

 

Закрытие потока:

F.close();

 

f.open(" C: \\a.txt", ios:: out);

cout< < " a=";

cin> > a;

f< < a< < " \t"; // Запись данных в поток (Может это??? Другое я даже не знаю что может быть.)

f.close();

 

9. Функции вывода данных в C и C++. Преобразование данных при выводе.

// Не уверен во всем

Examples:

cout < < ”text”;

printf(“text%”, переменная);

 

Некоторые типы форматов(%тип):,

c - Символ

s - Строка символов

d, i - Целое десятичное со знаком

o - Целое восьмеричное

u - Целое десятичное без знака

x, X - Целое шестнадцатеричное

f - Дробное число в фиксированном формате

e, E - Дробное число в научном формате

g, G - Дробное число в научном или фиксированном формате

p - Указатель (в шестнадцатеричном виде)

 

10. Явные и неявные преобразования типов в C и C++.

 

Неявные преобразования:

• Любой тип -> тип bool:

• всё ненулевое = 1; 0 = 0;

• Любой целый -> любой целый:

• при нехватке памяти старшие байты не добавляются;

• Любой целый -> любой действ.:

• дв. код меняется, число не меняется;

• Любой действ. -> любой целый:

• округление до ближайшего целого;

• Действ. с большей точн. -> действ. с меньшей точн.:

• лишние знаки после запятой отбрасываются.

 

Явные преобразования:

 

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

Простейший пример:

int a=25;

(float) a;

 

11. Понятие функции в C и C++. Описание функций и обращение к ним. Обмен данными с функциями по значению и по ссылке. Прототипы функций. Заголовочный и исходный модули для описания функций. Область видимости переменных.

 

Функция (подпрограмма) - выделенный набор инструкций, выполнение которого производится по вызову этой функции по имени.

Функции, не возвращающие никаких значений, объявляются с типом данных void.

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

Функции с любым типом данных, кроме void, используются в качестве операндов в выражениях; функции с типом данных void используются конкретно как подпрограммы.

 

Простейшее создание и вызов функции:

 

void Function1(){printf(“это функция”); } //создание безтиповой функции

int Fuction2(int a){a++; return a; } //создание типовой функции

 

Function1(); //вызов безтиповой функции

int b=2; b=Function2(b); //иниц. переменной и присваивание типовой ф.

 

Возвращаемое значение в типовой функции указывается после оператора return. После этого оператора выполнение функции прекращается.

 

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

 

Существует два способа передачи параметров в функцию: по значению и по адресу.

 

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

 

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

 

void f(int i, int* j, int& k);

int main(){

int i = 1, j = 2, k = 3;

cout < < " i j k\n";

cout < < i< < ’ ‘< < j< < ’ ‘< < k< < ’\n’;

f(i, & j, k);

cout < < i< < ’ ‘< < j< < ’ ‘< < k< < ’\n’;

}

void f(int i, int* j, int& k){i++; (*j)++; k++; }

 

Прототип функции — это описание только типа функции, её имени и входных параметров без указания инструкций, например:

void Function(int a);

 

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

 

• Заголовочный модуль (header) — файл, содержащий прототипы используемых функций и классов.

• Исходный модуль (source) — файл, содержащий наборы инструкций в рамках функций и классов.

 

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

include “something.h”

include “otherstuff.cpp”

 

Области видимости переменных:

 

1. Локальные переменные — объявляются внутри функции и недоступны снаружи её;

2. Глобальные переменные — объявляются вне всего и доступны везде.

 

12. Структуры в C и C++. Описание типов структур и конкретных структур. Обращение к членам структур.

 

Структура — совокупность переменных разного типа, доступ к которым дается по общему имени структуры и не имеет переменных.

 

Задание прототипа:

struct < имя типа структуры> {< описание членов структуры> }

 

Объявление структуры:

< имя типа структуры> < имя структуры (перем.)>

 

Вызов структуры:

< имя структуры>.< член структуры>

 

Вызов структуры с указателем:

< имя указателя на структуру> -> < член структуры>

 

Структуры других типов могут быть членами других структур.

Членами структур могут быть функции.

 

13. Понятие класса и объекта. Уровни инкапсуляции членов класса. Перегрузка функций и операций в классах в C++. Конструкторы и деструкторы класса.

 

Объект — совокупность переменных и функций, часть из которых могут быть доступны из внешней программы по внешнему имени объекта и имени переменной/функции.

Функции объектов == методы.

 

Объект представляет какой-либо класс. Классы являются типами данных для объектов.

 

В описании классов содержится описание членов, причем описания членов возможны на разных уровнях инкапсуляции.

 

Уровни инкапсуляции определяют возможности доступа к переменным из внешней программы и при наследовании.

 

Public — доступ открыт всем, кто видит определение данного класса.

Private — доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.

Protected — доступ открыт классам, производным от данного.

По умолчанию всегда private.

Синтаксис описания классов:

class < имя> {описание членов и инструкций}

Синтаксис объявления объектов:

< имя класса> < имя объекта>

Обращение к объектам:

< имя объекта>.< член>

< указатель> -> < член>

Функции, в том числе и конструкторы, можно перегружать, т.е. описывать разные функции с одинаковым именем. Они должны отличаться типами или количеством входных параметров.

Описание прототипа класса (вне самого класса, например, в заголовочном модуле):

< тип функции> < имя класса>:: < имя функции> (< описание входных параметров>)

{< тело функции> }

 

Конструкторы — бестиповые функции, имя которых совпадает с именем класса. Могут быть перегружены. Используются для инициализации объектов этого класса.

 

Инициализация с конструктором:

< имя класса> *< имя указателя>;

< имя указателя> =new < имя класса> (< входные параметры>);

 

Деструктор — единственный в классе; срабатывает автоматически при удалении объекта, невозможно вызвать вручную.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.