Единое окно доступа к образовательным ресурсам

Основы языка С++: Конспект лекций по курсу "Алгоритмические языки и программирование"

Голосов: 8

В конспекте для студентов, приступающих к изучению языка С++, рассматриваются основные конструкции языка Си и базовая технология программирования (структурное программирование). Приведены вопросы и примеры задач для подготовки к экзамену. Пособие подготовлено на кафедре информационных технологий и автоматизированных систем ПГТУ.

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
         +         бинарный плюс (сложение арифметических операндов)
     -         бинарный минус (вычитание арифметических операндов)
       Мультипликативные:
     *         умножение операндов арифметического типа
     /         деление операндов арифметического типа (если операнды целочис-
        ленные, то выполняется целочисленное деление)
     %         получение остатка от деления целочисленных операндов
       Операции сдвига (определены только для целочисленных операндов).
       Формат выражения с операцией сдвига:
       операнд_левый операция_сдвига операнд_правый
     <         сдвиг влево битового представления значения левого целочисленно-
<       го операнда на количество разрядов, равное значению правого операнда,
        освободившиеся разряды обнуляются
     >         сдвиг вправо битового представления значения правого целочислен-
>       ного операнда на количество разрядов, равное значению правого операнда,
        освободившиеся разряды обнуляются, если операнд беззнакового типа и за-
        полняются знаковым разрядом, если – знакового
       Поразрядные операции:
     &         поразрядная конъюнкция (И) битовых представлений значений це-
        лочисленных операндов (бит =1, если соответствующие биты обоих опе-
        рандов=1)
     |         поразрядная дизъюнкция (ИЛИ) битовых представлений значений
        целочисленных операндов (бит =1, если соответствующий бит одного из
        операндов=1)
     ^         поразрядное исключающее ИЛИ битовых представлений значений
        целочисленных операндов(бит =1, если соответствующий бит только одно-
        го из операндов=1)
       Операции сравнения: результатом являются true( не 0) или false(0)
     <         меньше, чем
     >         больше, чем
     <         меньше или равно
=
     >        больше или равно
=
     =        Равно
=
     !        не равно
=
        Логические бинарные операции:
      &          конъюнкция (И) целочисленных операндов или отношений, цело-
&        численный результат ложь(0) или истина(не 0)
      |          дизъюнкция (ИЛИ) целочисленных операндов или отношений, цело-
|        численный результат ложь(0) или истина(не 0)
        Операции присваивания
        =, +=, -=, += и т.д.
        Формат операции простого присваивания:
        операнд1=операнд2
        Леводопустимое значение (L-значение) – выражение, которое адресует некоторый
участок памяти, т. е. в него можно занести значение. Это название произошло от операции
присваивания, т. к. именно левая часть операции присваивания определяет, в какую об-
ласть памяти будет занесен результат операции. Переменная – это частный случай леводо-
пустимого выражения.
        Условная операция.
        В отличие от унарных и бинарных операций в ней используется три операнда.


         Выражение1 ? Выражение2 : Выражение3;
         Первым вычисляется значение выражения1. Если оно истинно, то вычисляется зна-
чение выражения2, которое становится результатом. Если при вычислении выражения1
получится 0, то в качестве результата берется значение выражения3.
         Например:
         x<0 ? -x : x ; //вычисляется абсолютное значение x.
         Операция явного (преобразования) приведения типа.
         Существует две формы: каноническая и функциональная:
            1) (имя_типа) операнд
            2) имя_типа (операнд)
(int)a //каноническая форма
int(a) //функциональная форма
                                              2.5. Выражения
         Из констант, переменных, разделителей и знаков операций можно конструировать
выражения. Каждое выражение представляет собой правило вычисления нового значения..
Если выражение формирует целое или вещественное число, то оно называется арифмети-
ческим. Пара арифметических выражений, объединенная операцией сравнения, называет-
ся отношением. Если отношение имеет ненулевое значение, то оно – истинно, иначе –
ложно.
         Приоритеты операций в выражениях
Ранг                  Операции
         1            ( ) [ ] -> .
         2            ! ~ - ++ -- & * (тип) sizeof тип( )
         3            * / % (мультипликативные бинарные)
                      + - (аддитивные бинарные)
         5            << >> (поразрядного сдвига)
         6            < > <= >= (отношения)
         7            == != (отношения)
         8            & (поразрядная конъюнкция «И»)
         9            ^ (поразрядное исключающее «ИЛИ»)
         10           | (поразрядная дизъюнкция «ИЛИ»)
         11           && (конъюнкция «И»)
         12           || (дизъюнкция «ИЛИ»)
         13           ?: (условная операция)
         14           = *= /= %= -= &= ^= |= <<= >>= (опера-
              ция присваивания)
         15           , (операция запятая)


      Контрольные вопросы
1. Из каких элементов состоит естественный язык? Что является аналогами этих эле-
    ментов в С++?
2. Что такое лексема? Привести примеры лексем в языке С++.
3. Что такое идентификатор? Правила записи идентификаторов.
4. Что такое константа? Как константа обрабатывается компилятором?
5. Какие типы констант существуют в С++. Привести примеры констант разных типов.
6. К какому типу относятся константы 192345, 0х56, 0хСВ, 016, 0.7865, .0045, ‘c’, “x”,
    one, “one”, 5 , 5.?
7. Что такое тип данных?
8. Чем отличаются типы данных: float и double, char и wchar_t, int и short int?
9. Чем отличаются типы данных int и unsigned int?
10. Перечислить все типы данных, которые существуют в C++. Сколько места в памяти
    занимают данные каждого типа?
11. На что влияет количество памяти, выделяемое для данных определенного типа?


12. Что такое переменная? Чем объявление переменой отличается от ее определения?
    Привести примеры определений и объявлений.
13. Что такое класс памяти? Какие классы памяти существуют в С++? Привести примеры
    объявлений и определений переменных разных классов памяти.
14. Что такое выражение? Из чего состоит выражение?
15. Что такое операнд?
16. Какие операции можно применять к целочисленным данным? К вещественным дан-
    ным? К символьным данным?
17. Что такое отношение?
18. В каком случае отношение считается ложным, а в каком – истинным?
19. Какие операции называются унарными? Привести примеры.
20. Какие операции называются бинарными? Привести примеры.
21. Что такое тернарная операция? Привести пример.
22. Какая разница между постфиксной и префиксной операцией инкремента (декремен-
    та)?
23. Какие операции присваивания существуют в С++?
24. Привести примеры выражений, содержащих операции присваивания, операции ин-
    кремента (декремента), аддитивные и мультипликативные операции. Пояснить, как
    они будут выполняться.
25. Что такое леводопустимое значение? Привести пример.
26. Чему будет равно значение выражений:
                   int z=x/y++; если int x=1, y=2;
                   int w=x%++y, если int x=1, y=2;
                   int a=++m+n++*sizeof(int); если int m=1, n=2;
                   float a=4*m/0.3*n; если float m=1.5; int n=5;
                   int ok=int(0.5*y)<short(x)++; если int x=10, y=3;


3. Ввод и вывод данных
       В языке Си++ нет встроенных средств ввода и вывода – он осуществляется с помо-
щью функций, типов и объектов, которые находятся в стандартных библиотеках. Суще-
ствует два основных способа: функции унаследованные из Си и объекты Си++.
       Для ввода/вывода данных в стиле Си используются функции, которые описывают-
ся в библиотечном файле stdio.h.
       1)printf ( форматная строка, список аргументов);
       форматная строка - строка символов, заключенных в кавычки, которая показывает,
