Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОАП_решения_задачи

.pdf
Скачиваний:
104
Добавлен:
26.03.2015
Размер:
1.69 Mб
Скачать

11

Тема 3 Разветвляющиеся алгоритмы

Задача 3.1.

Написать программу, выводящую значение истина если выполняется заданное условие.

* Указанные в варианте переменные ввести с клавиатуры * только одна из логических переменных a, b и с имеет значение true;

#include "stdafx.h" #include <iostream> #include <locale>

int main ()

{

setlocale (LC_CTYPE, "Russian");

std::cout << "Введите a, b и c" << std::endl; int a, b, c;

std::cin >> a >> b >> c;

(a && !b && !c) || (!a && b && !c) || (!a && !b && c) ? std::cout << "Истина" << std::endl : std::cout << "Ложь" << std::endl;

return 0;

}

Задача 3.2.

Написать программу, выводящую значение истина если выполняется заданное условие. Указанные в варианте переменные ввести с клавиатуры числа x,y,z равны между собой;

#include "stdafx.h" #include <iostream> #include <stdio.h> #include <cmath> using namespace std;

12

int _tmain(int argc, _TCHAR* argv[])

{

setlocale (LC_CTYPE, "Russian");

char x,y,z; cout<<"Введите Х:"<<endl; cin>>x;

cout<<"Введите Y:"<<endl; cin>>y;

cout<<"Введите Z:"<<endl; cin>>z;

cout<<endl;

if (x==y && x==z)

{

cout<<"Правда"<<endl;

}

else {cout<<"Ложь"<<endl;}

return 0;

}

Задача 3.3.

Определить, равна ли сумма двух первых цифр заданного четырехзначного числа, сумме двух его последних цифр.

#include "stdafx.h" #include <iostream> #include <stdio.h> using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { setlocale (LC_CTYPE, "Russian"); unsigned int ch,a,b,c,d;

cout<<"Здравствуйте!!! Задайте четырёхзначное число: "; cin>>ch;

if (ch>=1000&&ch<=9999) { d=ch%10; //единицы ch/=10;

13

c=ch%10; //десятки ch/=10;

b=ch%10; //сотни ch/=10;

a=ch%10; //тысячи if (a+b==c+d)

cout<<"Сумма двух первых цифр заданного четырехзначного числа РАВНА сумме двух его последних цифр"<<endl;

else cout<<"Сумма двух первых цифр заданного четырехзначного числа HE РАВНА сумме двух его последних цифр"<<endl;

}

else cout<<"Вы ввели НЕ четырёхзначное число. Попробуйте ещё раз!"<<endl; cout<<"Спасибо за выполнение!!!";

system ("Pause"); return 0;

}

Задача 3.4

Выполнить задание, используя условные операторы. Даны числа a, b, c, d. Если a<=b<=c<=d, то каждое число заменить наибольшим, если a>b>c>d, то числа - без изменений, /в противном случае все числа заменить их квадратами

#include "stdafx.h" #include <iostream> #include <cmath> using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

int a,b,c,d;

cin>> a>>b>>c>>d;

if (a<=b && b<=c && c<=d) {a=d;

b=d;

c=d;

}

else

if (a>b && b>c && c>d);

14

else { a=a*a; b=b*b; c=c*c; d=d*d;

}

cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl;

return 0;

}

Задача 3.5

Определить есть ли среди заданных целых чисел A, B, C, D хотя бы два чётных.

#include "stdafx.h" #include <iostream> #include <stdio.h> using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { setlocale (LC_CTYPE, "Russian"); int A,B,C,D;

cout<<"Здравствуйте!!! Задайте числа A,B,C,D:"<<endl; cin>>A>>B>>C>>D;

if (A%2==0&&B%2==0|A%2==0&&C%2==0|A%2==0&&D%2==0|B%2==0&&C%2==0|B%2==0&&D%2==0|C%2==0&&D %2==0)

cout<<"Среди заданных значений ЕСТЬ хотя бы два чётных числа"<<endl; else cout<<"Среди заданных значений НЕТ хотя бы двух чётных"<<endl; cout<<"Спасибо за выполнение!!!";

system ("PAUSE"); return 0;

}

Задача 3.6

