- •1 Билет.
- •2 Билет.
- •3 Билет.
- •4 Билет.
- •5 Билет.
- •6 Билет. Способы описания языков программирования: бнф-нотации, синтаксические диаграммы.
- •7 Билет.
- •8 Билет. Переменные, область действия, время жизни, класс памяти.
- •10 Билет.
- •19 Билет. Ввод/вывод данных на c.
- •21 Билет. Производные типы данных, массивы, работа с массивами.
- •26 Билет. Файлы прямого и последовательного доступа к данным. Форматизированный и неформатизированный ввод/вывод.
- •28 Билет. Понятие подпрограммы, назначение подпрограммы, использование подпрограмм.
- •30 Билет. Передача параметров в подпрограмму. Параметры входные и выходные, параметры передаваемые по значению и по адресу.
- •1) По значению.
- •2) По адресу.
- •31 Вопрос. Использование подпрограмм. Параметры формальные, локальные, глобальные, обращение к подпрограммам, фактические параметры.
- •32 Билет. Передача параметров-массивов в подпрограмму. Примеры.
- •33 Билет. Передача параметров-функций в подпрограмму.
- •34 Билет. Рекурсивные функции. Примеры.
- •35 Билет. Понятие структурного программирования, этап проектирования - композиция и декомпозиция, понятие статической и динамической структуры программы, спецификация программы.
- •36 Билет. Понятие частичной и полной корректности программы, правила вывода - общий вид, правила консеквенции.
- •2 Способа создания динамической переменной:
- •42. Понятие линейного связного списка, типы списков, представление стека с помощью массива, пример использования стека.
- •43. Использование динамических переменных для представления и работы со стеком.
- •44. Очередь, реализация очереди массивом.
- •45. Очередь, представление и реализация основных операций с помощью динамических переменных.
- •46. Реализация основных операций со списком: добавление, удаление, поиск.
- •47. Деревья, основные операции над деревьями, представление дерева массивом.
- •48. Двусвязные линейные списки, построение и обход бинарного дерева.
- •49. Операции поиска и удаления в бинарном дереве.
19 Билет. Ввод/вывод данных на c.
20 билет Ввод/вывод данных на C++.
Организация ввода/вывода данных осуществляется с помощью функций, унаследованных из языка C, и средства языка C++ содержатся в стандартных библиотеках.
Формат ввод/вывод с помощью функций
scanf(<строка формата>,<список вывода>);
printf (<строка формата>,<строка вывода>);
строка формата состоит из последовательно выводимых символов и спецификации типа передачи данных, определяющих тип передаваемых данных из стандартного потока ( ввод -клавиатура, вывод - экран).
Элементы списка ввода разделяются запятой и являются ссылками на вводимые величины.
Спецификация формата начинается символом % и выглядит:
%[[-]W.[d]]C,
W и d - целые положительные константы.
- значит что выводимая величина прижата к левой грани поля, лишние правые заполнены пробелами, если - отсутствует, то прижато к правой, а слева пробелы.
W - количество позиций, отведенных под перед. величину.
.d используется для double-типа и определяет количество цифр в дробной части числа.
C- спецификация, формат данных на его месте может быть:
c - элемент списка.
d или i - элемент списка целая величина
e или E - величина с плавающей точкой.
f - вещественная величина с фиксированной точкой
g или G - вещественная величина без незначащих нулей
o - беззнаковая 8-ричная величина ( без лидирующего нуля )
p - выведет указатель в 16-ричной формы
s - строка, заканчивающаяся нулевым символом.
n - беззнаковая 10чная константа
x или X - беззнаковая 16ричная величина ( без лид О)
% - символ %
Пример:
scanf ("%f%d%c",&x,&vol,&sim);
printf ("%d%c класс -%d часов",t,sim,kol+5);
Если t=11,sim='A' kol = 10 то на экране появится: 11 А класс - 15 часов.
Сложные типы данных.
Программа на С/C++ использует стандартные функции определения констант, типов, классов и макросов из стандартных библиотек.
Чтобы использовать их в программе нужно включить #include заголовочные файлы, содержащие соответствующие определения.
Реализация библиотек функции в скомпилированном виде, т.е. их объектные коды, подключаются к программе на этапе редактирования программы.
#include <stdio.h> подключает к нашей программе файл содержащий прототипы стандартных функций ввода и вывода.
Для реализации в С/C++ к программе подключается заголовочный файл <iostream.h>, который содержит описание набора классов для управления вводом/выводом, в нем определены стандартные объекты - потоки cin и cout и определения помещения << и исключения >> из потока.
21 Билет. Производные типы данных, массивы, работа с массивами.
Производные типы данных.
В С/C++ программист может определять новый тип, использовав специальное описание типа - typedef
typedef float real;
так же
#define real float.
#define исп. для создания макросов.
#define cub(x) x*x*x;
К сложным типам данных относятся массивы, указатели, тип, структура и объединения.
Массив - конечный набор данных одного и того же типа.
Массив определяется именем, типом, размерностью и размером. Массивы одномерные двумерные и многомерные. В памяти всегда размещается как одномерный.
Если в паскале индексы массивов x[a,b,c] , то в C/C++ только x[a][b][c] и индексы нумеруются с 0.
При описании можно определить начальное значение элементов, причем частично.
<тип><имя>[<размер>][={<значения>}] [] -необязательно.
Примеры:
char ch[5]; // ch[0],ch[1],ch[2],ch[3],ch[4]
float x[50]; //x[0],x[1],...,x[49]
float y[10]={1,5;5,7;34} /* y[0]=1,5, y[1]=5,7, y[2]=34,0 */
Ввод/вывод можно реализовать поэлементно с помощью цикла
for (i=0;i<10;i++)
{cout <<"a["<<i<<"]=" ;
cin >> a[i]; /*ввод элементов массива*/
}
22 билет. Указатели, работа с указателями в С/C++.
Указатели - переменные ссылочного типа. Значением указателя является адрес первого байта ячейки занимаемого константой, переменной или функцией, т.е. в С/C++ могут использоваться указатели на переменную, на константу, на функцию, на void.
Чаще всего при описании указателя указывается тип на который может ссылаться указатель.
Примеры:
1) int x,y,z[30];
2) int *p,*y;
3) float t;
Переменным ссылочного типа можно:
1) присвоить пустую ссылку это NULL.
2) Адрес объекта базового типа с помощью операции взятия адреса &.
3) Значение другого указателя соответствующего типа.
4) Можно сравнивать указатели на равенство.
Пример:
q=NULL; P=&x; if (q=NULL) q=p;
p и q равны адресу переменной x.
Обращение к области памяти с помощью указателя называется косвенной адресацией, обозначается *p и *q,то есть после выполненных операторов *p *q и хобозначают одно и то же.
*p=*q+2 <=> x=x+2
С такой переменной можем использовать все операции использованные для базового типа
p=&y; *p=25
y=25
Недопустимо присваивание p=&t ,так как p - указатель на переменную типа int ,а t - float
Указатель на функцию
тип(*имя)(список типов аргументов);
Пример int(*fun1)(double,double);
Указатель на Void применяется в тех случаях, когда или тип объекта который нужно будет хранить заранее неизвестен или мы хотим хранить в одной и той же области данные различного типа.
Указателем могут быть константы или переменные.
Указатель может указывать на константу/переменную.
1) int i; //целая переменная
2) const int ki; // целая константа
3) int *pi; // указатель на целую переменную.
4) const int *pki; // указатель на целую константу
5) int *const kp=&i; // указатель-константа на целую переменную
6) const int*const kpk =&ki; // указатель-константа на целую константу.
Понятие массива связано с понятием указателя. Имя массива без индексов указывает на начало массива
z=&z[o]
Имя массива является постоянным указателем поэтому имени массива нельзя ничего присваивать, но если имя является формальным параметром функции, то оно становится переменным указателем.
В заголовке функции описание параметра chars[] равносильно char*s.
После присваивания p=z или p=&z[0]
p[7] ~ z[7]
В общем случае если p указывает на z[i] , то по определению p+k указывает на z[i+k] т.е. указатель можно складывать с числами, константами, при вычислении таких выражений числа автоматически умножаются на размер объекта, на который ссылается указатель.
p[j]~*(p+j) а &z[k] ~ z+k
Примеры описания указателей.
char *p /* указатель на базовый тип*/
char **t /*указатель на указатель */
char *t[10] /*массив указателей*/
23 билет. Строковый тип в С/C++, стандартные функции для работы со строками.
Работа со строками.
В языке С нет переменных строкового типа, есть массивы, заканчивающиеся 0, это ASCIIZ-строка.
Строки можно описать:
1) как массив символов.
2) С помощью указателя на базовый тип char.
Например:
char *p; /*адрес данных типа char */
char mystring[10]; /*массив символов*/
Память под строку-массив выделяется на этапе компиляции, а под динамическую строку - при выполнении программы. Строки при описании можно инициализировать строковыми константами.
char my_string[10] = "СГУ"
нуль-символ автоматически добавляется.
Строка в динамической памяти создается с помощью специальной функции.
Стандартная библиотека содержит набор функций для работы со строками языка С. Для работы со строками используются следующие заголовки:
#include <string.h> ; #include <cstring>
Функции для работы со строками.
strcpy (s1,s2) копирует s2 в s1
strncopy(s1,s2) копирует n симв из s2 в s1
strcmp(s1,s2) сравнивает s1,s2. значен. функции является 0 если s1=s2, отр. число если s1<s2 и положительное число если s1>s2
strlen (s) длина строки без последнего 0
strstr(s1,s2) указывает на начало строки s2 в строке s1 и NULL, если s2 в s1 не содержится.
strcat(s1,s2) в s1 записывает результат объединения s1 и s2
strupr(s) преобразует строчную запись в прописную
strlwr(s) преобразует прописную запись в строчную
strnset(s,n)?????? заменяет первые n символов на S
Ввести и вывести строку можно с помощью функции scanf и printf.
24 билет. Работа со структурами в С/C++.
Структуры - это набор данных(полей) различного типа.
struct <имя типа> {<описание полей>}
пример.
struct anketa
{char fam[20];
enum {male,female} pol; описали массив из 30 структур типа анкета.
int god r;
float ves;
}
ank[30];
Обращение к полям структуры.
ank[2]pol = male;
x.godr=1980;y.godr=x. godr+5;
p=&ank[5];
p.ves =78.5; /*эквив (*p).ves=78.5; */
strcpy (x.fam, "Петров"); /*Копировать "Петров" в x.fam, но нельзя присвоить x.fam = "Петров", если описать поле fam не как массив, а как указатель на строку */
struct anketa
{char *fam;
..............
}x;
x.fam = "Петров"
Ввод полей структуры можно реализовать так:
cin >> x.godr; cin x.ves; cin>>x.pol;
Поля структуры могут быть любого типа, в том числе и структурами.
Обращение к полю структуры.
ank[2].fio.fam="Иванов";
(Знак (.) обозначает операцию? нахождения указанного поля заданной структуры)
Поля располагаются последовательно, одно за другим, в порядке описания структуры.
Размер поля, отводимый под структуру, равен сумме размеров полей, и адресом поля является адрес младшего байта занимаемой области памяти + адрес поля внутри этой структуры относительно начала этой структуры.
25 билет. Объединения в C/C++, отличие от структур.
Так же как и структура, объединение - это набор данных различного типа, но в отличие от структуры, размер области памяти, занимаемый объединением равен не сумме размеров полей, а размеру максимального поля.
Использование полей, наличие полей - это варианты использования одной и той же области памяти в зависимости от типа поля.
union<имя типа>{<описание полей>}
например:
union int_char_float
{int bim;
char bom[2];
float bat;}
x,y;
Объединение занимает 4 байта памяти.
x,y - переменные типа int_char_float
union int_char_float z;
Переменная z - объединение типа int_char_float
Использ.
x.bim=5
.... x.bom[0] и x.bom[1] - младший и старший байты числа 5.
x.bat = 5,7
вещественное число 5,7 занимает все 4 байта объединения х.