
- •1.1. Что такое программа и как она выглядит?
- •1.2. Комментарии
- •1.3. Зарезервированные слова и типы данных
- •1.4. Объявление переменных
- •1.5. Операции и выражения
- •1.6. Ввод и вывод
- •1.7. Переменные и константы
- •1.8 Логические операторы
- •1.9. Управляющие операторы
- •1.10. Операторы циклов
- •1.11. Операторы перехода
- •2. Функции
- •2.1. Передача параметров
- •2.2. Библиотечные функции
- •2.3. Локальные и глобальные переменные
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Int local_var; /* по умолчанию auto */
- •2.4. Перегрузка
- •Виртуальный метод
- •3. Массивы
- •Перечисления
- •Объединения
- •858993459 //Результат будет неопределенным,
- •Множества
- •4. Структуры
- •Int numberPeriod; //число переодов начисления процентов
- •Int page; //Количество страниц
- •Void print(); /*Внимание, записывается только прототип функции */
- •Int yearBorn; //год рождения
- •Int yearBorn; //год рождения
- •4.1. Демонстрационные программы
- •Int done;/*переменная, которая информирует о конце списка файлов */
- •6. Объединения
- •Info;//Обявление переменной типа объединение
- •Info;//Обявление переменной типа объединение
- •7. Объектно-ориентированное программирование
- •7.1. Классы и объекты
- •Демонстрационные программы
- •Результат работы программы
- •7.2. Конструкторы и деструкторы
- •Конструктор копирования
- •Конструктор копирования
- •7.5. Наследование
- •7.3. Создание объектов и обращение к членам объекта
- •8. Абстрактные типы данных
- •9. Пространство имен
- •Void greeting();/*это пространство имен содержит функцию с тем же
- •Void big_greeting(); /*эта функция не попадает ни в одно из созданных подпространств,т.Е. Принадлежит пространству имен std */
- •//Определение функций
- •Void big_greeting() /* определение данной функции не принадлежит ни одному из созданных пространств имен, следовательно дальнейший код помещается в глобальное пространство имен */
- •10. Строки
- •4.3 Демонстрационные программы
- •4.10. Класс string
- •Класс AnsiString
- •Класс AnsiString
- •Класс Set
- •4.9. Перегрузка операторов
- •Использование "умных" указателей
- •4.8. Полиморфизм
- •Главное меню — компонент MainMenu
- •Диалоги
- •Файлы и потоки
- •Ввод-вывод в файл
- •Ifstream inStream; //Объявление входного потока
- •InStream.Open("character.Dat"); /*присоединение файла к входному потоку */
- •InStream.Close(); //закрытие входного потока
- •If(!out){ //при неудачной попытке
- •If(in.Fail()){ //поток не создан, то сообщение и выход
- •Управление потоком ввода-вывода
- •Дополнительные возможности cin и cout
- •Что внутри iostream.H
- •Использование cout
- •Использование символа-заполнителя
- •Управление цифрами значений с плавающей точкой
- •Вывод и ввод одного символа за один раз
- •Чтение ввода с клавиатуры по одному символу за раз
- •Чтение с клавиатуры целой строки
- •Что вам необходимо знать
- •5.2. Ввод имен файлов
- •5.3. Манипуляторы
- •5. Указатели
- •5.1.Типы указателей и операции с указателями
- •Адресная арифметика
- •Сравнение указателей
- •Преобразование типа указателя
- •Указатель void
- •5.2. Динамические массивы
- •Int array[10]; //объявляется массив с именем array
- •Int a[10]; //объявляется массив с именем a
- •Int *array1; //указатель типа int с именем array1
- •Int *array[5];/*массив с именем array, его элементы указатели*/
- •Int (*point)[4][5]; /*объявление указателя на двумерный массив без имени */
- •Использование указателей в функциях и указатели на функции
- •Указатель классов
- •Шаблоны
- •Шаблоны функций
- •Void Swap (t& X, t& y) /* к моменту обращения тип т будет известен и заменен, например, на int */
- •Void sort(t array[], int maxIndex){ /*передали массив и его размер */
- •6.2. Шаблоны классов
- •6.3 Демонстрационные программы
- •7.1 Обработка исключений
- •Исключения и их стандартная обработка
- •Базовый класс исключений vcl Exception
- •Упражнения
- •Обработка исключительных ситуаций, возбуждаемых оператором new
- •Исходные файлы и объявление переменных
- •Связанные списки
- •Void newHead(PtrNode& head, //адрес головного узла
- •Void newHead(PtrNode& head, //адрес головного узла
- •Поиск в связанных списках
- •Void newHead(PtrNode& head, //адрес головного узла
- •Директивы препроцессора.
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Особенности программирования под Windows.
- •Создание окон.
- •Функция WinMain
- •Создание проекта Win32Application.
- •Библиотека mfc.
- •Создаем код
- •Шпаргалка
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Файл проекта
- •Введение
- •Свойства компонентов
- •События
- •Менеджер проектов
- •Пример: создание простейшего приложения
- •Графика Внедрение картинок
- •Редактор изображений
- •Классы для хранения графических объектов.
- •If (SelectDirectory( //Компонент библиотеки
- •Методы создания собственной графики. Рисование по пикселам
- •Int px, py; //координаты пикселей
- •Рисование с помощью пера
- •Int px, py; //координаты пикселей
- •Рисование кистью
- •Мультимедиа и анимация Общие сведения о звуковых и видеофайлах
- •Способы воспроизведения звуков
- •Создание мультфильма
- •Воспроизведение немых видео клипов — компонент Animate
- •Проигрыватель MediaPlayer
- •Процессы, потоки, распределенные приложения
- •If include "uOverlayl.H" // включение головного файла приложения
- •Функция CrateProcess
- •Заключение
- •Что такое ansi?
- •Почему вместо русских букв в консольном приложении выводится мусор? Автор: Алексей Кирюшкин Версия текста: 1.0
- •Выход 1
- •Выход 2
- •Выход 3
- •Выход 4
- •Ввод-вывод файлов
- •Выбор компонентов для групповых операций
- •Установка разделяемых свойств компонентов
- •Изменение размера компонентов
- •Выравнивание компонентов
- •Пример: Создание текстового редактора Проектирование формы приложения
- •Создание обработчиков событий
- •Создание меню
10. Строки
Сейчас мы будем рассматривать новый тип переменных, который называется строки. Строки или строковые значения мы неоднократно использовали, когда организовывали вывод сообщений на печать. Например:
cout<<"Привет!";
В данном случае текст, заключенный в двойные кавычки это и есть строка. Теперь вспомним, что базовые типы могут быть константами и переменными. Строка из рассмотренного примера похожа на константу, поскольку ее значение уже трудно изменить. Сразу возникает вопрос, а существуют ли такие строки, символы в которых могут изменяться? Ответ положительный: да, такие строки вполне можно сделать. Для этого просто нужно задать символьный массив элементы которого можно изменять. Например, объявим массив:
char myString[20]={'П','р','и','в','е','т'};
Здесь мы объявили массив, состоящий из 20 элементов, хотя использовали только 6. Важно отметить, что в отличие от числового массива, где неиспользованные позиции массива остаются неизменными (т.е. в них находится то, что осталось в памяти от предыдущей программы), неиспользованные символы в строковом массиве автоматически заполняются пробелами. Для символьных массивов существуют и другие исключения. Так для вывода на экран всей строки можно использовать оператор cout<<, а для ввода cin>> без указания на вывод каждого элемента массива. В последнем случае нужно иметь в виду, что все пробельные символы (пробелы и символы новой строки) пропускаются. Например, программа
#include <iostream>
using namespace std;
void main()
{
char myString[20]=”Privet”; // объявление
// и инициализация массива
cout<< myString; // массив символов выводится не поэлементно,
// а как одна величина
}
позволяет получить на экране слово Privet. Причем курсор остановится сразу после последней буквы. Программа
#include <iostream>
using namespace std;
void main()
{
char myString[20]= ”Privet”;
for(int i=0;i<20;i++)
cout<< myString[i];
}
также выводит Privet, но курсор останавливается на 20-ой позиции. Все незанятые символами позиции заполняются пробелами.
Рассмотрим еще один пример с использованием оператора ввода.
#include <iostream>
using namespace std;
void main()
{
char a[100],b[100];
cout<<"Input anithing"<<endl;
cin>>a>>b;
cout<<a<<b<<"\nTHE END";
}
Результате выполнения программы следующий : начала на экране появится сообщение
Input anithing
Мигающий курсор говорит о том, что выполняемая программа готова к вводу. После ввода какого-либо слова введите один или несколько побелов, нажмите Enter, что означает конец ввода в массивa, и теперь введите слово в массив b. В итоге получится нечто одна строка без пробелов, которая будет выглдядеть так:
Слово1Слово2
THE END
Если вы хотите ввести текст на кириллице, то не забудьте подключить библиотеку windows.hи установить кодировку для вводаSetConsoleCP(1251)и выводаSetConsoleOutputCP(1251).
Этот пример показывает, что оператор ввода cinне учитывает символ пробела.
Попробуйте ввести через пробел два слова в один и тот же массив, и вы увидите, что второе слово в него не войдет. Это говорит о том, что пробел используется для каких то других целей. Действительно, пробел означает, что ввод в массив закончен.
Для ввода строк включающих пробелы используется функция getline(str,int), в которой первый аргумент это вводимая строка, а второй это целое число, указывающее максимальное количество вводимых символов, учитывая пробелы, но не переводы строк.
#include <iostream>
using namespace std;
void main()
{
char a[100];
cout<<"Input anithing"<<endl;
cin.getline(a,80);//количество вводимых символов ограничено
cout<<a<<"THE END";
}
В данном случае результат будет таков:
Input anithing
Вводятся отдельные слова через пробел. После нажатия на Enterна экране появится
Слово1 Слово2THE END
Если количество введенных символов превысит значение, указанное во втором аргументе функции getlineто чтение прекращается. Строго говоря, количество вводимых символов даже на единицу меньше чем число во втором аргументе. Это объясняется тем, что последнюю позицию занимает так называемый нуль-символ, информирующий о конце строки, но об этом мы поговорим чуть позднее.
Вероятно, сейчас не вполне понятен вызов функции getline.О , почему вызов осуществляется именно так, мы расскажем тогда, когда познакомимся с классами и потоками ввода-вывода.
Вернемся к первому примеру. Обратим внимание, что наше приветствие выводится без восклицательного знака. Исправим эту ошибку. С этой целью добавим оператор ввода элемента на 6-ой позиции, и с его помощью введем восклицательный знак.
#include <iostream>
using namespace std;
void main()
{
char myString[20]=”Privet”;
cout<< myString;
cin>>myString[6]; //Здесь нужно ввести восклицательный знак
cout<< myString;
}
Последний пример показывает, что элементы символьного массива можно изменять.
Символьный массив можно инициализировать при объявлении
char myString[20]="Privet";
В этом случае после последней буквы компилятор автоматически добавит символ '\0' означающий конец строки. Для рассмотренного примера это будет 6-я позиция. Этот символ используется во многих функциях работающих со строковыми переменными, поэтому это способ предпочтительнее. Однако следует иметь в виду, что если мы теперь введем восклицательный знак, то символ '\0' будет замещен знаком '!'. С другой стороны, если не удалить символ '\0', то все свободные элементы массива будут недоступны. Например, после инициализации можно заменить любой символ массива с myString[0] до myString[5],но начиная сmyString[7] до myString[20] элементы массива недоступны. Недоступность означает, что эти символы невозможно прочитать.
Строковые значения и строковые переменные не похожи на значения и переменные других типов, поэтому обычные операторы с ними не работают. Например, для строковых переменных знак присвоения работает только при объявлении переменной, т.е. код
char myString[10];
myString="Privet!";
является неверным в силу того, что myString это массив и, следовательно, указанный код должен выглядеть так:
char myString[10];
myString[0]='P';
myString[1]='r';
myString[2]='i';
myString[3]='v';
myString[4]='e';
myString[5]='t';
myString[6]='!';
myString[7]='\0';
Хотя ввод с клавиатуры можно выполнить, т.е.
#include<iostream>
using namespace std;
void main(){
char myString[20];
cin>>myString; //ввод с клавиатуры
cout<<myString;
}
Наиболее распространенной ошибкой при работе со строками является применение ператора равенства «», к не справедлив , ведь строка это массив. Строки можно сравнивать лишь поэлементно.
Для работы со строками используются библиотечные функции, некоторые из которых приведены в таблице.
Функция |
Описание |
Замечания |
strcpy(str1,str2) |
Копирует str2 вstr1 |
Не проверяет достаточно ли места в str1для копирования |
strcat(str1,str2) |
Присоединяет str2 к окончаниюstr1 |
Не проверяет достаточно ли места в str1для присоединенияstr2. |
strlen(str) |
Возвращает целое число равное длине строки без учета нуль-символа. |
|
strcmp(str1,str2) |
Сравнивает строки. Поочередно сравниваются коды символов двух строк. Если они совпадают, возвращает 0. Если значение кода символа str1меньшеstr2, возвращает отрицательное число. Если значение кода символаstr1большеstr2, возвращает положительное число |
|
Указанные функции находятся в библиотеке cstring.Поэтому программа, использующая эти функции должна содержать директиву
#include <cstring>
Предостережения, отмеченные в замечаниях таблицы, весьма важны . Так, например, если длинную строку str2копировать в строку с недостаточной длинойstr1, то все элементы массиваstr1будут заполнены, однако функция на этом не остановится и продолжит заполнять ячейки памяти которые следуют за последним элементом массиваstr1, даже если они заняты другой информацией заменять которую нельзя. Естественно, что чаще всего это влечет сбой в работе программы.
Очень часто перед программистом стоит задача перевода строк в числа. Например, строка "12345" и число 12345 это совершенно разные типы. Для перевода строки в число используется функция atoi(str). По-русски название функции произносится как "эй ту ай" ("A"to"I" -alphabetictointeger). Функцияatoiвозвращает целое число, соответствующее символам строки. Если невозможно установить соответствие символов аргумента с целым числом, то функция возвращает значение 0. Например:
atoi("12345")возвращает 12345
atoi("#12345") возвращает 0, потому, что символ # не является цифрой.
Функция atoi находится в библиотеке с заголовочным файломcstdlib, поэтому в программах в которых используется эта функция должна присутствовать директива
#include <cstdlib>
В эту библиотеку входит также функция atol, которая возвращает значение типа long. Кроме того, в библиотеку входит функция atof, которая возвращает значение типаdoubleесли строка содержит только цифры и точку. В противном случае возвращается 0.0, что говорит о том, что число не определено.
В качестве примера рассмотрим программу, с помощью которой можно из вводимых букв и цифр выделить цифры. Правда, количество цифр не должно превосходить пяти, но читатель без труда может изменить это количество, поняв суть программы. В программе используется новая библиотечная функция isdigit(char), которая возвращает значениеtrue,если аргумент является десятичной цифрой. В противном случае возвращаетсяfalse. Кроме того, используется функцияcin.get(char),которая в отличие отcinчитает все символы, включая пробелы и символ возврата строки'\n'. Обращаться с этой функцией следует аккуратно, т.к. применение ее два раза подряд может привести к ошибке. Например, введя в первый раз число и нажав клавишу"Enter"автоматически повлечет ввод символа'\n'с помощью второй записи функции. В силу этих причин в предлагаемом ниже примере специально применена вспомогательная функцияnewLine.
#include <iostream>
#include <cstdlib>
#include <cctype>
using namespace std;
void read(int& n); /* Читает строку, отбрасывая все символы кроме цифр. Преобразует строку в целое число и присваивает его переменной n. */
void newLine(); /* Отбрасывает все символы оставшиеся в текущей строке, в том числе символ \n. */
void main(){
int n;
char answer;
do {
cout<<endl<<"Input sum and click Enter"<<endl;
read(n);
cout<<"The number equal "<<n<<" is'n it?"<<endl;
cout<<"Once more? (yes/no): ";
cin>>answer;
newLine();
}while((answer !='n')||(answer !='N'));
}// конец main
//*****************************************************
void read(int& n){
char digitString[6]; //массив для формирования числа
char next;
int index=0;
cin.get(next); //вводит символ включая пробелы
while (next !='\n')
{
if ((isdigit(next))&&(index<5))
{
digitString[index]=next;
index++;
}
cin.get(next);
} //конец while
digitString[index]='\0'; // ввод символа конца строки
n=atoi(digitString); //перевод символов в число
} //конец функции read()
//------------------------------------------
// Функция ввода строки
void newLine()
{char symbol;
do
{
cin.get(symbol);
}while(symbol !='\n');
}
Вот результат