Даны x, y, z вещественные числа. Существует ли треугольник с длинами сторон x, y, z? Если существует, то ответить – является ли он остроугольным

#include "stdafx.h" #include <iostream> using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { setlocale (LC_CTYPE, "Russian"); float a,b,c;

cout<<"Здравствуйте!!! Задайте стороны треугольника:"<<endl; cin>>a>>b>>c;

if (a>0|b>0|c>0)

{if (a<=b+c&&b<=a+c&&c<=a+b)

,cout<<"Заданные числа МОГУТ быть сторонами треугольника. "; if (a==b && b==c)

15

cout<<"Треугольник равносторонний."<<endl;

else {if(a==b|b==c|a==c)

cout<<"Треугольник равнобедренный."<<endl; else cout<<"Треугольник разносторонний."<<endl;

}

}

else cout<<"Заданные числа НЕ МОГУТ быть сторонами треугольника."<<endl;

}

else cout<<"Вы ввели числа меньшие нуля. Стороны треугольника не могут быть отрицательными числами. Попробуйте ещё раз!";

cout<<"Спасибо за выполнение!"; system ("PAUSE");

return 0;

}

Задача 3.7

На шахматной доске стоят черный король и три белые ладьи (ладья бьет по горизонтали и вертикали). Проверить, не находится ли король под боем, а если есть угроза, то от кого именно.

Замечание: поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит 8: первое - номер вертикали, второе - номер горизонтали.

Позиции фигур заданы натуральными числами

#include "stdafx.h" #include <iostream> #include <cmath> using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

setlocale (LC_CTYPE, "Russian");

int x,c,v,b,n,m,a,s;

cout<<"Введите координаты короля"<<endl; cin>>x>>c;

cout<<"Введите координаты ладьи №1"<<endl; cin>>v>>b;

cout<<"Введите координаты ладьи №2"<<endl; cin>>n>>m;

cout<<"Введите координаты ладьи №3"<<endl; cin>>a>>s;

if ((x==v)||(c==b))

 

cout<<"Под боем ладьи №1"<<endl;

else

if ((x==n)||(c==m))

 

cout<<"Под боем ладьи №2"<<endl;

else

if ((x==a)||(c==s))

cout<<"Под боем ладьи №3"<<endl;

else

cout<<"НЕ ПОД БОЕМ"<<endl;

return 0;

}

Задача 3.8

Голодная зима. Суточный рацион коровы составляет и кг сена, v кг силоса и w кг комбикорма. В хозяйстве, содержащем стадо из k голов, осталось s центнеров сена, t тонн силоса и f мешков комбикорма по 50 кг. Сколько еще дней хозяйство сможет кормить коров по полному рациону? Какой из кормов кончится раньше других?

// lab5_4.cpp : Defines the entry point for the console application.

//

#include "stdafx.h" #include <locale> #include <iostream> #include <cmath> #include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])

{

setlocale (LC_CTYPE, "Russian"); using namespace std;

int n,v,w,k,s,t,f,ceno,cilos,kombik;

cout<<"Введите суточный рацион коровы сена кг:"<<endl; cin>>n;

cout<<"Введите суточный рацион коровы силоса кг:"<<endl; cin>>v;

cout<<"Введите суточный рацион коровы комбикорма кг:"<<endl; cin>>w;

cout<<"Введите кол-во оставшегося сена ц:"<<endl; cin>>s;

cout<<"Введите кол-во оставшегося силоса т:"<<endl; cin>>t;

cout<<"Введите кол-во мешков оставшегося комбикорма:"<<endl; cin>>f;

cout<<"Введите кол-во коров:"<<endl; cin>>k;

17

ceno=(100*s)/(k*n);

cilos=(1000*t)/(k*v);

kombik=(50*f)/(k*w);

if (ceno==0||cilos==0||kombik==0) cout<<"Корма не хватит ни на один день"<<endl; else {

if (ceno<=cilos && ceno<=kombik) cout<<"Прокормят еще "<<ceno<<" дней. Первым закончится сено"<<endl;

if (cilos<=ceno && cilos<=kombik) cout<<"Прокормят еще "<<cilos<<" дней. Первым закончится силос"<<endl;

if (kombik<=cilos && kombik<=ceno) cout<<"Прокормят еще "<<kombik<<" дней. Первым закончится комбикорм"<<endl;

}

return 0;

}

