![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Циклические конструкции в программах
Наряду с операторами или группами операторов, которые могут выполняться в зависимости от каких-либо условий, существуют еще и операторы, которые могут выполняться несколько раз в одной и той же последовательности. Такой вид конструкции в программе известен как цикл. Существуют три основных типа циклов (хотя два из них можно рассматривать как разновидность одного). Это цикл while (“пока”), циклfor (“для”) и цикл do...while (“делать... пока”). Цикл while Цикл while является наиболее общим и может использоваться вместо двух других типов циклических конструкций. Оператор while имеет следующий формат: while (выражение) оператор; где “выражение” принимает нулевое или отличное от нуля значение, а “оператор” может представлять собой как один оператор, так и группу операторов (составной оператор). В процессе выполнения цикла, вычисляется значение “выражения”. Если оно истинно, то “оператор”, следующий за ключевым словом while выполняется и “выражение” вычисляется снова. Если “выражение” ложно, то цикл завершается и программа продолжает выполняться дальше. main() { char *msg; int indx; msg = “Hello”; indx=1; while (indx <= 10){ printf(“Время # %2d: %s\n”,indx,msg); indx++; } } После компиляции и выполнения этой программы на экране будут отображены строки со следующей информацией: Время # 1 : Hello Время # 2 : Hello Время # 3 : Hello ........... Время # 9 : Hello Время # 10 : Hello Очевидно, что оператор printf был выполнен ровно 10 раз, при этом значение параметра цикла indx изменилось от 1 до 10. Цикл for Цикл for является одним из основных видов циклов, которые имеются во всех языках высокого уровня. Однако версия, используемая в Си обладает большей мощностью и гибкостью. Основной формат цикла: for( выр1;выр2; выр3) оператор Так же как и в цикле while, “оператор” в теле цикла может быть как одиночным оператором программы, так и составным оператором. Параметры цикла, заключенные в скобки, должны обязательно разделяться точкой с запятой, которая делит пространство внутри скобок на три сектора. Каждый параметр, занимающий определенный сектор, означает следующее: · выр1 - обычно задает начальное значение индексной переменной, · выр2- условие продолжения цикла, · выр3 - обычно задает некоторую модификацию (приращение) индексной переменной за каждое выполнение цикла. Можно пропускать одно или даже все выражения в операторе for, но наличие всех точек с запятой должно гарантироваться. Например, если опустить “выр2”, то это равносильно тому, что значение “выр2” будет всегда иметь значение истина (1) и цикл никогда не завершится (такие циклы известны как бесконечные). В качестве примера рассмотрим ту же программу, что и в предыдущем разделе. main() { char *msg; int indx; msg = “Hello”; for(indx = 1; indx<=10; indx++) printf(“Время # %2d: %s\n, indx,msg); } Очевидно, что эта программа работает точно также, что и предыдущая. Цикл do...while Последним видом цикла является цикл do...while. Формат цикла можно представить в виде: do оператор while (выражение); Основным отличием между цикломwhile и do...while в том, что операторы внутри do...while всегда выполняются хотя бы один раз (так как проверка условия выполнения цикла осуществляется после выполнения последовательности операторов, составляющих тело цикла.
main() { float a,b,ratio; char ch; do { printf("Введите два числа: "); scanf("%f %f",&a,&b); if(b==0.0) printf("Отношение не определено\n"); else { ratio = a / b; printf("Отношение = %f \n",ratio); } printf("\n Нажми `q` для выхода или любую клавишу для продолжения\n") } while ((ch = getch()) != 'q'); } Вложенные циклы Когда внутри одного цикла находиться в качестве оператора или в составе операторов другой цикл, то второй цикл называют вложенным. При такой реализации внутренний цикл будет срабатывать на каждом шаге наружного цикла, и выполнять заданное количество повторений оператора. Например, для вывода на экран таблицы, содержащей факториалы чисел от 1 до 10 можно воспользоваться следующей конструкцией вложенных циклов for(n = 1; n<= 10; n++) { f = 1 ; for(i =2; i <= n; i++) f *= i ; printf("%2d-> %d\n", n, f); } Переменная nв этом фрагменте задает число, факториал которого вычисляется во внутреннем цикле. Поскольку значение п. меняется от 1 до 10, то на экран выводится таблица, в каждой строке которой показано число (значение n) и его факториал. Типовые задачи с массивами Для обработки переменных в массивах используется цикл forи простые задачи с массивами реализуются с помощью одного простого оператора, указанного в цикле for. 1.Ввод чисел в массив for(i =0; i < 100; i++) scanf("%d", &array[i]) ; Переменная i должна быть любого целого типа. 2.Вывод чисел из массива_ for(i =0; i < 100; i++) printf("%d, ", array[i]) ; 3.Подсчет суммы чисел в массиве sum =0 ; // Подсчет суммы начинается с 0 for(i =0; i < 100; i++) sum += array[i]; Тип переменной sumдолжен позволить получить в этой переменной правильный результат. В некоторых задачах выполнять простой оператор в цикле приходится в зависимости от условия, как показано ниже в задаче поиска. 4.Поиск максимального числа в массиве max= array[0] ; for(i =1; i < 100; i++) if(max < array[i]) // Если встретилось большее число max= array[i]; // его нужно запомнить Переменная maxдолжна быть того же типа, что и элементы массива. Реже, для реализации задачи с массивами приходится использовать два цикла. Это наблюдается в задачах, которые должны несколько раз повторить некоторую задачу для получения нужного решения. Ниже показана задача сортировки массива, которая использует задачу поиска минимального числа (второй цикл). Обнаружив минимальное число и положив его в начало массива, задача поиска минимального числа повторяется (первый цикл), но в ограниченной области от iдо конца массива. 5.Сортировка массива for(i =0; х < 100-1; i++) //Повторение поиска минимума for(j = i+1; j < 100; j++) //Поиск минимума if(array[i] > array[j]) { с = array[i] ; // Путем обмена меньшее array[i] = array[j] ;// закладывается на место с array[j] = с ; // номером i } Переменные iи jдолжны быть любого целого типа. Переменная с должна быть того же типа, что и элементы массива. 10.Функциональное программирование: функции в Си Функции Как быть, если есть необходимость выполнения различных групп операторов, использующие различные наборы данных или находящиеся в различных частях программы? Необходимо объединить эти группы в подпрограммы, к которым можно обращаться по необходимости. В Си подпрограммы рассматриваются как функции. Теоретически каждая функция возвращает некоторое значение. Практически же значения, возвращаемые большинством функций, игнорируются. В Турбо-Си используется тип функцийvoid, который никогда не возвращает значений. Функции дают определенные преимущества при создании программ: • уменьшение текста программы и самой программы. Достигается это за счет оформления повторяющихся задач в виде функций; • упрощение решения сложных задач за счет разбиения задачи на более мелкие и оформления этих задач в виде функций; • упрощение переноса задач в другие программы. Достигается это путем копирования текста функции в другую программу или создания библиотеки функций. • При использовании функций имеется и некоторый недостаток - уменьшение скорости работы программы.
Описание функций Для использования функций в программе их необходимо описать до момента вызова. Описать - это значит указать некоторые характерные идентификаторы функции, чтобы компилятор мог проверить правильность использования функции, когда он встретит ее в программе. Современный стиль используется в конструкциях расширенной версии СИ++. При описании функций в этой версии используются специальные версии языка, известные под названием “прототип функции”. Описание функции с использованием прототипа содержит дополнительно информацию о ее параметрах: тип имя_функции(пар_инф1,пар_инф2,...); где пар_инф1 имеет один из следующих форматов:
· тип · тип имя_пар Другими словами, при использовании прототипа функции должен быть описан тип каждого формального параметра, либо указано его имя. Определение функций Так же, как и в описании функций, при определении функций прослеживается два стиля - классический и современный. Классический формат определения функций имеет примерно следующий вид: гип_результата имя_функции( [список_параметров] ) // заголовок { локальные описания; операторы; }
тип_результата- тип возвращаемого функцией значения, которое будет получаться при решении задачи, вложенной в функцию. Если функция не будет возвращать результат, то на этом месте указывается ключевое слово void- функция без результата. Такую функцию нельзя использовать в выражениях. Тип результата можно пропустить, в этом случае будет считаться, что функция должна вернуть результат типа int. имя_функции- любое имя, заданное по правилам языка Си. список__параметров- список переменных, через которые функция получит исходную информацию, необходимую для решения задачи. Перед именем каждой переменной необходимо указать ее тип данных. Параметры функции часто называют формальными параметрами (аргументами), т. к. они определяют тип данных, порядок и количество передаваемой в функцию информации, но не саму информацию. При вызове функции ей указываются фактические параметры (аргументы). Если параметры не используются, вместо них рекомендуют ставить ключевое слово void. Первую строку в определении функции называют заголовком функции. За заголовком должно следовать тело функции, начинающееся с открывающей фигурной скобки. Определение функции можно делать в любом месте текста программы, но не внутри других функций. При создании многомодульных программ - программ, текст которых расположен в нескольких файлах, определение функции должно быть дано в одном файле. Пример простой функции:____________________________________________________ Работа любой функции происходит в три этапа 1. Вызов - происходит, когда программа встретит оператор вызова функции, являющийся одним из операторов перехода. Перед вызовом в параметры функции будет скопирована информация, указанная в круглых скобках в операторе вызова. 2. Исполнение - выполнение операторов функции. 3. Возврат - переход на оператор, идущий следом за оператором вызова функции. Возврат происходит после выполнения всех операторов в функции, когда программа выйдет на закрывающую фигурную скобку функции Как видно, определение функции практически совпадает с прототипом за одним важным исключением: прототип обязательно должен заканчиваться “;”. Рассмотрим пример определения функции в двух стилях. В классическом: void get_parms(p1,p2) float *p1; float *p2; { ..... } В современном: void get_parms(float *p1,float *p2) { .... }
Заметим, что ряд описаний (константы, типы данных,переменные), содержащиеся внутри функций (исключение - функция main), видимы или определены только внутри этой функции. Поэтому Си не поддерживает вложенность функций, т.е. нельзя объявить одну функцию внутри другой. Функции могут быть размещены в программе в различном порядке и считаются глобальными для всей программы, включая встроенные функции, описанные до их использования. Комментарии Пояснения к программе, которые необходимо вносить в нее для лучшего понимания хода программы, не распознаются компилятором и не транслируются. Для задания комментария надо пометить специальными знаками его начало и конец. Начало обозначается комбинацией (/*), а конец -(*/). Комментарий может занимать несколько строк программы. В С++ есть еще один вид комментария: однострочный комментарий. //это комментарий // это другая строка комментария Символ "//" начинает строку комментария и действует только до окончания этой строки.
![]() |