Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по ПвСИБ. Программирование на языке C.docx
Скачиваний:
17
Добавлен:
27.04.2022
Размер:
125 Кб
Скачать
☆

Задание 6

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

Прототип функции _Bool insert(const char *src, const char *str, int index, char *dest, int len).

Функция не должна использовать функции консольного ввода-вывода.

Задание 7

Написать функцию main, демонстрирующую работу ранее разработанных функций

Индивидуальные варианты заданий

Контрольные вопросы

  1. В какой области памяти хранятся строковые литералы?

Практикум №6 Структуры, объединения, перечисления и битовые поля

Цель практикума

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

Краткие теоретические сведения

Структуры

Структура – это последовательность объектов, имеющих в общем случае разные типы. Элементы структуры имеют название и занимают в памяти соседние ячейки. Ниже показано определение структуры и пример её использования.

Определение структуры

Использование структуры

struct Person

{

char firstName[20];

char lastName[20];

int age;

double height;

double weight;

};

void copy(char *dest, int maxSize, char *source) { /* поэлементное копирование массива опущено в целях экономии места */ }

void struct_example(void)

{

struct Person p;

const char firstName[] = "John";

const char lastName[] = "Smith";

copy(p.firstName, 20, firstName);

copy(p.lastName, 20, lastName);

p.age = 22;

p.height = 180;

p.weight = 80;

}

Объединения

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

Перечисления

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

Определение перечисления

Пример использования

enum Color { Red, Green, Blue };

enum Material { Metal = 1, Glass };

void enum_example(void)

{

enum Color c = Red; //0

enum Material m = Glass; //2

}

Задание Задание 1

Разработать структуру «Зачётка». Структура включает в себя фамилию, имя, отчество студента, номер зачётной книжки, массив, хранящий информацию о каждом семестре. Размер массива равен количеству разворотов в зачётной книжке, предназначенных для проставления зачётов и экзаменов.

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

Информация о предмете включает в себя название предмета, тип оценки (зачет или экзамен), оценку, дату, фамилию преподавателя.

Оценка является объединением из двух полей: логическое поле (зачёт или незачёт) и перечисление, представляющее оценку.

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

Практикум №7 Динамическое выделение памяти

Цель практикума

Овладеть навыками выделения динамической памяти в языке программирования C.

Краткие теоретические сведения

Динамическое выделение памяти

Указатели часто используются при работе с динамической памятью. Для того чтобы выделить память необходимо вызвать одну из функций malloc, calloc, realloc

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

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

Функция calloc принимает количество элементов count и размер size элемента и выделяет count*size байтов памяти, присваивая каждому выделенному байту нулевое значение.

Для того чтобы точно знать размер типа данных используется операция sizeof.

Для того чтобы присвоить значение переменной типа int * необходимо явное преобразование типа.

После того, как переменная больше не нужна, следует освободить память с помощью функции free. Функции free нельзя передавать указатель, который получен не от функций malloc, calloc, realloc.

Пример использования функций malloc, free:

Выделение памяти с помощью malloc

Выделение массива с помощью malloc

#include <stdlib.h>

void malloc_example(void)

{

int *p = (int *) malloc(sizeof(int));

*p = 5;

free(p);

}

#include <stdlib.h>

void malloc_array_example(void)

{

int *arr = (int *) malloc(5 * sizeof(int));

for (int *cur = arr;

cur - arr < 5; ++cur)

*cur = cur - arr;

free(arr);

}

Пример использования функций realloc, calloc, free:

Выделение массива с помощью realloc

Выделение массива с помощью calloc

#include <stdlib.h>

void realloc_example(void)

{

int *arr = (int *) malloc(5 * sizeof(int));

for (int *cur = arr;

cur - arr < 5; ++cur)

*cur = cur - arr;

arr = realloc(arr, 10);

for (int *cur = arr + 5;

cur - arr < 10; ++cur)

*cur = cur - arr;

free(arr);

}

#include <stdlib.h>

void calloc_example(void)

{

int *arr = (int *) calloc(5, sizeof(int));

for (int *cur = arr;

cur - arr < 5; ++cur)

*cur = cur - arr;

free(arr);

}