
- •Конспект лекций по предмету
- •Раздел 1. Основы языка.
- •Тема 1. История создания языка Си. Достоинства языка. Использование языка Си.
- •Тема 2.
- •Структура простой программы.
- •Описание переменных.
- •3.Использование комментариев. Читаемость.
- •Зарезервированные слова.
- •Раздел.2 Элементы языка. Выражения.
- •Тема 3.
- •3. Выражения
- •Раздел 3. Операторы языка. Условный оператор if
- •Оператор switch
- •Операторы цикла
- •Цикл с параметром (for)
- •Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •Раздел 4. Указатели и массивы Указатели
- •Инициализация указателей
- •Присваивание указателю адреса существующего объекта:
- •Присваивание указателю адреса области памяти в явном виде:
- •Присваивание пустого значения:
- •Выделение участка динамической памяти и присваивание её адреса указателю:
- •Внимание!
- •Объявляется массив из 10 указателей на функции без параметров, возвращающих указатели на int.
- •Раздел 5. Строки. Работа со строковыми данными
- •Функции работы со строками и символами
- •Символьные строки и строковые функции
- •Ввод-вывод строк средствами с.
- •1) Scanf, printf – вводит/выводит одно слово:
- •2) Ввести предложение:
- •3) Специальные средства ввода – вывода строк – gets и puts
- •Различия между массивом символов и указателем на строку
- •Массивы строк
- •Функции с для обработки строк
- •Strcat(), strncat(). Соеденение строк.
- •Другие функции для строк(краткое описание)
- •Раздел 6. Структуры. Структуры (struct)
- •Раздел 7. Функции (подпрограммы). Функции
- •Объявление и определение функций
- •Глобальные переменные
- •Возвращаемое значение
- •Параметры функции
- •Передача массивов в качестве параметров
- •Раздел 8. Файлы(потоки) Функции ввода/вывода
- •Открытие потока
- •Ввод/вывод в поток
- •Закрытие потока
- •Обработка ошибок
Другие функции для строк(краткое описание)
1. Поиск первого вхождения символа С в строке S .
char *strchr (const char *s, int c); возвращает указатель на первую ячейку строки S, содержащую символ C (‘\0’ является частью строки поэтому тоже может разыскиваться). Если символ не найден – возвращается нулевой указатель (см. лист 2 - NULL)
2. Поиск последнего входящего символа С в строке S.
char *strrchr(const char *s, int c); аналогично strchr();
3. Поиск первого вхождения любого символа строки s2 в строке s1.
char *strpbrk(const char *s1, const char *s2); возвращает указатель на 1-ю ячейку s1, где найден любой символ, находящийся в s2. Если никакой символ не найден, то функция возвращает NULL.
4. Поиск первого вхождения подстроки s2 в строку s1.
char *strstr(const char *s1, const char *s2); возвращает указатель на первую встречную подстроку s2 в строки s1. Если не найдена – NULL.
5. Преобразование строки в число.
а) atoi(s) – строку s преобразует в int (целое число) и возвращает его.
int atoi(const char *s)
концом числа служит любой символ не являющийся цифрой. Если
преобразование не удалось, то возвращается 0.
пример: atoi(“42куку”) вернет 42
б) atol(s) - строку s преобразует в long int(длинное целое)
в) atof(s) - строку s преобразует в float(вещественное). При ошибке – 0.
г) atod(s) - строку s преобразует в double(вещестевенное удвоенное)
Раздел 6. Структуры. Структуры (struct)
В отличие от массива, все элементы которого однотипны, структура может содержать элементы разных типов. В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С:
struct [ имя_типа ] {
тип_1 элемент_1;
тип_2 элемент_2;
…
тип_n элемент_n;
} [ список_описателей ];
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
// Определение массива структур и указателя на структуру:
struct {
char fio[30];
int date, code:
double salary:
}staff[100]. *ps;
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:
struct Worker{ // описание нового типа Worker
char fio[30]:
int date, code:
double salary;
}; // описание заканчивается точкой с запятой
// определение массива типа Worker и указателя на тип
Worker: Worker staff[100], *ps;
Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в тех случаях, когда компилятору не требуется знать размер структуры, например:
struct List; // объявление структуры List
struct Link{
List *p; // указатель на структуру List
Link *prev, *succ; // указатели на структуру Link
}:
struct List { /* определение структуры List */}:
Это позволяет создавать связные списки структур.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
struct{
char fio[30];
int date, code;
double salary;
}worker = {"Страусенке", 31, 215, 3400.55}:
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив — это массив массивов):
struct complex{
float real, im;
} compl [2][3] = {
{{1, 1}, [1, 1}, {1, 1}}, II строка 1, то есть массив compl[0]
{{2, 2}, {2, 2}, {2, 2}} // строка 2, то есть массив compl[l]
}:
Для переменных одного и того же структурного тина определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции. Другие операции со структурами могут быть определены пользователем (см. «Перегрузка операций», с. 189). Размер структуры не обязательно равен сумме размеров ее элементов, поскольку они могут быть выровнены по границам слова.
Доступ к полям структуры выполняется с помощью операций выбора (точка) при обращении к полю через имя структуры и -> при обращении через указатель, например:
worker worker, staff[100]. *ps;
…
worker.fio = "Страусенке";
staff[8].code = 215;
ps->salary = 0.12;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:
struct A {int a: double x;};
struct В (A a: double x;} х[2];
х[0].а.а = 1;
х[1].х = 0.1;
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект (например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово struct, но не советую это делать — запутать компилятор труднее, чем себя.