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

Основы Программирования (теория, ч.2)

Билет 1. Основные типы данных в С++

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

В C++ нет жёсткого стандарта на диапазоны значений арифметических типов (в стандарте языка оговариваются лишь минимально допустимые значения). В принципе, эти диапазоны определяются конкретной реализацией. Обычно выбор этих характеристик диктуется эффективностью использования вычислительных возможностей компьютера. Зависимость языка от реализации создаёт определённые проблемы переносимости. C++ остаётся машинно-зависимым языком.

К целочисленным типам относятся типы, представленные следующими именами основных типов:

char

short

int

long

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

signed

unsigned

Эти модификаторы изменяют формат представления данных, но не влияют на размеры выделяемых областей памяти.

Модификатор типа signed указывает, что переменная может принимать как положительные, так и отрицательные значения. Возможно, что при этом самый левый бит области памяти, выделяемой для хранения значения, используется для представления знака. Если этот бит установлен в 0, то значение переменной считается положительным. Если бит установлен в 1, то значение переменной считается отрицательным.

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

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

Здесь также многое определяется конкретной реализацией. В версиях Borland C++ данные типов, обозначаемых как signed, short и int в памяти занимают одно и то же количество байтов.

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

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

Тип данных Байты Биты Min Max

signed char 1 8 - 128 127

unsigned char 1 8 0 255

signed short 2 16 -32768 32767

enum 2 16 -32768 32767

unsigned short 2 16 0 65535

signed int 2 16 -32768 32767

unsigned int 2 16 0 65535

signed long 4 32 -2147483648 2147483647

unsigned long 4 32 0 4294967295

К плавающим типам относятся три типа, представленные следующими именами типов, модификаторов и их сочетаний:

float

double

long double

Как и ранее, модификатор типа входит в число имён основных типов.

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

297.7

2.977*10**2

2.977E2

и ещё один пример…

0.002355

2.355*10**-3

2.355E-3

В научной нотации слева от символа E записывается мантисса, справа - значение экспоненты, которая всегда равняется показателю степени 10.

Для хранения значений плавающих типов в памяти используется специальный формат представления вещественных чисел. Этот формат называется IEEE форматом.

Ниже представлены основные характеристики типов данных с плавающей точкой (опять же для Borland C++ 4.5):

Тип данных Байты Биты Min Max

float 4 32 3.4E-38 3.4E+38

double 8 64 1.7E-308 1.7E+308

long double 10 80 3.4E-4932 3.4E+4932

Подведём итог.

Имена типов данных и их сочетания с модификаторами типов используются для представления данных различных размеров в знаковом и беззнаковом представлении:

char

signed char

unsigned char

short

signed short

unsigned short

signed

unsigned

short int

signed short int

unsigned short int

int

signed int

unsigned int

long

signed long

unsigned long

long int

signed long int

unsigned long int

Все эти типы образуют множество целочисленных типов. К этому множеству также относятся перечисления.

А вот сочетания имён типов и модификаторов для представления чисел с плавающей точкой:

float

double

long double

Вот и всё об основных типах. Помимо основных типов в C++ существуют специальные языковые средства, которые позволяют из элементов основных типов создавать новые, так называемые производные типы.

Билет 2. Способы определения констант в С++

Константы

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

#define MyConstant 10 ( о директиве #define см. тут)

const int MyOtherConstant = 10 ;

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

Билет 3. Использование суффиксов для задания типов констант.

Можно явно задать тип константы, используя для этого суффиксы. Существует 3 вида суффиксов F float U unsigned L long(для целых и вещественных) кроме того, допускается совместное использование суффиксов UL/LU

3.14F float

3.14L long double(10 байт)

Производные типы.

Операции, создающие из основных типов новые типы

* - указатель на переменную

*const - константный указатель

& - ссылка

[ ] – массив

Константы.

1. Целые десятичные числа, начинающиеся не с 0.

2. Целые восьмеричные числа, начинаются с 0.

3. Целые шестнадцатеричные числа. Запись начинается с 0х

4. Если в записи числовой константы присутствует десятичная точка (2.5) или экспоненциальное расширение (1Е-8),то компилятор рассматривает её как вещественное число и ставит ей в соответствие тип double

5. Символьные константы заключаются в апострофы. Например, ‘a’ . Строковые константы, представляющие собой символьные последовательности, заключается в двойные кавычки “abs”

Особую разновидность символьных констант представляют управляющие символы. Их назначение – управление выводом на экран.

\n – переход на новую строку

\t – табуляция

Именованную константу можно определить с помощью предпроцессорной директивы #define

