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

Оператор "запятая" (,)

Используется для последовательного выполнения двух выражений.

expression1, expression2

var i, j, k; j=25; for (i = 0; i < 10; i++, j++) { k = i + j; }

Терна́рная усло́вная опера́ция — во многих языках программирования операция, возвращающая свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом.

В Си тернарная операция имеет следующий синтаксис:

o1 ? o2 : o3

min = (a < b) ? a : b;

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

int printf( const char *format [, argument]... );

Для ввода информации с клавиатуры удобно использовать функцию scanf() библиотеки stdio.h, которая имеет следующий синтаксис:

int scanf( const char *format [,argument]... );

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

Под массивом понимают набор данных одного и того же типа, имеющих одно общее имя. Каждый элемент массива определяется именем массива и порядковым номером элемента, который называется индексом. Индекс в языке Си всегда целое число. Индексы массивов в языке Си начинаются с 0.

Объявление массивов в программе

Основная форма объявления массива размерности N такова:

тип <имя массива> [размер 1][размер 2]...[размер N]

Таким образом, одномерный массив будет описан как:

тип <имя массива > [размер];

тип - базовый тип элементов массива,

размер - количество элементов одномерного массива.

При описании двумерного массива объявление имеет следующий вид:

тип <имя массива> [размер 1][размер2];

В этом описании можно представить объявление двумерного массива как объявление массива массивов, т. е. массив размера [размер2], элементами которого являются одномерные массивы <имя массива>[размер 1].

Пример: int mas [5]; unsigned arr[30]; double a[10];

К элементу двумерного массива можно обращаться и так:

*(a[i] + j) или так: *(*(а +i) +j)

Размещение массива в памяти

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

Распределения памяти осуществляется с помощь функций malloc() и calloc().

Int *X;

X = (int*) malloc(sizеof(int));

В качестве аргумента функции динамического распределения памяти передается число байт, которые следует зарезервировать в «куче». Функция возвращает указатель на тип void, поэтому такой указатель совместим с любым указателем, который может встретиться в левой части оператора присваивания.

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

  1. Дайте определение понятию указатель. Перечислите арифметические действия, которые можно и нельзя выполнять над указателями, приведите примеры. Объясните связь указателей и массивов в языке Си.

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

