Лекция 7. Арифметические и логические выражения. Массивы (Электронные лекции)
Описание файла
Файл "Лекция 7. Арифметические и логические выражения. Массивы" внутри архива находится в папке "Электронные лекции". PDF-файл из архива "Электронные лекции", который расположен в категории "". Всё это находится в предмете "алгоритмы и алгоритмические языки" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.Лекция 7 Арифметические и логические выражения. Массивы7.1. Арифметические типы данных:7.1.1. Целочисленные: int, short int, long int, char. Спецификатор .7.1.2. Типы с «плавающей точкой»: float, double, long double, long longdouble.7.2. Арифметические операции над целочисленными данными.7.2.1. Одноместные: изменение знака («одноместный минус»: –), одноместный плюс (+).7.2.2. Двухместные: сложение (+), вычитание (–), умножение (*), деление нацело (/),остаток от деления нацело (%).7.2.3. Пример программы.
Дано целое число a. Найти сумму его цифр#include <stdio.h>int main() {int a, b, s;printf ("Введите число: ");scanf ("%d ", &a);b = a;if (b < 0) b = -b;if (b = 0) s = 0;else {s = 0;while (b > 0) {s = s + b%10;b = b/10;}printf ("Сумма цифр числа %d равна %d\n ", a, s);}7.3. Арифметические операции над данными с плавающей точкой.7.3.1. Одноместные: изменение знака («одноместный минус»: –), одноместный плюс(+).7.3.2. Двухместные: сложение (+), вычитание (–), умножение (*), деление (/).7.4. Порядок выполнения арифметических операций в выражениях (приоритет). Самыйнизкий приоритет у двуместных + и –, более высокий приоритет у двуместных *, / и %,еще более высокий приоритет у одноместных + и –.
В выражениях без скобок операции сболее высоким приоритетом выполняются раньше. Скобки позволяют изменить порядоквыполнения операций.7.5. Вычисления с данными типа float. Нет ассоциативности и коммутативности.7.5.1. Пример. Вычисление суммы 5 чисел типа float (мантисса – 6 десятичных цифр,порядок – 2 десятичных цифры):0.231876*1002 + 0.645391*10-03 + 0.231834*10-01 + 0.245383*10-02 + 0.945722*10-03 =(с) Кафедра системного программирования ф-та ВМК МГУ, 20101Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.a) 0.231876*1002 + 0.645391*10-03 + 0.231834*10-01 + 0.245383*10-02 + 0.945722*10-03 =0.232147*1002;23.1876 + 0.000645391 = 23.188245391 = 23.1882 = 0.
231882*1002;23.1882 + 0.0231834 = 23.2113834 = 23.2114 = 0.232114*1002;23.2114 + 0.00245383 = 23.21385383 = 23.2138*1002;23. 2138 + 0.000945722 = 23.214745722 = 23.2147 = 0.232147*1002;b) 0.645391*10-03 + 0.9457*10-03 + 0.245383*10-02 + 0.231834*10-01 + 0.231876*1002 =0.232157*1002;0.000645391 + 0.000945722 = 0.001591113 = 0.00159111 = 0. 159111*10-02;0.00159111 + 0.00245383 = 0.00494493 = 0. 494493*10-02;0.00494493 + 0.0231834 = 0.02812833 = 0.0281283 = 0.
281283*10-01;0.0281283 + 23.1876 = 23.2157283 = 23.2157 = 0.232157*1002;7.5.2. Пример. Вычисление разности плавающих чисел (мантисса – 6 десятичных цифр,порядок – 2 десятичных цифры):0.238617*1002 – 0.238616*1002 + 0.645391*1004 – 0.645392*1004 + 0.845791*1000 –0.835790*1000 =a) 0.238617*1002 – 0.238616*1002 + 0.645391*1004 – 0.645392*1004 + 0.845791*1000 –0.835790*1000 = 0.100000*10-050.238617*1002 – 0.238616*1002 = 23.8617 – 23.8616 = 0.0001 = 0.100000*10-030.100000*10-03 + 0.645391*1004 = 0.0001 + 6453.91 = 6453.9101 = 0.645391*10040.645391*1004 – 0.645392*1004 = – 0.000001*1004 = – 0.100000*10-01– 0.100000*10-01 + 0.845791*1000 = – 0.01 + 0.845791 = 0.835791 *10000.835791 *1000 – 0.835790*1000 = 0.000001*1000 = 0.100000*10-05b) 0.238617*1002 + 0.645391*1004 + 0.845791*1000 – (0.238616*1002 + 0.645392*1004 +0.835790*1000) = 0.100000*10000.238617*1002 + 0.645391*1004 = 23.8617 – 6453.91 = 6478.6 = 0.647777*10040.647777*1004 + 0.845791*1000 = 6477.77 + 0.845791 = 6478.615791 =0.647862*10040.238616*1002 + 0.645392*1004 = 23.8616 + 6453.92 = 6477.7816 = 6477.78*10046477.78*1004 + 0.835790*1000 = 6477.78 + 0.835790 = 6478.61579 = 0.647852*10040.647862*1004 – 0.647852*1004= 0.000010*1004 = 0.100000*10-007.5.3.
Выводы. (1) При вычислении суммы чисел с одинаковыми знаками необходимоупорядочить слагаемые по возрастанию и складывать, начиная с наименьшихслагаемых.(2) При вычислении суммы чисел с разными знаками необходимо сначала сложитьвсе положительные числа, потом – все отрицательные числа и в конце выполнитьодно вычитание.(3) Вычитание (сложение чисел с противоположными знаками) часто приводит кпотере точности, которая у чисел с плавающей точкой определяется количествомзначащих цифр в мантиссе1 (при вычитании двух близких чисел мантисса«исчезает», что ведет к резкой потере точности).
Итак, чем меньше вычитаний,тем точнее результат.1Значащими цифрами числа с плавающей точкой называются все цифры его мантиссы за исключением нулей,стоящих в ее конце. Например, у числа 0.67000890000 * 103 все цифры, выделенные жирным шрифтом, значащие. Привычитании двух близких чисел почти все значащие цифры пропадают. Например, 0.67000890 * 103 - 0.67000880 * 103 =0.00000010 * 103 = 0.10 * 10-4. Таким образом, у результата всего одна значащая цифра, хотя у операндов было 7значащих цифр. Подробнее этот вопрос освещается в курсе численного анализа.(с) Кафедра системного программирования ф-та ВМК МГУ, 20102Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.(4) То же самое относится к умножению и делению.7.6.
Отношения и логические операции.7.6.1. Отношения – это операции: больше (>), больше или равно (>=), меньше (<),меньше или равно (<=). Имеют более низкий приоритет, чем сложение и вычитание(выражение i < lim – 1 воспринимается как i < (lim – 1)).7.6.2.
Операции сравнения: равно (==), не равно (!=) имеют более низкий приоритет, чемотношения.7.6.3. Логические операции: отрицание (!), конъюнкция (&&) и дизъюнкция (||)позволяют строить логические выражения. У одноместной операции ! приоритетвыше, чем у отношений и операций сравнения; у двухместных операций && и ||приоритет ниже, чем у отношений и операций сравнения; приоритет операции &&выше, чем приоритет операции ||.7.6.4. Результатами операций отношения и сравнения, операндами и результатамилогических операций являются константы и переменные булевского типа (см.дополнение д7.1)7.6.5.
Пример. Ввод строки символов. Фрагмент программы:for (i = 0; i < lim – 1 && (c = getchar()) != '\n' && c != EOF; ++i)s[i] = c;Замечания к примеру: (1) сначала проверка – поместится ли очередной символ впамяти, выделенной под строку (s); (2) если значение отношения i < lim – 1равно false, то значение всего логического выражения равно false (свойствооперации &&) и дальнейшие проверки не нужны; (3) проверка (c = getchar())!= '\n' делается второй, так как нужен новый символ; скобки в (c =getchar()) нужны потому, что операция присваивания (=) имеет более низкийприоритет, чем операция сравнения (!=); (4) EOF означает конец файла.7.7. Символьный тип данных (char)7.7.1.
Программа подсчета числа строк во входном потоке#include <stdio.h>int main() {int c, nl;nl = 0;while (c = getchar())!= EOF)if (c == ‘\n’)++nl;printf (“%d\n ”, nl);}7.7.2. В стандарте языка Си зафиксирован код для представления символьных данных.Символы представляются в коде ASCII (American Standard Code for InformationInterchange).
Код сопоставляет каждому символу число типа char, являющегося(с) Кафедра системного программирования ф-та ВМК МГУ, 20103Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.кодом этого символа. Символы упорядочены в алфавитном порядке (отдельно дляанглийского и русского алфавитов), к ним применимы операции отношения исравнения.
В Си-программе каждый символ, представляющий в программе самогосебя, заключается в одинарные кавычки ' и ', последовательность символов(строка) заключается в двойные кавычки " и ". Среди символов ASCII имеютсяанглийские и русские буквы (прописные и строчные), десятичные цифры, знакипрепинания, знаки арифметических действий, специальные (управляющие)символы. Часть специальных символов представляются в программах на языке Сипоследовательностями из двух символов, начинающихся с символа \: переход наначало новой строки (\n), знак табуляции (\t), возврат на один символ сзатиранием (\b), двойная кавычка (\"), обратная косая черта (\\) и др.
Вдополнении д7.2 такие специальные символы выделены розовым.7.7.3. Важное замечание: В коде ASCII буквы верхнего и нижнего регистра составляютнепрерывные последовательности: между a и z (соответственно, между A и Z) нетничего, кроме букв, расположенных в алфавитном порядке. Если бы код ASCII необладал указанным свойством, нижеприведенные функции были бы невозможны.7.7.4. Функция, преобразующая строку кодов цифр s в целое число (каждому символуцифры сопоставляется его код, и из полученных чисел формируется десятичноезначение).int atoi(char s[]) {int i, n;n = 0;for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)n = 10 * n + (s[i] – '0');return n;}7.7.5.