Спецификация задачи
Алгоритм
Описание алгоритма на
Языке высокого уровня
Объектный код (внут-
Ренний код конкретного
Компьютера)
Исполняемый файл для
конкретного компьютера
Требуется определить, является ли данное число простым.
Ввести x
Для каждого целого числа z из диапазоне от 1 до x
Если остаток от деления x на z равен 0, то
вывести сообщение "число не простое" и закончить работу
Если такого числа z не найдено, то
вывести сообщение "число простое" и закончить работу
#include <iostream.h>
int main()
{
int x;
cout << "Введите число:\n";
cin >> x;
for (int z=2; z<x; z++)
if (x % z == 0)
{
cout << "Это не простое число.\n";
return 0;
}
cout << "Это простое число.\n";
return 0;
}
Двоичные команды процессора (частично)
Двоичные команды процессора (полностью)
"Императивные" или "процедурные" языки позволяют программисту описать, в
какой последовательности компьютер будет выполнять отдельные шаги алгоритма и,
таким образом, решать задачу и выдавать на экран результат. "Декларативные" языки
предназначены больше для описания самой задачи и желаемого результата, а не дей-
ствий компьютера.
"Объектно-ориентированные языки" рассчитаны на применение особого под-
хода к описанию задач, согласно которому в задаче выделяются некоторые "объекты"
с характерным для них "поведением" и взаимодействующие между собой. Один из
первых объектно-ориентированных языков – Смоллток, он предназначен исключи-
тельно для объектно-ориентированного программирования. В отличие от него, язык
Си++ обладает как объектно-ориентированными возможностями, так и средствами
традиционного процедурного программирования.
Радикальные приверженцы различных языков и стилей программирования
иногда делают экстравагантные заявления, выделяющие семейство языков или один
язык как исключительный и идеально подходящий для любых задач. Например, до-
вольно распространено мнение, что объектно-ориентированный подход наиболее
близок к способу решения задач человеком. По этому поводу вы со временем сможе-
те составить собственное мнение, т.к. абсолютно истинного, очевидно, нет.
2.ПроисхождениеязыкаСи++
Язык Си++ был разработан в начале 1980-х гг. Бьерном Страуструпом из ком-
пании AT&T Bell Laboratories. Си++ основан на языке Си. Два символа "++" в назва-
нии – это игра слов, символами "++" в языке Си обозначается операция инкремента
(увеличение значения переменной на 1). Т.о., Си++ был задуман как язык Си с рас-
ширенными возможностями. Большая часть языка Си вошла в Си++ как подмножест-
во, поэтому многие программы на Си можно скомпилировать (т.е. превратить в набор
низкоуровневых команд, которые компьютер может непосредственно выполнять) с
помощью компилятора Си++.
При классификации языков программирования язык Си вызывает некоторые
трудности. По сравнению с ассемблером, это высокоуровневый язык. Однако Си со-
держит много низкоуровневых средств для непосредственных операций с памятью
компьютера. Поэтому язык Си отлично подходит для написания эффективных "сис-
темных" программ. Но программы других типов на Си могут оказаться довольно
сложными для понимания, и есть ряд ошибок, которым программы на Си особенно
подвержены. Дополнительные объектно-ориентированные возможности Си++ были
добавлены в Си, в частности, для устранения этих недостатков.
3.Стандарт ANSIСи++
Национальный Институт Стандартизации США (American National Standards
Institution, ANSI) разработал "официальные" стандарты для многих языков програм-
мирования, в том числе для Си и Си++. Эти стандарты стали общепринятыми и они
имеют очень большое значение. Программу, целиком написанную на ANSI Си++, га-
рантированно можно запустить на любом компьютере, для которого имеется компи-
лятор ANSI Си++. Другими словами, стандарт гарантирует переносимость программ
на языке ANSI Си++.
В действительности большинство версий Си++ представляют собой стандарт-
ный ANSI Си++, дополненный некоторыми машинно-зависимыми возможностями.
Эти специфические средства предназначены для облегчения взаимодействия про-
грамм с конкретными операционными системами. Вообще, в программах, которые
должны быть переносимыми, подобными специфическими возможностями следует
пользоваться как можно реже. В таких случаях части программы на Си++, в которых
используются не-ANSI компоненты языка, целесообразно особым образом помечать,
так, чтобы их легко можно было отделить от основной части программы и модифи-
цировать для других компьютеров и операционных систем.
4.Средаразработки Microsoft Developer Studio VisualС++
Известно, что лучший способ изучения языка программирования заключается в
том, чтобы писать на нем программы и проверять, как они работают на компьютере.
Для этого необходимы несколько программ:
• Текстовый редактор, с помощью которого можно набирать и редактировать
исходный текст программ на Си++.
• Компилятор. Эта программа выполняет преобразование исходного текста в
машинные команды, которые компьютер может непосредственно выпол-
нять.
• Компоновщик, который собирает отдельные скомпилированные части про-
граммы в единое целое и, при необходимости, добавляет к ним компоненты
из готовых библиотек. В результате компоновки получается готовая к за-
пуску программа – исполняемый файл.
• Отладчик, с помощью которого легче искать ошибки в программе. Ошибки
могут обнаружиться как при компиляции, так и во время работы програм-
мы.
В данном курсе изучения Си++ практические упражнения предполагается вы-
полнять в среде разработки программ Microsoft Developer Studio Visual C++ для
IBM-совместимых ПК под управлением Windows 95/NT. В этом пакете интегрирова-
ны редактор, компилятор, компоновщик и отладчик. Все вместе они образуют единую
удобную среду программирования. Краткое описание работы со средой Visual C++
приведено в Приложении.
5.ПримерпрограммынаСи++
Ниже приведен исходный текст простой программы на Си++.
// В языке Си++ с двойной косой черты начинаются комментарии
// (например, как эта строка). Компилятор игнорирует комментарии,
// начиная от первой черты и до конца строки.
/* Второй способ записи комментариев – после косой черты со звездочкой.
После текста комментария надо поставить звездочку, а затем – косую
черту. Комментарии, записанные подобным образом, могут занимать
больше одной строки. */
/* В программе ОБЯЗАТЕЛЬНО должно быть достаточное количество
комментариев! */
/* Эта программа запрашивает у пользователя текущий год, возраст
пользователя и еще один год. Затем программа вычисляет возраст
пользователя, который будет у него во втором введенном году.*/
#include <iostream.h>
int main()
{
int year_now, age_now, another_year, another_age;
cout << "Введите текущий год и нажмите ENTER.\n";
cin >> year_now;
cout << "Введите свой возраст (в годах).\n";
cin >> age_now;
cout << "Введите год, для которого вы хотите узнать свой возраст.\n";
cin >> another_year;
another_age = another_year - (year_now - age_now);
if (another_age >= 0)
{
cout << "В " << another_year << " году вам будет ";
cout << another_age << "\n";
}
else
{
cout << "В " << another_year << " вы еще не родились!\n";
}
return 0;
}
Программа 5.1.
Некоторые свойства программы 5.1 являются обычными для большинства про-
грамм на Си++. Программа начинается (после комментариев) с оператора
#include <iostream.h>
Этот оператор называется "директивой include". До компилятора исходный
текст обрабатывается препроцессором – специальной программой, которая модифи-
цирует текст программы по специальным командам – директивам. Директивы пре-
процессора начинаются с символа "#". Директива include предназначена для вклю-
чения в исходный текст содержимого другого файла. Например, в программу 5.1
включается файл iostream.h, содержащий описания функций стандартной библиоте-
ки ввода/вывода для работы с клавиатурой и экраном. (Стандартные библиотеки язы-
ка Си++ будут рассматриваться позже).
Алгоритм, записанный в программе 5.1, очень простой. Поэтому структуру
программы легко представить в виде списка последовательно выполняемых команд
(операторов). Схематично программу, содержащуюся после директивы #include,
можно представить в виде:
int main()
{
Первый оператор;
...
...
Последний оператор;
return 0;
}
Подобная структура является общей для всех программ на Си++. Каждый опе-
ратор в теле программы завершается точкой с запятой. В хорошо разработанной
большой программе большинство операторов являются обращениями (вызовами) к
подпрограммам, которые записываются после функции main() или в отдельных
файлах. Каждая подпрограмма (функция) имеет структуру, подобную функции
main(). Но функция main() в каждой программе только одна. Именно с нее начина-
ется выполнение программы. (Подробнее функции будут рассматриваться далее.)
В конце функции main() записана строка:
return 0;
Эта строка значит "вернуть операционной системе в качестве сигнала об ус-
пешном завершении программы значение 0". Оператор возврата return применяется
не только при завершении программы, но и при завершении отдельных подпрограмм.
В любом случае этот оператор возвращает определенное значение на более высокий
уровень управления.
В программе-примере используются четыре переменные:
year_now, age_now, another_year и another_age
Переменные в программировании отличаются от математических переменных.
Они используются как символические имена "фрагментов оперативной памяти ком-
пьютера". При выполнении программы в различные моменты времени переменные
могут хранить различные значения. В программе 5.1 первое упоминание четырех пе-
ременных содержится в строке с оператором описания переменных:
int year_now, age_now, another_year, another_age;
Этот оператор уведомляет компилятор, что для хранения четырех переменных
типа "целое число" (integer – int) требуется выделить необходимое количество памя-
ти. Эта область памяти будет зарезервирована в течение выполнения оставшейся час-
ти программы. Переменные всегда должны быть описаны до первого использования.
В программировании хорошим стилем считается описание всех переменных, исполь-
зуемых в подпрограмме, в начале этой подпрограммы. В Си++ есть несколько раз-
личных типов переменных, и они будут обсуждаться немного позже.
6.Выполнениеввода/выводаданныхиприсваиваниезначений
После компиляции программы ее можно запустить на выполнение. Результат
выполнения на экране будет выглядеть примерно так:
Введите текущий год и нажмите ENTER.
Введите свой возраст (в годах).
Введите год, для которого вы хотите узнать свой возраст.
В 2017 году вам будет 38
Первая, третья, пятая и седьмая строки выдаются на экран программой с по-
мощью следующего оператора:
cout << Выражение1 << Выражение2 <<... << ВыражениеN;
Этот оператор выводит на экран сообщение:
Выражение 1 Выражение 2 ... Выражение N
Последовательность операторов
cout << Выражение 1;
cout << Выражение 2;
...
...
cout << Выражение N;
приводит к аналогичному результату. Если между выражениями требуется вставить
пробелы или новые строки, то их нужно указать явно, с помощью символов " " и
"\n" соответственно.
Числа, показанные выше в примере выдачи на экран полужирным шрифтом, бы-
ли напечатаны пользователем. В показанном примере оператор
cin >> year_now;
приводит к тому, что переменной year_now присваивается значение 2000. Это проис-
ходит после того, как пользователь напечатает " 2000 " и нажмет клавишу Enter. В
программе есть еще места, где переменным присваиваются значения, в том числе
оператор присваивания:
another_age = another_year - (year_now - age_now);
Операция "=" означает "присвоить переменной, стоящей слева от знака равен-
ства, значение, указанное справа". Проверка на равенство в Си++ обозначается двой-
ным символом: "==".
7.Управлениепорядкомвыполнениякомандспомощьюоператора if
В нескольких последних строках программы (до строки "return 0") записано:
if (another_age >= 0)
{
cout << "В " << another_year << " году вам будет ";
cout << another_age << "\n";
}
else
{
cout << "В " << another_year << " вы еще не родились!\n";
}
Оператор ветвления (условный оператор) "if...else..." выглядит примерно
одинаково во всех процедурных языках программирования. В Си++ он называется
просто оператором if, и его общая структура такова:
if (условие)
{
Оператор 1;
...
...
Оператор N;
}
else
{
Оператор N+1;
...
...
Оператор N+M;
}
Часть "else (иначе)" в операторе if необязательна. Более того, если после
"if (условие)" стоит только один оператор, то можно опустить фигурные скобки и
записать оператор так:
if (условие)
Оператор 1;
В программах условные операторы часто встречаются группами, например:
...
...
if (total_test_score < 50)
cout << "Вы не прошли тест. Выучите материал как следует.\n";
else if (total_test_score < 65)
cout << "Вы прошли тест со средним результатом.\n";
else if (total_test_score < 80)
cout << "Вы хорошо выполнили тест.\n";
else if (total_test_score < 95)
cout << "Вы показали отличный результат.\n";
else
{
cout << "Вы сдали тест нечестно!\n";
total_test_score = 0;
}
...
...
Приведенный фрагмент программы может показаться довольно сложным. Тем
не менее, он соответствует правилам Си++. Это легко понять, если обратиться к син-
таксической диаграмме оператора if (рис. 4).
В овальных или круговых рамках на синтаксических диаграммах указываются
элементы языка, которые буквально так и воспроизводятся в исходном тексте про-
грамм. В прямоугольных рамках приведены элементы, требующие дальнейшего оп-
ределения, возможно, с помощью других синтаксических диаграмм. Набор таких диа-
грамм служит формальным описанием синтаксиса языка программирования.
Обратите внимание, что на рис. 4 отсутствует символ ";" и разделители "{}".
Эти элементы языка включены в определение (и синтаксическую диаграмму) для
обобщенного понятия "оператор языка Си++".
Рис. 4. Синтаксическая диаграмма оператора if.
При обработке приведенного фрагмента программы компилятор Си++ трактует
весь текст, выделенный ниже полужирным шрифтом, как один оператор после перво-
го слова else.
...
...
if (total_test_score < 50)
cout << "Вы не прошли тест. Выучите материал как следует.\n";
else if (total_test_score < 65)
cout << "Вы прошли тест со средним результатом.\n";
else if (total_test_score < 80)
cout << "Вы хорошо выполнили тест.\n";
else if (total_test_score < 95)
cout << "Вы показали отличный результат.\n";
Else
{
cout << "Вы сдали тест нечестно!\n";
total_test_score = 0;
}
...
...
8.Оформлениеисходноготекста
Между текстом программы, приведенным в п.5 и текстом, который показан
ниже, для компилятора Си++ нет никаких различий.
#include <iostream.h> int main() { int year_now, age_now, another_year,
another_age; cout << "Введите текущий год и нажмите ENTER.\n"; cin >>
year_now; cout << "Введите свой возраст (в годах).\n"; cin >> age_now;
cout << "Введите год, для которого вы хотите узнать свой возраст.\n"; cin
>> another_year; another_age = another_year - (year_now - age_now); if
(another_age >= 0) { cout << "В " << another_year << " году вам будет ";
cout << another_age << "\n"; } else { cout << "В " << another_year << "
вы еще не родились!\n"; } return 0; }
Отсутствие комментариев, пробелов, пустых строк и отступов делают эту
программу практически непригодной для чтения человеком. Для выработки хорошего
стиля программирования, конечно, требуется знать не только правила оформления
текста программы, но их следует соблюдать с самого начала. При оформлении собст-
венных программ будьте последовательны и делайте так, чтобы отступы и пробелы
отражали логическую структуру ваших программ.
Для переменных следует выбирать осмысленные имена: имена "year_now",
"age_now", "another_year" и "another__age" лучше, чем "y_n", "a_n", "a_y" и
"a_a" и намного лучше, чем "w", "x", "y" и "z". Это особенно важно, если в будущем
ваши программы могут потребовать изменения с помощью других программистов.
9.Сводкарезультатов
В данной лекции кратко и неформально были рассмотрены несколько важных
вопросов: переменные и типы данных, ввод и вывод, оператор присваивания и услов-
ный оператор ("оператор if"). Более строго и подробно эти вопросы будут рассмот-
рены в последующих лекциях.
10.Упражнения
Для выполнения этих упражнений требуется некоторый опыт работы с ПК под
управлением операционной системы Windows 95/NT.
Упражнение 1
Изучите краткое руководство по Visual C++ в Приложении. Создайте проект с
именем "AgeCalculator". Создайте исходный файл с именем AgeCalculator.cpp
и наберите в нем исходный текст программы 5.1. Сохраните файл на диске и добавьте
его в проект. Соберите проект и запустите программу на выполнение.
Возможно, вы встретитесь со следующими проблемами:
1)Вокнепрограммывместорусскихбукввыводятсякакие-тостранныесимволы.
Эта проблема объясняется различием таблиц кодировок Windows и DOS. В этих таблицах
русские буквы расположены в разных местах. Консольные программы при работе исполь-
зуют кодировку DOS, а текстовый редактор Visual C++ – кодировку Windows. Поэтому
вам придется добавить преобразование строк с русскими буквами из кодировки Windows
в кодировку DOS.
Для этого включите в программу, после файла iostream.h, файл windows.h с описа-
нием функций операционной системы Windows:
#include <windows.h>
Перед функцией main() создайте новую функцию с именем rus_str(), которая будет вы-
полнять необходимое преобразование с помощью специальной функции Windows:
char* rus_str(char* str)
{
CharToOem(str, str);
return str;
}
Во всех строках программы, где на экран выдаются символьные строки с русскими бук-
вами, укажите преобразование этих строк с помощью новой функции, например:
cout << rus_str("Введите текущий год и нажмите ENTER.\n");
2)Послезавершенияработыокнопрограммызакрываетсяинеудаетсяувидетьре-
Зультаты.
Для исправления этого недостатка проще всего предусмотреть в конце программы ввод
произвольного символа. Пока пользователь не нажмет какую-нибудь символьную клави-
шу и потом Enter, окно программы будет оставаться на экране. Для этого потребуется за-
вести символьную переменную (строку с описанием этой переменной расположите после
строки с описанием целочисленных переменных):
char wait_char;
Перед строкой с оператором возврата "return 0" добавьте оператор для ввода символа
с клавиатуры:
cin >> wait_char;
Сравните результаты работы своей программы с примером из лекции. Поэкс-
периментируйте над улучшением или изменением формата вывода на экран.
Упражнение 2
Модифицируйте программу 5.1, чтобы при превышении переменной
"another_age" значения 150 на экран выводилось сообщение:
Извините, но вы вряд ли доживете до [year] года!
Проверьте работу своей программы для нескольких разных лет.
Упражнение 3
Измените программу из упр.2 так, чтобы в ней учитывались и годы, и месяцы.
На экран программа должна выводить следующие сообщения:
Введите текущий год и нажмите ENTER.
Введите текущий месяц (число от 1 до 12).
Введите свой возраст (в годах).
Введите месяц своего рождения (число от 1 до 12).
Введите год, для которого вы хотите узнать свой возраст.
Введите месяц этого года.
Ваш возраст в 6/2006: 31 год и 1 месяц.
Программа должна выдавать корректные сообщения для единственного и мно-
жественного числа лет и месяцев, т.е. должна выводить на экран "25 лет и 1 ме-
сяц", но "24 года и 2 месяца".
Подсказка: В программе вам потребуются дополнительные переменные. Обязатель-
но добавьте их имена в оператор описания переменных. При вычислениях могут при-
годиться некоторые стандартные операции Си++:
Символ
+
Операция
Сложение
Пример Значение
3 + 5
-
*
/
%
Вычитание
Умножение
Деление
Остаток при деле-
нии нацело
43 - 25
4 * 7
9/2
20 % 6
(Обратите внимание, что в приведенной таблице операция деления "/" применялась к
двум целым числам, поэтому результат – тоже целое число.)
Кроме арифметических операций, для проверки условий в операторе if вам могут
потребоваться некоторые логические операции.
Символ
<
Операция
меньше, чем
3 < 5
Пример
Значение
TRUE (истина)
<=
меньше или равно 43 <= 25
FALSE (ложь)
>
больше, чем
4 > 7
FALSE
>=
больше или равно 9 >= 2
TRUE
==
!=
&&
||
равно
не равно
Логическое И
Логическое ИЛИ
20 == 6
20!= 6
5 > 2 && 6 > 10
5 > 2 | 6 > 10
FALSE
TRUE
FALSE
TRUE