Конкретного компьютера

Спецификация задачи

Алгоритм

Описание алгоритма на

Языке высокого уровня

Объектный код (внут-

Ренний код конкретного

Компьютера)

Исполняемый файл для

конкретного компьютера


Требуется определить, является ли данное число простым.

Ввести 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




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: