Краткие теоретические положения




Цель работы

Изучить возможности по созданию простейших консольных программ на языке С++ в интегрированной среде разработки программ MS Visual Studio 2005/2008; повторить основные принципы создания программ на языке С++; повторить возможности использования простейших управляющих конструкций в программах на языке С++.

Краткие теоретические положения

Рассмотрим пример 1 программы:

// Программа для сложения двух чисел

#include <iostream>

#include <conio.h>

using namespace std;

 

int main ()

{int x,y,z;

cout << "Enter a number: "; cin >> x;

cout << "Enter a number: "; cin >> y;

z=x+y;

cout << "z = " << z << "\n";

getch(); return 0;

}

На примере этой программы разберем основные моменты любой программы.

Строка

int x,y,z;

объявляет три переменные целого типа с именами x, y, z.. Тип int – один из встроенных типов данных для хранения целых чисел (от англ. integer). Этот тип данных позволяет хранить целые числа со знаками. Кроме типа int в С++ имеются и другие встроенные типы данных. Например, тип float позволяет хранить вещественные числа (то есть дробные), а тип char – один символ (например, букву ‘a’ или знак ‘+’).

Объявление переменных должно заканчиваться точкой с запятой. В списке переменные должны перечисляться через запятую.

Другие примеры объявления переменных:

float a,b;

int i, count;

float bMax; int arrMaxIndex, k,asd;

Объявление переменной может располагаться в функциях где угодно, но до первого использования данной переменной.

Строка

cin >> x;

осуществляет ввод значения, введенного с клавиатуры в переменную х.

Аналогично с помощью инструкции cin >> y; осуществляется ввод переменной у.

Ввод двух переменных можно было выполнить и так:

cin >> x >> y;

Далее в этой программе вычисляется сумма и результат выводится на экран.

z=x+y;

В этой инструкции используются две операции: операция присваивания (=) и операция получения суммы (+). Эти операции называются бинарными, потому что каждая из них имеет по два операнда: один слева от знака операции, а другой справа. Для основных арифметический операций используются следующие знаки:

* умножение / деление

+ сложение - вычитание

% взятие по модулю (получение остатка от деления)

Все операции характеризуются своим приоритетом, определяющим порядок, в котором производится оценка выражения, и правилом ассоциации, задающим направление последовательных оценок идущих друг за другом операций одного приоритета.

Для изменения порядка вычисления выражения могут применяться круглые скобки. Знак равенства здесь также является операцией присваивания, которая сама (и, соответственно, все выражение в целом) возвращает значение. В этом отличие С от других языков, в частности Pascal, где присваивание является оператором, а не операцией. Оператором выражение станет, если поставить после него точку с запятой.

Если в операторе присваивания тип результата, полученного при оценке выражения в правой части, отличен от типа переменной слева, компилятор выполнит автоматическое приведение типа (по-английски typecast или просто cast) результата к типу переменной. Например, если оценка выражения дает вещественный результат, который присваивается целой переменной, то дробная часть результата будет отброшена, после чего будет выполнено присваивание. Ниже показан и обратный случай приведения:

int p;

float pReal = 2.718281828;

p = pReal; // p получает значение 2

pReal = p; // pReal теперь равно 2.0

Возможно и принудительное приведение типа, которое выполняется посредством операции приведения и может применяться к любому операнду в выражении, например:

р = рО + (int)(pReal + 0.5); // Округление pReal

Следует иметь в виду, что операция приведения типа может работать двояким образом. Во-первых, она может производить действительное преобразование данных, как это происходит при приведении целого типа к вещественному и наоборот. Получаются совершенно новые данные, физически отличные от исходных. Во-вторых, операция может никак не воздействовать на имеющиеся данные, а только изменять их интерпретацию. Например, если переменную типа short со значением -1 привести к типу unsigned short, то данные останутся теми же самыми, но будут интерпретироваться по-другому (как целое без знака), в результате чего будет получено значение 65535.

В арифметическом выражении могут присутствовать операнды различных типов — как целые, так и вещественные, а кроме того, и те и другие могут иметь различную длину (short, long и т. д.), в то время как оба операнда любой арифметической операции должны иметь один и тот же тип. В процессе оценки таких выражений компилятор следует алгоритму т. н. возведения типов, который заключается в следующем. На каждом шаге оценки выражения выполняется одна операция и имеются два операнда. Если их тип различен, операнд меньшего “ранга экстенсивности” приводится к типу более “экстенсивного”.

Условный оператор if... else. Условный оператор реализует структуру выбора. Он имеет такой вид:

if (условие) оператор1 else оператор2

