Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
bILYeT_NOV_Ye.docx
Скачиваний:
72
Добавлен:
09.06.2015
Размер:
658.19 Кб
Скачать

16…Ввод/Вывод данных в с.

Каждый исходный файл, который обращается к функции из стандартной библиотеки, должен где то в начале содержать строку #include <stdio.h>. В файле stdio.h определяются некоторые макросы и переменные, используемые библиотекой ввода/вывода. Ввод scanf(<строка формата>,<список ввода>). Вывод printf(<строка формата>, <список ввода>), где строка формата это последовательность символов, выводимых на экран и спецификации форм, определяющих формат величин, присваиваемых элементам списка. Спецификации формата начинаются с % и имеют следующий вид: :[[-] w [d]]c , где все что есть в [] Может отсутствовать , w и d – определенный минимальный, размер поля(w) отводимый под элементы списка. Знак «-» если есть, говорит от том, что выводим число, выравнивая по левому краю. C – если элемент – символ, d или I к целому типу, f- вещественный с фиксированной точкой, G(g) вещь, без незначащих нулей, e(E) вещь, с плавающей точкой, p позволяет вывести указатель в 16-теричном формате, s строка заканчиватся на 0 или определяется с помощью w и d, u-десятичная константа.

17…Ввод/Вывод данных в С++.

Для организации консольного ввода/вывода данных необходимо подключить заголовочный файл iostream. В этом файле определены:

1.Объект cin, который предназначен для ввода данных с клавиатуры.

2. Объект cout, который предназначен для вывода данных на экран.

3.операция >>,которая используется для извлечения данных из входного потока

4. операция <<, которая используется для помещения данных во входной поток

5. Операции форматированного ввода/вывода.

Значение типа char помещается в поток как единичный случай и занимает в потоке поле, размерность которого равна 1;

Строка помещается в поток как последовательность символов и занимает в потоке поле, размерность которого равна длине строки;

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

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

Для формирования потоков используются манипуляторы.

18…Производные типы данных, массивы, работа с массивами.

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

Производные типы можно условно подразделить на две группы:

  • Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции преобразования типов. В группу непосредственно производных типов входят:

    • массивы

    • указатели

    • ссылки

    • перечисления

    • указатели на члены класса.

  • Составные производные типы. В группу составных производных типов входят:

    • классы

    • структуры

    • объединения

Массивы

Массив переменных или объектов состоит из определенного числа однотипных данных, называемых элементами массива. Все элементы массива индексируются последовательно, начиная с нуля. Размещение элементов массива в памяти выполняется последовательно.

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

Статический массив:

<базовый тип><имя массива>[<размер масива>]={<список инициализации>}

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

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

Ввод и вывод массивов производится поэлементно.

Динамические массивы

Имя массива является указателем-переменной, память под элементы массива выделяется в куче(динамической памяти) с помощью специальной команды new.

<базовый тип>*<имя массива>= new <базовый тип>[<размерность массива>]

Указатель а хранит адрес нулевого элемента. Выражение *(а+2) говорит о том, что вначале мы сдвинемся по отношению к нулевому элементу массива а на столько байт, сколько занимает 2 элемента, а затем, обратимся к значению, которое там хранится. Освободить память, выделенную под динамический массив можно командой delete. (delete [] m)

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

Статические двумерные массивы: <базовый тип><имя массива>[число строк][число столбцов]

Динамические двумерные массивы: <базовый тип>**<имя массива>= new <базовый тип>*[<размерность массива>]обращаться можно с помощью индексации( а[i][j]), или с помощью указателей( *(*(а+i)+j))

19…Указатели, работа с указателями в С/С++.

Программист может определить свои собственные переменные для хранения адресов области памяти. Такие переменные называются указателями. В С++ различают три вида указателей: указатели на объект, на функцию, на void, которые отличаются друг от друга свойствами и допустимыми операциями. Указатель не является самостоятельным типом, он всегда связан с каким-либо другим- базовым типом. Указатели позволяют максимально эффективно решить проблему возврата нескольких значений из функции, а также возврата больших объектов, копирование которых нежелательно.

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа(простого или составного). Простейшее объявление указателя на объект имеет следующий вид: <базовый тип>[<модификатор>]*<имя указателя> (модификатор не обязателен и может иметь значение near(по умолчанию), far, huge).

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

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

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

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

1)присваивание указателю адреса существующего объекта:

- с помощью операции получения адреса:(int a=50; int *x=&a; int *y(&a);)

- с помощью значения другого инициализированного указателя(int *z=x;)

- с помощью имени массива или функции;

2) присваивание указателю адреса области памяти в явном виде( int *p=(int*00xB8000000, где 0xB8000000-шестнадцатеричная константа)

3) присваивание пустого значения (int *x=NULL; int *y=0)

