А.А. Белеванцев, С.С. Гайсарян, Л.С. Корухова, Е.А. Кузьменкова, В.С. Махнычев. Семинары по курсу Алгоритмы и алгоритмические языки (1108027), страница 4
Текст из файла (страница 4)
Усложнением спецификаторов можноболее точно настроить вид выводимых чисел, например, спецификатор %.5f выводитчисло типа double c пятью знаками после запятой.Функция scanf возвращает количество правильно прочитанных (согласноформатной строке) аргументов, что широко используется для проверки корректностиввода. Следующий участок кода считывает три значения типа double и печатаетсообщение, если при вводе произошла ошибка:if (scanf ("%lf%lf%lf", &x, &y, &z) != 3)printf ("Ошибка ввода: нужно ввести три вещественных числа\n");Необходимо обращать особое внимание на передачу аргументов в функцию scanfдля записи значений по указателю, а также точному соответствию типа указателя испецификатора ввода, так как в случае ошибки считанные функцией значения будутзаписаны в неверные области памяти, что приведет к ошибочной работе программы илиее краху. Для контроля использования функций форматного ввода-вывода целесообразнопри компиляции с использованием GCC включать предупреждения семейства –Wformat.143.1.
Задачи для самостоятельного решения3.1.1.* Пусть определены переменные :double d; float f; long lng; int i; short s;Что будет напечатано в результате выполнения следующего фрагментапрограммы?...а) s = i = lng = f = d = 100/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);б) d = f = lng = i = s =100/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);в) s = i = lng = f = d = 1000000/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);г) d = f = lng = i = s =1000000/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);д) lng = s = f = i = d =100/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);е) f = s = d = lng = i = (double)100/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);ж) s = i = lng = f = d = 100/(double)3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);з) f = s = d = lng = i = (double)100/3;printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);и) i = s = lng = d = f = (double)(100/3);printf("s = %hd i = %d lng = %ld f = %f d = %f\n", s, i, lng, f, d);3.1.2.
Пусть определены переменные :double d = 3.2, x; int i = 2, y;Что будет напечатано в результате выполнения следующего фрагментапрограммы?а) x = ( y = d / i ) 2;printf ("x = %f ;y = %d\n", x, y);б) x = ( y = d / i ) 2;printf ("x = %d ;y = %f\n", x, y);в) y = ( x = d / i ) 2;printf ("x = %f ;y = %d\n", x, y);г) y = d ( x = 2.5 / d);printf ("x = %f; y = %d\n", x, y);д) x = d ( y = ( (int)2.9 + 1.1) / d;*Задачи из задачника [5]15printf ("x = %d y = %f\n", x, y);4. ОператорыДля организации вычислений в языке Си используются операторы.
Простейшимоператором является выражение-оператор вида "expression;": например, a = b;a++; или даже 5+1; – это корректные операторы. Составной оператор {} позволяетгруппировать несколько операторов вместе. Условный оператор имеет видif (expr) stmt; else stmt;, причем нужно отметить, что ветка else всегдаотносится к ближайшему if: два приведенных участка кода эквивалентны.if (x >if (yy =elsez =2)> z)z;if (x > 2) {if (y > z) {y = z;} else {y;z = y;}}Оператор выбора switch записывается какswitch (expr){case const-expr: stmt;case const-expr: stmt;default: stmt;}и позволяет выполнить один из операторов в зависимости от значения целочисленноговыражения либо выполнить некоторый оператор по умолчанию (метка default), если ниодин из вариантов значения не предусмотрен.
Можно перечислять несколько вариантовзначений для одного оператора. После того, как одно из значений подошло, происходитпереход по соответствующей метке case и начинается выполнение тела switch соператора после этой метки. Остальные операторы switch также выполняются в порядкеих записи, поэтому для прекращения выполнения оператора выбора обязательно нужноиспользовать оператор break:switch (tag){case 2: a *= b; /* Далее выполнится a += b; из следующейветки */case 3: a += b; break; /* А здесь произойдет выход */case 4: a -= b; break;default: break;}Операторами цикла в Си являются while, for, и do .. while. Цикл whileимеет вид while (expression) stmt; и выполняет оператор stmt, покавычисление управляющего выражения expression дает ненулевое значение, при этомпервая проверка выражения производится до первого выполнения оператора.
Цикл do ..while записывается как do { stmt; } while (expression); и аналогичен циклуwhile, но проверка условия выхода из цикла делается после оператора stmt, т.е. телоцикла исполняется хотя бы один раз.Цикл for является самым мощным видом цикла в Си и записывается какfor (expr1; expr2; expr3) stmt;. Перед началом выполнения цикла16вычисляется выражение expr1, как правило, используемое для инициализации счетчиковцикла.
При этом переменную-счетчик можно объявить прямо в заголовке цикла. Телоцикла – оператор stmt – выполняется до тех пор, пока значение выражения expr2оказывается ненулевым, это выражение вычисляется перед началом каждой итерациицикла. После окончания итерации цикла вычисляется выражение expr3, обычносодержащее обновление счетчика цикла. Примером цикла for является вычисление n-йстепени числа x: for (int i = 1, pow = 1; i <= n; i++) pow *= x;.Цикл for часто используется программистами из-за выразительности и наглядности: всеуправляющие циклом конструкции сосредоточены в его заголовке, причем нетограничений на их содержание.Все три выражения из заголовка цикла for могут быть опущены, при этомзначение выражения expr2 всегда считается истинным.
Например, вечный цикл на языкеСи может быть записан как for ( ; ; ) { ... }.Для досрочного выхода из цикла, как и в случае оператора выбора, может бытьиспользован оператор break. Этот оператор прерывает лишь самый внутренний цикл изгнезда циклов. Оператор continue используется для немедленного перехода кследующей итерации цикла, пропуская оставшуюся часть тела цикла, при этом выражениеexpr3 не пропускается и выполняется до начала следующей итерации. Таким образом,при использовании continue нет необходимости дополнительно к коду заголовка циклаобновлять счетчик цикла.Задача.
С помощью цикла while напишите цикл, эквивалентный описанномуобщему виду цикла for. Что, если тело цикла содержит оператор continue?Оператор перехода по метке goto label;используется для организациисложного потока управления. В качестве метки может выступать идентификатор,областью видимости которого оказывается вся функция.
Место перехода помечается впрограмме как label:. Нужно избегать неоправданного применения оператора goto.4.1. Задачи для самостоятельного решения4.1.1. Подсчитать количество натуральных чисел n (111 <= n <= 999), в записикоторых есть две одинаковые цифры.4.1.2.. Подсчитать количество натуральных чисел n (102 <= n <= 987), вкоторых все три цифры различны.4.1.3. Подсчитать количество натуральных чисел n (11 <= n <= 999),являющихся палиндромами, и распечатать их.4.1.4.
Подсчитать количество цифр в десятичной записи целого неотрицательногочисла n.4.1.5. Определить, верно ли, что куб суммы цифр натурального числа n равен n2.4.1.6. Определить, является ли натуральное число n степенью числа 3.4.1.7. Дано натуральное число n. Получить все его натуральные делители.4.1.8. Дано натуральное число n. Получить наименьшее число вида 2r,превосходящее n.4.1.9. Распечатать первые n простых чисел.4.1.10. Распечатать первые n чисел Фибоначчи( f0 = 1; f1 = 1; fk+1 = fk-1+fk; k = 1, 2, 3,...)175.
Функции5.1. ФункцииПонятие функции. Определение, объявление, вызов функции. Передача параметров вфункцию. Понятие указателя. Задачи.5.1.1. Понятие функцииВ разделе 1 при описании простейших программ на языке Си уже былирассмотрены примеры использования функций. Рассмотрим это базовое для языка Сипонятие более подробно.
Под функцией в языках программирования подразумеваетсяспециальным образом оформленный фрагмент программы, описывающий решениенекоторой подзадачи, как правило, неоднократно выполняемой при работе программы.Использование функций при разработке программ позволяет получить более наглядный,компактный и легче понимаемый код программы, а также облегчает повторноеиспользование кода за счет использования в программах уже ранее описанных функций.Тем самым устраняется дублирование работы и ускоряется процесс разработкипрограммы.Определение функции в языке Си имеет вид:<тип> <имя> (<список формальных параметров>){<тело функции>}где <тип> задает тип возвращаемого функцией значения, <список формальныхпараметров> содержит перечисление параметров функции с обязательным указаниемтипа для каждого отдельного параметра, <тело функции> содержит объявлениелокальных переменных и операторы, реализующие алгоритм данной функции.
Еслифункция возвращает некоторое значение в качестве результата своей работы, то в телефункции обязательно должен присутствовать оператор:return <выражение>;который завершает выполнение функции и возвращает вычисленное значениевыражения в вызывающую функцию. При вычислении выражения по мере необходимостивыполняется приведение типа к объявленному типу результата.В качестве примера приведем определение функции, вычисляющей максимум двухцелых чисел:intmax (int a, int b){return (a > b) ? a : b;}Если функция не возвращает никакого значения, то в качестве типа возвращаемогозначения указывается void. Оператор return в таких функциях может отсутствовать (вэтом случае выполнение функции завершается по достижению конца тела функции, т.е.закрывающей скобки }), либо присутствовать, но не содержать никакого выражения (в18этом случае выполнение функции завершается немедленно по достижению оператораreturn).
Например:voidmax1 (int a, int b){printf ("%d\n", (a > b) ? a : b);}Если функция не имеет параметров, то в качестве списка ее параметровуказывается void. Например:intmax2 (void){int a, b;scanf ("%d %d", &a, &b); // ввод значений a и breturn (a > b) ? a : b;}Определению функции в программе может предшествовать ее объявление,заданное в виде прототипа этой функции, где указывается имя функции, типвозвращаемого ею значения и формальные параметры функции. Например:intmax (int a, int b); // прототип функции maxИмена формальных параметров в прототипе можно не указывать. Передиспользованием функции она должна быть обязательно определена или объявлена впрограмме, т.е.