Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭВМ 1-3 лабы.rtf
Скачиваний:
33
Добавлен:
01.04.2015
Размер:
2.67 Mб
Скачать

4.4. Оператор перехода

Оператор перехода вызывает передачу управления оператору, которому предшествует метка:

goto <имя>;

. . .

<имя>: <оператор>

Помеченный <оператор> должен находиться в той же функции, что и оператор goto, и метка должна быть уникальна.

Метка – это просто идентификатор.

Метка от оператора должна отделяться символом ”:”.

Пример использования оператора

#include <stdio.h>;

#include <math.h>;

void main()

{ float a;

M: printf("Введите a>0: "); scanf("%f",&a);

if (a<=0) goto M;

printf("%.3f",sqrt(a));

}

5.4. Операторы передачи управления

Оператор перехода вызывает передачу управления оператору, которому предшествует метка:

goto <имя>;

. . .

<имя>: <оператор>

Помеченный <оператор> должен находиться в той же функции, что и оператор goto, и метка должна быть уникальна.

Метка – это просто идентификатор.

Метка от оператора должна отделяться символом ”:”.

Пример использования оператора

#include <stdio.h>;

#include <math.h>;

void main()

{ float a;

M: printf("Введите a>0: "); scanf("%f",&a);

if (a<=0) goto M;

printf("%.3f",sqrt(a));

}

5.5. Вложенные циклы

Для решения задачи достаточно часто требуется использовать несколько циклических конструкций, которые расположены внутри друг друга. Такие конструкции называют вложенными циклами.

Пример решения задачи

1) Натуральное число называют совершенным, если оно равно сумме всех своих делителей, не считая его самого. Например, 6=1+2+3, 28=1+2+4+7+14. Написать программу нахождения первых совершенных чисел меньших 10000.

Обсуждение. Единица по определению не является совершенным числом. На совершенность проверяем все числа n от 2 до 10000. Каждое число n делим на числа от 1 до n-1 и все делители суммируем (s=s+i). Как только сумма s делителей равна текущему числу n, выводим n на экран.

#include <stdio.h>;

void main()

{

long n, i, s;

for (n=2;n<=10000;n++)

{ s=0;

for(i=1;i<n;i++) if (n%i==0) s=s+i;

if (s==n) printf("%i\n",n);

}

}

5.6. Вычисление сумм

Одним из важных задач практики является вычисление сумм, которые без компьютера решить было бы весьма трудно.

Вычисление конечных сумм. Общий вид суммы можно записать в виде

.

Любая сумма вычисляется по рекуррентной формуле, которая получается следующим образом. Обозначим сумму первых i членов суммы , тогда сумма первыхi-1 членов ряда равна . Отсюда легко получим рекуррентную формулу вычисления суммы

.

Общий алгоритм вычисления суммы: требуется задать начальное значение суммы ряда (в данной постановке задачи S0=0), а затем многократно вычислять очередной член ряда и добавлять его к ранее найденной сумме (Si=Si-1+ai).

Примеры

1) Составить программу вычисления суммы .

Обсуждение. Общий член суммы имеет вид ,i=1,2,…,50.

#include <stdio.h>;

void main()

{

int i; float a, s;

s=0;

for (i=1;i<=50;i++)

{ a=1.0/((2*i-1)*2*i);s=s+a;}

printf("s=%.4f\n",s);

}

2) Составить программу вычисления для заданного x суммы первых n членов ряда

Обсуждение. Общий член ряда имеет вид ,i=1,2,…,n.

Прямое вычисление члена ряда по приведенной общей формуле, когда x возводится в степень, вычисляется факториал, а затем числитель делится на знаменатель, имеет два недостатка, которые делают этот способ непригодным. При возведении в степень и вычислении факториала можно получить очень большие числа, при делении которых друг на друга произойдет потеря точности. Второй недостаток связан с количеством операций. Для уменьшения количества операций следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий член. Для получения рекуррентной формулы вычислим отношение следующего члена ряда к предыдущему:

,

откуда ai=ai-1x2/(i-1), i=2,3,…,n, a1=1.

#include <stdio.h>;

void main()

{

int i,n; float x, a, s;

printf("x n="); scanf("%f%d",&x,&n);

a=1; s=a;

for (i=2;i<=n;i++) { a=a*x*x/(i-1); s=s+a;}

printf("s=%.4f\n",s);

}

Вычисление бесконечных сумм. Общий вид бесконечных сумм имеет вид

.

Бесконечные суммы вычисляются с некоторой точностью ε. Для достижения заданной точности требуется суммировать члены ряда, абсолютная величина которых больше ε. Для сходящегося ряда модуль члена ряда ai при увеличении i стремится к нулю.

Примеры

1) Дан угол α (|α |≤ 3600) в градусах. Вычислить sin(α) с заданной точностью ε =0.000001, если

.

При определении суммы ряда следует использовать рекуррентную формулу для получения текущего члена ряда. Для этого введем обозначение ai=(-1)ix2i+1/(2i+1)! и вычислим отношение текущего члена к предыдущему

.

Отсюда ai=-ai-1x2/(2i(2i+1)).

Для определения ai, i=1,2,... достаточно знать a0=x.

#include <stdio.h>;

#include <math.h>;

void main()

{

const eps=0.000001;

int i; float x, a, s;

printf("В градусах угол x="); scanf("%f",&x);

x=x*M_PI/180; //градусы переводим в радианы

i=0; a=x; s=a;

do

{

i++;

a=-a*x*x/(2*i*(2*i+1));

s=s+a;

}

while (fabs(a)>eps);

printf("sin(x)=%.6f",s);

}

2) Составить программу вычисления значения π с использованием соотношения

Обсуждение. Изменение знака моделируется соотношением z:=-z;

#include <stdio.h>;

#include <math.h>;

void main()

{

const eps=0.000001;

long i; double z, a, s;

s=1; z=1; i=1;

do

{ i++; z=-z; a=z/(2*i-1); s=s+a;}

while (fabs(a)>1E-6);

s=4*s;

printf("pi=%lf",s);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]