Если условие оценивается как истинное, выполняется onepamop1, если как ложное, выполняется onepamop2. Простейший пример:

if (а > b) max_ab = a; else max_ab = b;

Пример 2 программы с использованием инструкции if. При выполнении этой программы пользователю предлагается ввести два разных числа, а затем сообщается результат их сравнения.

#include <iostream>

#include <conio.h>

using namespace std;

 

int main()

{int a,b;

cout << "Enter first number: ";

cin >> a;

cout << "Enter second number: ";

cin >> b;

 

if (a > b) cout << "a > b \n";

else cout << "b >= a \n";

 

getch();

return 0;

}

Вместо одиночного оператора всегда можно подставить блок из нескольких операторов. Блок – это логически связанная группа программных инструкций, которая обрабатывается как единое целое. В С++ программный блок создается путем записи группы инструкций внутри фигурных скобок. Пример 3:

#include <iostream>

#include <conio.h>

using namespace std;

 

int main()

{int a,b;

cout << "Enter first number: "; cin >> a;

cout << "Enter second number: "; cin >> b;

 

if (a > b)

{cout << "a > b \n";

cout << "Ih raznost' ravna " << a-b;

}

else

{cout << "b >= a \n";

cout << "Ih raznost' ravna " << b-a;

}

 

getch();

return 0;

}

Условие оператора if может быть сколь угодно сложным выражением. Причем тип выражения в операторе if не обязательно должен быть bool. Главное, чтобы результат вычисления выражения можно было интерпретировать как значение ИСТИНА или ЛОЖЬ. Так, например, нуль автоматически преобразуется в false, а все ненулевые значения – в true. Таким образом, любое выражение, которое дает в результате нулевое или ненулевое значение можно использовать для управления инструкцией if.

Цикл for. Цикл for, наиболее универсальный из всех циклов языка С, выглядит так:

for ([инициализация]; [условие]; [модификация]) оператор

Прежде всего выполняется инициализация цикла; секция инициализации может содержать любое выражение. Инициализация производится только один раз перед началом работы цикла.

Оценивается выражение условия. Если оно истинно, выполняется оператор тела цикла; если условие ложно, происходит выход из цикла и управление передается следующему оператору.

После исполнения тела цикла производится модификация, после чего управление возвращается заголовку цикла и все повторяется снова. Секция модификации может содержать любое выражение; обычно в ней изменяют значения управляющих переменных цикла.

Пример 4. Программа запрашивает с клавиатуры числа a и b, а затем выводит на экран все целые числа из диапазона от а до b.

#include <iostream>

#include <conio.h>

 

using namespace std;

 

int main()

{int i, a, b;

cout << "Enter a: "; cin >> a;

cout << "Enter b: "; cin >> b;

for (i=a; i<=b; i++) cout << i << " ";

getch(); return 0;

}

Пример 5 использования инструкции for. В следующей программе находится сумма всех натуральных чисел от 1 до N.

#include <iostream>

#include <conio.h>

using namespace std;

 

int main()

{ int i,N;

long int S;

cout << "N = "; cin >> N;

for (S=0,i=1; i<=N; i++) S+=i;

cout << "Summa = " << S;

getch(); return 0;

}

Другой пример (№6). Найдем и выведем на экран значения квадратного корня из чисел от 1 до 100.

#include <iostream>

#include <conio.h>

#include <cmath>

using namespace std;

 

int main()

{int num; double sq;

for (num=1; num<101; num++)

{sq = sqrt ((double)num);

cout << num << " " << sq << "\n";

}

getch(); return 0;

}

Если при записи цикла for опущено условие, цикл будет выполняться бесконечно. Например:

for (;;) {// то же, что и for(;1;). бесконечный цикл

}

Можно внести в выражение инициализации инициализацию сразу нескольких значений, используя между ними запятую. Например:

for (F=1,i=1;i<=N;i++) F=F*i;

Некоторых элементов в операторе for может не быть, однако разделяющие их точки с запятой обязательно должны присутствовать. В следующем примере инициализирующая часть вынесена из оператора For:

F=1; i=1; for (;i<=N;i++) F=F*i;

Цикл while. Это оператор цикла с предусловием. Общий формат оператора цикла while следующий:

while (<условие>) <оператор>

Оператор тела цикла будет циклически повторяться до тех пор, пока вычисление «условия» не даст значения ноль. Условное выражение вычисляется и проверяется перед выполнением тела цикла. Например, в следующем примере значение переменной р увеличивается на единицу в цикле до тех пор, пока не достигнет 10:

while (p < 10) p++;