Билет 4. Арифметические и логические операции

- вычитание

+сложение

*умножение

/ остаток от деления

% деление по модулю

++ инкремент (унарная операция увеличения на 1)

-- декремент

Операция % применима только к целым числам, все остальные к любым. Если делимое и делитель – целые числа, то результат – целое число. Например 7/3 = 2

Если хоть один из операторов вещественный, то результат вещественный.

1./5=0.2

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

Различие префиксной и постфиксной формы проявляется при использовании их в выражениях

A=3 .b=2 . c=a++ * b++, то a=4. b=3. c=6

A=3 .b=2 . c=++a * ++b, то a=4. b=3. c=12

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

Билет 5. Операции отношения и присваивания

Операции отношения

< меньше

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

> больше

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

== равно

!= не равно

Операция присваивания.

В с++ есть операция присваивания = , а не оператор присваивания как в Pascal. В связи с этим присваивание может встречаться в неожиданных формах.

A=b=c=x+y;

X=sqrt(c=3*x);

Другим свойством операции присваивания является то, что она может совмещаться с бинарными операциями. Например x*=4 , означает что x = x*4

Билет 6. Операция *sizeof*. Операции явного преобразования типа.

Операции явного преобразования типа.

(long) 8

(float) 1

(int) x%2

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

Операция *sizeof*.

Эта операция имеет 2 формы записи.

1. Sizeof( тип )

2. Sizeof( выражение)

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

билет7. Операция *запятая*. Пустой оператор.

Операция *,*

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

A=(x=3,5*x). В результате получим a= 15 , x=3.

Пустой оператор.

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

Билет 8. Потоковый и форматный ввод данных( *cin * и *scanf*)

Билет 9. Потоковый и форматный вывод данных( *cout* и *printf*)

Билет 10. Программирование ветвлений. Операция *условие* (Условное выражение)

Это единственная операция, которая имеет 3 операнда. Формат операции :

выражение 1 ? выражение 2 : выражение 3;

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