4) выделение участка динамической памяти и присваивание ее адреса указателю (int *a= new int; int *b=new int(50);

Очистка памяти производится операцией delete.

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

20… Строковый тип в С/С++, стандартные функции для работы со строками.

Строка – это последовательность символов определенной длины. Существуют два типа данных, кототрые используются для представления строк. Первый: строка представляет собой массив базового типа char, конец которого отмечается нулевым символом ‘\0’, строки данного типа, называемые строками С, все еще широко используются, например, строковые константы в кавычках, такие как “Hello”, реализуются в С++ как строки С.

Второй: строка представляет собой объект класс string, класс string позволяет обрабатывать строки посредством стандартных операторов С++, использовать их в составе стандартных выражений, в классе string контролируются границы массива. Для работы со строками в стиле С надо подключить заголовочный файл cstring, а для работы со строковым классом нужно подключать заголовочный файл string.

Формат объявления строки первым способом: char <имя строки>[n+1];, где n максимальное количество символов в строке. 1 прибавляется для того, чтобы строка вместила нуль-символ. При этом строка может быть заполнена не до конца.

Строковую переменную можно инициализировать при объявлении, при этом необязательно указывать ее размер.

Ввод строк: cin>> (символы будут считываться до тех пор, пока не встретится символ пробела, табуляции или перевода строки, после чего ввод прекратится)

Сin.getline(s,n) – (вводится все трока целиком(до символа перевода строки) ввод строки s, а параметр n задает максимальное количество символов в этой строке, если ввести символов больше n то лишние будут проигнорированы)

Основные операции: Обратится к символу строки можно так же кАк и к элементу обычного массива, указав имя строковой переменной и, в квадратных скобюках, индекс требуемого символа. Строки в стеле С отличаются от переменных других типов днных, и многие операции языка С++ к ним неприменимы. Нельзя использовать строковую переменную в стиле С в операторе присваивания. Чтобы присвоить значение строковой переменной в стиле С, можно воспользоваться стандартной функцией strcpy(s,”Привет”)

Или strncpy(s1,s2,10); - копирует 10 символов из строковой переменной s2(независимо от ее длины) в строковую переменную s1

Сравнение двух строк в стиле С на эквивалентность выполняется с помощью стандартной функции strcmp(s1,s2), она возвращает отрицательное число, положительное число, либо ноль в зависимости от того , окажется первая из переданных ей строк меньше, больше или равной второй с точки зрения лексикографического порядка.

Strchr(s,ch) – функция возвращает указатель на первое вхождение символа ch в строке s, если его нет то возвращает NULL.

Для преобразования строки с стиле С, состоящей из цифр, в число используются функиции atoi(возвращает значение типа int), atol(long), atof(float). Для использования данных функций нужно подключить зазоловочный файл «stdlib» .

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

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

STRING

Strong(s1) – определяет длину строки без нуля Strstr(s1,s2) результат ук. на начало строки s2 в строке s1, если она там есть и 0 если нет. Strcat(s1,s2) в s1 записывается результат объединения s1 и s2 Strapr(s1) преобразует строчную запись в прописную Strlw(s1) противопоставление предыдущей Strset(s,c,n) заменяет в строке s n символов на символ c

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

Объявление: string<имя переменной>(<значение>)

Например:

String s(“Привет”); (переменной s присваивается объект типа стринг, содержащий те же символы и в том же порядке, что и строка привет, но его значение не завершается нуль-символом ‘\0’)

Или srting s=”Привет”;

Ввод: getline(cin,s)- прекращает чтение встретив символ \n

getline(cin,s,’l’)- перкращает считывание встретив знак l

cin>>s – считывает до пробела,табуляции или перевода строки

Класс string поддерживает доступ к символам, как к элементам массива.

Но можно использовать функцию-член at ( s.at(i);) выполняет ту же функцию что и квадратные скобки, но проверяет допустим ли индекс, переданный в качестве аргумента.

s.Lenght() кол-во символов в строке

s.substr(I,sl) возвращает подстроку строки s которая начинается с позиции i и содержит n символов

s.empty() возвращает true если является пустой строкой

s.insert()вставляет в строку s строку s1, начиная с позиции i

s.erase(i,n) удаляет n символов, начиная с позиции i

s.find(sl,i) возвращает индекс первого вхождения строки s1, причемпоиск начинается с позиции i

s.rfind(sl) возвращает индекс первого справа вхождения строки s1 в стоку s

s.replace(I,n,sl) заменяет n символов строки s начиная с позиции i на подстроку s1

s.compare(sl) сравнивает s и s1

21… Работа со структурами и объединениями в С/С++.

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

Описание: struct <имя структуры>

{<тип 1><идентификатор 1>;

<тип 2><идентификатор 2>;

<тип n><идентификатор n>;};

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

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

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

Объединения C++ очень похожи на структуры, за исключением того, как C++ хранит их в памяти; кроме того, объединение может хранить значение только для одного элемента в каждый момент времени. следующая структура определяет объединение с именем distance, содержащее два элемента:

union distance

{  int miles;    long meters;};

Объединение представляет собой структуру данных, подобную структуре C++, и состоит из частей, называемых элементами.

Когда вы объявляете объединение, компилятор C++ распределяет память, достаточную для хранения только самого большого элемента объединения.

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

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

Программы обращаются к элементам объединения, используя точку. Когда ваша программа присваивает значение элементу объединения, то значение, присвоенное, возможно, ранее другому элементу, теряется.

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

Union <имя объелинения>

{<тип 1><идентификатор 1>;

<тип 2><идентификатор 2>;

<тип n><идентификатор n>;};

Различия состоят в следующем:

 

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

2. С++ : В отличие от структур С++, объединения С++ не могут использовать спецификаторы класса доступа: public, private и protected. Все поля объединения имеют доступ private.

  3. Объединения инициализируются через компонент, объяв-

ленный первым

  union local87 (*

int i;

double d;

*) a = (* 20*);

  4. С++ : Объединение не может участвовать в иерархии

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

класса или быть базовым классом. Объединение может иметь

конструктор.

 

5. С++ : Анонимные объединения не могут иметь компоненты-функции.

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