А. Богатырев - Руководство полного идиота по программированию (на языке Си) (1109482), страница 2
Текст из файла (страница 2)
Руководство полного идиота<br> по программированию (на языке Си)while(условие)оператор;...продолжение...илиwhile(условие){операторы;...}...продолжение...Повторить|V|+------>--+|||V|--------------------|| проверить УСЛОВИЕ |-------> если ложно (нуль)A--------------------|||||V||если истинно (не нуль)|||||V||операторV||||||+-----<---+||+-------<---------------------+|VпродолжениеПример:int x;x = 10;while(x > 0){printf("x=%d\n", x);x = x - 1;}printf("Конец.\n");printf("x стало равно %d.\n", x);/* печатает 0 */"Цикл" он потому, что его тело повторяется несколько раз.Чтобы цикл окончился, оператор-тело цикла должен менятькакую-то переменную, от которой зависит истинность условия повторений.ОПЕРАТОРЫ "И, ИЛИ, НЕ"Условия могут быть сложными.ЕСЛИ красный И вес < 10 ТО ...;ЕСЛИ красный ИЛИ синий ТО ...;file:///Volumes/WININSTALL/assets/materials_informatiks.html8/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)ЕСЛИ НЕ красный ТО ...;На языке Си такие условия записываются так:if(условие1 && условие2) ...;if(условие1 || условие2) ...;if(! условие1)...;/* "И" *//* "ИЛИ" *//* "НЕ" */Например:if(4 < x && x <= 12) ...;Было бы неправильно записатьif(4 < x <= 12) ...;ибо язык программирования Си НЕ ПОНИМАЕТ двойное сравнение!Еще примеры:if(x < 3 || y > 4) ...;if( ! (x < 3 || y > 4)) ...;ЦИКЛ for ("для каждого")Этот цикл является просто иной записью одного из вариантов цикла while.Он служит обычно для выполнения опеределенного действия несколько раз,не "пока истинно условие", а "выполнить N-раз".У такого цикла есть "переменная цикла" или "счетчик повторений".int i;i = a; /* начальная инициализация */while(i < b){тело_цикла;i += c; /* увеличение счетчика */}...продолжение...переписывается в видеint i;for(i=a; i < b; i += c)тело_цикла;тело_цикла будет выполнено для значений iaa+ca+c+c...пока i < bfile:///Volumes/WININSTALL/assets/materials_informatiks.html9/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)В простейшем случаеfor(i=1; i <= N; i++)printf("i=%d\n", i);i означает "номер повторения".Такой цикл служит для повторения СХОЖИХ действий НЕСКОЛЬКО разс разным значением параметра.ОПЕРАТОР break ("вывалиться из цикла")Оператор break заставляет прервать выполнение тела циклаи сразу перейти к продолжению программы.while(условие1){операторы1;if(условие2)break; ------->----+|операторы2;|}|...продолжение...<--------<---------+иfor(i=0; условие1; i++){операторы1;if(условие2)break; ------->----+|операторы2;|}|...продолжение...<--------<---------+Этот оператор позволяет организовывать дополнительныеточки выхода из цикла (при дополнительных условиях).Пример:for(i=0; i < 20; i++){printf("i=%d\n", i);if(i == 7){printf("break loop!\n");break;/* вывалиться из цикла */}printf("more\n");}printf("finished, i=%d\n", i); /* печатает 7 */В частности, с его помощью можно организовывать бесконечный цикл:for(;;){/* заголовок бесконечного цикла */операторы1;if(условие2)break; ------->----+file:///Volumes/WININSTALL/assets/materials_informatiks.html10/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)||}|...продолжение...<--------<---------+операторы2;Здесь в самом заголовке цикла НЕ ПРОВЕРЯЕТСЯ НИКАКИХ УСЛОВИЙ,такой цикл продолжается бесконечно.Условие продолжения считается всегда истинным.Единственный способ выйти из него это сделать break (при каком-то условии) в теле цикла, что и написано.Бесконечный цикл можно также организовать при помощиwhile(1){...}ОПЕРАТОР ВЫВОДА (ПЕЧАТИ)printf("текст");Печатает на экран текст.printf("текст\n");Печатает на экран текст и переходит к новой строке.printf("слово1 слово2 ");printf("слово3\n");печатаетслово1 слово2 слово3и переходит на новую строку.Если переход на новую строку не задан явно, символом \n,то текст продолжает печататься в текущей строке.printf("%d", x);Печатает в текстовом виде ЗНАЧЕНИЕ переменной x.Специальная конструкция %d означает"взять переменную из списка после запятойи напечатать ее значение в ивде целого числа".printf("икс равен %d - ого-го\n", x);Печатает сначала текстикс равензатем значение переменной x как целое число,затем текст- ого-гои переходит на новую строку (поскольку указан символ \n).Этот оператор может печатать и несколько значений переменных:file:///Volumes/WININSTALL/assets/materials_informatiks.html11/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)int x, y;x = 12; y = 15;printf("икс есть %d, игрек есть %d, все.\n", x, y);~~~~~~Данный оператор работает так.Строка "икс есть %d, игрек есть %d\n" называется ФОРМАТОМ.Компьютер читает формат слева направо и печатает текстдо тех пор, пока не встретит символ %d.Курсор изображен символом _икс есть _Далее он берет ПЕРВУЮ переменную из списка ~~~~ ипечатает ее как целое число.икс есть 12_далее он снова печатает текст пока не встретит %dикс есть 12, игрек есть _Теперь он берет ВТОРУЮ переменную из списка и печатает ее:икс есть 12, игрек есть 15_Снова печатает текст, включая перевод строки \n.Как только строка формата кончилась, оператор printf завершен.икс есть 12, игрек есть 15, все._Печатать можно не только значения переменных, но и значения арифметическихвыражений:printf("равно: %d\n", 12 + 3 * 5);Контрольный вопрос, что печатается:int x, y, z;x = 13;y = 23;z = 34;printf("x=%d xx=%d\nzzz=%d\n", x, y - 1, z * 2 + 1);Тут в формате есть ДВА перевода строки,поэтому будет напечатано:x=13 xx=22zzz=69_Заметьте, что перед тем как быть напечатанными,выражения в списке после формата ВЫЧИСЛЯЮТСЯ.Что напечатаетprintf("x=%d\n y=%d\n", x, y);x=13file:///Volumes/WININSTALL/assets/materials_informatiks.html12/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)y=23_Пробел перед y возник потому, что он СОДЕРЖИТСЯв строке формата после символа \n !!!Будьте внимательны.ФУНКЦИИФункцией называется фрагмент программы,в который передаются ПАРАМЕТРЫ,и который ВОЗВРАЩАЕТ значение (или ничего).Прелесть функции в том, что ее можно выполнить много разиз разных точек программы.Функция состоит изОБЪЯВЛЕНИЯ- описания того, как она что-то вычисляетОбъявление бывает ровно одно.ВЫЗОВОВ- с конкретными значениями параметров,что именно она должна на этот раз вычислить.Вызовов может быть сколько угодно.Объявление простейшей функции выглядит так:int func(int x){/* Один или несколько операторов,завершающихся оператором return(нечто);*/return x+1;}------------------------------------------------------------------------int func(...задает функцию с именем func(имя выдумывает программист, как и имена переменных).int означает, что функция возвращает целое значение.------------------------------------------------------------------------...(int x)...задает список аргументов (или параметров) функции.------------------------------------------------------------------------...){...}задает тело функции - некую последовательность объявленийпеременных и операторов.------------------------------------------------------------------------return выражение;задает оператор выхода из функции в точку ее вызова с возвратом значенияfile:///Volumes/WININSTALL/assets/materials_informatiks.html13/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)выражения.------------------------------------------------------------------------Покажем простой пример ВЫЗОВА этой функции:int y;...y = func(5);...продолжение.../* a *//* b */Этот фрагмент работает следующим образом:y = func(5);В этой точке мы1) "записываем на бумажке",что вызов произошел в такой-то строке, таком-то местенашей программы.2) Смотрим на ОПРЕДЕЛЕНИЕ функции func.int func(int x){...Мы вызвали функцию как func(5).Это значит, что в теле функции x получает начальное значение 5.То есть ДЛЯ ДАННОГО ВЫЗОВА наша функция (ее тело) превращается вint x;x = 5;return x+1;3) x+1 есть 6.Далее должен выполниться оператор return.Он выполняется так:Мы "читаем с бумажки" - откуда была вызвана функция func,и смотрим на это место.
Это былоy = func(5);Вычеркиваем func(5) и заменяем его ЗНАЧЕНИЕМ выражения,вычисленного в операторе return;y = 6;4) Выполняем этот оператор и переходим к продолжению.------------------------------------------------------------------------int y, z, w;y = func(5);z = func(6);w = func(7) + func(8) + 1;Превратится вy = 6;z = 7;w = 8 + 9 + 1;file:///Volumes/WININSTALL/assets/materials_informatiks.html14/6803.06.2015Андрей Богатырев. Руководство полного идиота<br> по программированию (на языке Си)При этом мы четыре раза "прыгнем" на определение функции func(),пройдем все ее операторы с разными значениями параметра xи вернемся обратно в точку вызова.ПРОГРАММА В ЦЕЛОМПрограмма в целом состоит из функций.Одна из функций должна иметь имя main(),С ФУНКЦИИ main НАЧИНАЕТСЯ ВЫПОЛНЕНИЕ ПРОГРАММЫ.(на самом деле этому предшествует отведение и инициализацияглобальных переменных; смотри последующие лекции).Часто main() - единственная функция в программе.------------------------------------------------------------------------Структура программы такова:#include <stdio.h>/* магическая строка *//* ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ (о них позже) */int a = 7;int b;/* по умолчанию 0 *//* ФУНКЦИИ */f1(){....}f2(){....}/* НАЧАЛЬНАЯ (ГЛАВНАЯ) ФУНКЦИЯ */void main(){...}------------------------------------------------------------------------Пример программы:#include <stdio.h>int f1(int x, int y){return (x + y*2);}int f2(int x){int z;z = x+7;return 2*z;}void main(){/* Объявления переменных */int a, b, c;/* Операторы */a = 5; b = 6;c = f1(a, b+3);b = f1(1, 2);a = f2(c);file:///Volumes/WININSTALL/assets/materials_informatiks.html15/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)printf("A есть %d B есть %d C есть %d\n", a, b, c);}Она печатает:A есть 60 B есть 5 C есть 23КАК НЕ НАДО ПРОГРАММИРОВАТЬ ЦИКЛЫint i;for(i=0; i < 4; i++){if(i == 0)func0();else if(i == 1) func1();else if(i == 2) func2();else if(i == 3) func3();}В данном примере цикл АБСОЛЮТНО НЕ НУЖЕН.То, что тут делается, есть просто ПОСЛЕДОВАТЕЛЬНОСТЬ операторов:func0();func1();func2();func3();Цикл имеет смысл лишь тогда, когда много раз вызываетсяОДНО И ТО ЖЕ действие, но может быть зависящее от параметра, вроде func(i).Но не разные функции для разных i.Аналогично, рассмотрим такой пример:int i;for(i=0; i < 10; i++){if(i==0)func0();else if(i == 1) func1();else if(i == 2) func2();elsefuncN(i);}Тут funcN(i) берет на себя роль "а в остальных случаях".Однако, этот пример более естественно может быть записан так:int i;func0();func1();func2();for(i = 3; i < 10; i++)funcN(i);Заметьте, что цикл теперь начинается с индекса 3.А теперь - случай, где смесь цикла и условного оператора оправдана:int i;for(i=0; i < 100; i++){if((i % 2) == 0) even();elseodd();file:///Volumes/WININSTALL/assets/materials_informatiks.html/* четный *//* нечетный */16/6803.06.2015Андрей Богатырев.