- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
5.3. Ввод строк
Cтроку, не содержащую пробельных символов, можно ввести, используя операцию >> (взять из потока). Например, оператор cin>>s; вводит в строку s символы с клавиатуры. Объект cin считывает в строку символы до первого пробельного символа.
Для ввода в строку текста, в котором встречаются пробелы, символы перехода на новую строку или табуляции в С++ используется функция getline объекта cin.
Синтаксис вызова функции getline:
cin.getline(строка, максимальный размер строки+1, символ-ограничитель строки);
Функция getline считывает из буфера ввода (области оперативной памяти, в которую попадают вводимые с клавиатуры данные до их записи в переменные) символы до символа-ограничителя. Количество считываемых символов не может быть более чем максимальный размер строки. Сам символ-ограничитель в строку не записывается, он удаляется из буфера ввода. В конец строки-переменной добавляется символ ’\0’.
Примеры ввода строки, содержащей пробельные символы:
char s[21];
cin.getline(s,21,’\n’); //вводимые символы ABC ABC ММ 123’\n’
cout<<s; //ABC ABC ММ 123
cin.getline(s,21,’#’); //вводимые символы ABC ABC ММ 123’#’’\n’
cout<<s; //ABC ABC ММ 123
Если в качестве ограничителя используется символ новой строки, то третий аргумент функции getline можно не указывать:
cin.getline(s,21);// вводимые символы ABC ABC ММ 123’\n’
Пример программы, которая подсчитывает количество слов в тексте-предложении, которое заканчивается точкой. В качестве разделителей слов в предложении используются символы пробел и символ новой строки. Максимальная длина текста 200 символов.
#include <iostream.h>
#include <conio.h>
void main( )
{
char s[201]; //строка с текстом
int k=0; //счетчик слов
int i=0; //номер символа
cin.getline(s, 201, '.'); //ввод текста с пробельными символами
//Подсчет символов разделителей слов
while(s[i]!='\0')
{
if(s[i]==' ' || s[i]=='\n')
k++;
i++;
}
if (s[0]!=’\0’) //строка не пустая
k++; //количество слов на 1 больше количества разделителей
cout<<"k="<<k;
getch();
}
Другой способ ввода строки с пробелами – использование функции gets библиотеки stdio языка Си. Функция вводит символы из буфера ввода до символа новой строки и в конец строки-переменной добавляет символ ’\0’. Сам символ новой строки в строку не записывается, он удаляется из буфера ввода.
Пример использования функции gets:
char s[21];
gets(s); //ABC ABC ММ 123’\n’
cout<<s; //ABC ABC ММ 123
5.4. Библиотечные функции для работы с текстом
В стандартных библиотеках языка С++ содержится много полезных функций для работы со строками. Их использование позволяет сократить код программы, увеличить ее надежность, уменьшить время разработки программы. Библиотечные функции приведены в [1, 2]. Все функции рассчитаны на то, что строки заканчиваются нулевым символом. Ниже рассматриваются наиболее востребованные при обработке текста функции.
Функция strlen(s) возвращает текущую длину строки s. Для использования этой функции надо подключить к программе файл string.h.
Пример программы, определяющей является ли введенное слово палиндромом:
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{
char s[21]; //слово
int l, r; //левый и правый символы слова
cin>>s;
cout<<s<<endl;
l=0; //начало слова
r=strlen(s)-1; //конец слова
while(l<r && s[l]==s[r])
{
l++; //индекс левого символа
r--; //индекс правого символа
}
if( l>=r)
cout<<"Yes";
else
cout<<"No" ;
getch();
}
Тесты:
Шалаш палиндром
Тот палиндром
Таня не является палиндромом
АННА палиндром
С палиндром
Функция strcpy(s1,s2) копирует второй аргумент-строку s2 в строку s1. Размер первой строки должен быть не меньше второй, чтобы в нее скопировался 0-символ. Для использования этой функции надо подключить к программе файл string.h.
Пример использования функции:
char s1[21], s2[21];
cout<<s1<<endl; //abc
strcpy(s2,”12345”);
cout<<s2; //12345
Функция strcat(s1,s2) присоединяет к концу первой строки s1 вторую строку s2 и записывает результат в первую строку. Размер первой строки должен быть достаточен, чтобы в нее поместились две сцепленные строки и нулевой символ. Для использования этой функции надо подключить к программе файл string.h.
Пример использования функции:
char s1[10], s2[10];
cin>>s1; //abc
cin>>s2; //def
strcat(s1,s2);
cout<<s1<<endl; //abcdef
Функция strcmp(s1,s2) сравнивает две строки и возвращает число 0, если строки равны, отрицательное число, если строка s1 меньше s2 и положительное число, если строка s1 больше s2. Строки сравниваются лексиграфически (сравниваются коды соответствующих символов строк). Сравнение происходит до первого несовпадающего символа или до конца строк (если все символы строк совпадают). При лексиграфическом сравнении строка “Иванов” меньше строки “Петров”.
Пример программы сортировки по возрастанию массива из n слов (n<=20), максимальная длина слова 15 символов:
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{
char s[20][16]; //массив из 20 строк
char x[16]; //переменная для перестановки слов
int i, j, n; //номер слова и номер прохода
int n; //количество слов
cout<<"n? “;
cin>>n;
cout<<"s? "<<endl;
for (i=0; i<n; i++) //ввод входной строки из нескольких слов ...
cin>>s[i]; // ввод слова
for (j=1; j<n; j++) //сортировка пузырьковым методом
for (i=0; i<n-j; i++)
if(strcmp(s[i],s[i+1])>0) //сравнение слов
{//перестановка слов
strcpy(x,s[i]);
strcpy(s[i],s[i+1]);
strcpy(s[i+1],x);
}
for (i=0; i<n; i++)
cout<<s[i]<<' ';
getch();
}
Тест:
n=4, Иванов Андреев Сидоров Петров
Результат: Андреев Иванов Петров Сидоров