- •2. Структура и основные элементы программы
- •3.Общее понятие типов данных
- •4. Переменные и константы
- •5.Основные типы данных
- •6. Спецификаторы типов данных
- •7. Определение переменных и констант в программе
- •8. Инициализация переменных различных типов
- •9.Целочисленные типы данных
- •10. Вещественные типы данных
- •11. Особенности представления вещественных типов данных
- •12.Логический тип данных
- •13. Символьный тип данных
- •14. Управляющие последовательности
- •15. Операции и выражения
- •16. Операция присваивания, составные операции присваивания
- •17. Понятие l-значения
- •18. Преобразование типов данных
- •19. Арифметические операции
- •20. Операции инкремента и декремента, их разновидности
- •21. Операции отношения
- •22. Логические операции
- •23. Побитовые операции сдвига
- •24. Побитовые логические операции
- •25. Примеры применения побитовых операций
- •26. Условная операция и ее использование
- •27. Определение объема памяти, необходимого для размещения объектов
- •28. Понятие приоритета операций и его влияние на результаты вычислений
- •31.Флаги форматирования потоков ввода-вывода
- •32. Форматирование ввода-вывода с помощью манипуляторов
- •33.Форматирование ввода-вывода с помощью функций потоков ввода-вывода
- •34. Управление шириной поля вывода и выравниванием данных при выводе
- •35. Управление форматом вывода вещественных значений
- •36. Основные понятия структурного программирования
- •37. Базовый набор управляющих структур
- •39.Условная инструкция (if)
- •40. Инструкция множественного выбора (switch)
- •42. Цикл с постусловием (do while)
- •43. Итерационный цикл (for)
- •46. Инструкция перехода goto
- •47. Понятие рекуррентных вычислений, примеры
- •48. Понятие инварианта цикла
- •49. Понятие и определение массива
- •52. Ввод элементов массивов с клавиатуры
- •53. Декларативная и программная инициализация массивов
- •54. Копирование массивов
- •55. Нахождение минимальных и максимальных значений в массивах
- •56. Сдвиг элементов массивов
- •57. Перестановка элементов в массивах
- •58. Поиск данных в массивах
- •59. Сортировка данных в массивах
- •60. Вычисление сумм и произведений элементов массивов
- •61. Представление текстовых строк в виде массива символов
- •62. Ввод-вывод символьных строк
- •63. Определение фактической длины строки
- •64. Копирование символьных строк
- •65. Основные функции обработки строк библиотеки cstring
- •66. Массивы текстовых строк (двумерные массивы символов)
- •67. Указатели Понятие указателя
- •Работа с указателями
- •68. Арифметика указателей
- •69. Индексирование указателей
- •70. Ссылки
- •71. Определение функции
- •72. Инструкция return
- •73. Завершение работы функции
- •74. Механизмы передачи данных через параметры функций
- •75. Передача данных по значению
- •76. Передача данных через указатели
- •77. Передача данных по ссылке
- •78. Параметры по умолчанию
- •79. Функции с переменным числом параметров
- •80. Inline функции
- •81. Перегрузка функций
- •82. Рекурсия
- •83. Прототипы функций
63. Определение фактической длины строки
strlen - это функция стандартной библиотеки C, применяемая для определения длины строки, оканчивающейся нулем. Значение выражения с использованием вызова strlen определяется во время выполнения кода.
Функция strlen(char *s) – возвращает фактическую длину текстовой строки, хранящейся в символьном массиве s (см. аналог my_StrLen(char *S)).
Функция определения фактической длины строки (с нулевым символом):
unsigned my_StrLen(char *S)
{
unsigned L = 0;
while (S[L]) // При достижении символа с числовым значением 0 выход из цикла
++L;
return L;
}
64. Копирование символьных строк