Оператор while(1); реализует бесконечный пустой цикл. Использование в качестве условия константы 1 приводит к тому, что условие повторения цикла остается все время истинным и работа цикла никогда не заканчивается.

Как обычно, одиночный оператор тела цикла можно заменить блоком, заключенным в фигурные скобки:

whi1е (условие_продолжения){операторы_тела цикла}

Обратите внимание, что в цикле while проверка условия делается перед выполнением тела цикла. Если условие изначально ложно, то тело цикла не исполняется вообще, ни одного раза.

Пример 7. Дано натуральное число. Найти первую (старшую) цифру этого числа.

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{unsigned int N;

cout << "N = "; cin >> N;

while (N>10) N = N/10; // или можно так: N /= 10

cout << "\nFirst number = " << N;

getch(); return 0;

}

Цикл do—while. Это оператор цикла с постусловием. Общий формат этого оператора следующий:

do <оператор> while (условие);

<оператор> циклически повторяется до тех пор, пока условие истинно (вычисление <условия> не даст 0). Главное отличие этого оператора от оператора while состоит в том, что <условие> здесь проверяется не до, а после первого выполнения тела цикла. Гарантировано как минимум одно его выполнение.

Пример 8. Запрашиваются натуральные числа n (n <1000000) и m (m <10). Проверить, есть ли в записи числа n цифра т.

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{unsigned int n,m,k;

bool f;

cout << "n = "; cin >> n;

cout << "m = "; cin >> m;

f=false;

do { k = n % 10;

if (k==m) f=true;

n /= 10;

} while (n>0);

if (f) cout << "Est'! "; else cout << "Net.";

getch(); return 0;

}

Любую конкретную структуру повторения, требуемую для решения некоторой задачи, можно реализовать на основе любого из циклов С++, однако всегда какой-то из них подходит к данному случаю наилучшим образом, позволяя написать более ясный и компактный код. Так, если необходимое число итераций цикла известно заранее (как при обработке массива), проще всего применить цикл for. Если же число итераций заранее определить нельзя, например, при операциях поиска в списке, применяют цикл while или do...while.

Операторы прерывания блока. Часто бывает необходимо “досрочно” выйти из некоторого цикла, до того, как будет удовлетворено условие его завершения (говоря точнее, до того, как условие продолжения станет ложным). Например, вы просматриваете массив на предмет поиска заданного значения. Как только нужный элемент массива найден, выполнять цикл далее нет необходимости. Для досрочного завершения циклов в С++ применяются операторы break и continue.

· Оператор break вызывает прерывание ближайшего (самого внутреннего) заключающего его блока switch, while, do... while или for. Управление немедленно передается следующему за блоком оператору.

· Оператор continue воздействует только на блоки циклов. Он передает управление в конец тела цикла, пропуская, таким образом, все следующие за ним операторы блока. Здесь досрочно завершается не сам цикл, а его текущая итерация.

Эти два оператора эквивалентны следующим конструкциям с goto:

// Эквивалент break:

while (...) {…

goto brkLabel;

} // Закрывающая скобка блока.

brkLabel: // Метка следующего за блоком оператора.

 

// Эквивалент continue:

while (...) {…

goto cntLabel;

CntLabel:; // Пустой помеченный оператор.

} // Закрывающая скобка блока.

 

Разумеется, операторы прерывания циклов должны выполняться условно, т. е. должны входить в блок if или else некоторого условного оператора и исполняться только при наступлении условий досрочного завершения цикла.

Использование break и continue для прерывания циклов, вообще говоря, нежелательно — по тем же причинам, что и использование goto (от операторов break в структуре выбора switch никуда не уйти). Они нарушают структурную организацию потока управления и затрудняют чтение текста программы.

 

Для создания консольного приложения на языке С++ в интегрированной среде Visual Studio 2005/2008/2010 необходимо выбрать в меню File следующую последовательность опций: New -> Project -> -> Visual C++ -> Win32 Console Application. После этого определяем имя проекта в поле Name и местонахождение каталога с файлами проекта в поле Location. После нажатия OK в окне New Project появится окно Win32 Application Wizard, в котором необходимо выбрать пункт Application Settings. В правой половине окна появится группа селективных кнопок Application Type для указания типа приложения и две группы кнопок-переключателей. Для консольного проекта необходимо выбрать селективную кнопку Console application и переключатель Empty Project, а затем нажать кнопку Finish.

 

Задание на работу

1. Проверить работу программ, приведенных в кратких теоретических положениях.

2. Разработать самостоятельно приложения для решения трех задач по своему варианту.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: