- •Содержание
- •Глава 1. Основные принципы разработки алгоритмов и программ 8
- •Глава 2. Знакомство с технологией .Nет 30
- •Глава 3. Установка visual studio. Консольные приложения 42
- •Глава 4. Введение в язык c# 52
- •Глава 5. Операции и выражения. Программы линейной структуры 67
- •Глава 6. Программирование ветвящихся процессов 85
- •Глава 7. Программирование циклических процессов 92
- •Предисловие
- •Введение
- •Глава 1. Основные принципы разработки алгоритмов и программ
- •1.1 Этапы решения задач на эвм
- •1.1.1 Постановка задачи
- •1.1.2 Формализация или математическая постановка задачи
- •1.1.3 Выбор или разработка метода решения
- •1.1.4 Разработка алгоритма
- •1.1.5 Программирование
- •1.1.6 Отладка
- •1.1.7 Вычисление и обработка результатов
- •1.2 Формы записи алгоритмов
- •1.2.1 Словесное описание
- •1.2.2 Запись алгоритма с помощью схем
- •1.2.3 Псевдокоды
- •1.2.4 Способ записи на языке программирования
- •1.3 Свойства, которыми должны обладать алгоритмы
- •1.4 Характеристики качества программного продукта
- •1.5 Технология программирования хороших программ
- •1.5.1 Способы проектирования алгоритмов и программ
- •1.5.2 Основные идеи структурного программирования
- •При разработке алгоритма нужно руководствоваться следующими рекомендациями:
- •1.5.3 Дополнительные рекомендации
- •1.6 Контрольные вопросы
- •Глава 2. Знакомство с технологией .Nет
- •2. 1 Причины появления новой платформы и нового языка
- •2.2 Платформа .Nет Framework
- •2.3 Интегрированная среда разработки Visual Studio
- •2.3.1Общеязыковая среда выполнения clr
- •2.3.2 Новации Visual Studio 2010
- •2.4 Основные понятия объектно-ориентированной технологии
- •2.4.1 Инкапсуляция
- •2.4.2 Полиморфизм
- •2.4.3 Наследование
- •2.4.4 Классы
- •Контрольные вопросы
- •Глава 3. Установка visual studio. Консольные приложения
- •3.1 Установка Visual Studio
- •3.2 Разработка приложений
- •3.2.1 Консольные приложения
- •3.2.1.1 Создание проекта. Основные окна среды
- •Контрольные вопросы
- •Глава 4. Введение в язык c#
- •4.1 Историческая справка
- •4.2 Основы языка с#
- •4.2.1 Алфавит языка
- •4.2.2 Лексемы языка, директивы препроцессора и комментарии
- •4.3 Типы данных
- •4.3.1 Классификация типов данных
- •4.3.2 Встроенные типы данных
- •4.3.2.1 Целые типы
- •4.3.2.2 Вещественные типы
- •4.3.2.3 Логический тип
- •4.3.2.4 Символьный тип
- •4.3.2.5 Финансовый тип
- •4.3.3 Литералы
- •4.4 Переменные
- •4.4.1 Объявления переменных
- •4.4.2 Инициализация переменных
- •4.4.3 Область видимости переменных
- •4.5 Именованные константы
- •Контрольные вопросы
- •Глава 5. Операции и выражения. Программы линейной структуры
- •5.1 Выражения
- •5.1.1 Операции
- •5.1.1.1 Арифметические операции
- •5.1.1.2 Операции отношения, сдвига с#
- •5.1.1.3 Поразрядные и логические операции с#
- •5.1.1.4 Операции присваивания
- •5.1.1.5 Условная операция
- •5.2 Преобразование и приведение типов
- •5.2.1 Присвоение переменной одного типа значения другого типа
- •5.2.2 Явное преобразование типа
- •5.2.3 Преобразование типов в выражениях
- •5.3 Класс Math
- •Математические функции можно использовать только с величинами числовых типов. Углы тригонометрических функций должны быть представлены в радианах.
- •5.4 Линейные алгоритмы и программы
- •5.4.1 Простейшие способы вывода
- •5.4.2 Простейшие способы ввода с клавиатуры
- •5.5 Примеры
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 6. Программирование ветвящихся процессов
- •6.1 Условные операторы
- •6.2 Алгоритмы и программы разветвленной структуры
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 7. Программирование циклических процессов
- •7.1 Понятие цикла
- •7.2 Операторы управления
- •7.2.1 Оператор goto
- •7.2.2 Специальные операторы управления
- •7.2.3 Операторы циклов
- •7.3 Программирование вычислительных процессов усложненной структуры
- •7.3.1 Итерационные циклы
- •7.3.2 Вложенные циклы
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
7.3 Программирование вычислительных процессов усложненной структуры
В данном подразделе приводится ряд подходов с подробными рассуждениями к решению некоторых задач различных типов.
7.3.1 Итерационные циклы
Итерационным циклом называется такой, число повторений которого заранее неизвестно или его сложно рассчитать, а в процессе повторения тела цикла образуется последовательность значений y1, y2,…, yn,…, сходящаяся к некоторому пределу а, т. е.
Lim yn = a.
n
Каждое новое значение yn в такой последовательности определяется с учетом предыдущего yn-1 и является по сравнению с ним более точным приближением к искомому результату. Итерационный цикл заканчивает свою работу в том случае, если для некоторого значения n выполняется условие
| yn - yn-1 | ,
где – допустимая погрешность вычисления результата.
В такой ситуации за результат принимают последнее значение y, т.е. считают, что yn с заданной точностью представляет значение а.
Задача вычисления суммы бесконечного ряда может служить прекрасной иллюстрацией к пониманию итерационного циклического процесса. Естественно, вычислять сумму бесконечного ряда имеет смысл в том случае, когда бесконечный ряд является сходящимся. Известно, что ряд сходится, если его общий член zn при беспредельном возрастании n стремится к нулю, т. е.
Lim zn = 0; Lim (sn – sn-1) = 0.
n n
А сумма
sn = z0 + z1 + …+zn
его первых (n + 1) слагаемых при этом стремится к некоторому пределу S, который и называется суммой ряда, т. е.
Lim sn = S; Lim zn = S.
n n
Алгоритм, реализующий подсчет суммы ряда, должен вырабатывать последовательность s1, s2, …, sn, …при следующем условии окончания суммирования:
| zn | .
Пример 3. Вычислить значение функции cos x, используя разложение косинуса в ряд с заданной погрешностью :
Cos x = 1 - + - + …+(-1)n +...
При построении алгоритма данной задачи необходимо:
-
определить значение очередного слагаемого z;
-
осуществлять накопление суммы по итерационной формуле
s = s + z.
Для определения значения очередного слагаемого z в данном примере целесообразно использовать не прямое его вычисление по общей формуле, а рекуррентное соотношение, которое позволяет существенно сократить количество операций при вычислении его значения:
z = z * fn.
Определим сомножитель fn:
fn = =. .
Для работы алгоритма (рис.7.1) весьма важно определить исходную информацию для работы цикла. Подставив в данную формулу n = 0, получим начальное значение z = 1.
Для организации цикла по накоплению суммы используется оператор цикла с предусловием, в котором условие | z | > является условием продолжения цикла.
Вторым характерным примером использования итерационных циклов является задача решения алгебраических и нелинейных (трансцендентных) уравнений.
Нахождение корней уравнений вида
f (x)= 0
осуществляется в два этапа.
Первый этап – этап локализации корня – определяется отрезок [,], в пределах которого находится один и только один корень уравнения. Часто локализация корня осуществляется построением «грубого» графика функции f (x).
Второй этап – этап уточнения корня – ведется поиск корня с заданной степенью точности с помощью некоторого итерационного алгоритма.
Наиболее простым методом уточнения корня является метод итераций, заключающийся в следующем. Исходное уравнение f (x)= 0, где f (x) – непрерывная функция на отрезке [, ], заменяют эквивалентным уравнением вида
x = (x)
и, зная начальное приближение корня x0 [, ], каждое следующее приближение находят по формуле
xn = (xn-1).
Вычисления повторяют до тех пор, пока не выполнится условие |f(xn)| , где - заданная погрешность вычислений. Отметим, что иногда используют другой способ контроля сходимости, состоящей в сравнении xn и xn-1. Процесс сходится, если на всем отрезке [, ] |(x)|< 1, где (x) есть производная функции (x).
Рисунок 7.10 – Схема алгоритма к примеру 3
Все вышесказанное реализовано в программе (лист. 7), соответствующей схеме данного алгоритма (рис. 7.10).
Листинг 7 – К примеру 3
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double x, eps,s,t,y,f;
Console.Write("Enter x ");
x = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter eps ");
eps = Convert.ToDouble(Console.ReadLine());
s=0;
t=1;
int n=1;
while (Math.Abs(t) > eps)
{ //Начало цикла
s= s + t;
f= -x*x / (2*n*(2*n-1));
t= t*f;
n++;
} //Конец цикла
y= Math.Cos (x);
Console.WriteLine("х=" + x + " у=" + y+ " s="+s);
}
}
}
Пример 4. Определить корень уравнения x – tg(x)= 0 с погрешностью = 10-3 при начальном значении корня x0 = 4,5.
Преобразуем исходное уравнение следующим образом:
x = tg x,
тогда f(x)= x – tg x; (x) = tg x.
Для определения x0 удобно использовать следующие графические построения. Построить графики функций y1= x; y2= (x)= tg x. Точки пересечения этих графиков и будут корнями исходного уравнения f(x)= 0. На графике выделить приближенные отрезки [, ] локализации каждого корня. В качестве x0 можно взять любую точку отрезка.
Программа уточнения корня по методу итераций представлена в листинге 8, схема алгоритма на рисунке 7.11.
Рисунок 7.11 – Схема алгоритма к примеру 4
В данной программе на печать в качестве результата выводится последнее значение x, которое удовлетворяет заданному значению Eps.
Листинг 8 – К примеру 4
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double x, xn, eps;
Console.Write("Enter xn ");
xn = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter eps ");
eps = Convert.ToDouble(Console.ReadLine());
x=xn;
while (Math.Abs (x-Math.Sin(x)/Math.Cos(x))>eps)
x=Math.Sin(x)/Math.Cos(x);
Console.WriteLine("x=" + x);
}
}
}
Для практического контроля сходимости итерационного процесса xn=(xn-1) можно осуществлять печать промежуточных значений x, последнее из которых и будет корнем уравнения при заданной погрешности.