Примеры решения типовых задач
Задача 2.1. Программа позволяет угадать возраст Вашего дедушки, который может находиться в интервале от 45 до 109 лет.
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int high,mid,low,k=1,year,found;
char ch;
setlocale (NULL, ".1251");
// установить базовое число для генератора случайных чисел
srand((unsigned)time(NULL));
// Функция rand() генерирует псевдосучайные числа
// от 0 до RAND_MAX (RAND_MAX=32767), которые далее
// преобразуются к требуемому диапазону
do
{
found = 0;
low = rand()%10 + 45; cout << "min="<<low<<endl;
high = rand()%30 + 80;cout << "max="<<high<<endl;
cout<<"Хотите, я угадаю, сколько лет "<<endl;
cout<<"(от "<<low<<" до "<<high<<" ) Вашему дедушке(y/n)"<<endl;
k=1; ch=_getch(); if(ch != 'y' && ch != 'Y')break;
// Для поиска применен метод дихотомии (половинного деления
// интервала)
while (low<=high && !found)
{
mid = (low+high)/2;
cout<<"Вашему дедушке "<<mid<<" лет(y/n)?";
cin>>ch;
if (ch == 'y' || ch == 'Y')
{
cout<<"\n Ура! Я угадал за "<<k<<" попыток";
found = 1;
}
else
{
m2: cout<<"Больше(>) или меньше(<)? ";
cin>>ch;
if (ch == '>')
low = mid+1;
else if (ch=='<')
high=mid-1;
else
{
cout<<"Нажмите Shift+знак(< или >)"<<'\n';
goto m2;
}
k++;
}
}
cout<<"\n\n Еще(y/n)? ";
ch=_getch();
}
while(ch=='y' || ch=='Y');
return 0;
}
Задача 2.2. Есть отрезки труб длиной a метров и b метров (a < b). Сколько тех и других потребуется, чтобы проложить трубопровод заданной длины T с минимальным числом сварных швов? (Трубы разрезать нельзя!).
Замечание. Задача всегда имеет решение при a=3, b=5, если T>7.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int t3,t5,T; int a=3, b=5;
setlocale (NULL, ".1251");
printf("длина трубопровода?"); cin>>T;
t3=0;
while(t3<=T/a)
{
t5=(T-a*t3)/b;
if(a*t3+b*t5 == T)
{cout<<a<<"-м: "<<t3<<endl;
cout<<b<<"-м: "<<t5<<endl;
break;
}
else
t3++;
}
if(t3>T/a)
cout<<"Нельзя построить";
_getch(); return 0;
}
Задача 2.3. Программа реализует правило, согласно которому покупателю с 1 гривны всегда выдаётся сдача наименьшим количеством монет. Например, если стоимость покупки 24 коп., то продавец, руководствуясь этим правилом, должен дать сдачу набором монет: 50, 25, 1.
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{ int t, s;
setlocale (NULL, ".1251");
while(1)
{
printf("Сколько стоит покупка?");
scanf("%d",&s);
if(s >= 0 && s <= 100) break;
}
t = 100-s;
printf("Вот ваша сдача:");
while (t>=50)
{ t-=50; printf(" 50 "); }
while (t>=25)
{ t-=25; printf(" 25 "); }
while (t>=10)
{ t-=10; printf(" 10 "); }
while (t>=5)
{ t-=5; printf(" 5 "); }
while (t>=2)
{ t-=2; printf(" 2 "); }
while (t>=1)
{ t-=1; printf(" 1 "); }
getch(); return 0;
}
Задача 2.4. Заданное натуральное число М разложить на простые натуральные множители. Так, если М = 5784, то результат должен быть таким: 5784=1*2*2*2*3*241
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
int i,M;
setlocale (NULL, ".1251");
printf("введи М ");
scanf("%d",&M);
printf("%d =1",M);
for( ; M%2==0; M/=2)
printf("*2");
for( i=3; i <= M; )
if(M%i == 0)
{ printf("*%d",i); M/=i; }
else
i+=2;
getch(); return 0;
}
Задача 2.5. Изобразить показанный ниже равнобедренный треугольник заданной высоты Н, заполненный символом ª (код 05). Вершина фигуры должна находиться в 40-й колонке экрана.
ª
ªªª
ªªªªª
ªªªªªªª
ªªªªªªªªª
ªªªªªªªªªªª
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int k, h, x, y;
setlocale (NULL, ".1251");
cout<<"Введи высоту треугольника ==> ";
cin>>h;
for(y=1; y<=h; y++)
{
for (x=0; x <= 40 - y; x++)
cout<<" ";
for ( k=1; k<=2*y-1; k++)
cout<<'\05';
cout<<endl;
}
_getch(); return 0;
}