как должны быть напечатаны аргументы. Например:
       printf ( “Значение числа Пи равно %f\n”, pi);
       Форматная строка может содержать
                   1) символы печатаемые текстуально;
                   2) спецификации преобразования;
                   3) управляющие символы.
       Каждому аргументу соответствует своя спецификация преобразования:
       %d, %i - десятичное целое число;
       %f - число с плавающей точкой;
       %e,%E – число с плавающей точкой в экспоненциальной форме;
       %u – десятичное число в беззнаковой форме;
       %c - символ;
       %s - строка.
       В форматную строку также могут входить управляющие символы:
        \n - управляющий символ новая строка;
       \t – табуляция;
       \a – звуковой сигнал и др.
       Также в форматной строке могут использоваться модификаторы формата, которые
управляют шириной поля, отводимого для размещения выводимого значения. Модифика-
торы – это числа, которые указывают минимальное количество позиций для вывода значе-
ния и количество позиций ля вывода дробной части числа:
       %[-]m[.p]C, где
                                1. - задает выравнивание по левому краю,
                   m – минимальная ширина поля,
                   p – количество цифр после запятой для чисел с плавающей точкой и ми-
            нимальное количество выводимых цифр для целых чисел (если цифр в числе
            меньше, чем значение р, то выводятся начальные нули),
                   С- спецификация формата вывода.
       Пример
       printf("\nСпецификации формата:\n%10.5d - целое,\n%10.5f - с плавающей точкой\
       \n%10.5e – в экспоненциальной форме\n%10s - строка",10,10.0,10.0,"10");
       Будет выведено:
       Спецификации формата:
           00010 – целое
         10.00000 – с плавающей точкой
       1.00000е+001 - в экспоненциальной форме
             10 – строка.
       2) scanf ( форматная строка, список аргументов);
       В качестве аргументов используются адреса переменных. Например:
       scanf(“ %d%f ”, &x,&y);
       При использовании библиотеки классов Си++, Используется библиотечный файл
iostream.h, в котором определены стандартные потоки ввода данных от клавиатуры cin и
вывода данных на экран дисплея cout, а также соответствующие операции
           1) << - операция записи данных в поток;
           2) >> - операция чтения данных из потока.


      Например:
      #include <iostream.h>;
      .........
      cout << “\nВведите количество элементов: ”;
      cin >> n;

