Оборудование: Персональный компьютер, компилятор языка С#.
Цель работы: Ознакомиться с операторами цикла и научиться применять их в С#-программах.
Циклическая управляющая структура применяется для организации многократного выполнения некоторого оператора. Оператор цикла включает <заголовок цикла> и <тело цикла>. Заголовок определяет количество повторений цикла, а тело - повторяемые операторы.
В C реализовано три вида оператора цикла.
(1) Цикл while
<тело цикла>
Условие - это логическое выражение булевского типа.
Тело цикла - это оператор, или последовательность операторов, заключенная в операторные скобки { }.Алгоритм выполнения цикла while
1. Вычисляется значение условия.
2. Если условие истинно, то выполняются операторы тела цикла и повторяется шаг 1.
3. Если условие ложно, то цикл завершается и происходит переход к следующему за whileоператору.
(2) Циклdo while
do{
<телоцикла>
}
while(<условие>);
Условие - это выражение булевского типа.
Тело цикла - это оператор, или последовательность операторов, разделенная символом ";".
1. Выполняются операторы тела цикла.
2. Вычисляется значение условия.
3. Если условие ложно, то повторяется шаг 1.
4. Если условие ложно, то цикл завершается и происходит переход к следующему за do оператору.
Замечания.
1. Оператор dowhile, в отличии от оператора while, обязательно выполнится по крайней мере один раз.
2. Выйти из цикла можно минуя вычисление условия с помощью оператора go, однако это не соответствует принципам структурного программирования.
3. Если операторы тела цикла не влияют на значение условия и условие истинно перед выполнением цикла while и после выполнения цикла dowhile, то цикл будет выполняться бесконечно (эффект "зацикливания").
(3) Оператор for
Оператор for - это наиболее общий способ организации цикла. Он имеет следующий формат:
for ( выражение 1 ; выражение 2 ; выражение 3 ) тело
Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.
Схема выполнения оператора for:
1. Вычисляется выражение 1.
2. Вычисляется выражение 2.
3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.
Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.
Пример:
int main()
{ int i,b;
for (i=1; i<10; i++)
b=i*i;
return 0;
}
В этом примере вычисляются квадраты чисел от 1 до 9.
Другим вариантом использования оператора for является бесконечный цикл. Для организации такого цикла можно использовать пустое условное выражение, а для выхода из цикла обычно используют дополнительное условие и оператор break.
Пример:
for (;;)
{ ...
... break;
... }
Так как согласно синтаксису языка С# оператор может быть пустым, тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска.
Пример:
for (i=0; t[i]<10 ; i++) ;
В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10. Типы параметра цикла, начального и конечного значений должны быть совместимы. Допускается любой скалярной тип кроме вещественного, т.е. любой порядковый тип. Порядок, установленный на множестве значений таких типов, позволяет для любого значения определить следующее за ним и предыдущее.
Тело цикла - это оператор, или последовательность операторов, заключенная в операторные скобки { }.
1. Цикл for целесообразно использовать в тех случаях, когда заранее известно количество повторений цикла.
2. Значение параметра цикла нельзя изменять внутри тела цикла и следует считать это значение неопределенным при выходе из цикла.
3. Выйти из цикла можно преждевременно с помощью оператора goto, однако это не соответствует принципам структурного программирования.
Лабораторная работа 3 включает 4 задания.
1. Обработка последовательностей значений.
При обработке последовательности ее элементы не запоминаются, а обрабатываются непосредственно после ввода.
Даны натуральное число n и целые числа A1,A2,...,An. Выяснить, какое число встретится в последовательности раньше положительное или отрицательное. Если все члены равны нулю, то сообщить об этом.
Рассмотримкодпроцедуры Main()
string N, A;
int n, a, i;
Console.WriteLine("Введите n");
N = Console.ReadLine();
n = Convert.ToInt32(N);
i = 0; a = 0;
while ((a == 0) && (i < n))
{
Console.WriteLine("Введите a");
A = Console.ReadLine();
a = Convert.ToInt32(A);
i++;
}
if (a == 0)
Console.WriteLine("Всеэлементыравны 0");
else
if (a < 0)
Console.WriteLine("Первый не нулевой элемент отрицательный");
else
Console.WriteLine("Первый не нулевой элемент положительный");
Console.ReadLine();
2. Распечатка в виде таблицы значения заданной функции.
Вычислить значения функции:
для а=1,1.1,1.2,...,1+0.1n и распечатать в виде таблицы значений с 2 знаками после десятичной точки.Рассмотрим код процедуры Main():
string N;
double a, f;
int i, n;
Console.WriteLine("Введите количество элементов");
N = Console.ReadLine();
n = Convert.ToInt32(N);
a = 1;
Console.WriteLine("********************************");
f = ((a - 3) * a + 2) / Math.Sqrt(2 * a * a * a - 1);
Console.WriteLine("* {0} * {1} ", a, f);
a = a + 0.1;
for (i = 1; i < n + 1; i++)
{
f = ((a - 3) * a + 2) / Math.Sqrt(2 * a * a * a - 1);
Console.WriteLine("* {0} * {1} ", a, f);
a = a + 0.1;
}
Console.WriteLine("********************************");
Console.ReadLine();
3. Вычисление суммы (произведения) заданного числа слагаемых (сомножителей), каждое из которых есть функция от своего индекса (номера).
Для заданных действительного x и целого n (n>0) вычислить
S = x-
Рассмотрим код процедуры Main():
string N, X;
double x, s, h, f;
int n, i;
Console.WriteLine("Введите количество элементов");
N = Console.ReadLine();
n = Convert.ToInt32(N);
Console.WriteLine("Введите значение x");
X = Console.ReadLine();
x = Convert.ToDouble(X);
s = x;
h = 1;
f = 1;
for(i = 0; i < n; i++)
{
h = -h*x*x;
f = f*(2*n)*(2*n+1);
s = s + h /f;
}
Console.WriteLine("Summa = {0}",s);
Console.ReadLine();
Обратите внимание, что на каждом шаге очередное слагаемое вычисляется с использованием значения предыдущего слагаемого. Это полезный прием при вычислении значений типа xn,(-1)n, (sin x)n, sin xn и т.д.
4. Задание на итерационный цикл с заранее неизвестным количеством шагов. Реализовать метод Ньютона нахождения приближения к корню степени k из действительного неотрицательного x.
Пусть y0 - начальное приближение к корню. Будем последовательно получать значения:
y1=y0-(y0k - x)/(k*y0k-1),
y2=y1-(y1k - x)/(k*y1k-1),
y3=y2-(y2k - x)/(k*y2k-1) и т.д.
Процесс будем продолжать до тех пор, пока модуль разности двух последовательных приближений больше некоторого заданного e. Полученное значение будет приближением к корню степени k из x с точностью e. Заметим, что на каждом шаге нам нужны только два последних приближения. Рассмотрим код функции Main():
string K, X, EPS;
double x, d = 1, y, eps;
int k;
Console.WriteLine("Введитестепень");
K = Console.ReadLine();
k = Convert.ToInt32(K);
Console.WriteLine("Введитезначениепервогоэлемента");
X = Console.ReadLine();
x = Convert.ToDouble(X);
Console.WriteLine("Введите значение эпсилент");
EPS = Console.ReadLine();
eps = Convert.ToDouble(EPS);
y = x;
while (Math.Abs(d)>eps)
{
d=(x/Math.Exp((k-1)*Math.Log10(y))-y)/k;
y=y+d;
}
Console.WriteLine("Приближениеккорнюравно {0}", d);
Console.ReadLine();
Вариант 1
1. Даны целые числа а1,...,аn,an+1,...;а1>0, среди а2,а3,... есть хотя бы одно отрицательное. Пусть а1,...,аn члены предшествующие первому отрицательному. Получить min(a1+a2,a2+a3,...,an-1+an).
2. Дано натуральное число n.Вычислить сумму и распечатать
S=
3. Даны действительные числа а и b (a<b), натуральное n, функция y=x+cos x, определенная на отрезке [a,b]. Для значений аргумента xi=a+ih (i=0,1,...,n), h=(b-a)/n Вычислить значение функции yi=xi+cos xi. Вывести xi,yi в виде колонки для значений (a=-π ,b=π, n=50).n 1
4. Вычислить сумму ряда
и распечатать. Вычисления прекращаются при условииВариант 2
1. Даны натуральные числа n, a1, ..., an.Определить количество членов ак последовательности а1, ..., аn, являющихся квадратами четных чисел.
2. Даны натуральное число n , действительное - х. Вычислить:
3. Получить значения функции Z и распечатать в виде колонки Xi , Zi
Z=A sin2X + cos(Ax)2; A=ex + 2,5*10-3
Х изменяется в интервале [X0,Xn] с шагом h=0,05
X0=- π
Xn=
4. Вычислить значение суммы и распечатать :
,где (i=1,...,n)Вычисления прекращаются при Ui<=E, E=10-5
Вариант 3
1. Даны целые числа а1,...,а50.Получить сумму тех чисел данной последовательности, которые удовлетворяют условию