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

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 байта объединения х.