Контрольные вопросы
   1. Что такое форматная строка? Что содержит форматная строка функции printf? Что
      содержит форматная строка функции scanf?
   2. Что такое спецификация преобразования? Привести примеры спецификаций
      преобразования для различных типов данных.
   3. Что будет выведено функцией
      printf("\nСреднее арифметическое последовательности чисел равно: %10.5f \nКоли-
      чество четных элементов последовательности равно%10.5d ",S/n,k);
   4. Как записать вывод результатов из вопроса 3 с помощью операции << ?
   5. Как выполнить ввод переменных х и у, где x типа long int, а у типа double с помо-
      щью функции scanf? С помощью операции >> ?


4. Основные операторы языка Си++»
                4.1. Базовые конструкции структурного программирования
      В теории программирования доказано, что программу для решения задачи любой
сложности можно составить только из трех структур: линейной, разветвляющейся и цик-
лической. Эти структуры называются базовыми конструкциями структурного програм-
мирования.
      Линейной называется конструкция, представляющая собой последовательное со-
единение двух или более операторов.
      Ветвление – задает выполнение одного из двух операторов, в зависимости от вы-
полнения какого либо условия.
      Цикл – задает многократное выполнение оператора.
      Следование                    Ветвление                   Цикл




       Целью использования базовых конструкций является получение программы про-
стой структуры. Такую программу легко читать, отлаживать и при необходимости вносить
в нее изменения. Структурное программирование также называют программированием
без goto, т. к. частое использование операторов перехода затрудняет понимание логики ра-
боты программы. Но иногда встречаются ситуации, в которых применение операторов
перехода, наоборот, упрощает структуру программы.
                Операторы управления работой программы называют управляющими
конструкциями программы. К ним относят:
            составные операторы;
            операторы выбора;
            операторы циклов;
            операторы перехода.

                                 4.2. Оператор «выражение»
       Любое выражение, заканчивающееся точкой с запятой, рассматривается как опера-
тор, выполнение которого заключается в вычислении этого выражения. Частным случаем
выражения является пустой оператор ;.
       Примеры:
       i++;
       a+=2;
       x=a+b;
                                  4.3. Составные операторы
              К составным операторам относят собственно составные операторы и блоки.
В обоих случаях это последовательность операторов, заключенная в фигурные скобки.
Блок отличается от составного оператора наличием определений в теле блока. Например:
       {
       n++;                      это составной оператор
       summa+=n;
       }

      {
      int n=0;
      n++;                       это блок
      summa+=n;


      }

                                       4.4. Операторы выбора
        Операторы выбора - это условный оператор и переключатель.
        1. Условный оператор имеет полную и сокращенную форму.
        if (выражение-условие ) оператор;           //сокращенная форма
        В качестве выражения-условия могут использоваться арифметическое выражение,
отношение и логическое выражение. Если значение выражения-условия отлично от нуля
(т. е. истинно), то выполняется оператор. Например:
        if (x<y&&x<z)min=x;
        if ( выражение-условие ) оператор1;                 //полная форма
        else оператор2;
        Если значение выражения-условия отлично от нуля, то выполняется оператор1, при
нулевом значении выражения-условия выполняется оператор2.Например:
        if (d>=0)
        {
        x1=(-b-sqrt(d))/(2*a);
        x2=(-b+sqrt(d))/(2*a);
        cout<< “\nx1=”<<x1<<“x2=”<<x2;
        }
        else cout<<“\nРешения нет”;
        2.Переключатель определяет множественный выбор.
        switch (выражение)
        {
        case константа1 : оператор1 ;
        case константа2 : оператор2 ;
        ...........
        [default: операторы;]
        }
        При выполнении оператора switch, вычисляется выражение, записанное после
switch, оно должно быть целочисленным. Полученное значение последовательно сравни-
вается с константами, которые записаны следом за case. При первом же совпадении вы-
полняются операторы помеченные данной меткой. Если выполненные операторы не со-
держат оператора перехода, то далее выполняются операторы всех следующих вариантов,
пока не появится оператор перехода или не закончится переключатель. Если значение вы-
ражения, записанного после switch не совпало ни с одной константой, то выполняются
операторы, которые следуют за меткой default. Метка default может отсутствовать.
        Пример:
        #include <iostream.h>
        void main()
        {
                int i;
                cout<<"\nEnter the number";
                cin>>i;
                switch(i)
                {
                case 1:cout<<"\nthe number is one";
                case 2:cout<<"\n2*2="<<i*i;
                case 3: cout<<"\n3*3="<<i*i;break;
                case 4: cout<<"\n"<<i<<" is very beautiful!";
                default:cout<<"\nThe end of work";
                }
        }
        Результаты работы программы:


           1. При вводе 1 будет выведено:
       The number is one
       2*2=1
       3*3=1
           2. При вводе 2 будет выведено:
       2*2=4
       3*3=4
           3. При вводе 3 будет выведено:
       3*3=9
           4. При вводе 4 будет выведено:
       4 is very beautiful!
           5. При вводе всех остальных чисел будет выведено:
       The end of work
                                    4.5. Операторы циклов
       Различают:
                               1) итерационные циклы;
                               2) арифметические циклы.
       Группа действий, повторяющихся в цикле, называется его телом. Однократное вы-
полнение цикла называется его шагом.
       В итерационных циклах известно условие выполнения цикла.
          1. Цикл с предусловием:
       while (выражение-условие)
       оператор;
       В качестве <выражения-условия> чаще всего используется отношение или логиче-
