- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
Пример вычисления значения выражения
Вычислить значение выражения:
при x=6.251, y=0.827, z=25.001
// formula_1 вывод в стиле С #include <stdio.h> #include <math.h>
#include <conio.h>
int main() { double x, y, z, b, r1, r2, r3, r4; //r1, r2, r3, r4 – вспомогательные переменные puts ("input x, y, z: "); // функция выводит на экран строку scanf ("%lf %lf %lf", &x, &y, &z); //ввод значений через пробел или <enter> r1=pow(y, pow(fabs(x), 1./3.)); //вычисление первого слагаемого r2= cos(y); r3=fabs(x-y)*(1+r2*r2/sqrt(x+y)); //вычисление числителя большой дроби r4=exp(fabs(x-y))+x/2; //вычисление знаменателя большой дроби b=r1+r2*r2*r2*r3/r4; printf ("\nfor x=%lf, y=%lf, z=%lf, b=%10.6lf\n", x, y, z, b); // вывод на экран _getch();
return 0;
}
Результат: for x=6.251000, y=0.827000, z=25.001000, b= 0.713336
// formula_2 вывод в стиле С++ #include <iostream.h> #include <math.h>
#include <conio.h>
int main() { double x, y, z, b, r1, r2, r3, r4; //r1, r2, r3, r4 – вспомогательные переменные cout << "input x, y, z: "<< endl; // вывод строки с приглашением cin >> x >> y >> z; //ввод значений через пробел или <enter> r1=pow(y, pow(fabs(x), 1./3.)); //вычисление первого слагаемого r2= cos(y); r3=fabs(x-y)*(1+r2*r2/sqrt(x+y)); //вычисление числителя большой дроби r4=exp(fabs(x-y))+x/2; //вычисление знаменателя большой дроби b=r1+r2*r2*r2*r3/r4; cout << "\n x=" << x << " y=" << y << " z=" << z << " b=" << b << endl; _getch();
return 0;
}
Примеры использования преобразования типов
1. Внимание !!! Иногда при смешивании в одном выражении операндов разных арифметических типов могут получиться «неожиданные» результаты. Например:
int a=8, b=5; double var1, var2; var1 = a/b; //результат имеет значение 1, т.к. выполняется целочисленное деление var2 = (double)a/b; //результат имеет ожидаемое значение1.6
2. Особенности преобразования типов int и double:
main() {double d=3.2, x; int i=2, j; x = (j = d/i)*2; // i преобразуется к типу double, результат деления = 1.6 // при присваивании j значение 1.6 усекается до 1 printf (”x=%f\t, j=%d\n”, x, j); // х=2, j=1 j=(x=d/i)*2; // i преобразуется к типу double, результат деления = 1.6 printf (”x=%f\t, j=%d\n”, x, j); // x=1.6 j=3 (3.2 усекается при присваивании до 3) j=d*(x=2.5/d); //правая часть выражения для j получит значение 2.5
//усекается при присваивании до 2
printf (”j=%d\n”, j); // j=2 x=d*(j=((int)2.9+1.1)/d); // значение выражения ((int)2.9+1.1) равно 3.1 // значение выражения ((int)2.9+1.1)/d) < 1 и при
printf (”x=%f\t, j=%d\n”, x, j); // присваивании целой переменной j усекается до 0, //значит и x=0, j=0
}
3. Чтобы вывести на экран код символа, нужно применить операцию явного преобразования. Например:
#include <conio.h>
#include <iostream.h>
int main() { char c= 'a'; cout << (unsigned) c << endl; // будет напечатан код символа _getch();
return 0;
}
4. Переменной перечислимого типа нельзя присвоить значение с помощью оператора ввода. Однако можно ввести значение для переменной целого типа и воспользоваться далее приведением типа:
#include <iostream.h>
#include <conio.h>
enum Predmet {alg, geom, progr, analiz}; //описание типа
int main() {Predmet pred (progr); //определение и инициализация переменной pred
cout << pred << endl; // будет выведено 2 - внутреннее представление переменной
int i=3;
pred = (Predmet) i; // преобразование к перечислимому типу
cout << pred << endl; // будет выведено 3 - внутреннее представление // нового значения переменной _getch();
return 0;
}
Заметим, что подобная форма преобразования типа не может применяться для типов со сложным наименованием (например, unsigned long (x/3+2) вызовет ошибку компиляции). Для таких типов удобно выполнять явное преобразование с помощью typedef.
Например, если имеем:
typedef unsigned long UL;
typefef char * PCH;
то можно применить функциональную запись преобразования типа в виде:
UL (x/3+2) или PCH(0777);
5. Приведение типов может быть полезным при работе с условными операторами. Сравните приведенные ниже выражения (они на самом деле решают одну задачу):
if (x > 15) x = x – 15; |
x =x – 15 * (unsigned) (x > 15); |