Билет 11. Программирование ветвлений. Операция *if * ( оператор, алгоритм работы, пример

If (выражение) оператор 1;

Else оператор 2;

Найти наибольшее значение из 2-ух переменных a и b .

If (a>b) max=a;

Else max = b;

Бидет 12. Программирование ветвлений. Операция *switch * ( оператор, алгоритм работы, пример)

Формат оператора выбора switch (целочисленное выражение)

{ case конст_1 : список_операторов;

case конст_2: список_операторов;

….

Default : список_операторов;

}

Последняя строка default может отсутствовать. Например :

Билет 13. Цикл с предусловием ( оператор, алгоритм работы, пример)

Билет 14. Цикл с постусловием ( оператор, алгоритм работы,пример)

Билет 15. Цикл с параметром ( оператор, алгоритм работы,пример)

Билет 16. Оператор безусловного перехода goto

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

Билет 17. Функции и формат их определения

Функция — самостоятельная единица программы, спроектированная для реализации конкретной задачи. Каждая функция должна иметь имя, которое используется для вызова. Имя функции main(), которая обязательно присутствует в любой С-программе, зарезервировано. В программе на С могут присутствовать несколько функций, причем функция main() необязательно должна быть первой. Но с функции main() всегда начинается выполнение любой С-программы. При вызове функции ей могут быть переданы данные посредством аргументов. Функция может возвращать значение, которое и есть основной результат выполнения функции; этот результат подставляется на место вызова функции, где бы этот вызов не встретился в программе. Могут быть определены функции, которые не имеют никаких параметров и не возвращают никакого значения. Тем не менее действие таких функций может состоять в изменении внешних переменных или статических переменных или выполнением каких-либо других действий, не связанных с данными. Определение функции задает имя функции, типы и число ее формальных параметров, а также объявление и операторы, которые определяют действие функции. Последовательность объявлений объявлений и операторов называется телом функции. В определении функции также может быть задантип значения, возвращаемого функцией (он же и является типом функции), а также класс памяти. Если функции не передаются аргументы, то вместо списка формальных параметров необходимо указать ключевое слово void. Если функция возвращает значение, то должен быть выполнен оператор return, содержащий некоторое значение. Значение возврата не определено, если оператор return не выполнен, или если в операторе return не было указано выражение.

Объявление функции:

тип_результата имя_функции(формальные параметры)

{

объявления и операторы (тело функции);

}

Билет 18. Понятие прототипа функции

Однако, для того, чтобы компилятор мог выполнить проверку соответствия типов передаваемых аргументов типам формальных параметров в определении функции, до вызова функции нужно поместить объявление (прототип) функции Прототип функции имеет такой же формат, что и определение функции, с той лишь разницей, что не имеет тела функции и что заголовок функции заканчивается точкой с запятой. Прототип функции задает имя функции, типы и число формальных параметров, тип возвращаемого значения (тип функции) и класс памяти. Формальные параметры в прототипе могут иметь имена, но эти имена компилятору не нужны. Прототип приведенной выше функции имеет вид:

int rus(unsigned char );

Данный прототип объявляет, что функция rus() возвращает целое значение (int) и имеет один формальный параметр типа unsigned char. Вызов функции представляет собой либо отдельный оператор вызова, либо выражение, которое является частью другого оператора, как правило, присваивания. При вызове функции указывается ее имя и фактические аргументы, которые подставляются вместо формальных параметров в определении функции. Прототипы библиотечных функций, таких как getchar(), printf(), находятся в файлах включения (stdio.h), поставляемых вместе с системой программирования.

Билет 19. Массивы: основные понятия, ввод и вывод данных

Массив — элемент, который содержит подэлементы одного типа. Нумерация массива начинается с 0. Он может быть объявлен при описании: тип_данных имя_массива [количество_элементов]; Обращение к элементу массива: имя_массива [номер_элемента]; PS: int mas[10] – 0-9, 10 не включается.

Ввод и вывод данных в массиве происходит непосредственно, через цикл for(){}, внутри которого проискодит запись/вывод объявленного ранее массива:

int mas[10];

for(i=0;i<10;i++) где 10 – количество элементов массива

{

cin>>mas[i]; Ну или что-то в этом духе

cout<<mas[i]; А это уже вывод

}

Билет 20. Массивы: одномерные и многомерные

Одномерные массивы в С++ рассматриваются как массивы, элементы которых являются структурной единицей, т.е. Не имеют вложенности.

Многомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы.

Синтаксис: int mas [10] [20]; Массив в 10 элементов, содержащие в себе 20 подэлементов каждый.

имя_типа имя_массива [кол-во_эл-в] [кол-во_эл-в2];

Массив может быть и более вложен: int mas [3] [2] [5];

Билет 21. Указатели: основные понятия, описание, указатели и массивы

Указатель — это адрес поля памяти, занимаемый программными объектами.

Int a=5;

char c='G';

float r=1,2E8;

Таблица занимаемой памяти

Память

FFC0

FFC1

FFC2

FFC3

FFC4

FFC5

FFC6

Переменная

a

c

r

Значение

5

'G'

1,2*10^8

Тип *имя_переменной;

int *pti;

После такого описания переменная pti может принимать значения указателя на величину целого типа(int). Указателям могут присваиваться значения адресов объектов только того типа, с которым они описаны:

pti=&a;

В результате:

pti=FFC0;

pti=null; В stdio.h определена константа: нулевой указатель с именем NULL. Означает отсутствие конкретного адреса ссылки. Через * можно ссылаться через указатель к самой переменной:

a *pti;

Указатели на массивы.

Int x [10];

X – указатель на нулевой эт-т массива в памяти PC. x=&x[0]

имя_массива[индекс] ~ *(имя_массива+индекс)

x[5]~*(x+5)

~*(5+x)

Переприсваивать массивы ошибочно(a[10]=b[10]), это нужно делать лишь только по-элементно.

Билет 22. Обработка символьных строк (основные понятия, пример)

Символьные строки в С++ представлены, как массивы символов, последним из которых является '\0', внутренний код которого равен 0(конец строки). Ограничений по длине символьного массива нет.

Пример:

char str [20];

char s[]=”строка”; //Будет выделено 7байт, т. к. последний символ '\0'

Пример программы:

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

#include <stdio.h>

#include <conio.h>

void main()

{

char s[]=”fh5j”

int i=0;

clrscr();

puts(s);

while(s[i])

{

s[i++]='*';

puts(s);

}

printf(“\n Dlina stroki=%d”,i);

getch();

}

Результат:

fh5j

*h5j

**5j

***j

Dlina stroki=4

Билет 23. Структуры и объединения

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

Элемент структуры — поле. Каждому полю соответствует имя и тип.

Struct имя_типа

{ определение элементов; }

struct Student

{

char fio[100];

int kurs;

};

Void main()

{

Student std1;

...

}

Или:

struct Student

{

...

} std1;

Обращение к полям:

имя_структуры.имя_элемента;

Student stud1={«Иванов», 2};

Определим указатель к структуре:

Student *pst, stud1;

Тогда, после выполнения операции присваивания (pst=&stud1) к каждому элементу структуры можно будет обратиться 3-я способами:

stud1.fio

(*pst).fio

pst → fio

Поля структуры могут сами иметь структурный тип. Допускается использование массивов структур.

Объединение.

Union имя_типа

{ определения_элементов; };

Отличия от структуры в способе организации внутренней памяти. Общий объём занимаемый в памяти равен объёму самого большого поля. Изменение значения любого поля объединения меняет значения других полей.

Билет 24. Работа с файлами

Работа с файлами начинается с объявления указателя на поток.

FILE *имя_указателя;

FILE *fp;

Применяется библиотека stdio.h. Следующий шаг — открытие файла стандартной функцией:

fopen();

имя_указателя=fopen(имя_файла, режим_открытия);

Пример:

fp=fopen(C:\bbc\proba.txt, “r”);

Режимы открытия файлов:

r - открыть для чтения

w - -//- запись

a - -//- добавление

r+ - -//- чтение и запись

w+ - -//- создать для чтения и записи

a+ - -//- добавление или создать для чтения/записи

Открытие уже существуещего файла для записи ведёт к потере данных в нём. Открыть для чтения можно только существующий файл.

\n – возврат строки и перевод каретки.

B – режим двоичного кода. При открытие файла к режиму добавляется эта буква.

Пример:

rb

r+b

wr

T – текстовый режим.

Rt

r+t

wt

Если при открытии файла произошла ошибка, то функция fopen() возвращает значение NULL.

Fclose(); //Закрытие файла

Запись символов в поток:

putc();

Запись цеых чисел в поток:

putw();

Считывание:

puts(); и putw(); аналогично.

25 Билет. Директивы препроцессора. Определение макросов. Подключение файлов

Препроцессор С++ - это программа назначение которой заключается в обработке исходного текста программы до её компилятора. Препроцессор включает в себя следующие директивы:

#define – определение макроса. Макрос — средство замены одной последовательности символов на другую.

#undef — отмена определения макроса.

#include — включить текст из выбранного файла.

#if — компиляция, если выражение истино.

#ifndef — компиляция, если макрос неопределён.

#ifdef — компиляция, если макрос определён.

#else — выражение, если выражение ложно.

#elif — составная директива else и if.

#endif — окончание группы компиляции по-условию.

#line — замена новым номером строки или именем исходного файла.

#error — формирование ошибок трансляции.

#pragma — действие определяется реализацией.

# - пустая директива.

#define

Используется для записи идентификатора.

Пример:

#define begin {

#define end }

void main()

begin

операторы;

end

#define STROKA “Здесь текст”

cout<<STROKA;

#define pk cout<<”Бла-бла-бла”

void main()

{

pk;

...

}

Если заменяемая строка слишком длинна, то её можно продолжить на следующей строке, используя в конце символ \

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

Пример:

#define MIN(a,b) ((a)<(b))?(a):(b)

cout<<”\nMIN from X and Y=”<<MIN(x,y);

Возможно использование выражений.

#undef

Используется для отмены замены в тексте

Пример:

#define m 16

#undef m

Директиву #undef удобно применять при разработке больших программ, особенно, когда работает над проектом 1< программиста.

С помощью #define и #undef можно избавиться от повторяющихся переменных.

#include

Используется для включения текста из файла

#include<имя_файла>

#include”имя_файла”

суффикс h помещается только в заголовке в программе.

Билет 26. Объектно-ориентированное программирование. Классы и объекты. Компоненты классов

Использование классов — основное отличие оо-программирования от структурного.

Класс — это производный структурный тип, введённый в программировании на основе уже существующих типов.

Объект — конкретные переменные типа.

ключ_класса имя_класса

{

список_компонентов;

};

ключ_класса — одно из служебных слов:

  • class

  • struct

  • union

Определение класса заканчивается ;

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

Struct complex

{

double real;

}

Класс: все компоненты по-умолчанию закрыты.

Структура: все компоненты по-умолчанию открыты.

Билет 27. Инкапсуляция. Режимы доступа к элементам класса

Доступ определяется правами доступа, которые устанавливаются следующие:

  • private(использование только функции данного класса)

  • public

  • protected

Private – устанавливается по-умолчанию для служебного слова class.

Public - -//- слова struct.

Protected – используются лишь при создании иерархии классов.

Union – использование в качестве ключа_класса приводит к экономии пространства в памяти и ещё некоторым интересным аспектам. Общедоступно, но изменяемо спецификаторами.

Инкапсуляция — скрытие данных внутри объекта.

:: - операция принадлежности, при объявлении своих прототипов.

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

void drob::vvod(void)

{…}

drob y;

y.vvod();

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