Циклические конструкции в языках программирования высокого уровня
Циклические конструкции в языках программирования высокого уровня
Курсовая работа “ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ” Студент группы Научный руководитель: канд. пед. наук. Тамбов 2007 СОДЕРЖАНИЕ - ВВЕДЕНИЕ
- 1. ИСТОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
- 1.1 Классификация языков программирования
- 1.2 Язык C
- 1.3 Язык C++
- 1.3 Язык Java
- 1.4 Язык C#
- 2. ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ В ЯЗЫКАХ ВЫСОКОГО УРОВНЯ
- 2.1 Алгоритмическая структура цикла.
- 2.2 Циклы в языке С.
- 2.3 Циклы в языке С++.
- 2.4 Циклы в языке Java.
- 2.5 Циклы в языке С#
- 3. ПРИМЕР ПРОГРАММ ЦИКЛИЧЕСКИХ КОНСТРУКЦИЙ НА ЯЗЫКЕ С#
- 3.1 Программа №1 цикл while
- 3.2 Программа №2 цикл do-while.
- 3.3 Программа №3 цикл for.
- 3.4 Программа №4 цикл foreach
- ЗАКЛЮЧЕНИЕ
- СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ВВЕДЕНИЕ Создавая программу, программист сталкивается с тем, что часто приходится выполнять одни и те же действия над последовательностью значений. Для решения таких задач, программист использует циклы. Циклические конструкции являются важным компонентом программирования. Программисты редко пишут программы, которые используются только один раз. Большинство из них выполняются многократно, в основном каждый раз делая одни и те же операции, но с достаточными вариациями, в результате чего получаются ценные результаты. Часто непосредственно внутри самой программы используются множество повторений, также с небольшими вариациями. Вышесказанное позволяет сделать вывод, что исследование особенностей циклических конструкций в различных языках программирования остается актуальным, особенно в процессе подготовки специалиста-информатика. Научная проблема заключена в необходимости совершенствования знаний о циклических конструкциях и в повышении эффективности их практического использования. Рабочая гипотеза: решение научной проблемы возможно путем изучения и анализа материалов из различных источников и разработки на практике программ с использованием циклов. Цель работы: изучение циклических конструкций в языках высокого уровня. Задачи исследования: - ознакомиться с особенностями некоторых современных языков программирования высокого уровня; - исследовать циклические конструкции в языках высокого уровня; - подготовить литературный обзор источников по теме работы; - написать одну или несколько программ, демонстрирующих использование циклических конструкций в языке С#. Объект исследования: - языки программирования высокого уровня. Предмет исследования - циклические конструкции. Метод исследования заключен в анализе, обобщения литературы и программировании. Научной новизной является получение новых знаний об использовании циклических конструкций в языках программирования высокого уровня. Практическая значимость заключается в приобретении навыков по использованию циклических конструкций для написания программ. Источниковедческая база - библиотека ТФ МГУКИ, интернет. 1. ИСТОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ1.1 Классификация языков программирования Язык программирования - это формализованный язык для описания алгоритма решения задач на компьютере. Языки программирования можно разделить на: - языки программирования низкого уровня; - языки программирования высокого уровня. В группу языков низкого уровня входят машинные языки и языки символического кодирования: (Автокод, Ассемблер). Операторы этого языка - это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т.е. являются машинно-зависимыми. Машинно-ориентированные языки - это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.). К языкам программирования высокого уровня относятся Фортран, Алгол, Кобол, Бейсик, Си, Пролог, С++, С#, JAVA и т.д. Эти языки машинно-независимы, т.к. они ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках. Это и есть основной их недостаток. Языки программирования высокого уровня отличаются от языков низкого уровня, во-первых, тем, что они используют более строгий контроль, во-вторых, многие детали обрабатываются автоматически, и, в-третьих, программисту для создания своего приложения приходится писать меньшее количество строк. Кроме того в языках высокого уровня распределением регистров занимается компилятор, так что программисту не надо писать код, обеспечивающий перемещение данных между регистрами и памятью. Последовательности вызова процедур генерируются автоматически; программисту нет необходимости описывать помещение аргументов функции в стек и их извлечение оттуда. Для описания структур управления программист может использовать также ключевые слова, как if, while; последовательности машинных команд, соответствующие этим описаниям компилятор генерирует динамически. Все созданные до настоящего времени языки были связанны друг с другом, причем на каждый новый язык в той или иной форме влияют его предшественники. В процессе такого "перекрестного опыления" средства из одного языка адаптируются другим, удачная новинка интегрируется в существующий контекст, а отжившая конструкция отбрасывается за ненадобностью. Примерно так и происходит эволюция компьютерных языков и развитие искусства программирования. Наиболее известными и популярными языками программирования на сегодняшний день являются: С, С++, Java, С# [1]. 1.2 Язык C Язык С был разработан в начале 1970-х годов Денисом Ритчи (Dennis Ritchie), работавшим в то время в компании Bell Laboratories. Хотя первоначально язык С создавался для разработки операционных систем и компиляторов, он быстро получил популярность в среде программистов и приобрел дополнительные преимущества благодаря его стандартизации, выполненной Американским институтом национальных стандартов (ANSI -- American National Standards Institute). Язык С сначала рассматривался просто как некоторый шаг вперед по сравнению с машинным языком. По этой причине его синтаксис более краток и выразителен, чем синтаксис других языков высокого уровня, использующих полные слова английского языка для выражения тех языковых конструкций, которые в языке С представляются с помощью специальных символов. Эта лаконичность является одной из причин чрезвычайной популярности языка С, поскольку позволяет программистам эффективно выражать сложные алгоритмы. Часто, краткое представление алгоритма более доступно пониманию, чем его пространное описание [2]. Пример программы на языке С: /* Программа обработки списка */#include <stdio.h> #include <string.h> main() { char names[10][9], pivot[9]; int i, j; /* Ввод имен с клавиатуры */ for(i = 0; i < 10; ++i) scanf("%s", names[i]); /* Сортировка списка имен */ for(i = 1; i < 10; ++i) { strcpy(pivot,names[i]); j = i - 1; while((j>=0) && (strcmp(pivot, names[j]) < 0) { strcpy(names[j+1], names[j]); --j;} strcpy(names[j+1],pivot);} /* Печать отсортированного списка */ for( i = 0; i < 10; ++i){ printf("%s\n", names[i]);}
1.3 Язык C++ К концу 1970-х размер проектов стал приближаться к критическому, при превышении которого методика структурного программирования и язык С "опускали руки". Поэтому стали появляться новые подходы к программированию, позволяющие решить эту проблему. Один из них получил название (ООП). Используя ООП, программист мог справляться с программами гораздо большего размера, чем прежде. Но вся беда состояла в том, что С, самый популярный на то время язык, не поддерживал ООП. Желание работать с объектно-ориентированной версией языка С в конце концов и привело к созданию C++. Язык C++ был разработан Бьярни Страуструпом (Bjarne Stroustrup) в компании Bell Laboratories (Муррей Хил, Нью-Джерси), и годом создания считается 1979-й. Первоначально создатель нового языка назвал его "С с классами", но в 1983 году это имя было изменено на C++. C++ полностью включает элементы языка С. Таким образом, С можно считать фундаментом, на котором построен C++. Большинство дополнений, которые Страуструп внес в С, были предназначены для поддержки объектно-ориентированного программирования. По сути, C++ -- это объектно-ориентированная версия языка С. Возводя "здание" C++ на фундаменте С, Страуструп обеспечил плавный переход многих программистов на "рельсы" ООП. Вместо необходимости изучать совершенно новый язык, С-программисту достаточно было освоить лишь новые средства, позволяющие использовать преимущества объектно-ориентированной методики. На протяжении 1980-х годов C++ интенсивно развивался и к началу 1990-х уже был готов для широкого использования. Рост его популярности носил взрывоподобный характер, и к концу этого десятилетия он стал самым широко используемым языком программирования. В наши дни язык C++ по-прежнему имеет неоспоримое превосходство при разработке высокопроизводительных программ системного уровня. Важно понимать, что создание C++ не было попыткой изобрести совершенно новый язык программирования. Это было своего рода усовершенствование и без того очень успешного языка. Такой подход к разработке языков (взять за основу существующий язык и поднять его на новую ступень развития) дал начало тенденции, которая продолжает жить и сегодня [4, 6]. Пример программы на языке С++: // Программа обработки списка #include <iostreain.h> #include <string.h> const int ListLength = 10; // Все объекты класса list содержат список имен и три открытых // метода, которые называются getnames, sortlist и printnames. class list { private: char names[ListLength][9]; public: void getnames() { int i; for(i = 0; i< ListLength; *+i) cin » names[i]; } void sortlist() { int i,j; char pivot[9]; for(i = 1; i < ListLength; ++i) { strcpy(pivot, names[i]); j = i - 1; while((j >= 0) && (stremp(pivot, names[j]) < 0)) { strcpy(names[j+1], names[j]); --j;} strcpy(names[j+1],pivot); } } void printnames() { int i; cout « endl; for(i = 0; i < ListLength; ++i) cout « names[i] « endl; } } // Создание объекта с именем namelist и обращение к нему с // требованием ввести несколько имен, отсортировать их, а // затем вывести отсортированный список на экран.void main() { list namelist; namelist.getnames(); namelist.sortlist(); namelist.printnames();
1.3 Язык Java Следующей ступенью на лестнице прогресса языков программирования стал язык Java, который первоначально назывался Oak (в переводе с англ. "дуб"). Java -- это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems в начале 90-х годов. Его разработчики много позаимствовали из языков С и C++. Будучи новым языком, Java еще не подвергался стандартизации. Действительно, язык Java все еще находится на стадии эволюции. Однако многие восторженно относятся к этому языку, поскольку он обещает стать стандартом для тех программ, которые известны как "аплеты Java" и которые можно передавать через Internet в виде выполняемых модулей и запускать на любой клиентской машине. Благодаря такой способности статичные по своей природе гипертекстовые документы можно заменить динамичными программами, с которыми пользователь сможет взаимодействовать непосредственно [7]. Пример программы на языке Java: // Программа обработки списка import java.io.* // Все объекты класса list содержат список имен и три открытых // метода, которые называются getnames, sortlist и printnames. class list { final int ListLength = 10; private String[] names; public list() { names = new String[ListLength]} public void getnames{} { int i; Datalnput data = new DatalnputStream(System.in); for(i = 0; i < ListLength; i++) { try( names[i] = data.readLine(); catch(IOException e){};} public void sortnames() { int i,j;String pivot;for(i = 1; i < ListLength; i++) { pivot = names[i]);j = i - 1; while((j >= 0) && (pivot.compareTo(names[j]) < 0)) { names[j+1]=names[j];j--;} names[j+1] = pivot;}} public void printnames() { int i;for(d = 0; i < ListLength; i++) System.out.println(names[i]);}} // Создание объекта с именем namelist и обращение к нему с// требованием ввести несколько имен, отсортировать их, а// затем вывести отсортированный список на экран. class sort{ public static void main (String args[]) { list namelist = new list(); namelist.getnames(); namelist.sortnames(); namelist.printnames(); }}
1.4 Язык C# Разработчики Java успешно решили многие проблемы, связанные с переносимостью в среде Internet, но далеко не все. Одна из них -- межъязыковая возможность взаимодействия (cross-language interoperability) программных и аппаратных изделий разных поставщиков, или многоязыковое программирование (mixed-language programming). В случае решения этой проблемы программы, написанные на разных языках, могли бы успешно работать одна с другой. Такое взаимодействие необходимо для создания больших систем с распределенным программным обеспечением (ПО), а также для программирования компонентов ПО, поскольку самым ценным является компонент, который можно использовать в широком диапазоне компьютерных языков и операционных сред. Кроме того, в Java не достигнута полная интеграция с платформой Windows. Хотя Java-программы могут выполняться в среде Windows (при условии установки виртуальной машины Java), Java и Windows не являются прочно связанными средами. А поскольку Windows -- это наиболее широко используемая операционная система в мире, то отсутствие прямой поддержки Windows -- серьезный недостаток Java [13]. Чтобы удовлетворить эти потребности, Microsoft разработала язык С#. С# был создан в конце 1990-х годов и стал частью общей .NET-стратегии Microsoft. Впервые он увидел свет в качестве б-версии в середине 2000 года. Главным архитектором С# был Андерс Хейлсберг (Anders Hejlsberg) -- один из ведущих специалистов в области языков программирования, получивший признание во всем мире. Достаточно сказать, что в 1980-х он был автором весьма успешного продукта Turbo Pascal, изящная реализация которого установила стандарт для всех будущих компиляторов. С# непосредственно связан с С, C++ и Java. И это не случайно. Эти три языка -- самые популярные и самые любимые языки программирования в мире. Более того, почти все профессиональные программисты сегодня знают С и C++, и большинство знает Java. Поскольку С# построен на прочном, понятном фундаменте, то переход от этих "фундаментальных" языков к "надстройке" происходит без особых усилий со стороны программистов. Так как Андерс Хейлсберг не собирался изобретать свое "колесо", он сосредоточился на введении усовершенствований и новшеств. "Дедушкой" С# является язык С. От С язык С# унаследовал синтаксис, многие ключевые слова и операторы. Кроме того, С# построен на улучшенной объектной модели, определенной в C++. Если вы знаете С или C++, то с С# вы сразу станете друзьями. С# и Java связаны между собой несколько сложнее. Как упоминалось выше, Java также является потомком С и C++. У него тоже общий с ними синтаксис и сходная объектная модель. Подобно Java C# предназначен для создания переносимого кода. Однако С# -- не потомок Java. Скорее С# и Java можно считать двоюродными братьями, имеющими общих предков, но получившими от родителей разные наборы "генов". Связь языков можно изобразить в виде схемы, которая представлена на рисунке 1[12]. Рисунок 1 - Схема связи языков программирования Общую связь языков можно увидеть в коде C# программы: // Определение наименьшего множителя, // состоящего из одной цифры. using System; class Ladder { public static void Main() { int num; for(num = 2; num < 12; num++) { if((num % 2) == 0) Console.WriteLine("Наименьший множитель числа " + num + " равен 2."); else if((num % 3) == 0) Console.WriteLine("Наименьший множитель числа " + num + " равен 3."); else if((num % 5) == 0) Console.WriteLine("Наименьший множитель числа " + num + " равен 5."); else if((num % 7) == 0) Console.WriteLine("Наименьший множитель числа " + num + " равен 7."); else Console.WriteLine(num + " не делится на 2, 3, 5 или 7."); }} 2. ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ В ЯЗЫКАХ ВЫСОКОГО УРОВНЯ2.1 Алгоритмическая структура цикла Цикл - это такая форма организации действий, при которой одна последовательность действий повторяется несколько раз (или ни разу), до тех пор, пока выполняются некоторые условия. В алгоритмические структуры цикл входит серия команд, выполняемая многократно. Такая последовательность команд называется телом цикла. Циклические алгоритмические структуры бывают двух видов: - циклы со счетчиком, в которых тело цикла выполняется определенное количество раз; - циклы с условием, в которых тело цикла выполняется до тех пор, пока выполняется условие. Они все состоят из нескольких этапов. Это: - Подготовка цикла, в которую входят начальные присвоения; - Тело цикла - команды повторения цикла; - Условие - обязательная часть цикла “Пока”. Циклической конструкцией со счетчиком является цикл “For или Для”, его используют когда заранее известно, какое число повторений тела цикла необходимо выполнить. Цикл “For” можно представить в виде блока схем, такая схема изображена на рисунке 2. Теперь рассмотрим цикл “While или Пока”. Цикл “While” является циклической конструкцией с условием, т.е. это такой цикл, где тело цикла выполняется до тех пор, пока выполняются некоторые условия. Его простейшая блок схема изображена на рисунке 3. Рисунок 2 - Схема цикла For Рисунок 3 - Схема цикла While Существует также пустой цикл - это цикл без тела цикла. В большинстве случаев он применяется для создания пауз в программах. Наиболее часто в алгоритмах и программах применяются два вида циклов. Это циклы “ While или Пока ” и “ For или Для ”. Циклы очень часто используют в прикладных программах и алгоритмах. Для того чтобы понять принципы циклов, рассмотрим их в языках программирования высокого уровня [9].
2.2 Циклы в языке С В языке C применяются такие циклические конструкции: while,for. Цикл while - это цикл, в котором тело повторяется несколько раз до тех пор, пока истинно условие. Чтобы цикл окончился, оператор-тело цикла должен менять какую-то переменную, от которой зависит истинность условия повторений. Его конструкция выглядит таким образом: while(условие){ оператор;} ...продолжение... или while(условие){ операторы; ... } ...продолжение... Пример цикла: int x; x = 10; While (x > 0) { Printf ("x=%d\n", x); x = x - 1;} printf("Конец.\n"); printf("x стало равно %d.\n", x);/* печатает 0 */ Цикл for ("для каждого") Этот цикл является просто иной записью одного из вариантов цикла while. Он служит обычно для выполнения определенного действия несколько раз, не "пока истинно условие", а "выполнить N-раз". У такого цикла есть "переменная цикла" или "счетчик повторений". int i; i = a; /* начальная инициализация */ while(i < b){ тело_цикла; i += c; /* увеличение счетчика */} ...продолжение... переписывается в виде int i;for(i=a; i < b; i += c) тело_цикла; Тело_цикла будет выполнено для значений i a a+c a+c+c ... пока i < b В простейшем случае: 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; операторы2; } ...продолжение... Здесь в самом заголовке цикла не проверяется никаких условий, такой цикл продолжается бесконечно. Условие продолжения считается всегда истинным. Единственный способ выйти из него - это сделать break (при каком-то условии) в теле цикла, что и написано [2,3]. Бесконечный цикл можно также организовать при помощи: while(1){ ... }
2.3 Циклы в языке С++ Предположим, нам нужно вычислить сумму всех целых чисел от 0 до 100. Для этого воспользуемся оператором цикла for: int sum = 0; int i; for (i = 1; i <= 100; i = i + 1) // заголовок цикла sum = sum + i; // тело цикла Оператор цикла состоит из заголовка цикла и тела цикла. Тело цикла - это оператор, который будет повторно выполняться (в данном случае - увеличение значения переменной sum на величину переменной i). Заголовок - это ключевое слово for, после которого в круглых скобках записаны три выражения, разделенные точкой с запятой. Первое выражение вычисляется один раз до начала выполнения цикла. Второе - это условие цикла. Тело цикла будет повторяться до тех пор, пока условие цикла истинно. Третье выражение вычисляется после каждого повторения тела цикла. Оператор for реализует фундаментальный принцип вычислений в программировании - итерацию. Тело цикла повторяется для разных, в данном случае последовательных, значений переменной i. Повторение иногда называется итерацией. Мы как бы проходим по последовательности значений переменной i, выполняя с текущим значением одно и то же действие, тем самым постепенно вычисляя нужное значение. С каждой итерацией мы подходим к нему все ближе и ближе. С другим принципом вычислений в программировании - рекурсией - мы познакомимся в разделе, описывающем функции. Любое из трех выражений в заголовке цикла может быть опущено (в том числе и все три). То же самое можно записать следующим образом: int sum = 0; int i = 1; for (; i <= 100; ) { sum = sum + i; i = i + 1; } Заметим, что вместо одного оператора цикла мы записали несколько операторов, заключенных в фигурные скобки - блок. Другой вариант: int sum = 0; int i = 1; for (; ;) { if (i > 100) break; sum = sum + i; i = i + 1; } В последнем примере мы опять встречаем оператор break. Оператор break завершает выполнение цикла. Еще одним вспомогательным оператором при выполнении циклов служит оператор продолжения continue. Оператор continue заставляет пропустить остаток тела цикла и перейти к следующей итерации (повторению). Например, если мы хотим найти сумму всех целых чисел от 0 до 100, которые не делятся на 7, можно записать это так: int sum = 0; for (int i = 1; i <= 100; i = i+1) { if ( i % 7 == 0) continue; sum = sum + i; } Еще одно полезное свойство цикла for: в первом выражении заголовка цикла можно объявить переменную. Эта переменная будет действительна только в пределах цикла. Другой формой оператора цикла является оператор while. Его форма следующая: while (условие) оператор Условие - как и в условном операторе if - это выражение, которое принимает логическое значение "истина" или "ложь". Выполнение оператора повторяется до тех пор, пока значением условия является true (истина). Условие вычисляется заново перед каждой итерацией. Подсчитать, сколько десятичных цифр нужно для записи целого положительного числа N, можно с помощью следующего фрагмента: int digits =0; while (N > 0) { digits = digits + 1; N = N / 10;} Третьей формой оператора цикла является цикл do while. Он имеет форму: do { операторы } while ( условие); Отличие от предыдущей формы цикла while заключается в том, что условие проверяется после выполнения тела цикла. Предположим, требуется прочитать символы с терминала до тех пор, пока не будет введен символ "звездочка". char ch; do { ch = getch(); // функция getch возвращает // символ, введёный с // клавиатуры } while (ch != '*'); В операторах while и do также можно использовать операторы break и continue. Как легко заметить, операторы цикла взаимозаменяемы. Оператор while соответствует оператору for: for ( ; условие ; ) оператор Пример чтения символов с терминала можно переписать в виде: char ch; ch = getch(); while (ch != '*') { ch = getch();} Разные формы нужны для удобства и наглядности записи [4, 5, 6].
2.4 Циклы в языке Java В языке программирования java, как и в других языках программирования, используются такие циклические конструкции как while, for, do while. Основной оператор цикла в языке Java-- оператор while -- выглядит так: while (лог.Вьгр) оператор Вначале вычисляется логическое выражение; если его значение true, то выполняется оператор, образующий цикл. Затеем, снова вычисляется лог.выр. и действует оператор, и так до тех пор, пока не получится значение false. Если логическое выражение изначально равняется false, то оператор не будет выполнен ни разу. Предварительная проверка обеспечивает безопасность выполнения цикла, позволяет избежать переполнения, деления на нуль и других неприятностей. Поэтому оператор while является основным, а в некоторых языках и единственным оператором цикла. Оператор в цикле может быть и пустым, например, следующий фрагмент кода: int i = 0; double s = 0.0; while ((s += 1.0 / ++i) < 10); вычисляет количество i сложений, которые необходимо сделать, чтобы гармоническая сумма s достигла значения 10. Такой стиль характерен для языка С. Можно организовать и бесконечный цикл: while (true) оператор Конечно, из такого цикла следует предусмотреть какой-то выход, например, оператором break, как в листинге 1.5. В противном случае программа зациклится, и вам придется прекращать ее выполнение. Если в цикл надо включить несколько операторов, то следует образовать блок операторов {}. Другой оператор цикла -- оператор do-while -- имеет вид do оператор while (лог.Выр) Здесь сначала выполняется оператор, а потом происходит вычисление логического выражения логического выражения. Цикл выполняется, пока логического выражения остается равным true. В цикле do-while проверяется условие продолжения, а не окончания цикла. Существенное различие между этими двумя операторами цикла только в том, что в цикле do-while оператор обязательно выполнится хотя бы один раз. Например, пусть задана какая-то функция f(x), имеющая на отрезке, [о; b] ровно один корень. Ниже представлена эта программа: class Bisection{ static double f(double x){ return x*x*x -- 3*x*x +3; } // Или что-то другое public static void main(String!] args){double a = 0.0, b = 1,5, с, y, eps = le-8; do{с = 0.5 *(a + b); у = f(с); if (Math.abs(y) < eps) break;// Корень найден. Выходим из цикла// Если на концах отрезка [а; с] // функция имеет разные знаки: if (f (а) * у < 0.0) b = с; //Значит, корень здесь. Переносим точку b в точку с //В противном случае: else а * с; // Переносим точку а в точку с// Продолжаем, пока отрезок [а; Ь] не станет мал } while (Math, abs (b-a) >= eps); System.out.println("x = " +c+ ", f(" +c+ ") = " +y) }} И еще один оператор цикла -- оператор for -- выглядит так: for ( список.Выр ; лог.Выр; список.Выр2) оператор Перед выполнением цикла вычисляется список выражений список.Выр1. Это нуль или несколько выражений, перечисленных через запятую. Они вычисляются слева направо, и в следующем выражении уже можно использовать результат предыдущего выражения. Как правило, здесь задаются начальные значения переменным цикла. Затем вычисляется логическое выражение лог.выр. Если оно истинно, true, то действует оператор, потом вычисляются слева направо выражения из списка выражений списокВыр2. Далее снова проверяется лог.выр. Если оно истинно, то выполняется оператор и списокВыр2 и т. д. Как только лог.выр станет равным false, выполнение цикла заканчивается. Короче говоря, выполняется последовательность операторов. Любая часть оператора for может отсутствовать: цикл может быть пустым, выражения в заголовке тоже, при этом точки с запятой сохраняются. Можно задать бесконечный цикл: for (;;) оператор В этом случае в теле цикла следует предусмотреть какой-нибудь выход. Хотя в операторе for заложены большие возможности, используется он, главным образом, для перечислений, когда их число известно, например, фрагмент кода: int s=0; for (int k = 1; k <= N; k++) s += k * k; В операторах цикла используется оператор continue. Он имеет две формы. Первая форма состоит только из слова continue и осуществляет немедленный переход к следующей итерации цикла. В очередном фрагменте кода оператор continue позволяет обойти деление на нуль: for (int i = 0; i < N; i++){ if (i '== j) continue; s += 1.0 / (i - j); } Вторая форма содержит метку: continue метка Метка записывается, как все идентификаторы, из букв Java, цифр и знака подчеркивания, но не требует никакого описания. Метка ставится перед оператором или открывающей фигурной скобкой и отделяется от них двоеточием. Так получается помеченный оператор или помеченный блок. Также в операторах цикла используется оператор break для немедленного выхода из циклических конструкций. оператор break метка применяется внутри помеченных операторов цикла, оператора варианта или помеченного блока для немедленного выхода за эти операторы. Следующая схема поясняет эту конструкцию: Ml: { // Внешний блок М2: { // Вложенный блок -- второй уровень М3: { // Третий уровень вложенности... if (что-то случилось) break M2; } \// Если true, то здесь ничего не выполняется // Здесь тоже ничего не выполняется} // Сюда передается управление} Поначалу сбивает с толку то обстоятельство, что метка ставится перед блоком или оператором, а управление передается за этот блок или оператор. Поэтому мне кажется что не стоит увлекаться оператором break с меткой [8]. 2.5 Циклы в языке С# Управляемые итерации, или циклы, в С# выполняют операторы for, while, do/while и foreach. В каждом случае исполняется простой или составной оператор, пока значение булевского выражения остается равным true. Исключение составляет foreach, производящий итерацию списка объектов. Цикл , for предоставляет механизм для прохода по циклу, при котором инициализируется некоторая локальная переменная и выполняется оператор в цикле до тех пор, пока заданное условие истинно, причем перед переходом к следующей итерации производится какой-нибудь простой шаг. Синтаксис цикла: for(инициализатор; условие; итератор;) оператор {ы} Где инициализатор-выражение, вычисляемое до начала выполнения цикла (обычно здесь инициализируется локальная переменная, используемая в качестве счетчика цикла), условие-выражение, которое вычисляется перед выполнением каждой итерации цикла (например, проверка того, что счетчик цикла меньше определенного значения), итератор-это выражение, которое будет выполнятся после каждой итерации цикла (например, увеличение счетчика цикла).Цикл, for известен также как цикл с предусловием, поскольку условие цикла вычисляется до выполнения операторов цикла, а в том случае, если условие сразу оказывается равным false, операторы цикла вообще не будут исполнены. Перед каждой итерацией цикла условие вычисляется вновь. Цикл завершается, как только результат вычисления условия становится false. Цикл for превосходно подходит для повтора оператора или нескольких операторов заранее определенное число раз. Следующий пример показывает типичное использование цикла for: for ( int I = 0; I < 100; i ++) { //Цикл будет выполнен 100 раз} Цикл for можно вкладывать друг в друга, так что внутренний цикл полностью выполняется один раз для каждой итерации внешнего цикла. Эта схема обычно используется для прохода по каждому элементу в многомерном массиве. Внешний цикл осуществляет проход по всем строкам, а внутренний по каждому столбцу соответствующей строки. // Этот цикл проходит по строкам for ( int i = 0; i < 100; i ++) {// Это цикл проходит по столбцам for ( int j = 0; j < 100; j ++){ a[ i , j] = 0;}} Рассмотрим цикл while, его общая форма имеет такой вид: whi1е (условие) инструкция; Здесь под элементом инструкция понимается либо одиночная инструкция, либо блок инструкций. Работой цикла управляет элемент условие, который представляет собой любое допустимое выражение типа bool. Элемент инструкция выполняется до тех пор, пока условное выражение возвращает значение истина. Как только это условие становится ложным, управление передается инструкции, которая следует за этим циклом. Цикл while работает следующим образом. Проверяется значение переменной num. Если оно больше нуля, счетчик mag инкрементируется, а значение num делится на 10. Цикл повторяется до тех пор, пока num больше нуля. Когда num станет равным нулю, цикл завершится, а переменная mag будет содержать порядок исходного числа. Подобно циклу for, условное выражение проверяется при входе в цикл while, a это значит, что тело цикла может не выполниться ни разу. Это свойство цикла (иллюстрируемое следующей программой) устраняет необходимость отдельного тестирования до начала цикла: // Вычисление целых степеней числа 2. using System; class Power { public static void Main() { int e; int result; for(int i=0; i < 10; result = 1; e = i; while(e > 0) { result *= 2; e--; Console.WriteLine("2 в степени " + i + " равно " + result); Третьим циклом в С# является цикл do-while. В отличие от циклов for и while,в которых условие проверяется при входе, цикл do-while проверяет условие при выходе из цикла. Это значит, что цикл do-while всегда выполняется хотя бы один раз. Его общий формат имеет такой вид: do {инструкции;} while {условие); Несмотря на то, что фигурные скобки необязательны, если элемент инструкции состоит только из одной инструкции, они часто используются для улучшения читабельности конструкции do-while, не допуская тем самым путаницы с циклом while. Цикл do-while выполняется до тех пор, пока остается истинным элемент условие, который представляет собой условное выражение. В следующей программе цикл do-while используется для отображения в обратном порядке цифр, составляющих заданное целое число. using System; class DoWhileDemo { public static void Main() { int num; int nextdigit; num = 198; Console.WriteLine("Число: " + num); Console.Write("Число с обратным порядком цифр: " ) ; do {nextdigit = num % 10; Console.Write(nextdigit); num = num / 10; } while(num > 0) ;Console.WriteLine();}}} И еще одна циклическая конструкция foreach. Цикл foreach предназначен для опроса элементов коллекции. Коллекция -- это группа объектов. В С# определено несколько типов коллекций, среди которых можно выделить массив. Формат записи цикла foreach имеет такой вид: foreach (тип имя__переменной in коллекция) инструкция; Здесь элементы тип и имя_переменной задают тип и имя итерационной переменной, которая при функционировании цикла fоreach будет получать значения элементов из коллекции. Элемент коллекция служит для указания опрашиваемой коллекции (в данном случае в качестве коллекции мы рассматриваем массив). Таким образом, элемент тип должен совпадать (или быть совместимым) с базовым типом массива. Здесь важно запомнить, что итерационную переменную применительно к массиву можно использовать только для чтения. Следовательно, невозможно изменить содержимое массива, присвоив итерационной переменной новое значение. Рассмотрим простой пример использования цикла foreach. Приведенная ниже программа создает массив для хранения целых чисел и присваивает его элементам начальные значения. Затем она отображает элементы массива, попутно вычисляя их сумму [10, 12, 13, 14]. // Использование цикла foreach. using System; class ForeachDemo { public static void Main() { int sum = 0;int[] nums = new int[10]; // Присваиваем элементам массива nums значения, for(int i = 0; i < 10; i++){ nums[i] - i; // Используем цикл foreach для отображения значений // элементов массива и их суммирования, foreach(int x in nums) { Console.WriteLine("Значение элемента равно: " + х); sum += х;} Console.WriteLine("Сумма равна: " + sum);}}} 3. ПРИМЕР ПРОГРАММ ЦИКЛИЧЕСКИХ КОНСТРУКЦИЙ НА ЯЗЫКЕ С#3.1 Программа №1 «цикл while» Предположим необходимо найти арендную плату за помещение за 10 лет. Известно, что арендная плата в месяц составляет 1200р. и что она увеличивается на 5 % в год. Для написания программы решения этой задачи воспользуемся циклом while: using System; //указывает что используется пространство имен system using System.Collections.Generic; using System.Text;{ namespace ConsoleApplication5 { class Program { // объевление функции main static void Main(string[] args) { // программа расчета арендной платы // год начала и конца арендной платы int i = 2007, j = 2017; // арендная плата в месяц и проценты вгод decimal Renta = 1200, Procent = 5; // заголовок столбцов Console.WriteLine("Год Аренда"); Console.WriteLine("---- -----"); while (i <= j) { // строка вывода арендной платы Console.WriteLine("{0,-8}{1,10:C2}", i, Renta); // расчет арендной платы за год Renta *= (1 + Procent / 100); Renta = Decimal.Round(Renta, 2); i++; } Console.ReadLine(). }}} В результате чего получена сумма арендной платы за 10 лет. Результат работы этой программы изображен на рисунке 3 Рисунок 3 - Результат программы №1 «цикл while»
3.2 Программа №2 «цикл do-while» Цикл do-while полезен в программах, предполагающих ввод данных. Ниже представлен текст программы, которая выполняет несколько простых математических действий, в конце чего запрашивает у пользователя о его желании выполнить другое вычисление. using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication6 { class Program { static void Main(string[] args) {string strAnswer; double a; do { //запрос на ввод первого числа числа Console.WriteLine("Введите первое число"); double n1 = Convert.ToDouble(Console.ReadLine()); //запрос на ввод второрго числа Console.WriteLine("Введите второе число"); double n2 = Convert.ToDouble(Console.ReadLine()); //запрос на выбор действия Console.WriteLine("Выбирите действие +: /: *: -:"); string s = Convert.ToString(Console.ReadLine()); //выполнение условия //если введенное значение соответствует знаку + то выполняется сложение if (s == "+") { a = n1 + n2; Console.WriteLine("Сумма чисел равна :"+a); } //если введенное значение соответствует знаку * то выполняется умножение else if (s == "*") { a = n1 * n2; Console.WriteLine("Произведение чисел равна :"+ a); } //если введенное значение соответствует знаку - то выполняется отнимание if (s == "-") { a = n1 - n2; Console.WriteLine("Разность чисел равна :"+ a); } //если введенное значение соответствует знаку / то выполняется деление else if (s == "/") { a = n1 / n2; Console.WriteLine("Частное чисел равна :"+ a); } // запрос на новое вычисление Console.Write("Не желает ли пользователь выполнить другое вычисление (y/n)"); strAnswer = Console.ReadLine().Trim(); } //происходит сравнение strAnswer символом y while (strAnswer.Length > 0 && strAnswer.ToLower()[0] == 'y'); Console.ReadLine(); } } } Результат программыы можно увидеть на рисунке 4 Рисунок 4 - Результат программы №2 «цикл do-while» 3.3 Программа №3 «цикл for» Предположим, необходимо получить сумму двух матриц. В программировании эту задачу проще всего реализовать, воспользовавшись циклической конструкцией for. Ниже представлен код программы решения данной задачи. using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication7 { class Program { static void Main(string[] args) { int i, j, m, n; //запрос на ввод количества строк Console.WriteLine("введите n"); n = Convert.ToInt32(Console.ReadLine()); //запрос на количество столбцов Console.WriteLine("введите m"); m = Convert.ToInt32(Console.ReadLine()); //инициализация массивов int[,] a = new int[n, m]; int[,] b = new int[n, m]; int[,] c = new int[n, m]; int[] d = new int[n]; //заполнение массивов случайными числами Random r = new Random(); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { a[i, j] = r.Next(0, 10); b[i, j] = r.Next(0, 10); } } Console.WriteLine("----------------матрица a ------------"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) "); Console.WriteLine(); } Console.WriteLine("---------------матрица b -------------"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) "); Console.WriteLine(); } Console.WriteLine("------------c=(сумма а и b)-----------"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) "); Console.WriteLine();} Console.ReadLine();}}} Результат этой программы изображен на рисунке 5 Рисунок 5 - Результат выполнения программы №3 «цикл for» 3.4 Программа №4 «цикл foreach» Предположим необходимо организовать поиск числа в массиве. Для этого можно использовать циклическую конструкцию foreach. Ниже приведен текст программы с таким циклом: using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication10 {class Search {public static void Main(string[] args) { int[] n=new int [10]; int val; bool found = false; //присваиваем элементам масива n значение for (int i = 0; i < 10; i++) n[i] = i; Console.WriteLine("Введите значение"); val = Convert.ToInt32(Console.ReadLine()); //используем цикл foreach для поиска в массиве n //заданного значения foreach (int x in n) { if (x == val) { found = true; break;}} if (found) Console.WriteLine("Значение найдено!"); else Console.WriteLine("Значение ненайденно!"); Console.ReadLine();}}} В итоге получилась программа, которая запрашивает у пользователя значение и осуществляет поиск в массиве. Результат этой программы изображен на рисунке 6 Рисунок 6 - Результат работы программы №4 «цикл foreach» ЗАКЛЮЧЕНИЕ Исследование циклических конструкций в языках высокого уровня, можно сделать вывод, что по принципам построения они схожи между собой, а если и есть различия, то они связанные с синтаксисом. Основная задача циклических конструкций - это многократное выполнение одних и тех же операций, что существенно облегчает работу программисту и позволяет организовать выполнение итерационных процессов. Циклические конструкции делятся на два вида: циклические конструкции со счетчиком, в которых тело цикла выполняется определенное количество раз, и циклические конструкции с условием, в которых тело цикла выполняется до тех пор, пока выполняется условие. В зависимости от кода программы, выбирается тот вид циклических конструкций с помощью которых будет достигнут максимальный эффект программы. Программа немыслима без циклических конструкций, так как все программы основаны на повторении. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ1. Лахатин, А.С. Языки программирования. Учеб. пособие / А.С. Лахатин, Л.Ю. Искакова. - Екатеринбург, 1998. - 548с.: ил.2. Богатырев, А. Язык программирования С [Электронный ресурс] / А. Богатырев.- электр. дан. - Режим доступа: http://www.refby.com. - Загл. с экрана.3. Уэйт, М. Язык С. Руководство для начинающих. / М. Уэйт, С. Прага, Д. Мартин. - М.: Мир, 1995. - 521с.: ил.4. Фридман, А.Л. Язык программирования С++ / А.Л.Фридман. - М.: Бином, 2006. - 523с.: ил.5. Патрикеев, Ю.Н. Объектно-ориентированное программирование на Broland C++ [Электронный ресурс] / Ю.Н.Патрикеев. - Электрон. Дан. - Режим доступа: http://www.intuit.ru/department/pl/cpp/lit.html. - загл. с экрана.6. Тарасов, И. Thinking in C++/ И. Тарасов.- М.: 2004.- 496с.: ил.7. Гагин, А. История JAVA / А.Гагин.- М,1998.-257с.: ил.8. Таранов, А. Java как центр архипелага [Электронный ресурс] / А. Таранов, В. Цишевский. - Электрон. дан.- Режим доступа: http:// www. fortunecity.com/skyscraper/mmx/490/index.html. - Загл. с экрана.9. Коропов, С. Алгоритм [Электронный ресурс] / С. Коропов. - Электрон. дан. - Режим доступа: ftp://labrea.stanford.edu/pub/cweb/ . - Загл. с экрана.10. Робинсон, С. C# для профессионалов: T.1. / С.Робинсон, О. Корнес, Д.Глин, Б. Харвей и др.; пер. с англ. С. Кортыгин и О. Труфанов. - М. ЛОРИ. - М.: 2005. - 999с.11. Петцольд, Ч. Программирование в тональности C#. - М.: изд-во торговый дом «Русская редакция», 2004. - 512с.: ил.12. Шилдт, Г. Полный справочник по C#. / Г. Шилдт; пер. с англ. Н.М. Ручко. - М.: Изд. дом Вильямс, 2004. - 752с.: ил.13. Бишоп, Дж. C# в кратком изложении / Дж.Бишоп, Н. Хорспул; пер.с.англ. - М.: Бином, 2005. - 472с.: ил.14. Троелсен, Э. C# и платформа. NET. Библиотека программиста / Э. Троелсен. - Питер.: 2004. - 796с.: ил.
|