© 2022, id43259955 188 0
СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ
Благодаря готовым учебным материалам для работы в классе и дистанционно
Скидки до 50 % на комплекты
только до
Готовые ключевые этапы урока всегда будут у вас под рукой
Организационный момент
Проверка знаний
Объяснение материала
Закрепление изученного
Итоги урока
Министерство образования и науки Кыргызской Республики
Ошский технологический университет
Узгенский колледж технологии и образования имени академика Б.Мурзубраимова
Отделение среднего профессионального образования
Кафедра «Естественно технические дисциплины»
ПРОГРАММА ОБУЧЕНИЯ ПО ДИСЦИПЛИНЕ
– SYLLABUS для студентов
По дисциплине «Объектно-ориентированное программирование»
По специальности «230109 - Программное обеспечение вычислительной техники и автоматизированных систем (по отраслям)»
г. Узген
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ КЫРГЫЗСКОЙ РЕСПУБЛИКИ ОШСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТУЗГЕНСКИЙ КОЛЛЕДЖ ТЕХНОЛОГИИ И ОБРАЗОВАНИЯ
ИМЕНИ АКАДЕМИКА Б.МУРЗУБРАИМОВА
Кафедра «ЕСТЕСТВЕННО-ТЕХНИЧЕСКИЕ ДИСЦИПЛИНЫ»
Утверждаю Одобрено
заместитель директора по учебной работе на заседании учебно-методического
__________________________________ совета колледжа, протокол №
«______» ____________________________ 20____ г. «______» ____________________ 20____ г.
УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС ПО ДИСЦИПЛИНЕ
«Объектно-ориентированное программирование»
форма обучения – очная
Распределение объема учебной нагрузки по учебному плану
| № | Специальности | Семестр | Всего | Ауд. | Лек. | Прак. | СРС | Экз |
| 1. | 230109 - Программное обеспечение вычислительной техники и автоматизированных систем.
| 3 |
|
| 20 | 56 |
| + |
Рассмотрено на заседании кафедры, протокол № ____ ______________20____г.
Зав.кафедрой _____________________ Абдуллаева Р.А
Разработала:______________________преп. Калчаева З.И.
Пояснительная записка
Социальные и экономические изменения в жизни общества вызывают потребность в новом качестве образования. Процесс информатизации является одной из основных характеристик современного периода развития цивилизованного общества. Информатизация общества - это важнейший социальный процесс, в котором в качестве основного ресурса на первый план выдвигаются информация, а также средства и методы работы с ней. В развитых странах мира наметился переход от общества индустриального к постиндустриальному, или информационному. Такой переход обусловлен появлением принципиально нового инструмента - компьютера. Сегодня система "человек-компьютер" превратилась в проблему, которая касается всех членов общества, а не только специалистов.
Становится очевидным то, что те качества и навыки, которыми должен обладать выпускник, завершающий образование на одном из уровней среднего профессионального образования, призваны отразить конкретные требования отраслей, перспектив их развития, профилей. При этом, ключевым аспектом образования является качество подготовки специалиста.
Рабочая программа учебной дисциплины «Объектно-ориентированное программирование» предназначена для реализации государственных требований к минимуму содержания и уровню подготовки выпускников по специальности «Программирование в компьютерных системах» среднего профессионального образования, и является единой для всех форм обучения.
Цель дисциплины: дать знания об основах объектно-ориентированного программирования.
Основными задачами курса являются:
Особенности программирования на С++;
Препроцессорные средства компилятора;
Базовые конструкции структурного программирования;
Функции;
Взаимосвязь функций с указателями;
Массивы и строки на С++;
Структуры и объединения;
Средства адресации памяти.
Задачи:
- формировать у студентов знания о направлениях развития программного обеспечения вычислительной техники;
- о роли и месте знаний по дисциплине при освоении смежных дисциплин по выбранной специальности и в сфере профессиональной деятельности;
- дать понятие об основах объектно-ориентированного программирования и базовых конструкциях изучаемых языков программирования;
- раскрыть основные приемы программирования и принципы построения алгоритмов;
- создать условия для составления программ на алгоритмическом языке высокого уровня;
- способствовать приобретению практического навыка работы в интегрированной среде изучаемых языков программирования.
Преподавание дисциплины имеет практическую направленность и проводится в тесной взаимосвязи с другими общепрофессиональными дисциплинами: «Операционные системы», «Архитектура компьютерных систем», «Информационные технологии», «Теория алгоритмов».
Для проведения занятий планируется использовать лекции и практические занятия, а также работу с методическими и справочными материалами; применение технических средств обучения и компьютерной техники.
Освоение учебной дисциплины предполагает практическое осмысление ее разделов и тем на практических занятиях.
В рабочей программе планируется самостоятельная работа с указанием тематики и видов работы: написание рефератов, подготовка сообщений по указанной тематике, составление конспекта сообщения, чтение литературы; приведены формы контроля: устный опрос, проверка рефератов, конспекта, тестирование.
Курс строится на принципах теоретического осмысления и логической систематизации полученных знаний, а также на принципах интерактивности, доступности и связи с практикой.
Цели и задачи учебной дисциплины – требования к результатам освоения учебной дисциплины
В результате освоения учебной дисциплины студент должен уметь:
- работать в среде программирования;
- реализовывать построенные алгоритмы в виде программ на конкретном языке программирования.
В результате освоения учебной дисциплины студент должен знать:
- этапы решения задачи на компьютере;
- типы данных;
- базовые конструкции изучаемых языков программирования;
- принципы структурного и модульного программирования;
- принципы объектно-ориентированного программирования.
1.1. Процесс изучения дисциплины направлен на формирование общих компетенций, включающих в себя способность:
ОК 1. Понимать сущность и социальную значимость своей будущей профессии, проявлять к ней устойчивый интерес.
ОК 2. Организовывать собственную деятельность, выбирать типовые методы и способы выполнения профессиональных задач, оценивать их эффективность и качество.
ОК 3. Принимать решения в стандартных и нестандартных ситуациях и нести за них ответственность.
ОК 4. Осуществлять поиск и использование информации, необходимой для эффективного выполнения профессиональных задач, профессионального и личностного развития.
ОК 5. Использовать информационно-коммуникационные технологии в профессиональной деятельности.
ОК 6. Работать в коллективе и в команде, эффективно общаться с коллегами, руководством, потребителями.
ОК 7. Брать на себя ответственность за работу членов команды (подчиненных), за результат выполнения заданий.
ОК 8. Самостоятельно определять задачи профессионального и личностного развития, заниматься самообразованием, осознанно планировать повышение квалификации.
ОК 9. Ориентироваться в условиях частой смены технологий в профессиональной деятельности.
Программист должен обладать профессиональными компетенциями, соответствующими видам деятельности:
ПК 1.1. Выполнять разработку спецификаций отдельных компонент.
ПК 1.2. Осуществлять разработку кода программного продукта на основе готовых спецификаций на уровне модуля.
ПК 1.3. Выполнять отладку программных модулей с использованием специализированных программных средств.
ПК 1.4. Выполнять тестирование программных модулей.
ПК 1.5. Осуществлять оптимизацию программного кода модуля.
ПК 3.1. Анализировать проектную и техническую документацию на уровне взаимодействия компонент программного обеспечения.
Пререквизиты курса: для усвоения дисциплины «Объектно-ориентированное программирование» необходимо знание основ информатики и математики, физики, математического анализа, дискретной математики, линейной алгебры. Студент должен уметь: пользоваться персональным компьютером, иметь начальные навыки работы с операционными системами и сервисными программами, знать основы алгоритмизации и программирование в среде Pascal пользоваться услугами локальных компьютерных сетей, глобальной компьютерной сети Интернет для поиска и получения;
Постреквизиты (перечень дисциплин, в которых используются знания изучаемой дисциплины): знания и навыки по «Объектно-ориентированному программированию» могут быть использованы студентами при изучении дисциплин «Проектирование информационных систем», «Современные методы программирования» и других профилирующих дисциплин.
2. Система оценки знании студентов
Таблица 1
2.1 Распределение рейтинговых баллов по видам контроля
| № вариантов | Вид итогового контроля | Виды контроля | % |
| 1. | Экзамен | Итоговый контроль | 100 |
| Текущий контроль | 100 |
Таблица 2
2.2. Оценка знаний студентов
| Оценка | Буквенный эквивалент | Рейтинговый балл (в процентах %) | В баллах |
| Отлично | А | 95-100 | 5 |
| А- | 90-94 | -5 | |
| Хорошо | В+ | 85-89 | +4 |
| В | 80-84 | 4 | |
| В- | 75-79 | -4 | |
| Удовлетворительно | С+ | 70-74 | +3 |
| С | 65-69 | 3 | |
| С- | 60-64 | -3 | |
| D+ | 55-59 | +2 | |
| D | 50-54 | 2 | |
| Неудовлетворительно | F | 0-49 | -2 |
Таблица 3
2.3. Тематический план курса
| № | Наименование темы | лекции |
| 1 | Введение с систему программирования С++. Классификация символов языка | 2 |
| 2 | Категории типов данных | 2 |
| 3 | Использование редактора и компилятора | 2 |
| 4 | Операции языка программирования С++. Приоритеты операций | 2 |
| 5 | Условные операторы. Циклы | 2 |
| 6 | Функции. Использование локальных и глобальных переменных. Способы передачи данных | 2 |
| 7 | Ввод-вывод информации | 2 |
| 8 | Массивы и указатели | 2 |
| 9 | Структуры. Строки | 2 |
| 10 | Работа с памятью | 2 |
| Всего: | 20 | |
| № | Наименование темы | практика | |
| 1 | Компиляция, выполнение и отладка программ. | 4 | |
| 2 | Операции языка программирования С++. | 4 | |
| 3 | Условные операторы | 4 | |
| 4 | Оператор while | 4 | |
| 5 | Циклы | 4 | |
| 6 | Функции | 4 | |
| 7 | Ввод-вывод информации | 4 | |
| 8 | Массивы и указатели | 4 | |
| 9 | Составной тип данных. Структуры. | 4 | |
| 10 | Строки | 4 | |
| 11 | Динамические структуры | 4 | |
| 12 | Работа с памятью | 4 | |
| 13 | Графика С++ | 4 | |
| 14 | Работа с файлами | 4 | |
| Всего: | 56 | ||
Тема 1. Введение с систему программирования С++. Классификация символов языка
Введение
Цели изучения темы
изучить структуру программы;
использование данных различного типа;
директивы препроцессора.
Требования к знаниям и умениям
Студент должен уметь:
• составить программу линейной структуры: описание переменных, ввод значений, вычисления, вывод результатов;
• использовать директивы препроцессора #include и #define.
План изложения материала
1. Структура программы.
2. Типы данных.
3. Использование констант.
4. Директива define.
5. Директива include.
Основные термины и понятия
Комментарий на одной строке начинается с символа // . // Комментарий
Комментарии на нескольких строчках заключается в /* */
/* комментарий */
2. Для вывода на экран текстовых сообщений и переменных используется оператор cout.
3. Управляющая последовательность вставляется в текстовые сообщения и начинаются со знака "\".
4. Для ввода данных используется оператор cin.
5. Для описания переменных указывается их тип.
6. Директива #define работает как команда текстового редактора найти и заменить.
Формат:
#include АРГУМЕНТ1 аргумент2
7. Директива #include используется для включения текстовых файлов в текст программы.
Формат:
#define
Структурная схема терминов
Программа линейной структуры: описание переменных, ввод значений.
2. Структура программы
Разберите структуру программ на конкретном примере. Программа рассчитывает площадь треугольника по трем сторонам. Используется формула.
где a, b, c - длины сторон треугольника, p – полупериметр.
В качестве операторных скобок используются фигурные скобки.
В конце каждой команды ставится точка с запятой.
Оператор присваивания обозначается знаком =.
А для сравнения двух значений используется двойной знак равенства ==.
Команды могут начинаться с любой позиции.
Для улучшения восприятия можно вставлять в программу пустые строки.
Если комментарий помещается на одной строке, перед ним ставится символ //.
Второй вариант - комментарий занимает несколько строк, тогда он начинается с символов /*, а заканчивается символами */
Команда cout выводит информацию на стандартное устройство вывода.
Этим устройством является экран, если Вы не переназначали стандартное устройство.
Формат команды:
cout
data - переменная, константа, выражение или комбинация всех трех типов.
При выводе символьных строк они берутся в двойные кавычки. В команде использованы управляющие последовательности \t (табуляция) и \n (возврат каретки).
Вы можете использовать и другие управляющие последовательности:
\a Звуковой сигнал
\b Возврат каретки на одну позицию
\f Перевод страницы (для принтера)
\r Возврат каретки
\v Вертикальная табуляция
\\ Выводит левую наклонную черту
\? Выводит знак вопроса
\' Выводит одиночную кавычку
\" Выводит двойную кавычку
\ooo Число в восьмеричной форме
\xhh Число в шестнадцатеричной форм
\o Null-символ (или двоичный ноль)
Оператор cin позволяет вводить значения переменных.
Формат команды
cin [ переменная];
Информацию о командах cout и cin содержит файл iostream.h. Поэтому его необходимо указывать в директиве include.
Заглавные и прописные буквы имеют более существенное значение, чем в большинстве языков программирования. Все зарезервированные слова пишутся прописными буквами. В данном примере это: include, float, cout и т.д. Если вы наберете их заглавными, то компилятор C++ воспримет их как имена переменных. Имена переменных могут быть написаны как прописными, так и заглавными буквами. Причем переменные alfa, Аlfa, aLfa считаются различными переменными. При описании переменной указывается ее тип, имя и, возможно, значение.
Пример:
float a=0, b=10.5;
Переменные a, b описываются как длинные с плавающей точкой, а получает значение 0, b - 10.5
Переменные могут быть описаны в каком-либо модуле (тогда они являются локальными), или вне модуля (тогда они глобальные)
В примере все переменные описаны внутри главного модуля и являются локальными.
Пример глобальных переменных
float a,b,c;
float p,s;
main()
{
.....
}
Тема 2. Категории типов данных
С++ содержит большое количество различных типов.
Использование констант
Директива define.
Директива include
| Имя объявления | Тип | Примерный диапазон значений |
| Char | Символьный | -128..127 |
| unsigned char | Беззнаковый символьный | 0..255 |
| signed char | Знаковый символьный (такой же как char) | -128..127 |
| int | Целый | -32868..32676 |
| unsigned int | Беззнаковый целый | 0..65535 |
| signed int | Знаковый целый (такой же как int) | -32768..32767 |
| short int | Короткий целый | -32768..32767 |
| unsigned short int | Беззнаковый короткий целый | 0..65535 |
| signed short int | Знаковый короткий целый (такой же как short int ) | -32768..32767 |
| Long | Длинный целый | -2147483648..2147483847 |
| long int | Длинный целый (такой же как long ) | -2147483648..2147483847 |
| signed long int | Знаковый длинный целый (такой же как long int ) | -2147483648..2147483847 |
| unsigned long int | Беззнаковй длинный целый | 0..4294967295 |
| Float | Длинный с плавающей точкой | -3.4Е+38..3.4Е+38 |
| long double | Длинный с плавающей точкой двойной точности | -1.7Е+308..1.7Е+308 |
Наибольший интерес для Вас будет представляет тип char, int, float.
Без знаковый тип может принимать только положительные значения
Символьный тип предназначен для хранения 1 символа.
В ранних версиях С++ не специального логического типа любое ненулевое значение считается истинным, нулевое - ложным.
Замечание
На различных моделях компьютеров диапазон может значительно отличаться от приведенного.
2.Использование констант
Константа может принадлежать к любому из выше перечисленных типов, а так же быть строковой константой. Строковая константа не имеет соответствующего типа. Она всегда заключается в двойные кавычки.
Примеры
"С++ Programming" "123" " " "423 Е."
Любая строка символов или одиночный символ, заключенный в кавычки интерпретируется как символьная строка.
Все строковые константы заканчиваются нулем. Вы не увидите нуля. Однако С++ проверяет, что в конце строки в памяти находится ноль. Так располагается строка "Program" в памяти:
Вам не нужно беспокоится о занесении нуля в конец строковой константы, С++ сам сделает это при занесении строки в память. Ноль ограничитель строки очень важен, т.к. без него было бы не понятно, где оканчивается строка.
Можно пользоваться также символьными константами. Символьная константа заключается в одинарные кавычки.
Примеры
'w' 'W' 'C' '='
C++ не добавляет ограничитель в конец символьной константы.
Константы 'R' и "R" сильно отличаются друг от друга:
Символьной константе можно присваивать как символ, так и число.
Пример
char c;
c=84;
В с будет храниться символ T. Т.к. он имеет 84 по таблице ASCII.
Допустимы и арифметические операции:
Пример
a='T'+5;
char a;
И наоборот целой переменной можно присвоить символ. Тогда в ней окажется ASCII номер символа.
В переменную a будет размещен символ Y, который имеет номер 89 по таблице ASCII.
Пример
int i='P';
В переменной i окажется число 80.
3. Директива define
Директива препроцессора #define широко используется в C++. Работает как обыкновенная команда текстового редактора найти и заменить.
Формат:
#include АРГУМЕНТ1 аргумент2
АРГУМЕНТ 1 - одно слово, не содержащее пробелов. Для работы в имени первого аргумента традиционно используются большие буквы. АРГУМЕНТ1 отделяет от аргумента2 по крайней мере один пробел. Аргумент2 может быть любым символом словом или фразой, может содержать пробелы или любые символы, которые можно набрать на клавиатуре. Не ставьте в конце директивы define точку с запятой, т.к. это не выполняемый оператор, а директива препроцессора.
Пример
Программа рассчитывает выражение:
z=(log2x+logcy)/ logc+2(x+y)
Для расчета logab используется формула:
logab=lnb/lna
В программе logab записывается в форме lg(b,a)
#include
#include
#include
#define LG(b,a) log(b)/log(a)
main()
{
float x,y,c;
float z;
cout
cin xyc;
z=(LG(x,2)+LG(y,c))/LG(x+y,c+2);
cout
return 0;
}
Директива include
Директива препроцессора include используется для включения текстовых файлов в текст программы. Имя файла указывается в угловых или двойных кавычках " ".
Угловые кавычки означают, что файл находится в стандартной папке INCLUDE, двойные кавычки, что файл находится в текущей папке. Директива include обычно используется для подключения библиотек.
Проблемные ситуации
Иногда возникают проблемы при использовании директивы препроцессора define. Обратите внимание: в конце не ставиться точка с запятой; используйте дополнительные круглые скобки, Например, директива для поиска минимального из двух чисел.
#define min(x,y) ( (xy)? x : y )
Выводы по теме
Программа линейной структуры может содержать директивы препроцессора, переменные и константы операторы ввода и вывода.
Вопросы для самоконтроля
Для чего используются директивы include и define?
Какой знак ставиться в конце каждого оператора?
Как выделить комментарии в программе?
Что означает оператор cout
Как будет размещена информация на экране.
Перечислите управляющие последовательности
Какой оператор может быть использован для ввода значения в переменную?
Что означает двойной знак равенства?
Какой оператор используется для присвоения значения?
Чем различаются типы int и unsigned int?
Тема 3. Использование редактора и компилятора
Введение
Набор программы
Компиляция программы
Цели изучения темы
• ознакомиться с особенностями набора программы, ее компиляции и отладки.
Требования к знаниям и умениям
Студент должен знать возможности редактора интегрированной среды Borland C++.
Студент должен уметь набирать, компилировать и отлаживать программу.
План изложения материала
1. Набор программы.
2. Компиляция программы.
Ключевой термин
Ключевой термин: компиляция программы.
Компиляция программы ― это процесс преобразования исходного кода в исполняемый.
Второстепенные термины
• выделение;
• копирование;
• перенос;
• переход между окнами;
Структурная схема терминов
2. Набор программы
Интегрированная среда Borland C++ версия 3.0, для ОС DOS создана "по образу и подобию" интегрированной среды Borland Pascal.
Редактор поддерживает стандартные возможности:
• режимы вставки и замены (INSERT);
• выделения блока (^КB- начало блоков, ^КК);
• копирование блока (^КС);
• удаление блока (^КY);
• перенос блока (^КV).
Если среда запущена под управлением Windows, можно скопировать блок в буфер обмена (^Insert), вставку из буфера (Shift+Insert).
Вызов верхнего меню производиться клавишей F10, второе нажатие отменяет выбор меню, а также мышью.
В редакторе может быть открыто несколько программ, каждая в своем окне. Для перехода из одного окна в другое можно пользоваться мышью или функциональной клавишей F6.
Закрытие ненужных окон производиться ALT+F3.
File/Save или F2 - сохранить программу,
File/Open или F3 - открыть программу.
3. Компиляция программы
Компиляция программы происходит по нажатию ^F9.
При компиляции программы могут обнаружится ошибки. В этом случае появляется окно "Message", в котором эти ошибки будут перечислены и расшифрованы.
Например,
Error N.cpp 6: Undefined symbol 't'
Error N.ccp 6: Stament missing ;
Ошибка в 6-й строке: неопределенный символ 't'
Ошибка в 6-й строке: прощена точка с запятой
На самом деле ошибка может располагаться и в предыдущих строках программы, например, в 5-й строке.
Вы можете пощелкать по строке с ошибкой в окне "Message", будет выделена соответствующая строка в тексте программы. Программа с такого рода ошибками не работоспособна. Пока Вы их не исправите, программа не будет работать.
Могут быть обнаружены менее серьезные ошибки, которые не влияют на работоспособность программы.
Например,
Warning N.cpp 7: 'n' assigned a value that is never used
Предупреждение в строке 7: 'n' не было присвоено значение, 'n' не используется
Хотя программа работоспособна при наличие предупреждений, обращайте на них внимание и исправляйте программу.
Окно Message позволяет быстро отладить программу, устранить синтаксические ошибки и добиться правильной работы.
Если ошибка возникла во время выполнения программы, простое указание того места, где она была обнаружена может не дать нужной информации. Т.к. ошибка может являться следствием неправильной подготовки данных. Например, если ошибка возникла при извлечении корня их отрицательного числа, будет указан оператор, в котором осуществлялась сама операция извлечения корня, хотя ясно, что первопричину ошибки следует искать где-то раньше, там, где соответствующей переменной присваивалось отрицательное значение.
Для выявления таких ошибок обычно используют пошаговое выполнение программы, а так же точки останова.
Например, при нажатии клавиши F7 среда выполнит компоновку, компиляцию и загрузку программы, а затем остановит прогон программы перед первым оператором. Теперь нажатие F7 приведет к выполнению очередного оператора, будут показаны так же операторы вызываемых функций, в том числе и стандартных. Если Вы не хотите заходить в функции, пользуйтесь клавишей F8.
В подозрительных местах программы можно просмотреть значения переменных или выражений. Для этого нужно действовать следующим образом. Установите курсор в то место текущей строки, где написано имя интересующей переменной и нажмите ^F7. После этого на экране появиться окно "Add Watch", в строке Watch Expression указывается имя интересующей Вас переменной, нажмите Ok. Если курсор стоял на пустом участке строки или на другом выражении после нажатием ^F4 Вам придется исправить выражение, а затем нажать Enter.
При отладке можно выполнить программу до того места, на котором находится курсор (Run / Go to cursor или F4).
Выводы по теме
1. При работе редакторе Вы, в основном, будете использовать функциональные клавиши F2, F3, F7, F8, F9 или использовать соответствующие пункты меню.
Вопросы для самоконтроля
1. Вам необходимо скопировать две строки текста из одного места программы в другое. Какие действия можно для этого предпринять?
2. На Вашем компьютере перестала работать "мышь", как вы будете вызывать верхнее меню?
3. Как сохранить программу?
4. Как открыть готовую программу?
5. Какие действия необходимо предпринять для выполнения и компиляции программы?
6. При компиляции обнаружена ошибка, в окне Message появилось сообщение: "Error...". Будет ли работать Ваша программа?
7. При компиляции обнаружена ошибка, в окне Message появилось сообщение: "Warning...". Будет ли работать Ваша программа?
8. Чем отличается пошаговое выполнение при помощи клавиш F7 и F8?
| Тема 4. Операции языка программирования. С++. Приоритеты операций |
| Введение Цели изучения темы изучить операции языка С++ и их приоритеты. Требования к знаниям и умениям Студент должен уметь: составлять выражения с различными операциями; описывать указатель на какой-либо тип данных; получать доступ к переменной по ее адресу. План изложения материала Математические операции. Присваивание. Составное присваивание. Преобразование типов. Операции отношения. Операции инкремента (++) и декремента (--). Операция sizeof. Операция "запятая". Оператор?:. Указатель. Определение адреса переменной. Таблица приоритетов операций языка С++. Ключевой термин Ключевой термин: составное присваивание. Составное присваивание - это операция изменения переменной: увеличения, уменьшения на какое-либо число, умножение или деление на какое-либо число. Второстепенные термины преобразование типов; инкремент; декремент; операция sizeof; операция "запятая"; указатель. Структурная схема терминов
|
|
|
2. Математические операции
| Знак | Математическая операция |
| * | Умножение |
| / | Деление и целочисленное деление нацело |
| % | Деление по модулю и остаток от деления |
| + | Сложение |
| - | Вычитание |
Знак / всегда означает деление. Однако если с обеих сторон от этого знака стоят целые величины (константы, переменные или их комбинации), он означает целочисленное деление. Если в результате такого деления получается остаток, С++ его отбрасывает.
Знак % означает выделение остатка при целочисленном делении. Эта операция требует, чтобы с обеих сторон от ее знака стояли целые величины.
Примеры
cout // 5 (остатка нет)
cout
cout
cout // 1 (остаток отброшен)
cout ; // 1 (остаток)
cout
1.3.3. Присваивание
В одной строке может стоять больше одной операции присваивания =.
Пример
a=b=c=d=100;
Знак = всегда означает: "переменной слева присвоить значение, стоящее справа". Операция выполняется справа налево. Поэтому первой значение 100 получает переменная d, затем с, b и а.
Знак присвоить может стоять даже внутри математического выражения:
value=5+(r=9-c)
Присваивание имеет более высокий приоритет, чем сложение и вычитание. Поэтому сначала переменной r будет присвоено значение 9-с. А затем переменная value получит значение 5+9-с.
1.3.4. Составное присваивание
При написании программы часто требуется изменить значение переменной. Например, требуется взять текущее значение переменной, прибавить или умножить это значение на какое-то выражение, а затем присвоить это значение той же переменной. Такие операции выполняют операторы составного присваивания.
| Операция | Пример | Эквивалент |
| + = | B+ = 500; | B= b+ 500; |
| - = | С- = 50; | C = с - 50; |
| * = | D* = 1.2; | D = d*1.2; |
| / = | F/ = 50; | f = f/.50; |
| % = | m% = 7; | M = m% 7; |
1.3.5. Преобразование типов
Чаще всего Вам не надо беспокоиться об автоматическом преобразовании типов. Однако если Вы смешивает беззнаковые переменные с переменными других типов, могут возникнуть проблемы. Точность результата может быть потеряна. Поэтому необходимо произвести временное изменение типов.
Формат:
(тип данных) выражение
Тип данных - это любой допустимый тип.
Выражение - переменная, константа или выражение.
Пример
v=(double)age*f;
Переменная age временно преобразуется к типу с плавающей точкой двойной точности и умножается на переменную f.
1.3.6. Операции отношения
| Операции | Описание |
| = = | Равно |
| Больше | |
| Меньше | |
| = | Больше или равно |
| Меньше или равно | |
| != | Не равно |
Замечание 1
Знак = никогда не используется как знак сравнения! Это знак присвоить значение.
Замечание 2
В C++ нет логического типа. Поэтому, если выражение принимает ненулевое значение, то оно считается истинным, а если не нулевое - ложным.
1.3.7. Операции инкремента (++) и декремента (-)
В языке C++ предусмотрены две уникальные операции, которые увеличивают или уменьшают значение переменной на 1.
| Оператор | Пример | Описание | Эквивалентное выражение |
| + + | i + +; | Постфиксная | i =i+1; или i+=1; |
| + + | + + i; | Префиксная | i =i+1; или i+=1; |
| - - | i - -; | Постфиксная | i =i-1; или i-=1; |
| - - | - - i; | Префиксная | i =i-1; или i-=1; |
Префиксный и постфиксные операции различаются приоритетом. Префиксные операции имеют самый большой приоритет и выполняются до любой другой операции. Постфиксные операции имею самый маленький приоритет и выполняются после всех остальных операции.
Пример
float a, b=2, c=1, d=1;
a = b + c++;
cout
/* Даст результат a=3 c=2.
Используется постфиксный инкремент. Сначала произойдет сложение b и c, результат запишется в а, затем с будет увеличена на 1 */
a = ++d + b;
cout
/* Даст результат a=4 d=2.
Используется префиксный инкремент. Сначала d будет увеличена на 1 (и станет равной 2), затем произойдет сложение d и b, результат запишется в а */
1.3.8. Операция sizeof
Имеет формат
sizeof данные
или
sizeof (тип данных)
Операция sizeof возвращает размер в байтах указанного в ней данного или типа данных.
Пример
cout " "Размер типа float в байтах=\t" "sizeof (float)
Результат: 4.
1.3.9. Операция "запятая"
Дополнительная операция (,) не работает непосредственно с данными, а приводит к вычислению выражения слева направо. Эта операция позволяет Вам использовать в одной строке несколько выражений, разделенных запятой.
Пример 1
main()
{
int i = 10,
j = 25;
}
Пример 2
i = 10;
j=(i=12,i+8);
Результат выполнения: j=20. Сначала i получает значение 10, затем использование операции "запятая" приведет к тому, что i получит значение 12, а затем значение i+8, т.е. 12+8=20. Результат будет присвоен j.
1.3.10. Оператор ?:
(Условие) ? (выражение1):(выражение2)
Если условие истинно, то выполняется выражение1, а если ложно, то выражение2.
Пример
(аb) ? (ans =10):(ans=25);
или
ans=(ab)?(10):(25);
Если аb, то переменная ans получается значение 10, иначе - значение 0.25
1.3.11. Указатель. Определение адреса переменной
С++ позволяет на прямую работать с памятью. С любой переменной можно работать, указывая ее имя или ее адрес. Адреса переменных называются указателями, при описании указатель обозначается *.
Пример
int * k; // k - указатель на переменную целого типа
Можно получить адрес, по которому переменная располагается в памяти.
Операция & переменная определяет адрес переменной по ее имени, а также позволяет обратиться к памяти по значению указателя.
Операция * указатель позволяет получить доступ к данным, которые хранятся по адресу указатель.
Перед использованием указателя его необходимо описать в программе.
Пример
int *c; // с указатель на переменную типа int
float * d; // d указатель на переменную типа float
1.3.12. Примеры программ. Таблица приоритетов операций языка С++
Пример 1
Выведем значения переменной и ее адреса в памяти
#include
main()
{
int *c; int d;
d=45; c=&d; // с присваивается адрес переменной d
cout
return 0;
}
с - это указатель на число типа int.
Пример 2
Изменим значение переменной двумя способами:
1) с использованием имени переменной.
2) с использованием адреса переменной.
#include
main()
{
int *c; int d;
c=&d; // с присваивается адрес переменной d
d=105; // первый способ
*с=105; // второй способ
cout
cout
return 0;
}
Таблица 1.3.1. Таблица приоритетов С++
| Уровень приор. | Символы | Описание |
|
| 1 | ++ | Префиксный инкремент | Слева направо |
| -- | Префиксный декремент | ||
| () | Вызов функции и подвыражение | ||
| [] | Выделение элемента массива | ||
| - | Указатель структуры | ||
| . | Член структуры | ||
| 2 | ! | Логическое отрицание | Справа налево |
| ~ | Поразрядное логическое НЕ (дополнение до 1) | ||
| - | Унарный минус (изменение знака) | ||
| + | Унарный плюс | ||
| (type) | Преобразование к типу | ||
| * | Обращение к памяти по значению указателя | ||
| & | Определение адреса переменной | ||
| sizeof | Определение размера в байтах | ||
| 3 | * | Умножение | Слева направо |
| / | Деление | ||
| % | Остаток от деления | ||
| 4 | + | Сложение | Слева направо |
| - | Вычитание | ||
| 5 | Поразрядный сдвиг влево | Слева направо | |
| Поразрядный сдвиг вправо | |||
| 6 | Меньше | Слева направо | |
| Меньше или равно | |||
| Больше | |||
| = | Больше или равно | ||
| 7 | == | Равно | Слева направо |
| != | Не равно | ||
| 8 | & | Поразрядное логическое И | Слева направо |
| 9 | ^ | Поразрядное исключающее ИЛИ (XOR) | Слева направо |
| 10 | | | Поразрядное логическое ИЛИ | Слева направо |
| 11 | && | Логическое И | Слева направо |
| 12 | || | Логическое ИЛИ | Слева направо |
| 13 | ?: | Операция условия | Слева направо |
| 14 | = | Присваивание | Слева направо |
| += | Составное сложение | ||
| -= | Составное вычитание | ||
| *= | Составное умножение | ||
| /= | Составное деление | ||
| %= | Составное определение остатка от деления | ||
| Составной поразрядный сдвиг влево | |||
| = | Составной поразрядный сдвиг вправо | ||
| &= | Составное поразрядное логическое И | ||
| ^= | Составное поразрядное исключающее ИЛИ | ||
| |= | Составное поразрядное логическое ИЛИ | ||
| 15 | , | Операция "запятая" | Слева направо |
| ++ | Постфиксный инкремент | ||
| -- | Постфиксный декремент |
1.3.13. Выводы по теме
В языке С++ существуют: математические операции, присваивание, составное присваивание, преобразование типов, операции отношения, операции инкремента (++) и декремента (--), операция sizeof, операция "запятая", оператор ?:.
1.3.14. Вопросы для самоконтроля
Какие результаты появятся на экране?
cout
cout
Чему будет равен y?
float a=1, b=2, c=3, y=4;
a) y *=a;
б) y /= 2;
в) y- -;
г) - - y;
Как определить, сколько байт в памяти занимает переменная типа long int?
Запишите при помощи оператора ?: действия: "Если х больше нуля, y присвоить значение x, иначе значение -x".
Что представляет собой z?
int * z;
Как занести значение 8 по адресу z?
int *z;
Как определить адрес переменной b в памяти?
int b;
| Тема 5. Условные операторы. Циклы |
| 1. Введение Цели изучения темы изучить особенности работы условных и циклических операторов С++. Требования к знаниям и умениям Студент должен знать: какие циклы и условные операторы существуют в С++; правила их записи. Студент должен уметь составить программу с использованием условного оператора или цикла. План изложения материала Условный оператор. Оператор while. Оператор do while. Оператор exit(), break, continue. Оператор for. Оператор switch. Основные термины или понятия if; switch; while; do...while; for; exit; break; continue. Структурная схема терминов
|
1.4.2. Условный оператор
if (условие)
{блок из одного или более операторов}
Если условие верно, то выполняется блок из одного или более операторов.
Второй вариант:
if (условие)
{блок 1 из одного или более операторов}
else
{блок 2 из одного или более операторов}
Если условие верно, то выполняется блок 1 из одного или более операторов, а если не верно, то блок 2.
Пример 1
if (ab)
ans=10;
else
ans=25;
Если аb, то переменная ans получается значение 10, иначе - значение 0.
Пример 2
if ( age
{
cout
cout
cin grade;
}
Если переменная age
1.4.3. Оператор while
Цикл while - цикл с неизвестным числом повторений.
while (условие)
{блок из одного или нескольких операторов}
Если условие истинно (принимает не нулевое значение), то выполняется блок из одного или нескольких операторов и происходит возврат на проверку условия. Если условие ложно, происходит выход из цикла. Условие может быть составлено из нескольких выражений, с использованием || (логическое сложение "или") и && (логическое умножение "и").
Пример 1
char ans ='Y';
longint a==l;
while ( (ans ='Y') || (ans='y') )
{a*=a+l;
cout
cout
cin ans;
}
ans описывается как символ, а - как целое длинное. Если пользователь вводит 'Y' или'у', то выполняются блок операторов в фигурных скобках.
Прокомментируйте операторы в фигурных скобках.
Оператор while удобно использовать для проверки ввода пользователя.
1.4.4. Оператор do...while
do...while - это цикл с постусловием.
Цикл do...while - цикл с неизвестным числом повторений. В отличие от цикла while условие проверяется в конце цикла. Поэтому тело цикла выполняется хотя бы один раз.
do
{блок из одного или нескольких операторов}
while (условие)
Пример 1
char ans 'Y';
longint a=l;
do
{a*=a+l;
cout
cout
cin ans;
}
while ((ans ='Y') || (ans='y') ) ;
1.4.5. Операторы exit(). break continue
В C++ предусмотрена возможность досрочного выхода из программы до ее нормального завершения с помощью функции exit().
Формат:
exit(статус);
где статус - переменная или константа типа int - код завершения. В соответствии с кодом завершения устанавливается переменная окружения, уровень ошибки (ERRORLEVEL) операционной системы. Этот код завершения может проверяться в командных файлах.
Обычно оператор exit ставиться в теле оператора if, чтобы закончить программу, в зависимости от результата проверки условия. При использовании exit необходимо указывать заголовочный файл stdlib.h
Команда используется для выхода из текущего цикла.
Команда break может находиться в любом месте программы, однако обычно break ставиться в теле операторов while или do... while.
Пример 1
#include
#include
main()
{exit(0); //заставляет программу завершиться в этом месте
cout
cout
return 0;
}
На первый взгляд кажется, что эта программа выдаст на экран несколько сообщений.
Но это заблуждение, т.к. функция exit в начале программы приведет к ее прерыванию.
Пример 2
#include
#include
// Проверка пароля, пользователю предоставляется 3 попытки.
main()
{
int nash_p=4321; // пароль int k=0; // количество попыток
int ego_p; // пароль введенный пользователем
do
{
cout
cin ego_p;
k++;
if (ego_p=nash_p)
{
cout
exit(0);
}
else
{
(k
(cout
}
}
while (k
return 0;
}
Если пользователь ввел верный пароль, программа заканчивает свою работу с кодом завершения 0. В противном случае выдается сообщение о неверном пароле.
Оператор continue прерывает выполнение очередного шага цикла и заставляет компьютер начать выполнять новый шаг цикла. Если Вы поместите оператор continue в цикл for или while, компьютер будет игнорировать все операторы, следующие в теле цикла после continue.
Формат оператора:
continue;
Обычно оператор continue используется, если данные, обрабатываемые в теле цикла неверны, выходят за допустимые пределы или имеют непредвиденные значения. Вместо обработки некорректных данных, вы можете захотеть вернуться к началу цикла, чтобы получить другое значение.
Пример
// Вычисление средней зарплаты, зарплаты меньше 500 не учитываются
#include
main()
{
float sr_zarp=0,zarp; // средняя заработная плата, текущая заработная плата
int kol=0; // количество
do
{
cout
cout
cin zarp;
if ( zarp
break;
if ( zarp
continue;
else
{
sr_zarp+=zarp;
kol++;
}
while (1= =1); // Бесконечный цикл
s_zarp/=floa_kol;
cout
}
Прокомментируйте программу. Что произойдет если ввести зарплату -550, 230?
1.4.6. Оператор for
for - оператор цикла с известным числом повторений.
Формат:
for (начальное выражение; контрольное выражение ; счетчик)
{блок из одного или нескольких операторов}
Оператор for работает следующим образом:
Перед выполнением цикла вычисляется начальное выражение.
Проверяется контрольное выражение.
Если контрольное выражение истинное, то
выполняется блок из одного или нескольких операторов,
рассчитывается выражение счетчик,
возврат к пункту 2.
А если ложно, то оператор for заканчивает свою работу.
Пример 1
// Программа выдает на экран числа от 1 до 10
#include
main()
{
int i;
for (i=l; i
{ cout
}
Пример 2
// Сложение чисел от а до b
#include
main()
{ int a,b,i;
long int s=0;
cout Введите a \n";
cin a;
cout Введите b \n";
cin b;
if(ab)
{ cout b"; }
else
{
for (i=a; i
s+=i;
cout nСумма=" s;
}
return 0;
}
Прокомментируйте программу. Что произойдет, если b окажется больше чем а? Какое выражение вычисляется в качестве счетчика, начального выражения, контрольного выражения?
В качестве начального выражения можно использовать несколько операторов, их нужно разделять запятыми. В примере занесем s=0 в начальное выражение:
for (i=a, s=0; i=b; i++)
s+=i;
1.4.7. Оператор switch
Оператор switch - оператор выбора.
Формат:
switch (выражение)
case (выражение 1):
блок из одного или нескольких операторов 1;
break;
case (выражение2):
блок из одного или нескольких операторов 2;
break;
case (выражениеЗ):
блок из одного или нескольких операторов 3;
break;
default:
блок из одного или нескольких операторов n;
break;
}
Выражением могут быть любое выражение, константа или переменная типа int или char.
Оператор switch используется вместо нескольких операторов if else.
Если выражение принимает значение выражение1, то выполняется блок из одного или нескольких операторов 1, если выражение принимает значение выражение2, то выполняется блок из одного или нескольких операторов 2, и т.д. Если выражение не совпадет ни с выражением под номером, то выполняется блок из одного или нескольких операторов n.
Строка default - необязательная и может отсутствовать.
Пример 1
// начисление процентов,
// kat - категория счета, если категория счета =1, то начисляется 20 %,
// если категория счета =2, то - 17.5 %,
// в остальных случаях начисляется 10 %
#include
main()
{
int kat;
float s, proz;
cout
cin kat;
coot
cin s;
switch (kat)
{
case 1:
s*=1.2;
proz = s*.2;
break;
case 2:
s*=1.175;
proz =s*. 175;
break;
default:
s*=l.l;
proz= s*.l;
break;
}
cout Начислено "
cout Итого "
return 0;
}
1.4.8. Стандартные математические функции
Стандартные математические функции хранятся в библиотеке math.h.
Тригонометрические функции используют радианы. Все функции, кроме указанных, принимают один аргумент типа double. Возвращают так же число типа double.
| Acos | Аркосинус |
| Asin | Арксинус |
| Atan | Арктангенс |
| atan2 (x, y) | Арктангенс от у/х |
| Ceil | Округление в большую сторону |
| Cos | Косинус |
| Cosh | Гиперболический синус |
| Exp | е в степени х |
| Fabs | Модуль |
| Floor | Округление в меньшую сторону |
| fmod (x, y) | Остаток от деления х на у |
| log | Натуральный логарифм |
| Sin | Синус |
| Sinh | Гиперболический синус |
| Sqrt | Квадратный корень |
| Tan | Тангенс |
| Tanh | Гиперболический тангенс |
1.4.9. Выводы по теме
В языке С++ применяются условные операторы: if и switch, операторы циклов: for, while, do..while.
1.4.10. Вопросы для самоконтроля
Вычислите
Чем отличаются циклы while и do...while?
Какие операторы будут выполнены один раз до цикла, какие при каждом шаге цикла, что является условием завершения цикла, чему будет равен у?
for ( i==1, s==0; i
s += i*i;
Чем различается способ работы операторов continue и break?
К каким результатам приведет выполнение оператора exit(2)?
В чем ошибка?
switch (n)
{case 1: y=x*x;
case 2: y=x*x*x;
case 3: y=x+3;
}
Тема 6. Функции. Использование локальных и глобальных переменных. Способы передачи данных
| 1. Введение Цели изучения темы изучить способы описания локальных и глобальных переменных, использования функций; механизмы передачи данных. Требования к знаниям и умениям Студент должен знать: особенности локальных и глобальных переменных; формат и вызов функции; способы передачи значений из функции. Студент должен уметь: составить программу с локальными и глобальными переменными; составить функцию. План изложения материала Видимость переменных. Формат функции. Возвращаемые значения функции. Использование прототипов функций. Ключевой термин Ключевой термин: функция. Второстепенные термины локальные и глобальные переменные; автоматические и статистические глобальны переменные. Структурная схема терминов
|
1.5.2. Видимость переменных
Можно использовать глобальные и локальные переменные. Глобальные переменные видимы (доступны) от точки их определения до конца файла. Локальные переменные доступны только в том блоке, в котором они описаны. Блок ограничивается фигурными скобками.
Пример
Программа содержит два блока.
main()
начало блока 1 { int I=10;
начало блока 2 {
int I=20;
cout
конец блока 2 }
cout
return 0;
конец блока 1 }
Программа содержит две локальные переменные i. Каждая переменная является локальной по отношению к тому блоку, в котором она определена. После окончания блока переменная очищается.
Поэтому в программе фактически две различные переменные. Результатом выполнения программы будут сообщения:
i=20
i=10
Пример
int a;
main()
{
int I;
return 0;
}
a - глобальная переменная, она существует внутри блока main и существовала бы в других блоках, если бы они присутствовали в программе.
I - локальная переменная блока main.
Локальные переменные подразделяются на автоматические и статистические.
Автоматические переменные уничтожаются сразу после завершения того блока, в котором они описаны.
Автоматические переменные описываются со словом auto.
auto float с;
По умолчанию все переменные являются автоматическими, поэтому префикс auto можно не указывать.
Статистические переменные сохраняют свое значение на случай, если блок (функция) когда-нибудь будет выполнен во второй раз.
Для описания статистических переменных используется префикс static.
{
static int i=l;
}
Инициализация переменной происходит только при первом обращении к блоку (функции). Если Вы не проинициализируете переменную, то C++ сам обнулит ее при первом обращении.
1.5.3. Формат функции
ТипРезультата ИмяФункции (СписокПараметров)
{
... // Тело функции
return Результат;
}
Функция, написанная на C++, имеет следующие свойства:
- имя, которое начинается с буквы или знака подчеркивания. Имя функции может состоять из букв, цифр и знаков подчеркивания
- за именем функции должна стоять пара круглых скобок. В них перечисляются параметры функции. Круглые скобки помогают компилятору отличать функции от переменных. Скобки могут ничего в себе не содержать
- тело каждой функции, которое начинается сразу же после закрывающей круглой скобки за именем функции, должно быть заключено в фигурные скобки
Пример
Функция, которая вычисляет
,
х,y вещественные числа, результат будет так же вещественным числом.
Float sqr (float x, float y)
{
float rez;
rez=sqrt (x*x+y*y);
return rez;
}
Пример
Функция, которая выводит квадраты чисел от n до тех пор, пока квадрат числа меньше 250:
int kvadrat (int n)
{ int i=n;
while (i
{
coutКвадрат числа ";
i++;
}
return 0;
}
Если функция возвращает значение типа int, тип результата можно не указывать.
kvadrat (int n)
{ int i=n;
while (i
{
coutКвадрат числа ";
i++;
}
return 0;
}
Возможны ситуации, когда функция не возвращает никаких значений. Тогда вместо типа результата указывается слово void, а return не пишется.
void kvadrat (int n)
{ int i=n;
while (i
{
coutКвадрат числа ";
i++;
}
}
1.5.4. Структура программы
С точки зрения функций, main тоже является функцией. Main переводится как главная. Возможны два варианта блока main.
Вариант 1
main ()
{ ...
return 0;
}
Блок main возвращает значение целого типа int.
Вариант 2
void main ()
{ ...
}
Блок main не возвращает никаких значений.
Блок main может включать вызовы других функций. Для вызова функции указывается ее имя и значения параметров в круглых скобках. При вызове функции выполняются все операторы из тела функции до конца (оператора return). Затем происходит возврат в главную функцию.
При использовании локальных переменных Вы защищаете их значение, т.к. изменить содержимое переменной может только та функция, которая имеет к ней доступ.
Что делать, если имеется локальная переменная и Вы хотите использовать ее в другой функции? Другими словами, Вам нужно ввести значение переменной в одной функции, а вывести в другой. Можно передать ее значение во вторую функцию.
Пример
f (int i, int j)
{
i=6; j=16;
cout
return 0;
}
main ()
{
int i=5, j=15;
f (i,j);
return 0;
}
Данный способ называется передача по значению (или копированием). В принимающую функцию передается не сама переменная, а только ее значение. Это уже не одна переменная, а, фактически, две. Первая является локальной по отношению к главной функции, а вторая локальной по отношению к принимающей функции. Если эти переменные имеют одно и тоже имя конфликта не возникает, т.к. они локальны. При изменении переменной в принимающей функции, значение в главной функции не изменяется.
Второй способ передачи значений по адресу (или ссылке). Если Вы используете этот способ, то принимающая функция получит адрес переменной. И получает доступ на прямую к к месту памяти, в котором хранится переменная. Функция может записать по этому адресу любое значение. Записанное значение сохраниться и после выхода из функции.
Пример
.....
f (int *ai, int *aj)
{
*ai=6;
*aj=16;
coutс i="
return 0;
}
void main()
{
int i=5, j=4;
coutnДо вызова функции i="inj="j;
f (&i, &j);
cout
}
В результате выполнения программы в переменных i и j окажутся значения 6 и 16.
1.5.5. Возвращаемые значения функции
Если Вы хотите вернуть значение в вызывающую функцию, укажите его после оператора return. Можно заключить его в круглые скобки. В этом случае перед названием функции указывается тип возвращаемого значения.
Пример функции, которая возвращает среднее арифметическое от введенных 3-х чисел.
#include
float sred (float nl, float n2, float n3)
{
int s;
s=( n1 + n2 + n3)/ 3;
return s;
}
main()
{
float num1, num2, num3;
int avg;
cout
cinnum 1num2num3 ;
avg=sred (numl, num2, num3);
cout
return 0;
}
Замечание
Хотя функция может получать более одного параметра, она возвращает только одно значение в вызывающую функцию. Если функция должна изменять более одного значения, Вы должны передать их по адресу. Оператор return не может возвращать несколько значений. Если функция не возвращает никакого значения, то перед ее именем указывается слово void. В этом случае оператор return можно опустить.
1.5.6. Использования прототипов функций
Во всех выше описанных примерах сначала описывались вызываемые функции, а затем главная функция main. Чтобы изменить порядок описания функций необходимо использовать прототип функций. Прототип функции выглядит так же как ее заголовок, только с точкой запятой в конце. Если функция не передает каких-либо значений или нет необходимости передавать в нее значения, Вы все равно можете описать ее прототип. Вместо недостающих типов используйте слово void.
Предыдущий пример, записанный при помощи прототипов.
#include
float sred (float nl, float n2, float n3); Прототип функций sred
main()
{
float num1, num2, num3;
int avg;
cout
cinnum1num2num3 ;
avg=sred (numl, num2, num3);
cout
return 0;
}
float sred (float nl, float n2, float n3)
{
int s;
s=(n1 + n2 +n3) / 3; функция sred
return s;
}
Использование прототипов позволяет исключить возможные ошибки при передаче параметров.
1.5.7. Выводы по теме
В С++ могут быть использованы локальные и глобальные переменные и функции.
1.5.8. Вопросы для самоконтроля
Какими значками ограничивается блок операторов?
Укажите значение, которое появится на экране
int k=12;
{
int k=25;
}
cout
На какие виды подразделяются локальные переменные?
В чем различие статистических и автоматических переменных?
Какой тип результата у функции f
f (int x)
{return x*x+3;}
Какое слово используется в описании функции, которая не возвращает никаких результатов?
Укажите типы аргументов и результатов функции.
float f (int z)
{float f1;
f1=z*z -0.5;
return f1;
}
Функция rash вычисляет квадрат и синус числа х
void rash (float x, float * kv, float *sn)
{
... = x*x;
... = sin(x);
}
Что должно стоять на месте многоточий?
Что должно стоять на месте многоточий при вызове этой функции (см. предыдущий вопрос) для расчета квадрата и синуса числа 2.7
float kv1, sn2;
rash (2.7, ..., ...)
Что такое прототип функции, зачем он нужен?
|
1. Введение Цели изучения темы изучить различные функции для ввода и вывода данных; буферизованный и небуферизованный ввод. Требования к знаниям и умениям Студент должен уметь организовать ввод данных различного типа. План изложения материала Функции get() и put(). Функция getch(). Функция printf(). Функция sprintf(). Основные термины и понятия функция get(); функция put(); функция getch(); функция printf(); функция sprintf(). Структурная схема терминов
Если Вы из любопытства просматривали папки Borland C ++, то, вероятно, обратили внимание на папку INCLUDE. Она содержит библиотечные файлы с расширениями h. Каждый из библиотечный фалов хранит функции, предназначенные для работы с памятью, графическими примитивами, файлами, строками и т.д. Многие из них содержат средства ввода-вывода информации. Разберем некоторые из них. |
1.6.2. Функции get() и put()
Функция get() вводит один символ из стандартного устройства ввода (оно обозначается cin и если оно не было переназначено, то это клавиатура). Функция put() выводит одиночный символ в стандартное устройство вывода (cout, если оно не было переназначено, то это экран). Функции get() и put() хранятся в библиотечном файле fstream.h Для их применения подключайте библиотечный файл директивой include.
Пример
Функция get() сначала получает набранный вами символ, затем получает \n (символ новой строки, который генерируется нажатием клавиши ENTER), a после этого еще один символ.
#include
main()
{ char s, inl, in2;
cout
cin.get(s);
inl=s;
cin.get(s);
cout
cin.get(s);
in2=s;
cout
cout.put(inl);
cout.put(in2);
return 0;
}
Для более красивого вывода результата можно добавить возврат каретки:
cout
cout.put(inl);
cout.put('\n');
cout.put(in2);
Функция get() является функцией буферизированного вывода. Это значит, что вводимые символы сначала попадают в буфер, и только после этого в программу. Т.к. символ сначала находится в буфере, то это влияет на порядок обработки информации. Так ни один символ не попадет в программу, пока не будет нажата клавиша Enter. Поэтому если вы задает вопрос: "Продолжить работу (Y/N)?" и используете для ввода get(), то даже если пользователь нажмет Y , программа не будет знать об этом до тех пор, пока не будет нажат Enter.
1.6.3. Функция getch()
Если вы хотите непосредственно вводить символы, используйте функцию getch() При использовании этих функций ввод не может быть перенаправлен. Символы всегда выводятся на экран, а считываются с клавиатуры. Для использования этих функций в директиве include необходимо указывать conio.h.
Пример
В примере вычисляется количество букв а во введенной строке.
char с;
int k=0, i;
cout
for (i= 1 ; i
{ c=getch();
if (c=='a' || c='A')
k++;
}
Во время выполнения программы символы не появляются на экране. Не нажимайте клавишу Enter, цикл закончится после набора 5 символов.
Пример
Пользователь вводит пароль из 5 символов, вместо вводимых символов на экране отображается символ '*'.
char с[5];
int k=0, i;
cout
for (i= 0 ; i
{c[ i ]=getch();
cout
}
Можно использовать функцию
getch()
для задержки сообщений на экране.
В библиотеке conio.h так же содержатся функции
clrscr() - очистка экрана
gotoxy (x1,y1) - позиционирование курсора, х1 - номер строки, y1 - номер столбца.
1.6.4. Функция printf
printf - функция, которая может быть использована для вывода информации на экран (библиотека stdio.h).
Формат функции
printf ( Аргумент1, Аргумент2, Аргумент3, ...)
Функция printf формирует символьную строку из аргументов Аргумент1, Аргумент2, Аргумент3, ...
Аргумент1 - строка символов, которая может включать управляющие последовательности \n \t и т.д.
А также знак %, % указывает место включения в строку Аргументов2, Аргумент 3, ...
%f - вещественное число, можно указать формат числа;
%4.0f - первая цифра - общее количество позиций на число, вторая цифра - количество позиций на дробную часть;
%d - десятичное целое число;
%о - восьмеричное целое число;
%х - шестнадцатеричное целое число;
%с - символ
%s - символьная строка
Пример
printf( "\nПри х=%d y=%7.1f ", x , y);
1.6.5. Функция sprintf()
В stddio имеется еще одна полезная функция sprintf. В отличие от функции printf sprintf не выводит строку на экран, а записывает ее в Аргумет 0, Аргументы 1, 2, 3 и т.д. аналогично функции printf.
Пример
Сформируем символьную строку buffer из сообщения и значения числа пи.
char buffer[80];
sprintf(buffer, "\n Число Пи = %f\n", M_PI);
Функция sprintf применима в более новых системах программирования на основе С++, например, в C++ Builder.
1.6.6. Выводы по теме
Кроме операторов cin и cout в языке С++ можно использовать функции, функции get(), put(), getch(), printf(), sprintf().
1.6.7. Вопросы для самоконтроля
Какие функции используются для буферизованного и небуферизованного ввода?
В чем различается буферизованный и небуферизованный ввод?
Какие действия выполняет функция printf, каков ее формат?
Чем различаются функции printf и sprintf?
| Тема 1.7. Массивы и указатели |
| 1.7.1. Введение Цели изучения темы изучить работу с массивами и указателями. Требования к знаниям и умениям Студент должен уметь составить программу с использованием одномерного или двумерного массива. План изложения материала Описание массива. Многомерные массивы. Указатели. Ключевой термин Ключевой термин: maccив. Maccив - это конечное множество элементов одного типа, каждый элемент имеет свой номер. Второстепенные термины многомерный массив; указатели. Структурная схема терминов
|
1.7.2. Описание массива
В C++ можно определить массив любого типа.
int mas[3];
Описан массив из 3 целых чисел.
Нумерация в массивах начинается с 0-го элемента. Поэтому массив mas содежит: mas[0], mas[1], mas[2]
Массив можно инициализировать при описании. В этом случае нет необходимости указывать его размер.
int mas[]={23, 25, 81};
Далее создан массив mas из 3-х элементов:
mas[0]= 23,
mas[1]= 25,
mas[2]= 81.
char city [ ] = "Москва";
Массив city будет содержать строку из 7 элементов: 6 букв и 0-символ. 0-символ является признаком конца строки, в программе он обозначается \0.
Такой способ инициализации не подходит, если в дальнейшем в массив city потребуется занести название другого города с длинным названием.
Можно описать название города по-другому.
char city1[ ] = {'М', 'о', 'с' , 'к' , 'в' , 'а' }
Массив city1 - это массив символов, он будет содержать 6 элементов.
| № | City | № | City1 |
| 0 | М | 0 | М |
| 1 | О | 1 | о |
| 2 | С | 2 | с |
| 3 | К | 3 | к |
| 4 | В | 4 | в |
| 5 | А | 5 | а |
| 6 | /0 |
|
|
Вышеописанный способ инициализации возможен только при объявлении массива. В программе используйте поэлементную инициализацию.
city [0]='м';
Кроме стандартного доступа к элементам массива C++ обеспечивает еще один. В C++ имя массива представляет собой не только имя, которое вы используете в своих программах, но и является адресом, по которому в памяти находится первый элемент массива. Поэтому к элементам массива можно обращаться следующими способами:
int m[6] = {4, 3 , 1, 4, 7, 8 };
m[3] или (m + 3)[0] Обращение к 4-му элементу массива.
Возможны и другие варианты:
(m + 0)[3]
(m + 2)[1]
(m - 2)[5]
Наиболее полезно использовать такой подход к массивам, содержащим символьные строки.
Пример
char names [ ]={'Иван', 'Петр', 'Елена' }
будет выглядеть в памяти следующим образом:
| 0 | И |
| 1 | В |
| 2 | А |
| 3 | Н |
| 4 | \0 |
| 5 | П |
| 6 | Е |
| 7 | Т |
| 8 | Р |
| 9 | \0 |
| 10 | Е |
| 11 | Л |
| 12 | Е |
| 13 | Н |
| 14 | А |
| 15 | \0 |
Команда cout
cout
1.7.3. Многомерные массивы
Многомерные массивы - это массивы с более чем одним индексом.
Чаще всего используются двумерные массивы.
При описании многомерного массива необходимо указать C++, что массив имеет более чем одно измерение.
Пример 1
int t[3][4];
Описывается двумерный массив, из 3 строк и 4 столбцов.
Элементы массива:
t[0][0] t[0][1] t[0][2] t[0][3]
t[1][0] t[1][1] t[1][2] t[1][3]
t[2][0] t[2][1] t[2][2] t[2][3]
При выполнении этой команды под массив резервируется место. Элементы массива располагаются в памяти один за другим.
Пусть это линейка памяти:
Пример 2
int temp [3] [15] [10];
резервируется место под 3-х мерный массив.
В памяти многомерные массивы представляются как одномерный массив, каждый из элементов которого, в свою очередь, представляет собой массив.
Рассмотрим на примере двумерного массива.
int a[3][2]={4, l, 5,7,2, 9};
Представляется в памяти:
| a[0][0] | заносится значение 4 |
| a[0][1] | заносится значение 1 |
| a[1][0] | заносится значение 5 |
| a[1][1] | заносится значение 7 |
| a[2][0] | заносится значение 2 |
| a[2][1] | заносится значение 9 |
Второй способ инициализации при описании массива
int а[3][2]={ {4,1}, {5, 7}, {2, 9} };
Обращение к элементу массива производится через индексы.
cout
Выдаст значение 4.
cout
Выдаст знaчение 7.
Программа, которая инициализирует массив и выводит его элементы на экран.
#include
main ()
{
int a[3] [2]={
{1,2}, {3,4}, {5,6}
};
int i,j;
for (i=0; i
for(j=0;j
cout
return 0;
}
Для того, чтобы убрать из программы явные значения размера и массива, можно воспользоваться директивой define
#include
#define I 3
#define J 2
main()
{ int a[I][J]={ {l,2}, {3,4}, {5,6} };
int i, j;
for ( i=0 ; i
for( j=0; j
cout
return 0;
}
При передаче массива в функцию всегда происходит передача его адреса. Т.о. в C++ все массивы передаются по адресу.
Пример
Вводится квадратная матрица с максимальным размером 10 на 10. Ввод матрицы оформлен в виде отдельной функции vvod. Программа заменяет все отрицательные числа их модулями.
#include
void vvod (int u[10][10], int n)
{
int i,j;
for (i=0; i
{ cout
for (j=0; j
cin u[i][j];
}
}
void main()
{
int a[10][10];
int n,i,j,min;
cout
cinn;
vvod(a, n);
for (i=0; i
for (j=0; j
if (a[i][j]
// Вывод матрицы
cout
for (i=0; i
{
for (j=0; j
cout
cout
}
}
Принимающая функция получает не весь массив, а только адрес первого элемента массива. Несмотря на то, что в блоке main массив называется а, а в функции vvod - u это один и тот же массив.
1.7.4. Указатели
Указатели - это переменные, которые содержат адрес адреса данных. В С++ указатели могут быть на любой тип данных.
Если необходимо, можно описать массив указателей.
int*ip[ 10 ];
массив указателей на целые значения из 10 элементов.
С указателем можно производить некоторые арифметические операции. Например, при работе с массивами.
Пусть sub содержит номер элемента массива, тогда до этого элемента можно "добраться"
mas [ sub ]
или
*(mas +sub)
Т.к. имя массива фактически является указателем на нулевой элемент массива. Переменная sub указывает на сколько элементов необходимо сместиться. Вы можете инкрементировать и декрементировать указатель. При этом вы смещаетесь на один элемент, независимо от типа элемента.
Допустим uk адрес нулевого элемента массива, тогда
cout
uk++;
cout
uk+=2
cout
Наиболее полезное применение массивов указателей - это массив указателей на строки.
Пример
char names [3] [20]= {
{"Иванов"},
{"Петров"},
{"Сидоров "}
};
Схематично можно изобразить следующим образом
Для вывода строки можно использовать
cout
1.7.5. Выводы по теме
В языке С++ применяются массивы и указатели.
1.7.6. Вопросы для самоконтроля
1. С какого числа начинается нумерация элементов массива?
2. Сколько элементов будет содержать массив а, где храниться адрес нулевого элемента массива?
int a []= {3,6,2,8,-2}
3.Продолжите фразу: "При передачи массивов в функции используется передача по..."
4.Создан массив указателей на целые числа. Какой элемент будет хранить адрес числа 7?
5.int * mas [4];
*(mas +1) = 7
Тема 8. Массивы и указатели
| 1. Введение Цели изучения темы изучить работу с массивами и указателями. Требования к знаниям и умениям Студент должен уметь составить программу с использованием одномерного или двумерного массива. План изложения материала Описание массива. Многомерные массивы. Указатели. Ключевой термин Ключевой термин: maccив. Maccив - это конечное множество элементов одного типа, каждый элемент имеет свой номер. Второстепенные термины многомерный массив; указатели. Структурная схема терминов
|
2. Описание массива
В C++ можно определить массив любого типа.
int mas[3];
Описан массив из 3 целых чисел.
Нумерация в массивах начинается с 0-го элемента. Поэтому массив mas содежит: mas[0], mas[1], mas[2]
Массив можно инициализировать при описании. В этом случае нет необходимости указывать его размер.
int mas[]={23, 25, 81};
Далее создан массив mas из 3-х элементов:
mas[0]= 23,
mas[1]= 25,
mas[2]= 81.
char city [ ] = "Москва";
Массив city будет содержать строку из 7 элементов: 6 букв и 0-символ. 0-символ является признаком конца строки, в программе он обозначается \0.
Такой способ инициализации не подходит, если в дальнейшем в массив city потребуется занести название другого города с длинным названием.
Можно описать название города по-другому.
char city1[ ] = {'М', 'о', 'с' , 'к' , 'в' , 'а' }
Массив city1 - это массив символов, он будет содержать 6 элементов.
| № | City | № | City1 |
| 0 | М | 0 | М |
| 1 | О | 1 | о |
| 2 | С | 2 | с |
| 3 | К | 3 | к |
| 4 | В | 4 | в |
| 5 | А | 5 | а |
| 6 | /0 |
|
|
Вышеописанный способ инициализации возможен только при объявлении массива. В программе используйте поэлементную инициализацию.
city [0]='м';
Кроме стандартного доступа к элементам массива C++ обеспечивает еще один. В C++ имя массива представляет собой не только имя, которое вы используете в своих программах, но и является адресом, по которому в памяти находится первый элемент массива. Поэтому к элементам массива можно обращаться следующими способами:
int m[6] = {4, 3 , 1, 4, 7, 8 };
m[3] или (m + 3)[0] Обращение к 4-му элементу массива.
Возможны и другие варианты:
(m + 0)[3]
(m + 2)[1]
(m - 2)[5]
Наиболее полезно использовать такой подход к массивам, содержащим символьные строки.
Пример
char names [ ]={'Иван', 'Петр', 'Елена' }
будет выглядеть в памяти следующим образом:
| 0 | И |
| 1 | В |
| 2 | А |
| 3 | Н |
| 4 | \0 |
| 5 | П |
| 6 | Е |
| 7 | Т |
| 8 | Р |
| 9 | \0 |
| 10 | Е |
| 11 | Л |
| 12 | Е |
| 13 | Н |
| 14 | А |
| 15 | \0 |
Команда cout
cout
1.7.3. Многомерные массивы
Многомерные массивы - это массивы с более чем одним индексом.
Чаще всего используются двумерные массивы.
При описании многомерного массива необходимо указать C++, что массив имеет более чем одно измерение.
Пример 1
int t[3][4];
Описывается двумерный массив, из 3 строк и 4 столбцов.
Элементы массива:
t[0][0] t[0][1] t[0][2] t[0][3]
t[1][0] t[1][1] t[1][2] t[1][3]
t[2][0] t[2][1] t[2][2] t[2][3]
При выполнении этой команды под массив резервируется место. Элементы массива располагаются в памяти один за другим.
Пусть это линейка памяти:
Пример 2
int temp [3] [15] [10];
резервируется место под 3-х мерный массив.
В памяти многомерные массивы представляются как одномерный массив, каждый из элементов которого, в свою очередь, представляет собой массив.
Рассмотрим на примере двумерного массива.
int a[3][2]={4, l, 5,7,2, 9};
Представляется в памяти:
| a[0][0] | заносится значение 4 |
| a[0][1] | заносится значение 1 |
| a[1][0] | заносится значение 5 |
| a[1][1] | заносится значение 7 |
| a[2][0] | заносится значение 2 |
| a[2][1] | заносится значение 9 |
Второй способ инициализации при описании массива
int а[3][2]={ {4,1}, {5, 7}, {2, 9} };
Обращение к элементу массива производится через индексы.
cout
Выдаст значение 4.
cout
Выдаст знaчение 7.
Программа, которая инициализирует массив и выводит его элементы на экран.
#include
main ()
{
int a[3] [2]={
{1,2}, {3,4}, {5,6}
};
int i,j;
for (i=0; i
for(j=0;j
cout
return 0;
}
Для того, чтобы убрать из программы явные значения размера и массива, можно воспользоваться директивой define
#include
#define I 3
#define J 2
main()
{ int a[I][J]={ {l,2}, {3,4}, {5,6} };
int i, j;
for ( i=0 ; i
for( j=0; j
cout
return 0;
}
При передаче массива в функцию всегда происходит передача его адреса. Т.о. в C++ все массивы передаются по адресу.
Пример
Вводится квадратная матрица с максимальным размером 10 на 10. Ввод матрицы оформлен в виде отдельной функции vvod. Программа заменяет все отрицательные числа их модулями.
#include
void vvod (int u[10][10], int n)
{
int i,j;
for (i=0; i
{ cout
for (j=0; j
cin u[i][j];
}
}
void main()
{
int a[10][10];
int n,i,j,min;
cout
cinn;
vvod(a, n);
for (i=0; i
for (j=0; j
if (a[i][j]
// Вывод матрицы
cout
for (i=0; i
{
for (j=0; j
cout
cout
}
}
Принимающая функция получает не весь массив, а только адрес первого элемента массива. Несмотря на то, что в блоке main массив называется а, а в функции vvod - u это один и тот же массив.
1.7.4. Указатели
Указатели - это переменные, которые содержат адрес адреса данных. В С++ указатели могут быть на любой тип данных.
Если необходимо, можно описать массив указателей.
int*ip[ 10 ];
массив указателей на целые значения из 10 элементов.
С указателем можно производить некоторые арифметические операции. Например, при работе с массивами.
Пусть sub содержит номер элемента массива, тогда до этого элемента можно "добраться"
mas [ sub ]
или
*(mas +sub)
Т.к. имя массива фактически является указателем на нулевой элемент массива. Переменная sub указывает на сколько элементов необходимо сместиться. Вы можете инкрементировать и декрементировать указатель. При этом вы смещаетесь на один элемент, независимо от типа элемента.
Допустим uk адрес нулевого элемента массива, тогда
cout
uk++;
cout
uk+=2
cout
Наиболее полезное применение массивов указателей - это массив указателей на строки.
Пример
char names [3] [20]= {
{"Иванов"},
{"Петров"},
{"Сидоров "}
};
Схематично можно изобразить следующим образом
Для вывода строки можно использовать
cout
1.7.5. Выводы по теме
В языке С++ применяются массивы и указатели.
1.7.6. Вопросы для самоконтроля
С какого числа начинается нумерация элементов массива?
Сколько элементов будет содержать массив а, где храниться адрес нулевого элемента массива?
int a []= {3,6,2,8,-2}
Продолжите фразу: "При передачи массивов в функции используется передача по..."
Создан массив указателей на целые числа. Какой элемент будет хранить адрес числа 7?
int * mas [4];
*(mas +1) = 7
Тема 9. Структуры. Строки
| 1. Введение Цели изучения темы изучить способ описания и работы со структурами; научится работать со строками. Требования к знаниям и умениям Студент должен уметь составить программу с использованием структур, обработкой символьных массивов. План изложения материала Структуры. Способы реализации строк. Строковые константы. Указатель на символьную строку. Массив символов. Некоторые функции для работы со строками. Некоторые функции проверки и преобразования символов. Ключевые термины Ключевые термины: структура, строка. Структура - это множество, состоящее из нескольких элементов, каждый из которых может иметь свой тип. Строку реализуются одним из трех вариантов: строковые константы; указатель на символьную строку; массив символов. Второстепенные термины строковые константы; указатель на символьную строку; массив строк; строковые и символьные функции. Структурная схема терминов
|
1.8.2. Структуры
Позволяют группировать данные и работать с ними как с единым целым. Возможность манипулирования несколькими значениями в одной переменной облегчает создания и модификации программ.
Структура это множество, состоящее из нескольких элементов, каждый из которых может иметь свой тип. В отличие от массива. (Все элементы массива одного типа). Каждый элемент структуры называется полем. При описании структуры Вы должны указать стандартное слово struct, затем имя структуры и определить все элементы структуры.
Пример
struct sotr
{
char familia [25];
char adres [30];
long int telefon;
} c1. c2, c3;
Определяется значение трех структурных переменных c1, c2, c3. Доступ к каждому элементу происходит с помощью оператора.
c1. telefon=321123;
cout telefon;
Структуры можно инициализировать во время объявления и в теле программы.
Во время объявления:
struct sotr
{
char familia [25];
char adres [30];
long int telefon;
} c1={
"Антонов А.И.",
"ул. Седова 25, 10"
321123 },
c2,
c3;
В программе можно присвоить значения полям структуры:
strcpy (c2 .familia, "Антонов А.И. ");
strcpy (c2 .adres, "ул. Седова 25, 10");
с2.telefon=321595;
Либо ввести их значения с клавиатуры:
cout
gets (c3.familia);
coutВведите адрес ";
gets (c3.adres);
cout
cin (c3.telefon);
Оператор точка используется для доступа к полю структуры.
Можно использовать указатель на структуру, например:
sort * uk;
uk = &c2;
Теперь для доступа к полям вместо точки нужно указывать оператор -
Например,
cout familia; cout adres;
cout telefon;
1.8.3. Способы реализации строк
В классическом С++ нет специального строкового типа. Как же можно реализовывать строки?
Возможны три варианта:
Строковые константы.
Указатель на символьную строку.
Массив символов.
Рассмотрим каждый из этих вариантов.
1.8.4. Строковые константы
Строковые константы заключаются в двойные кавычки. Строковые константы используются в операторах вывода, могут включать управляющие последовательности.
Пример
cout
На самом деле Вы уже работали с ними.
В конце строки всегда присутствует нуль - символ (\0), который служит признаком конца строки.
cout
Вы можете и не указывать его, в этом случае нуль-символ будет добавлен автоматически.
1.8.5. Указатель на символьную строку
Можно описать указатель на строку символов.
char *s="Фамилия";
cout
Указателю s можно присвоить адрес другой символьной строки
s="Отчество";
cout
1.8.6. Массив символов
Можно описать указатель на строку символов.
char s[20]="Фамилия";
Количество элементов массива должно быть на 1 больше, чем символов в строке. "Лишний" символ нужен для хранения нуль-символа.
Можно не указывать размер:
char s[]="Фамилия";
В этом случае размер будет определен автоматически и будет равен 8. Обратите внимание, s является как именем массива, так и адресом его нулевого элемента.
1.8.7. Некоторые функции для работы со строками
Таблица 1.8.1. Библиотека strring.h
| strcpy (s1, s2) | Копирует строку s2 в массив символов s1. |
| strcat (s1,s2) | Добавляет строку s2 в массив символов s1 |
| strcmp(s1,s2) | Сравнивает строки s1 и s2. Если s1s2, будет возвращено положительное значение |
| strlen(s1) | Возвращает длину строки, без учета нуль-символа. |
| strtok(s1,s2) | Выделяет слово из строки s1, в качестве разделителей используются символы из строки s2. При повторных вызовах функции вместо s1 указывается NULL. |
Пример
Пусть массив символов fam содержит фамилию, ima - имя, otsh - отчество, сформируем из них новый массив fio, который будет содержать фамилию, имя и отчество
#include
#include
void main()
{
char fio[45],fam[15], ima[15], otsh[15];
cout
cin fam;
cout Имя ";
cin ima;
cout Отчество ";
cin otsh;
strcpy(fio,fam);
strcat(fio," ");
strcat(fio,ima);
strcat(fio," ");
strcat(fio,otsh);
cout
}
Замечание
Для ввода строки, которая не содержит пробелов можно пользоваться оператором cin. Пробел воспринимается как разделитель между значениями различных переменных, поэтому все символы после пробела будут потеряны. Если строка содержит пробелы, необходимо пользоваться другими операторами для ввода, например функцией gets.
Пример
Ввести текст, поделить его на слова, определить количество букв в каждом слове.
Text - вводимый текст,
р -указатель на слово из текста,
razd - строка из разделителей,
dlina - длина слова
#include
#include
#include
void main()
{
char text[80],*p, *razd=" .,";;
cout
gets(text);
cout
p=strtok(text,razd); // Выделение первого слова текста
while (p) // Пока можно выделить слово
{
cout
int dlina, i;
dlina=strlen(p); // Определение длины слова
cout
p=strtok(NULL,razd); // Выделение второго, третьего, и т.д. слов
}
Таблица 1.8.2. Библиотека stdlib.h
| atoi(s) | Преобразует строку в целое число. s-строка символ | |||||||||||||||||||||
| atoll(s) | Преобразует строку в длинное целое число. s-строка символ | |||||||||||||||||||||
| atof(s) | Преобразует строку в вещественное число | |||||||||||||||||||||
|
|
|
Выводы по теме
В языке С++ существует три способа описания строк: строковые константы, указатель на символьную строку, массив символов и большое количество строковых и символьных функций.
1.8.10. Вопросы для самоконтроля
Описана структура:
struct stud
{
char fam [12]; // Фамилия
int oz1, oz2, oz3; // оценки
} ;
stud s1,*adr;
Запишите команды для занесения в st1 фамилии Сколов и оценок 4, 4, 5.
Запишите команды для занесения по адресу adr фамилии Аксенов и оценок 3, 4, 5. В чем различие при работе с именем структуры и указателем на структуру?
Как описать структуру "Товар" с полями "Название", "Цена", "Вес"?
Перечислите способы реализации строк на С++
Описан массив символов:
char a[]="Нина";
Какова размерность массива? Какие значения будет храниться в элементах массива: а[0], a[1], a[2], a[3], a[4]?
Какой символ служит признаком окончания строки?
Назовите функцию, при помощи которой можно вводить строку символов с пробелами.
Можно ли вводить строки функцией cin? Будет ли искажена при этом строка "12 февраля"?
Чем различаются функции strcpy (s1, s2) strcat (s1,s2)? В каких случаях используют каждую из них?
При помощи функции strcmp сравниваются две строки s1 и s2, функция вернула значение 0, что это означает?
Какая функция используется для выделения слов из строки?
Как выделить первое слово строки?
А как второе, третье и т.д.?
Тема 10. Работа с памятью
Цель изучения темы: ознакомиться с некоторыми операторами для работы с памятью.
Краткие теоретические сведения
Среди языков программирования C++ выгодно отличается удобной работой с памятью. Именно поэтому С++ часто используется для системного программирования.
Разберем некоторые операторы для работы с памятью.
Оператор malloc
Выделяет блок памяти. Размер блока задается в байтах. Возвращает адрес выделенного блока или ноль, если не удалось выделить память. Содержится в библиотеках alloc.h и stdlib.h.
Пример.
char *str; // Указатель на строку символов
str = malloc(10); // Выделяем 10 байт, адрес выделенной памяти записываем в str
if ! ( str )
{
cout
exit (0);
}
strcpy(str, "Hello"); // Копируем строку "Hello" в блок памяти с адресом str
malloc часто используется вместе с оператором size. С помощью size можно определить сколько байт выделено под переменную или тип данных.
Оператор free
Освобождает память, выделенную оператором malloc.
Пример.
Освободим память, выделенную в предыдущем примере
free (str);
Оператор new
В версиях начиная с 3-й Borland C++ содержит операторы new и delete. Они являются улучшенными вариантом операторов malloc и free.
new позволяет выделять память, необходимую для размещения переменной, структурной переменной или массива. Для переменной необходимо указывать тип и в случае массива - размер. new может записывать значение в созданную переменную.
В случае успешного завершения new возвращает адрес созданной переменной.
В отличие от malloc, при использовании оператора new ненужно указывать количество байт памяти, которое необходимо выделить.
Примеры.
/* Опишем указатели на целую и вещественную переменные и указатель на символ */
Int * uk_i;
double * uk_d;
char * uk_c;
/* Выделим память под число типа int адрес памяти присвоим указателю uk_i */
uk_i = new int;
* uk_i=10; // запишем число 10 в ячейку памяти с адресом uk_i;
/* Выделим память под число типа double, запишем в нее число 3.1415 и
присвоим указателю uk_d ее адрес */
uk_d=new double (3.1415);
/* Выделим память под число
uk_с=new char [ 60 ] ;
Можно выполнить проверку:
If !(uk_i && uk_d && uk_c)
{
cout
}
Оператор delete
Освобождает память, выделенную оператором new.
Примеры.
Продолжим предыдущий пример, освободим выделенную память.
delete uk_i;
delete uk_d;
delete [ kol_s ] uk_s;
где kol_s - количество символов в строке.
Вопросы для самоконтроля
Какой оператор используются для выделения блока памяти указанного размера?
Какой оператор используется для освобождения памяти, которая была выделена оператором malloc?
Чем отличается работа операторов malloc и new?
Какой оператор используется для освобождения памяти, которая была выделена оператором new?
Тема 1.10. Динамические структуры
Цель изучения темы: познакомиться с различными динамическими структурами, научиться с ними работать.
Краткие теоретические сведения
До сих пор все рассмотренные программы позволяли работать с массивами фиксированной длины, например массив из 100 элементов. В реальной жизни обычно требуется, чтобы программа могла принимать от 50 до нескольких тысяч элементов и при этом экономно использовала ресурсы компьютера. Такие задачи решаются при помощи динамических структур.
Динамические структуры способны увеличиваться и уменьшаться в процессе работы. Должен быть организовать доступ к каждому элементу динамической структуры.
Разновидности динамических структур
Динамические структуры строятся из динамических элементов.
Динамический элемент состоит из двух частей:
информационная часть
указатели
Информационная часть хранит значение элемента.
Указатели - это адреса одного или нескольких других динамических элементов.
В простейшем случае элемент имеет вид:
Рисунок 1.10.1.
В данном случае информационная часть состоит из одного поля, которое используется для хранения одного целого числа, указатель - из указателя на один элемент.
Существует 5 основных видов динамических структур:
Очередь
Из динамических элементов формируется цепочка. Динамический элемент хранит адрес следующего динамического элемента.
Очередь работает по тому же принципу, что и очередь в магазине: "первым пришел, первым ушел". Элементы добавляются в конец очереди, а берутся из начала. Для работы необходимо знать начало и конец очереди.
Указатель у последнего элемента в очереди хранит нулевое значение
Рисунок 1.10.2.
Стек
Стек работает по принципу "первым пришел, последним ушел". Элементы добавляются и берутся с одного конца, который называется вершина стека.
Рисунок 1.10.3.
Список
Список порядок работы с элементами списка не определен. Можно, например, вставить или убрать элемент из любой части списка.
Рисунок 1.10.4.
Может использоваться кольцевой список, в котором соединены начало и конец.
Двунаправленный список
Формируется из динамических элементов с двумя указателями.
Рисунок 1.10.5.
Рисунок 1.10.6.
Может использоваться кольцевой список, в котором начало и конец соединены.
Дерево
Дерево состоит из элементов, которые называются узлами или вершинами.
Рисунок 1.10.7.
Узлы соединены направленными дугами X-Y. X называется предшественником (родителем) Y. Y - называется потомком. Дерево имеет одну вершину, которая не имеет предшественников. Она называется корнем дерева. Вершины, которые не имеют потомков, называются листьями.
Дерево может формироваться из динамических элементов с двумя указателями.
Рисунок 1.10.8.
Программа для организации очереди.
Будет создана очередь из произвольного количества целых положительных чисел. Признак окончания ввода - отрицательное число.
#include
#include
/* Описание структурного элемента, info - информационное поле, next -указатель на следующий элемент. */
struct ELEM
{
int info;
ELEM *next;
};
void main()
{
// Указатели на элементы очереди: первый, последний, текущий, старый, новый
ELEM *nach, *tek, *old, *kon, *new_n;
int i=1;
nach=0;
kon=0;
cout
cout
// Создается очередь из целых чисел
do
{
// Ввод числа
cout
cin i;
if (ibreak; // Прекращение цикла
// Создание очередного элемента
new_n=new ELEM; /* Выделяется память под новый элемент, адрес выделенной памяти записывается в new_n */
new_n- info=i; /* Присваивается значение информационному полю нового элемента*/
new_n- next=0; /* Присваивается значение указателю нового элемента */
if (nach)
{ // Если очередь не пуста, очередной элемент добавляется в конец очереди
kon- next=new_n;
kon=new_n;
}
else
{
/* Если очередь пуста, начало и конец очереди будут указывать на один и тот же элемент */
nach=new_n;
kon=new_n;
}
}
while (i 0);
// Пример обработки элементов
// Элементы отображаются на экране и удаляются из очереди
while (nach)
{
old=nach;
cout info; // Выводим элемент на экран
nach=nach- next; // Переходим к следующему элементу очереди
delete old; // Очищаем память, которую занимал первый элемент
}
getch();
}
Фрагмент программы для реализации стека
Создание стека из элементов 9, 10,... 16.
nach=0; // nach - вершина стека
for (i=9; i
{
// Создание очередного элемента
new_n=new ELEM;
new_n- info=i;
if (nach)
{ // Если стек не пуст, очередной элемент добавляется в вершину стека
new_n- next=nach;
nach=new_n;
}
else
{ // иначе стек будет состоять из одного элемента
new_n- next=0;
nach=new_n;
}
Программа для реализации упорядоченного двоичного дерева
Двоичное дерево - это самый простой вид дерева, у каждой вершины может быть только два потомка. В упорядоченном дереве большее значение располагается справа от вершины, а меньшие значения слева от вершины.
Построим двоичное упорядоченное дерево из чисел 5, 7, 3, 1, 4.
Первый элемент (5) помещается в корень дерева.
Рисунок 1.10.9.
Берем следующий элемент (7). Т. к. 7 больше 5, помещаем его в правую ветвь от 5.
Рисунок 1.10.10.
Берем следующий элемент (3). Т. к. 3 меньше 5, помещаем его в левую ветвь от 5.
Рисунок 1.10.11.
Берем следующий элемент (1). Т. к. 1 меньше 5 и левая ветвь уже существует (элемент 3), будем сравнивать 1 и 3. 1 меньше 3 помещаем 1 в левую ветвь от 3.
Рисунок 1.10.12.
Берем следующий элемент (4). Т. к. 4 меньше 5 и левая ветвь уже существует (элемент 3), будем сравнивать 1 и 3. 4 больше 3 помещаем 1 в правую ветвь от 3. В результате получаем бинарное дерево:
Рисунок 1.10.13.
Пример программы "Бинарное дерево".
Для создания дерева будут использованы рекурсивные функции: dob для добавления элемента, pech для печати элемента дерева.
Элемент дерева будет иметь структуру
Рисунок 1.10.14.
#include
struct DEREVO
{
int info;
DEREVO * next_l;
DEREVO * next_r;
};
void dob (DEREVO * tek, int znach);
void pech (DEREVO *tek);
void main()
{
int i;
DEREVO *nach, *tek, *new_n;
nach=0;
cout
do
{
cout
cin i;
if (nach)
{ // Если дерево не пусто, вызывается функци dob
dob(nach, i);
}
else
{ // Если дерево пусто создается корень дерева
new_n=new DEREVO;
new_n- info=i;
new_n- next_l=0;
new_n- next_r=0;
nach=new_n;
}
}
while (i);
pech(nach); // Печать
}
// Рекурсивная функция dob.
tek - указатель на текущую вершину дерева,
znach - значение, которое необходимо добавить в дерево.
Функция dob определяет в какую ветвь нужно добавить новое значение,
если znach меньше текущего значения, то производиться добавление в левую ветвь,
иначе - в правую ветвь.
Если ветвь нельзя добавить (такая ветвь уже существует), то снова вызывается функция dob.
void dob (DEREVO * tek, int znach)
{
int i1;
DEREVO *new_n;
i1=tek- info;
// Если значение текущего элемента дерева меньше нового элемента
if (znach
{
if (tek- next_l)
dob (tek-next_l,znach);
else
{
new_n=new DEREVO;
new_n- info=znach;
new_n- next_l=0;
new_n- next_r=0;
tek- next_l=new_n;
}
}
if (znachi1)
{
if (tek- next_r)
dob (tek- next_r,znach);
else
{
new_n=new DEREVO;
new_n- info=znach;
new_n- next_l=0;
new_n- next_r=0;
tek- next_r=new_n;
}
}
}
void pech (DEREVO *tek)
{
if (tek)
{
pech(tek- next_l);
cout info;
pech(tek- next_r);
}
}
Вопросы для самоконтроля
Перечислите различные виды динамических структур
Какие динамические структуры могут быть построены на основе элемента с информационным полем и одним указателем?
Чем различается работа очереди, стека и списка?
Какие динамические структуры могут быть построены на основе элемента с информационным полем и двумя указателями?
Добавьте в программу "Бинарное дерево" функцию, которая находит самое большое значение дерева. Для этого начните двигаться от корня дерева и все время выбирайте правую ветвь дерева.