Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Informatika_1_1fedorova_1

.pdf
Скачиваний:
37
Добавлен:
09.06.2015
Размер:
18.73 Mб
Скачать

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

При передаче параметров char/short -> int; float -> double; Floor(x)-ближайшее меньшее целое

Ceil(x)-ближайшее большее целое

16) Операции, используемые в С/С++, перечислимый тип в С/С++.

Унарные операции: ++, --

Бинарные: арифметические, логические, присваивания Тернарные: Условные операции (?:)

Операция new, malloc- выделяет участок памяти с указателем, delete, free- освобождает выделенную память Перечислимый тип определяется как набор идентификаторов с точки зрения языка

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

17)Ввод/вывод данных в С

scanf ("Cтрока Форматов", адрес1, адрес2,...); printf("Строка Форматов", объект1, объект2, ..., объектn); управляющие символы:

'\n' — перевод строки;

'\t' — горизонтальная табуляция; '\v' — вертикальная табуляция; '\b' — возврат на символ;

'\r' — возврат на начало строки; '\a' — звуковой сигнал. Форматы :

19) Производные типы данных, массивы, работа с массивами

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

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

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

В группу составных производных типов входят: классы, структуры, объединения. typedef – определение нового типа

Например, typedef float real; (real => float)

#define real float; (real => float) для создания макросов

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

В памяти машины массивы располагаются линейно одномерно т.о., что многомерный массив массив массивов.

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

Статический: <тип><имя>[<размер>]{=<значения>}; Размер целое константное выражение, определяющее количество элементов по

каждому индексу.

Память выделяется на этапе выделения массива в стеке или сегменте данных. Динамический: <тип>*<имя> = new <тип>[<размерность>];

Ф-я new выделяет место в памяти и присваивает адрес 1-го байта этой области элементу слева.

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

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

1-на объект: <базовый тип>{<модификатор(near, far, huge)>}*<имя указателя> 2-на функцию <тип>(*<имя>)(<список типов аргументов>);содержит адрес в сегменте кода, по которому передается управление при вызове ф-и, используются для косвенного вызова ф-и(не через ее имя, а через переменную, хранящую ее адрес) 3-на void применяется, когда конкретный тип объекта, адрес которого нужно хранить, не определен. Ему можно присвоить значение указателя любого типа, а также сравнить его с любым указателем, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется преобразовать его к конкретному типу явным образом.

Например,

int i;//цел перем

const int ki = 20;//цел константа int *pi;//указатель на цел перем const int *pki;//указат на цел конст

int *const kp = &i;//указатель-константа на цел перем

const int *const kpk = &ki;//указатель-константа на цел конст

Операция разадресации (*) для доступа или изменения значения, адрес которого хранится в указателе.

Операция получения адреса (&) применима к величинам, имеющим имя и размещенным в ОП.

Не является самостоятельным типом. Всегда связаны с другими типами.

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

Строка- последовательность символов определенной длины.

Строка в виде массивов символов. Формат char<имя строки>[n+1(для пустого символа)]

Ввод cin.getline(s,n)

Atoi – int, atol – long, atof – float

Класс string: string <имя>{=<значение>};

Можно присваивать:s3=s1+s2(если s3 окажется мал то выделяется память) можно обращаться как к элементу массива

22) Работа со структурами в С/С++

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

struct<имя структуры> {<тип1><идентификатор1>;-члены-данные/поля

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

<тип> <название()>;-закрытый член-функция

};

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

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

#include <fstream> #include <iostream> #include <iomanip>

using namespace std;

ifstream inp("input.txt"); ofstream out("output.txt"); struct bank

{

int number, year; double money; void print();

};

void bank::print()

{

out << setw(8) << number << setw(20) << money << setw(5) << year;

}

int main()

{

bank people[4]; int i, j, n = 0; if(!inp)

{

cout << "Ошибка при открытии файла input.txt" << endl;

}

else

{

while(inp.peek() != EOF)

{

inp >> people[n].number; inp >> people[n].money; inp >> people[n].year; n++;

};

}

inp.close();

out.close(); return 0;

}

