- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
Замечания по программированию алгебраических выражений
-
Не забываем включать требуемые заголовочные файлы.
-
При программировании больших формул придерживаемся подхода «здравого смысла», т.к. запись формулы в виде одного выражения чревата появлением ошибок (как правило, несоответствие открывающих и закрывающих скобок), а введение большого числа дополнительных переменных для сохранения промежуточных результатов – также не лучший выход.
-
При форматном выводе с помощью функции printf необходимо внимательно относиться к заданию спецификатора. Например, для переменной, определенной как double df; запись оператора вывода в виде printf(“%d”, df) даст неверный результат.
-
При форматном вводе с помощью функции scanf необходимо не забывать указывать адрес вводимой переменной (например, &x).
-
При использовании функции pow для извлечения корня некоторой, (например, 4-ой степени) из выражения (например, a+b*b) помнить, что запись вида pow (a+b*b, 1/4) всегда даст значение, равное 1 из-за целочисленного деления 1 на 4. Исправить положение поможет запись степени в виде 1.0/4 или 1/4.0 или 1.0/4.0 или 0.25
-
Заменяем умножением возведение выражений в небольшую степень (в том числе и значений, возвращаемых функциями), стараемся не использовать в таком случае функцию pow,
-
Не путаем операции = и ==.
-
Не забываем о приоритете операций.
-
Невозможно определить порядок обработки операндов в коммутативных операциях: например: int z, x=1; z=(x*5) +((x=10)/2); z может получить различные значения в зависимости от того, какое выражение в скобках будет вычисляться первым; во избежание двусмысленности следует использовать промежуточную переменную: int z, t, x=1; t=x*5; z=(x*5) +((x=10)/2);
-
Следим за наличием точки с запятой перед второй частью (else) условного оператора if.
-
Если в какой-либо ветви условия необходимо выполнить более одного оператора, их следует объединить в один блок с помощью фигурных скобок.
-
Если в операторе вывода в поток используется тернарная операция, то тернарное выражение полностью заключается в скобки.
-
При вводе значения любого из целочисленных типов, превосходящего максимально допустимое значение для диапазона типа соответствующей переменной, фактически вводится неверное значение. Чтобы обнаружить ошибку, необходимо контролировать вводимые данные.
Условный оператор
Пример 1.
Проанализируйте конструкции и убедитесь, что ваш ответ совпадает с приведенным в тексте:
int x, y=1, z; if (y !=0) x=5; printf (” %d”, x); // x=5
if (y ==0) x=3; else x=5; printf (” %d”, x); // x=5
x=1;
if (y <0) if (y>0) x=3; else x=5; printf (” %d”, x); // x=1
if (z = y <0) x=3; else if (y==0) x=5; else x=7; printf (” %d %d”, x, z); // x=7 z=0
if (z=(y==0)) x=5; x=3; printf (” %d %d”, x, z); // x=3, z=0, y=1
if (x = z = y); x=3; printf (” %d %d”, x, z); // x=3, z=1
Пример 2.
Проанализируйте конструкции и вспомните, когда возможно их применение:
if (выражение1) break;
if (выражение2) continue;
if (выражение3) return;
Пример 3. Даны вещественные числа a, b, c, d. Если a b c d, то каждое число заменить наибольшим, если a > b > c > d, то числа оставить без изменений, в противном случае – все числа заменить их квадратами.
//program 6_1
#include <conio.h>
#include <stdio.h>
int main ()
{double a, b, c, d;
printf (" Input a, b, c, d:\n");
scanf ("%lf%lf%lf%lf", &a, &b, &c, &d);
printf ("a = %lf; b = %lf; c = %lf; d = %lf;\n", a, b, c, d);
if (a<=b && b <=c && c<=d)
{a = d; b = d; c=d;}
else if (a >b && b>c && c>d) ;
else {a = a*a; b = b*b; c = c*c;}
printf ("a = %lf; b = %lf; c = %lf; d = %lf;\n", a, b, c, d);
_getch();
return 0;
}