Урок 3 «Если ты не хочешь учить С++, закрой это окно, иначе – читай дальше»

Вот и очередной нудный урок по фундаменту С++. Потерпите еще пару уроков.  Скоро мы приступим к нормальному кодингу .

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

С++ позволяет программисту проводить следующие  унарные операции (забудьте это слово, оно всего лишь означает операцию с одним знаком) – сложение (+), вычитание (-), умножение (*), деление (/),  деление по модулю (%), сдвиги и мои любимые побитовые операции: |, &, ^

Мы и раньше делали простые операции. Просто вы не знали об этом. Самая простейшая операция это присваивание (=).   Как вы можете догадаться, операция предназначена для присвоения левому операнду значения правого операнда.

int a=2*34; //мы присвоили а значение 68.

Можно присвоить также логическое значение немного нестандартными для вас способами:

bool bolshe;

bolshe=2<1; //вернет переменной false

Кстати, пора уже и пояснить вам, что за странные черточки стоят после точки с запятой. Это, друзья мои, комментарии, причем в стиле С++. Они нужны для того, чтобы мы, программисты, смогли изучить и доработать чужой код или свой, который забросили пару лет назад. Рекомендуется всегда на сложных участках давать различные комментарии. Не бойтесь, компилятор их игнорирует.

Кроме однострочного комментария (//) часто применяют многострочный (/* */). Текст заключенный между этими знаками, является также комментарием. Этот способ достался нам от языка С

int factorial (int n);/* функция факториала */

Хорощий стиль программирования как раз подразумевает применение комментариев. Так что я буду приучать их использовать.

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

int a,b=23,c=123;

a=c/b; // остаток потеряли

А вот если a будет double, то все нормально.

Очень часто может использоваться вами деление по модулю. Результатом такого деления будет остаток числа. Вот пример:

int  a, c=3, b=12;

a=b%c;

cout<< a <<endl; // вернет 0.

А вот если присвоить b значение 13, то  вернется уже 1. Поэкспериментируйте с этим. Скоро мы используем все на примере.

Кроме всего прочего, на радость перешедшим на С паскальщикам, в этом языке имеются операторы инкремента (увеличение на 1)  и декремента (уменьшение на 1).  Они представлены знаками ++ для инкремента и – для декремента.  Существует две формы этих операций: префиксная и постфиксная. Рассмотрим их на примерах.

int x = 0;
++x;

Значение x увеличивается на единицу и становится равным 1.

--x;

Значение x уменьшается на единицу и становится равным 0.

int y = ++x;

Значение x опять увеличивается на единицу. Результат операции ++ – новое значение x, т.е. переменной y присваивается значение 1.

int z = x++;

Здесь используется постфиксная запись операции увеличения на единицу. Значение переменной x до выполнения операции равно 1. Сама операция та же – значение x увеличивается на единицу и становится равным 2. Однако результат постфиксной операции – это значение аргумента до увеличения. Таким образом, переменной z присваивается значение 1

Подобными мотивами оптимизации и сокращения записи руководствовались создатели языка Си (а затем и Си++), когда вводили новые знаки операций типа «выполнить операцию и присвоить». Довольно часто одна и та же переменная используется в левой и правой части операции присваивания, например:

x = x + 5;
y = y * 3;
z = z – (x + y); 

В Си++ эти выражения можно записать короче:

x += 5;
y *= 3;
z -= x + y; 

 

Как видите, это значительно экономит время. Хотя побочным эффектом является трудность понимания кода.

Пока с этой нудятиной покончили. Давайте поговорим о побитовых операциях. Их три – логическое или (|), логическое  и (&), исключающее или (^).

Механизм их работы пока вам будет трудно доступен. Единственное, что могу сказать –на практике часто приходится работать только с | и ^. Эти операции пригодятся для криптографии.

Я бы мог расписать то, как оно все работает, но боюсь вас вспугнуть.  По этой же причине оставим пока сдвиги. Они будут актуально только в уроках по улучшению быстродействия.

Мы теперь знаем как делать математические операции в С++, но без управления этим все насмарку.

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

if (); else

Это условный оператор. Условные операторы позволяют выбрать один из вариантов выполнения действий в зависимости от каких-либо условий. Условие – это логическое выражение, т.е. выражение, результатом которого является логическое значение true (истина) или false (ложь).

Оператор if выбирает один из двух вариантов последовательности вычислений.

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

Если условие истинно, выполняется оператор1, если ложно, то выполняется оператор2.

if   (x > y)
     a = x;
else
     a = y; 

В данном примере переменной a присваивается значение максимума из двух величин x и y.

Конструкция else необязательна. Можно записать:

if   (x < 0)
     x = -x;
abs = x; 
        

В данном примере оператор x = -x; выполняется только в том случае, если значение переменной x было отрицательным. Присваивание переменной abs выполняется в любом случае. Таким образом, приведенный фрагмент программы изменит значение переменной x на его абсолютное значение и присвоит переменной abs новое значение x.

Если после  выражения идут несколько операторов, то их заключают в скобки. Однако, рекомендую использовать правило, которое действует в Perl  — всегда ставьте операторные скобки. Лишними они не покажутся.

Вышеуказанный код в таком случае станет:

if (x<0)

   {

        x = -x;

    }

abs = x;

Как видите, данный способ более нагляден.  Лично мне данный подход больше нравится, так как не дает запутаться в коде.

 

Условный оператор можно расширить для проверки нескольких условий:

if   (x  < 0)
     cout  << "Отрицательная величина";
else if   (x > 0)
     cout  << "Положительная величина";
else
     cout  << "Ноль"; 

 

Конструкций else if может быть несколько. Это важно понимать и не бояться их использовать.

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

Если a % 2=0 И b %2=0 тогда «Числа четные»;

иначе

«Одно или оба числа не отвечают условиям задачи»

Записать это теперь можно так:

if ((a % 2=0) && (b % 2=0)) cout<<” Числа четные”;

else

cout<< “Одно или оба числа не отвечают условиям задачи”;

Как видите, здесь проверяется условие на истинность обоих чисел. Однако часто нам нужно проверять на истинность только одно выражение. Тогда применяется ИЛИ (||).

if ((a % 2=0) || (b % 2=0)) cout<<” Число четное”;

else

cout<< “Одно или оба числа не отвечают условиям задачи”;

 

Конструкция switch… case

Хотя любые комбинации условий можно выразить с помощью оператора if, довольно часто запись становится неудобной и запутанной. Оператор выбора switch используется, когда для каждого из нескольких возможных значений выражения нужно выполнить определенные действия. Например, мы пишем программу-ежедневник. На каждый день календаря записаны свои действия. Конечно, можно легко записать эту программу так:

int day;

if (day==1) cout<<” Приготовь отчет за предыдущий месяц”<<endl;

if  (day==2)…

Представляете себе громоздкость и нелепость такого кода? Чтобы этого избежать, в С++ имеется другой способ. Сравните

int day;

switch (day)

{

case 1:

  cout <<” Приготовь отчет за предыдущий месяц”<<endl;

 break;

case 2:

 cout<<”Оплати квартплату”<<endl;

break;

 defult:

cout<<”Все дела переделаны”<<endl;

}

Хотя этот способ и выглядит более непонятным, пользоваться им гораздо удобнее. В зависмости от значения  day будет выполняться своя ветка кода. Для значения по умолчанию используется ветка default. Метка default может быть опущена, что эквивалентно записи:

default:
   ;  // пустой оператор, не выполняющий 
      // никаких действий 
 
Селектором может выступать не только число, но и символ. В этом случае, его заключают в одинарные кавчки.

Еще один важный момент в этом операторе – не забывайте ставить break. Это слово говорит компилятору, что нужно переходить на следующий case.

Тернарный оператор

Последний тип условного оператора замыкает тернарный оператор. Его так называют потому, что он работает с тремя операндами. Давайте рассмотрим на примере, как он работает.

Даны три переменных a, b и с. Задача состоит в том, чтобы присвоить значение большей переменной c.

Мы могли сделать это так:

int a=45,b=21,c;

if (a>b) c=a;

else  c=b;

А вот при помощи это можно сделать так:

c=a>b?a:b;

Смысл тот же самый, вот только код намного короче.

Закрепление

В качестве закрепления давайте напишем простенькую экспертную систему. Что это такое можете посмотреть в википедии. В нашем случае, это простой искусственный интеллект, который будет давать вам советы.


#include <iostream>

#include <locale.h>

using namespace std;

int main(int argc, char* argv[])

{

setlocale (0,"");

cout<<"Введите ваш возраст \n";

int age;

cin>>age;

cout<<"Введите ваш рост \n";

int height;

cin>>height;

cout<<"Введите ваш вес \n";

int ves;

cin>>ves;

int norm;

int vnorm;

norm =((height - 100) + 10);  //так должно быть

vnorm=height - ves +10; //а это у вас

if (vnorm>norm) cout<<"Толстяк, тебе нужно худеть \n";

else if (vnorm<norm) cout<<"А ты дистрофик \n";

else

cout<<"Все в норме";

system ("pause");

return 0;

}

Теперь можно переходить к уроку 4

<<Предыдущий урок                                                   Следующий урок>>.

Яндекс.Метрика