23) Объединения в С/С++, отличие от структур

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

идентичен обращению к элементу вложенной структуры. Объединение можно инициализировать только данными того типа, который имеет его первый элемент. <тип объединения>::= union <имя типа>{<описания полей>};

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

24) Файлы прямого и последовательного доступа к данным, форматированный и неформатированный ввод/вывод

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

Форматированный с помощью средств языка С(<stdio.h>) , и неформатированный-

С++(<fstream.h>).

Данные рассматриваются как поток байтов, а физически поток-файл на диске/устройство(клава..)

5 предопределtнных потоков: stdin, stdout, stdeer – вывод сообщений об ошибках, stdprn- принтер, stdaux. Работа с потоком начинается с его открытия: в оперативной памяти выделяется специальная область памяти буфер. Существуют ф-и, управляющие размером буфера. Данные передаются по блокам или до закрытия потока. Открыть поток для форматированной передачи данных:

1. FILE*<имя переменной>

<имя переменной> = fopen(<имя ф-ла на диске>,<режим>); <режим>: “r” – чтение, указатель на начале ф-ла

“w” – запись, указатель на начале ф-ла “a” – дозапись, указтель на конце ф-ла

“r+”, “w+”, “a+” – поток и для чтения, и для записи

“rt”, “wb”, “at+” – формат инфы, где t - текстовый, b – бинарный. Если символа нет, то по умолчанию текстовый.

если поток открыт успешно, создается указатель на структуру типа FILE, содержащую инфу, необходимую для работы с потоком, иначе – NULL. freopen(<имя ф-ла на диске>,<режим>,<указатель на ф-л>); - как fopen , но закрывает поток, если он ранее был открыт.

fscanf(<имя перменной>,<строка формата>,<список>) – чтение из потока fprintf(<имя перменной>,<строка формата>,<список>) – запись в поток fclose(<указатель на ф-л>)закрыть ф-л

fclose all() – закрыть все ф-лы

feof(<ф-ая переменная>) – просмотр всех элементов ф-ла, организация цикла по ф-лу. Возвратит 0, если конец ф-ла не достигнут, иначе не 0.

неформатированная передача данных <fstream.h>

ifstream <имя потока>(<имя ф-ла на диске>); - чтение ф-ла с диска

ofstream <имя потока>(<имя ф-ла на диске>); - устанавливает соответствие между именем потока и ф-м на диске и записывает

fstream <имя потока>(<имя ф-ла на диске>); - чтение и запись <<, >> - помещение/извлечение в/из поток/а

<имя потока>.close() – закрытие потока

Произвольный доступ. Выше описана работа с файлами в режиме последовательного доступа. Для обеспечения произвольного доступа используется внутренний указатель файла, который определяет текущий индекс обрабатываемого байта файла, и две пары функций. seekg(), seekp() – используется потоками ввода и устанавливает указатель в нужную позицию.

tellg(), tellp() – используется потоками вывода и сообщает текущую позицию указателя.

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

in.seekg(3, ios::end); // устанавливает указатель на позицию 3 относительно конца файла

streampos n = in.tellg(); // переменной n присваивается текущая позиция чтения streampos n = in.tellg(); // в переменную n запишется текущая позиция чтения streampos n = out.tellp(); // в переменную n запишется текущая позиция записи

25) Работа с файлами в С/С++, примеры

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

fteel(<ф-я переменная>) или fgetpos(<ф-я переменная>, <имя>) – указатель ф-ла Fseek(<ф-я перменная>,<смещение>,<база>) – перемещает указатель на нужную компоненту: где смещение есть константа, определяющая, на сколько байтов нужно переместить указатель относительно базы. А параметром базы могут быть: SEEK_SET – начало ф-ла, SEEK_CUR – текущая позиция, SEEK_END – конец ф-ла

Fsetpos(<ф-я переменная>,<позиция>) – куда нужно переместить указатель ф-ла с помощью ф-и f.getpos()

Rewind(<ф-я переменная>) – переместить указатель на начало ф-ла, соответствующего этой ф-ой перемнной

Malloc(<размер>) выделяет участок памяти, заданного размера в байтах

для текста: Fread(<буфер>,<длина записи>,<кол-во записей>,<ф-ая переменная>) – чтение из ф-ла соответствующей ф-ой переменной заданного кол-ва записей заданной длины в буфер

Fwrite(<буфер>,<длина записи>,<кол-во записей>,<ф-ая переменная>) – запись в файл соответствующей ф-ой переменной заданного кол-ва записей заданной длины из буфера

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

ifstream in(“infile.dat”, ios::binary);

На нижнем уровне двоичного ввода/вывода находятся функции get() и put(). Функция get() считывает один символ из соответствующего потока и помещает его значение в переменную типа char, при этом возвращает ссылку на поток, связанный с предварительно открытым файлом. При считывании символа конца файла данная функция возвратит вызывающему потоку значение false. Пример: in.get(ch);

Функция put() записывает символ в поток и возвращает ссылку на этот поток.

Пример: in.put(ch);

Функции get и put используются для считывания данных побайтно, что позволяет нам обрабатывать текстовые данные, представленные в ASCII кодировке. Однако в двоичных файлах могут храниться последовательности целых и вещественных типов, где каждое значение занимает от 2 до 10 байт. В этом случае использование этих функций невозможно. В таком случае нужно использовать функции read() и write(), предназначенные для считывания и записи блоков двоичных данных.

Пример функции read(): double j;

in.read((char*) &j, sizeof(double));

Функция считывает из вызывающего потока sizeof(double) байт и передает их в буфер j. Если конец файла достигнут до того, как было считано нужное количество байт, то выполнение функции read() прекращается, а в буфере оказывается столько байт, сколько их было в файле.

Пример функции write(): int i = 20;

out.write((char*) &i, sizeof(int));

Функция записывает в соответствующий поток из буфера i столько байт, сколько задано параметром sizeof(int).

(26)Понятие подпрограммы(ПП),назначение подпрограмм, использование подпрограмм.

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

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

Использование подпрограмм позволяет:1) избегать дублирования одинаковых частей программ, делая ее короче, но увеличивая время выполнения, за счет организации передач параметров, реализация обращения к подпрограмме и выхода из нее.2)сделать структуру программы более четкой и понятной, с помощью обращения подпрограммы к модулям. Программа, разбитая на части легче компилируется.3)позволяют расширить язык программирования, добавляя новые операции, функции и добавляя новые операторы.4)повторно использует ранее разработанные программы.

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

(27)Подпрограммы в C/C++, функции, возвращающие значение и не возвращающие знаечение,примеры.

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

действий при разных исходных данных.Описание функции в С++ осуществляется следующим образом:

<тип возвращаемого значения><Имя функции>(<список фактических параметров>)

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

Невозвращающая значение:

void main(float x)

Возвращающая значение: int min(int a,int b)

{return (a>b)? b:a;}

(28)Передача параметров в подпрограмму, параметры входные и выходные, параметры, передаваемые по значению и адресу.

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

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

(29)Использование подпрограмм, параметры, формальные, локальные, глобальные, обращения к подпрограммам, фактические параметры.

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

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

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

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

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

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

иэти переменные никак не связаны между собой.

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

(30)Передача параметров массивов в подпрограмму,примеры.

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

Передача с определенным параметром. Пример:

void func (int mas[100])

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

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

void func (int mas[])

где mas объявлен как целочисленный массив неизвестного размера. Поскольку С не предоставляет проверку границ массива, настоящий размер массива не имеет никакого отношения к параметру (но, естественно, не к программе). Данный метод объявления также определяет mas как целочисленный указатель.

Передача через указатель. Пример:

void func (int *mas)

Он допустим, поскольку любой указатель может быть индексирован с использованием [], если он является массивом. (На самом деле массивы и указатели очень тесно связаны друг с другом.) Все три метода объявления параметра приводят к одинаковому результату - указателю. С другой стороны, элемент массива

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