ское выражение. Если оно истинно, т. е. не равно 0, то тело цикла выполняется до тех пор,
пока выражение-условие не станет ложным.
       Пример
       while (a!=0)
       {
       cin>>a;
       s+=a;
       }
          2. Цикл с постусловием:
       do
       оператор
       while (выражение-условие);
       Тело цикла выполняется до тех пор, пока выражение-условие истинно.
       Пример:
       do
       {
       cin>>a;
       s+=a;
       }
       while(a!=0);

         3. Цикл с параметром:
      for ( выражение_1;выражение-условие;выражение_3)
      оператор;
      выражение_1 и выражение_3 могут состоять из нескольких выражений, разделен-
ных запятыми. Выражение_1 - задает начальные условия для цикла (инициализация). Вы-
ражение-условие> определяет условие выполнения цикла, если оно не равно 0, цикл вы-
полняется, а затем вычисляется значение выражения_3. Выражение_3 - задает изменение
параметра цикла или других переменных (коррекция). Цикл продолжается до тех пор,
пока выражение-условие не станет равно 0. Любое выражение может отсутствовать, но


разделяющие их « ; » должны быть обязательно.
      Примеры использования цикла с параметром.
         1) Уменьшение параметра:
      for ( n=10; n>0; n--)
      { оператор};
         2) Изменение шага корректировки:
      for ( n=2; n>60; n+=13)
      { оператор };
         3) Возможность проверять условие отличное от условия, которое налагается на
             число итераций:
      for ( num=1;num*num*num<216; num++)
      { оператор };
         4) Коррекция может осуществляться не только с помощью сложения или вычи-
             тания:
      for ( d=100.0; d<150.0;d*=1.1)
      { <тело цикла>};
      for (x=1;y<=75;y=5*(x++)+10)
      { оператор };
         5) Можно использовать несколько инициализирующих или корректирующих
             выражений:
      for (x=1, y=0; x<10;x++;y+=x);

                                 4.6.Операторы перехода
             Операторы перехода выполняют безусловную передачу управления.
         1) break - оператор прерывания цикла.
       {
       < операторы>
       if (<выражение_условие>) break;
       <операторы>
       }
       Т. е. оператор break целесообразно использовать, когда условие продолжения
итераций надо проверять в середине цикла.
       Пример:
       // ищет сумму чисел вводимых с клавиатуры до тех пор, пока не будет введено 100
чисел или 0
       for(s=0, i=1; i<100;i++)
       {
       cin>>x;
       if( x==0) break; // если ввели 0, то суммирование заканчивается
       s+=x;
       }
           2) continue - переход к следующей итерации цикла. Он используется, когда тело
              цикла содержит ветвления.
        Пример:
       //ищет количество и сумму положительных чисел
       for( k=0,s=0,x=1;x!=0;)
       {
       cin>>x;
       if (x<=0) continue;
       k++;s+=x;
       }
           3) Оператор goto
       Оператор goto имеет формат: goto метка;
       В теле той же функции должна присутствовать конструкция: метка:оператор;


       Метка – это обычный идентификатор, областью видимости которого является
функция. Оператор goto передает управления оператору, стоящему после метки. Исполь-
зование оператора goto оправдано, если необходимо выполнить переход из нескольких
вложенных циклов или переключателей вниз по тексту программы или перейти в одно ме-
сто функции после выполнения различных действий.
       Применение goto нарушает принципы структурного и модульного программирова-
ния, по которым все блоки, из которых состоит программа, должны иметь только один
вход и только один выход.
       Нельзя передавать управление внутрь операторов if, switch и циклов. Нельзя пере-
ходить внутрь блоков, содержащих инициализацию, на операторы, которые стоят после
инициализации. Пример:
       int k;
       goto m;
       ...
       {
       int a=3,b=4;
       k=a+b;
       m: int c=k+1;
       ...
       }
       В этом примере при переходе на метку m не будет выполняться инициализация
переменных a , b и k.
          4) Оператор return – оператор возврата из функции. Он всегда завершает выпол-
              нение функции и передает управление в точку ее вызова. Вид оператора:
       return [выражение];



    
Яндекс цитирования Яндекс.Метрика