65. Основные функции обработки строк библиотеки cstring
Функция strlen(char *s) – возвращает фактическую длину текстовой строки, хранящейся в символьном массиве s (см. аналог my_StrLen(char *S)).
Функция strcpy(char *dest, char *source) – копирует содержимое строки source в строку dest.
Функция strcat(char *s1, char *s2) – добавляет содержимое строки s2 в конец строки s1.
Функция strcmp(char *s1, char *s2) – осуществляет лексикографическое сравнение строк s1 и s2. Возвращает значение 0, если строки одинаковы (равны), значение большее 0 при s1 > s2 и отрицательное значение при s1 < s2.
Пример. Имеются две строки S1 и S2, содержащие некоторые тексты. Необходимо поменять содержимое этих строк так, чтобы строка S2 содержала “больший” текст. Реализация:
char S1 [41], S2 [41], B [41];
cin >> S1;
cin >> S2;
if (strcmp (S1, S2))
{
strcpy(B, S1);
strcpy(S1, S2);
strcpy(S2, B);
}
cout << S1 << endl;
cout << S2 << endl;
В этой же библиотеке содержатся другие варианты упомянутых функций и множество других полезных обработчиков строк.
66. Массивы текстовых строк (двумерные массивы символов)
Массивы текстовых строк
Широкое применение в программировании получила специальная форма двумерных массивов символов, которые можно рассматривать как одномерный массив строк, заканчивающихся нулевым символом. Определяются такие массивы следующим образом:
char arr_str [30] [21]
Этот массив содержит 30 строк. Каждая строка может содержать текст из максимум 20 символов + нулевой символ.
Для того чтобы обратиться к некоторой строке этого массива достаточно указать только первый индекс. Например:
strcpy (arr_str [10] , “Иванов”);
cout << arr_str [10] << endl; // На экран выведено “Иванов”
Инициализация такого массива:
char arr_str [3] [21] = {“Иванов”, “Петров”, “Сидоров”};
cout << arr_str [1] << endl; // На экране “Петров”
или так:
char arr_str [ ] [21] = {“Иванов”, “Петров”, “Сидоров”};
cout << arr_str [2] << endl; // На экране “Сидоров”
Для получения доступа к отдельным символам строк необходимо указывать два индекса, как в обычном двумерном массиве:
cout << arr_str [2] [2]; // На экране буква ‘д’ из строки “Сидоров”
67. Указатели Понятие указателя
Все данные (переменные, константы и др.) хранятся в памяти. Память представляет собой непрерывную последовательность ячеек (байтов), каждая из которых имеет свой номер – адрес:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
… |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
… | |
При определении, например, некоторой переменной, она располагается в памяти по определенному адресу и занимает столько ячеек, сколько требует тип этой переменной. Пусть, например, имеется переменные int A = 2351 и double B = 3.1 и пусть они располагаются в памяти так:
|
|
|
|
А = 2351 |
B = 3.14 |
|
|
|
|
| |||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||
|
… |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
… | ||||||||||||||||||||||||
Говорят, что переменная А располагается по адресу 101 и занимает 4 байта, а переменная B имеет адрес 105 и занимает 8 байт памяти.
Для получения адреса какого-либо программного объекта используется оператор &. Например, если выполнить фрагмент следующей программы (в предположении, что переменные A и B располагаются в памяти, как это показано на предыдущем рисунке):
int A = 2351;
double B = 3.14;
cout << “Значение переменной А: ” << A << endl;
cout << “Адрес переменной А: ” << &A << endl;
cout << “Значение переменной В: ” << В << endl;
cout << “Адрес переменной В: ” << &В << endl;
получим следующий результат:
Значение переменной А: 2351
Адрес переменной А: 101
Значение переменной В: 3.14
Адрес переменной В: 105
Правда, значения адресов переменных будут выведены в шестнадцатеричном формате.
Указатели – это тоже обычные переменные, но они служат для хранения адресов памяти.
Указатели определяются в программе следующим образом:
<тип данных> *<имя переменной>
Здесь <тип данных> определяет так называемый базовый тип указателя.
<Имя переменной> является идентификатором переменной-указателя.
Признаком того, что это переменная указатель, является символ *, располагающийся между базовым типом указателя и именем переменной-указателя.
Например:
int *p1;
double *p2;
Здесь определены две переменные-указатели (или просто – два указателя). Указатель p1 является переменной-указателем на базовый тип int (или, как говорят, переменная p1 указывает на int - значение), а указатель p2 указывает на double – значение.
Иными словами, переменная p1 предназначена для хранения адресов участков памяти, размер которых соответствует типу int (4 байта), а переменная p2 - для хранения адресов участков памяти, размер которых соответствует типу double (8 байт).
Формально указатели представляют собой обычные целые значения типа int и занимают в памяти 4 байта не зависимо от базового типа указателя. Значения указателей при их выводе на экран представляются как целые значения в шестнадцатеричном формате.
