Слайд 1Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ С++
Массивы
и строки
Слайд 2Массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Массив (array) — это коллекция
однотипных данных, обращение к которым происходит с применением общего для всех имени.
В C++ массивы могут быть одно- или многомерными, хотя в основном используются одномерные массивы.
Массивы представляют собой удобное средство группирования связанных элементов.
Слайд 3Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Одномерный массив —
это список связанных элементов. Для объявления одномерного массива используется следующая форма записи.
тип имя_массива[размер];
Слайд 4Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Например, при выполнении
приведенной ниже инструкции объявляется int-массив (состоящий из 10 элементов) с именем sample.
int sample[10];
Слайд 5Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Доступ к отдельному
элементу массива осуществляется с помощью индекса.
Индекс описывает позицию элемента внутри массива.
В C++ первый элемент массива имеет нулевой индекс.
Слайд 6Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Чтобы получить доступ
к элементу массива по индексу, достаточно указать нужный номер элемента в квадратных скобках.
Первым элементом массива sample является sample[0], а последним — sample[9].
Слайд 7Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
int main()
{
int sample[10];
int t;
for (t = 0; t<10; ++t)
sample[t] = t;
for (t = 0; t<10; ++t)
cout << sample[t] << ' ';
return 0;
}
Слайд 8Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В C++ все
массивы занимают смежные ячейки памяти.
Ячейка с наименьшим адресом относится к первому элементу массива, а с наибольшим — к последнему.
Слайд 9Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
после выполнения фрагмента
кода
int i[7];
int j;
for (j = 0; j<7; j++) i[j] = j*j;
получим
Слайд 10Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Для одномерных массивов
общий размер массива в байтах вычисляется так:
всего байтов = (размер типа в байтах) х (количество элементов)
Слайд 11Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В следующей программе
создается массив из десяти элементов, каждому элементу присваивается случайное число, а затем на экране отображаются минимальное и максимальное значения.
Слайд 12Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
using namespace std;
int main()
{
int i, min_value, max_value;
int list[10];
for (i = 0; i<10; i++) list[i] = rand();
min_value = list[0];
for (i = 1; i<10; i++)
if (min_value > list[i]) min_value = list[i];
cout << "Минимальное значение: " << min_value << ' \n';
max_value = list[0];
for (i = 1; i<10; i++)
if (max_value < list[i]) max_value = list[i];
cout << "Максимальное значение: " << max_value << '\n';
return 0;
}
Слайд 13Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В C++ нельзя
присвоить один массив другому. В следующем фрагменте кода, например, присваивание а = b; недопустимо.
int а[10], b[10];
// ...
а = b; // Ошибка!!!
Чтобы поместить содержимое одного массива в другой, необходимо отдельно выполнить присваивание каждого значения.
Слайд 14Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
На границах массивов
погранзаставы нет
Слайд 15Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В C++ не
выполняется никакой проверки "нарушения границ" массивов
Если это происходит при выполнении инструкции присваивания, могут быть изменены значения в ячейках памяти, выделенных некоторым другим переменным или даже вашей программе.
Это означает, что вся ответственность за соблюдение границ массивов лежит только на программистах, которые должны гарантировать корректную работу с массивами.
Слайд 16Одномерные массивы.
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
using namespace std;
int main()
{
int crash[17], i;
for (i = 0; i < 17; i++)
{
crash[i] = i;
cout << crash[i] << " ";
}
system("pause");
return 1;
}
Скомпилируется ли следующая программа?
Есть ли ошибки в программе?
Слайд 17Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
using namespace std;
int main()
{
int crash[17], i;
for (i = 0; i < 18; i++)
{
crash[i] = i;
cout << crash[i] << " ";
}
system("pause");
return 1;
}
А эта программа скомпилируется?
Есть ли ошибки в программе?
Слайд 18Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Например, С++-компилятор "молча"
скомпилирует и позволит запустить программу на выполнение, несмотря на то, что в ней происходит выход за границы массива crash.
Слайд 19Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
using namespace std;
int main()
{
int crash[17], i;
for (i = 0; i < 17; i++)
{
crash[i] = i;
}
for (i = 0; i < 25; i++)
{
cout << "crash["< }
system("pause");
return 1;
}
Слайд 20Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Слайд 21Двумерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Двумерный массив, по сути,
представляет собой список одномерных массивов.
Чтобы объявить двумерный массив целочисленных значений размером 10x20 с именем twod, достаточно записать следующее:
int twod[10][20];
Слайд 22Двумерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В двумерном массиве позиция
любого элемента определяется двумя индексами.
Если представить двумерный массив в виде таблицы данных, то один индекс означает строку, а второй — столбец.
Слайд 23Двумерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Чтобы получить доступ к
элементу массива twod с координатами 3,5 , необходимо использовать запись
twod[3][5]
Слайд 24Двумерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
using namespace std;
int main()
{
int t, i, num[3][4];
for (t = 0; t<3; ++t) {
for (i = 0; i<4; ++i) {
num[t][i] = (t * 4) + i + l;
cout << num[t][i] << ' ';
}
cout << '\n';
}
return 0;
}
Слайд 25Многомерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В C++, помимо
двумерных, можно определять массивы трех и более измерений.
Вот как объявляется
тип имя[размер1] [размер2]... [размерN];
Например, с помощью следующего объявления создается трехмерный целочисленный массив размером 4x10x3.
int multidim[4][10][3];
Слайд 26Инициализация массивов
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В C++ предусмотрена
возможность инициализации массивов. Формат инициализации массивов подобен формату инициализации других переменных.
тип имя_массива [размер] = {список_значений};
Слайд 27Инициализация массивов
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Примеры
int i[10] =
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
char str[7] = "привет";
char str[7] = { 'п', 'р', 'и', 'в', 'е', 'т', '\0' };
Слайд 28"Безразмерная" инициализация массивов
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Предположим, что
мы используем следующий вариант инициализации массивов для построения таблицы сообщений об ошибках.
char e1[14] = "Деление на 0\n";
char е2[23] = "Конец файла\n";
char еЗ[21] = "В доступе отказано\п";
Слайд 29"Безразмерная" инициализация массивов
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
в C++
предусмотрена возможность автоматического определения длины массивов путем использования их "безразмерного" формата.
Если в инструкции инициализации массива не указан его размер, C++ автоматически создаст массив, размер которого будет достаточным для хранения всех значений инициализаторов.
Слайд 30"Безразмерная" инициализация массивов
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Предыдущий вариант
инициализации массивов для построения таблицы сообщений об ошибках можно переписать так.
char е1[] = "Деление на 0\n";
char е2[] = "Конец файла\n";
char еЗ[] = "В доступе отказано\n";
Слайд 31Одномерные массивы
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Удивляет такая "непредусмотрительность"
C++?
Язык C++ предназначен для профессиональных программистов, и его задача — предоставить им возможность создавать максимально эффективный код
Любая проверка корректности доступа средствами C++ существенно замедляет выполнение программы.
Слайд 32Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В C++ строка определяется
как символьный массив, который завершается нулевым символом ('\0').
При определении длины символьного массива необходимо учитывать признак ее завершения и задавать его длину на единицу больше длины самой большой строки из тех, которые предполагается хранить в этом массиве.
Слайд 33Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Например, объявляя массив str,
предназначенный для хранения 10-символьной строки, следует использовать следующую инструкцию.
char str[11];
Заданный здесь размер (11) позволяет зарезервировать место для нулевого символа в конце строки.
Слайд 34Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
C++ позволяет определять строковые
литералы.
Вспомним, что строковый литерал — это список символов, заключенный в двойные кавычки.
Вот несколько примеров.
"Привет"
"Мне нравится C++"
"#$%@@#$"
""
Слайд 35Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Вам не нужно вручную
добавлять в конец строковых констант нулевые символы. С++-компилятор делает это автоматически.
Следовательно, строка "ПРИВЕТ" в памяти размещается так, как показано на этом рисунке:
Слайд 36Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Проще всего считать слово
с клавиатуры, создав массив, который примет это слово с помощью инструкции cin.
Считывание слова, введенного пользователем с клавиатуры, отображено в следующей программе.
Слайд 37Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите строку: ";
cin >> str; // Считываем строку с клавиатуры.
cout << "Вот ваша строка: ";
cout << str;
}
Слайд 38Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Несмотря на то что
эта программа формально корректна, она не лишена недостатков. Рассмотрим следующий результат ее выполнения.
Введите строку: Это проверка
Вот ваша строка: Это
Слайд 39Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
оператор ">>" прекращает считывание
строки, как только встречает символ пробела, табуляции или новой строки (будем называть эти символы пробельными).
Для решения этой проблемы можно использовать еще одну библиотечную функцию gets(). Общий формат ее вызова таков.
gets(имя_массива);
ВНИМАНИЕ! В новой версии VS2015 данная функция заменена на gets_s
Слайд 40Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
В следующей версии предыдущей
программы демонстрируется использование функции gets(), которая позволяет ввести в массив строку символов, содержащую пробелы.
При этом имейте в виду, что ни оператор ">>", ни функция gets() не выполняют граничной проверки (на отсутствие нарушения границ массива). Поэтому, если пользователь введет строку, длина которой превышает размер массива, возможны неприятности, о которых упоминалось выше.
Слайд 41Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите строку: ";
gets_s(str); // Считываем строку с клавиатуры.
cout << "Вот ваша строка: ";
cout << str;
}
Слайд 42Строки
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Язык C++ поддерживает множество
функций обработки строк. Самыми распространенными из них являются следующие.
strcpy()
strcat()
strlen()
strcmp()
Для вызова всех этих функций в программу необходимо включить заголовок .
Слайд 43Функция strcpy()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Общий формат вызова
функции strcpy() таков:
strcpy (to, from);
Функция strcpy() копирует содержимое строки from в строку to.
Слайд 44Функция strcpy()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
using namespace std;
int main()
{
char str[80];
strcpy(str, "Привет");
cout << str;
return 0;
}
Слайд 45Функция strcat()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Обращение к функции
strcat() имеет следующий формат.
strcat(s1, s2);
Функция strcat() присоединяет строку s2 к концу строки s1, при этом строка s2 не изменяется. Обе строки должны завершаться нулевым символом.
Слайд 46Функция strcat()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
using namespace std;
int main()
{
char s1[20], s2[10];
strcpy(s1, "Привет");
strcpy(s2, " всем!");
strcat(s1, s2);
cout << s1;
return 0;
}
Слайд 47Функция strcmp()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Обращение к функции
strcmp() имеет следующий формат:
strcmp(s1, s2);
Функция strcmp() сравнивает строку s2 со строкой s1 и возвращает значение 0, если они равны. Если строка s1 лексикографически (т.е. в соответствии с алфавитным порядком) больше строки s2, возвращается положительное число. Если строка s1 лексикографически меньше строки s2, возвращается отрицательное число.
Слайд 48Функция strcmp()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
#include
using namespace std;
bool password();
int main()
{
if (password()) cout << "Вход разрешен.\n";
else cout << "В доступе отказано.\n";
return 0;
}
Слайд 49Функция strcmp()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
bool
password()
{
char s[80];
cout << "Введите пароль: ";
gets(s);
if (strcmp(s, "пароль")) { // Строки различны.
cout << "Пароль недействителен.\n";
return false;
}
// Сравниваемые строки совпадают.
return true;
}
Слайд 50Функция strlen()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Общий формат вызова
функции strlen() таков:
strlen(s);
Здесь s — строка. Функция strlen() возвращает длину строки, указанной аргументом s.
Слайд 51Функция strlen()
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите строку: "; gets(str);
cout << "Длина строки равна: " << strlen(str);
return 0;
}
Слайд 52string
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
string – это STL’евский класс основанный
на шаблонах, который входит в стандартную библиотеку C++
Для использования данного класса в ваших приложениях, нужно подключить заголовочный файл string
#include
Слайд 53Отображение строки в обратном порядке.
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
#include
using namespace std;
int main()
{
char str[80];
int i;
cout << "Введите строку: ";
gets(str);
for (i = strlen(str) - 1; i >= 0; i--)
cout << str[i];
return 0;
}
Слайд 54string
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
#include
#include
int main()
{
std::string str;
std::cout << "Enter your name: ";
std::getline(std::cin, str);
std::cout << "Hello, " << str << "!!! \n";
return 0;
}
Слайд 55string
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Чтобы узнать длину строки, можно
воспользоваться функцией-членом size(), или length()
str.size();
str.length();
str.empty(); Что делает?
Слайд 56String
Никитин Михаил Евгеньевич, 2015
ГБПОУ ПК имени П.А.Овчинникова
Как мы можем узнать, совпадают
ли строки?
if (str == str2)
А как же можно скопировать одну строку в другую?
std::string str2; // Создание объекта строки
str2 = str;
Как добавить к первой строке вторую и записать в третью?
std::string str1 = "Hello";
std::string str2 = "World";
std::string str3 = str1 + str2;