18

Тема 4 Циклические конструкции и итерационные алгоритмы

Задача 4.1

n ln n

Найти сумму 13 членов ряда, в котором an (ln n)n

Описание алгоритма

Очевидно, что процесс подсчета суммы членов ряда должен быть итерационным: следует повторять вычисления по одной и той же формуле при значениях k =0, 1, 2, ... . В каждой итерации цикла следует выполнять вычисления по заданной формуле для текущего значения k, т.е. подсчитывать очередной член ряда. Полученное значение следует прибавлять к переменной, которая представляет сумму. Эта переменная в каждой итерации будет содержать в себе сумму всех уже обработанных членов ряда, следовательно, ее начальное значение (когда ни один член еще не обработан) должно быть 0. После вычисления суммы следует вывести значение суммы. После вычисления каждого члена ряда (но до прибавления его значения к сумме) следует сравнить полученное значение с заданным пределом точности. Из-за того, что значение члена ряда может быть как положительным, так и отрицательным, при сравнении следует использовать абсолютное значение. Если абсолютное значения члена ряда не превышает предела точности, следует закончить вычисления: выйти из цикла напечатать значение суммы и завершить программу.

Алгоритм вычисления zk

Для выполнения возведения в степень можно применить библиотечную функцию pow(x,y) . Но есть возможность получения этого значения более эффективным способом. В каждой следующей итерации цикла значение этого выражения вдвое больше, чем в предыдущей. Так что, будет целесообразно выделить отдельную переменную для сохранения значения zk. Ее начальное значение должно быть z0 = 1, а в конце каждой итерации оно должно увеличиваться в z раз.

Алгоритм вычисления (-1)k

В этом случае также нецелесообразно применять функцию возведения в степень. Значение этого выражения будет 1 при четных значениях k и -1 - при нечетных. Так что, можно выделить переменную для сохранения значения этого выражения. Ее начальное значение должно быть (-1)0=1, а в конце каждой итерации оно должно менять знак на противоположный.

#include "stdafx.h" #include <stdio.h> #include <cmath>

void main(void)

{

float S=0,a,s,p; int n;

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

{

s=pow((float)n,log((float)n)); p=pow(log((float)n),(float)n); a=s/p;

S+=a;

}

19 printf("S=%1.6f\n",S);

}

Задача 4.2

Сравнить cos(x), полученный расчетным путем (с заданной точностью) и с помощью функции

#include "stdafx.h" #include <stdio.h> #include <cmath>

void main(void)

{

int i, j, n, F; float x, e, s, k,d;

printf("x="); scanf("%f",&x); printf("e="); scanf("%f",&e); i = 0;

n = 1; s = 1; do

{

F = 1;

for (j=1; j<=2*n; j++)

F = F * j; // считаем факториал k=pow((float)-1,(float)n)*pow((float)x,(float)2*n)/F; s=s+k;

n=n+1;

}

while (fabs((float)k) > e); d=cos(x); printf("cos(x)=%1.12f\n",d); printf("s=%1.12f\n",s);

}

Задача 4.3

Проверить чисденно первый замечательный предел, задавая x значения 1, 1/2, 1/4, 1/8,... до тех пор, пока

20

левая часть равенства не будет отличаться от правой менне чем на заданную погрешность е.

#include "stdafx.h" #include <stdio.h> #include <cmath>

#define p 1 //левая часть

void main(void)

{

//объявление переменных

double s;

//правая часть

float n=1,eps;

 

int i=0;

//число шагов

//инициализация переменных printf("eps="); scanf("%f", &eps); //вычисления

do

{

s=sin(n)/n;

n=n*1/2;

i++;

}

while(p-s>=eps); //вывод результатов

printf("Right part %1.20f\n", s); printf("Number of steps %d\n", i);

}

Задача 4.4

Составить алгоритм решения ребуса РАДАР=(Р+А+Д)^4 (различные буквы означают различные цифры, старшая - не 0).

#include "stdafx.h" #include <stdio.h> #include <locale> #include <math.h>

int main ()