Указатели и массивы тесно связаны между собой. Имя массива является указателем на его первый элемент, т.е. для массива int v[10] v и v[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива - это адрес начала последовательно расположенных его элементов. Рассмотрим обращение к элементам массива на примере. Пусть объявлены : массив из 100 значений float и указатель на объект типа float, тогда:

float p[100];

float *q;

int i;

если выполнить операцию q=p; то обращения к элементу массива p: p[i] , *(q+i) и *(p+i) эквивалентны.

Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма удобнее для читаемости текста, вторая - эффективнее по быстродействию программы.

С Указателями можно использовать только четыре арифметических оператора: ++, --, + И -. Чтобы Лучше понять, Что происходит при выполнении арифметических действий с указателями, Начнем с примера. Пусть p1 — Указатель на int-Переменную с текущим значением 2 000 (т. е. p1 содержит адрес 2 000). После Выполнения выражения p1++; содержимое указателя p1 станет равным 2 004, А не 2 001! Дело В том, Что при каждом инкрементировании указатель p1 будет указывать на следующее int-значение. Поскольку В C int-Значения занимают четыре байта, То при инкрементировании p1 его значение увеличивается на 4.

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

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

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

//Динамический массив #include <iostream> using namespace std; int main() {   int value;   cout << "Skol'ko chisel vy budete vvodit'? ";     cin >> value;    //динамически создаем массив     int *array = new int[value];     for(int k = 0; k < value; k++)     {        cout << "Vvedite chislo: "; cin >> array[k]; }  cout << endl << "Byli vvedeny chisla: " << endl;  

 for(int m = 0; m < value; m++)         cout << array[m] << "\t";     //освобождаем память, которую выделяли ранее под массив         delete []array;     return 0; }

  1. Приведите синтаксис описания и обращения к символьным переменным языка Си. Поясните способ хранения и представления символьных переменных в памяти. Опишите стандартные функции классификации символов из библиотеки <ctype.h>. Приведите примеры работы с символьными переменными.

Например, описание: char str[11]; предполагает, что строка str содержит 10 символов, а последний байт зарезервирован под нулевой символ .

Функции имеют прототипы следующего вида:

int имя_функции( int );

Функции классификации

#include <ctype.h>

int isalnum(int c); //Если аргумент функции является либо буквой, либо цифрой, она возвращает ненулевое значение.

int isalpha(int c); //Возвращает ненулевое значение, если ее аргумент является буквой, в противном случае возвращается нуль.

int isblank(int c); int iscntrl(int c);

int isdigit(int c); int isgraph(int c);

int islower(int c); int isprint(int c);

int ispunct(int c); int isspace(int c);

int isupper(int c); int isxdigit(int c);

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

Пример:

main()

{ // объявление трех символьных массивов (трех строк), максимальное //количество символов в них равно 9

char str1[10],str2[10],str3[10]; clrscr(); printf("Пример ввода строк разными способами."); printf("Введите строку 1: "); gets(str1); printf("Введите стр 2 : "); scanf("%s",str2); printf("Введите строку 3 : "); cin>>str3; }

  1. Поясните принцип описания и обращения к строковым переменным языка Си. Объясните способ их размещения в памяти. Поясните принцип перевода строки в число и наоборот. Приведите примеры стандартных функций обработки строк.

При инициализации строки символов ее можно рассматривать как одномерный массив символов и соответственно инициализировать как одномерный массив:

char str[]=”Строка”;

Также можно инициализировать строку через указатель на тип char. Достаточно присвоить указателю значение строковой константы. При этом не нужно заранее выделять память для строки. Компилятор по внешнему виду строки определит необходимое количество байтов, в том числе один байт на символ конца строки:

char *p;

p=”Строка”; или char *p=”Строка”;

Функции преобразования строки S в число (stdlib.h):

- целое: int atoi(S);

- длинное целое: long atol(S);

- действительное: double atof(S);

при ошибке возвращают значение 0.

Функции преобразования числа V в строку S (stdlib.h):

- целое: itoa(int V,char S,int kod);

- длинное целое: ltoa(long V,char S,int kod);

void *memcpy(void *dest, const void *src, size_t n);

копирует n байт из области памяти src в dest, которые не должны пересекаться, в противном случае результат неопределен (возможно как правильное копирование, так и нет)

void *memchr(const void *s, char c, size_t n);

возвращает указатель на первое вхождение c в первых n байтах s, или NULL, если не найдено

int memcmp(const void *s1, const void *s2, size_t n);

сравнивает первые n символов в областях памяти

char *strcat(char *dest, const char *src);

дописывает строку src в конец dest

char *strchr(const char *, int);

ищет символ в строке, начиная с головы и возвращает его адрес, или NULL если не найден

char *strcpy(char *toHere, const char *fromHere);

копирует строку из одного места в другое

char *strncpy(char *toHere, const char *fromHere, size_t n);

копирует до n байт строки из одного места в другое

size_t strlen(const char *);

возвращает длину строки

C++ трактует символьную строку как массив типа char.

Главное различие между символьными строками и другими типами массивов заключается в том, как C++ указывает последний элемент массива, Как вы уже знаете, программы на C++ представляют конец символьной строки с помощью символа NULL, который в C++ изображается как специальный символ '\0'. Когда вы присваиваете символы символьной строке, вы должны поместить символ NULL ('\0') после последнего символа в строке.

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

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

Пример определения шаблона структуры:

struct student

{char name [30]; int kurs; char gruppa [3]; int stipendia; };

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

Доступ к конкретному элементу структуры осуществляется с помощью операции "точка".

Структуры, как и переменные другого типа, могут объединяться в массивы структур. Чтобы объявить массив структур, надо сначала задать шаб­лон структуры , а затем объявить массив:

struct student massivstuct[20];

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

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

Когда структура является элементом другой структуры, то она называется вложенной структурой. Например, ниже структура addr вложена в структуру emp:

struct emp {

struct addr address; float wage; } worker;

Массивы структур:

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

struct addr ainfo[100];

Указатели на структуру объявляются путем помещения оператора * перед именем структурной переменной. Например: struct addr *addr_ptr ;

Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент:

struct bal {

float balance; char name[80]; } person;

struct bal *p; /* объявление указателя на структуру */

тогда p = &person; помещает адрес структуры person в указатель р.

Для доступа к элементам структуры с помощью указателя на структуру следует использовать оператор «стрелка». p>balance .

  1. Дайте определение понятиям: объединение, перечисление, битовое поле. Опишите способ их объявления. Поясните, где, как и для чего используются перечисленные типы данных. Объясните назначение ключевого слова typedef, приведите примеры его использования.

    Объединения (union)

В языке С++ определен еще один тип для размещения в памяти несколь­ких разнородных переменных – это объединения. Объявляется шаблон объединения так же, как и структура:

union u

{ int i; char ch; long int l; } alfa;

В отличие от структуры для переменной типа union места в памяти выде­ляется ровно столько, сколько надо элементу объединения, имеющему наибольший размер в байтах. Синтаксис использования эле­ментов объединения такой же, как и для структуры: u.ch = 'c';

Для объединений также разрешена операция ->

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