- •Оглавление
- •Билет 1: Понятия о структурном программировании
- •Билет 2: Моделирование стандартных управляющих структур
- •Билет 3: структура программы
- •Билет 4: организация (структура) модуля
- •Билет 5: Переменные
- •Билет 6: Система типов языка
- •Билет 7: Арифметические типы языка c
- •Билет 8: Константы
- •Билет 9: КонстантныеобъектывязыкеСи.
- •Билет 10: Константные объекты
- •Билет 11. Переменные, понятие об объекте, lvalue и rvalue выражения.
- •Билет 12. Время жизни переменных.
- •Билет 15. Операторы. Приоритет и ассоциативность операторов.
- •Билет 19: Побочные эффекты в языке Си.
- •Билет 20: Организация функций. Определение функций
- •Билет 25: Инструкция If…else. Программирование разветвлений.
- •Билет 26: Инструкция switch и организация разветвленных алгоритмов.
- •Билет 27: Циклические алгоритмы, классификация, функциональная схема
- •Билет 28: Циклические инструкции.
- •Билет 29: инструкция for и арифметические циклы
- •Билет 30: Инструкция while и do...While, интерационные циклы
- •Билет 31: Циклы с выходом. Бесконечные циклы
- •Билет 32. Организация вложенных циклов
- •Билет 33: Массивы. Определение и инициализация одномерных массивов
- •Билет 34. Массивы. Определение и инициализация двумерных массивов
- •Билет 35. Связь указателей и массивов
- •Билет 40. Указатели. Определение типизированных и нетипизированых указателей. Модель, используемая при работе с указателями. Операции с указателями.
- •Билет 41: Операции с указателями
- •Билет 42. Использование указателей для возврата из функции через параметры
- •Билет 43. Указатели на функцию. Определение. Операции. Использование в параметрах функции
- •Билет 44. Типичные ошибки при работе с массивами
- •Билет 45. Массив указателей, динамическая матрица
- •Билет 46. Понятие некорректного указателя.
- •Билет 47. Организация строк. Общие сведения
- •Билет 48. Ввод/вывод строк
- •Void funk(“Kozin”); - при этом ничего не возвращается. Данная запись используется довольно редко.
- •Билет 52. Организация динамического одномерного массива
- •Билет 53. Структуры. Определение типа структур. Определение переменных в структуре и инициализация. Операции со структурой
- •Билет 54. Обращение к полям структуры. Массивы структур
- •Билет 55. Использование структур при работе с функциями. Указатели на структуры
- •Билет 58: Файловый ввод-вывод. Символьный ввод-вывод в языке Си.
- •Синтаксис преобразования вывода
- •Билет 60: Файловый ввод-вывод. Строковый ввод-вывод в языке Си.
- •Билет 61: Файловый ввод-вывод. Блоковый ввод-вывод в языке Си.
- •Int fseek(file *f, long int колич_байт, int начало_отсчета);
Void funk(“Kozin”); - при этом ничего не возвращается. Данная запись используется довольно редко.
Билет 50. Массивы строк
Массив строк – это двумерный массив типа char, у которого в каждой строке есть символ \0. Это может быть как обычный массив, так и динамическая матрица.
Пример:
Static char massiv [3] [8]= {“Ivanov”
“Petrov”
“Sidorov”}
Работа с массивом строк в С такая же, как и с двумерным массивом, динамической матрицей, строками. Точнее, она объединяет в себе эти типы работ. (повторяться не буду, нужная информация по работе уже описана в соответствующих билетах).
Билет 51. Работа с динамической памятью
Преимущества динамической памяти в том, что программист может оптимизировать расход памяти, выделяя память без запаса, а так же выиграть время, отведённое на выделение памяти. В совокупности это увеличивает производительность программы. Позволяет работать с динамическими объектами.
Как минус работы в С: необходимо все время следить за удалением памяти, т.к. стек не резиновый, а очищающей программы в С, в отличие от некоторых других языков, нету =(.
Стандартные функции для работы с динамической памятью в «си»:
#include <stdlib.h>
Выделяют память
void *malloc(size_t size); //описана в билете о массиве указателей
void *calloc(size_t row, size_t size); //возвращает указатель на двумерный массив (выделяется память под массив объектов, каждый из которых размером size, притом количество объектов в массиве - row)
void *realloc(void *p, size_t size); //изменяет размер выделенной памяти
Освобождает память
void free(void *); //описана в билете о массиве указателей
! void* не означает, что ничего не передается, это нетипизированый указатель
! нельзя освободить освобожденную или невыделенную память
! нельзя использовать уже освобожденный указатель
Билет 52. Организация динамического одномерного массива
Впрочем, вопрос содержит билеты № 45 и 51. Чтобы организовать динамический одномерный массив, необходимо объявить указатель нужного типа, выделить память под массив с помощью malloc, изменять размер памяти, если это необходимо (лучше при расширении выделять большой блок памяти, скажем, в 2 раза больше, чем был, т.к. подобные операции требуют много времени), а затем !обязательно эту память освободить с помощью freem.
Изменять размеры можно двумя способами: либо функцией realloc (по своему опыту скажу, довольно геморная функция в плане разобраться с ней), либо выделять новую память, копировать туда данные и стирать старую. Козину лучше выдать второй вариант, если спросит про какой-нить другой способ, только тогда упомянуть имя функции realloc.
Билет 53. Структуры. Определение типа структур. Определение переменных в структуре и инициализация. Операции со структурой
Язык С предоставляет программисту возможность организации переменных не только по типу (массивы), но и по любому критерию. Таким объединением является структура – форма представления данных различных типов. !структура объединяет логически связанные данные.
Структура состоит из 3 частей: заголовок, поля, объявление с именем переменной.
! описывать структуру можно как вне тела main, так и внутри.
Пример:
struct Books
{
char title[20];
char author[20];
} book;
Struct Books – заголовок (объявлениеструктуры), { … } – поляструктуры, book – переменнаятипа Books.
Объявление book можно опустить. Объявить переменную типа Books можно в main: struct Books book; - это равносильно объявлению в конце описания.
Инициализация структур похожа на инициализацию массива.
Пример: struct Books book = {“TITLE”, “AUTHOR”}; (притом такая инициализация вне объявления у меня лично не сработала, может это свойство стандарта С89, но все же)
Инициализация переменных происходит в строгой последовательности, т.е. первому полю в структуре будет соответствовать первый инициализатор (“TITLE”), второму – второй и так далее.
Стандарт С99 расширяет возможности инициализации структуры и стирает это ограничение. Теперь инициализация может быть произведена в следующей форме: struct Books book = {.author = “Kozin”, .title = “C for dummies”};.
Всего 3 варианта инициализации:
Без инициализаторов
Последовательная запись инициализаторов
Запись непосредственно в поля в любой последовательности
Обращение к полю структуры записывается как: book.author. Название структуры соответствует типу переменной, т.е. работать со структурой в общем можно как с переменной. Её можно передавать в функцию целиком, возвращать через ретурн или указатель. Можно присвоить значение одной структуры другой, притом произойдет копирование из одной структуры в другую.
Примеробъявленияфункции:
struct Books copy(struct Books *book)
{
struct Books book1={" ","AUTHOR"};
*book=book1;
return book1;
}
В данном случае мы передаем указатель на структуру бук. В функции определяем и записываем структуру бук1. Копируем созданную структуру в бук. !Возвращаются и бук, и бук1, только бук1 возвращаем через ретурн, а бук само запишется через указатель.
!!С полями структуры также можно выполнять операции как с переменными того же типа(или массивами, если полем структуры является массив)
!!Полем структуры может быть другая структура