05 [FreeBASIC] - решаем задачи
В этот раз мы немного попрограммируем, порешаем некоторые, пока весьма маленькие, задачки, а заодно и разберёмся что к чему.

Начнём с простеньких задачек.
### По заданному радиусу определить длину окружности и площадь круга.
Здесь нам понадобится три переменные R, S, l
`#lang "qb"`
`R=17`
`l=2*3.1415*R`
`S=3.1415*R*R`
`print "R="; R; " S=";s;" l=";l`
В конце программы нужно сделать паузу, чтобы увидеть результат
`sleep`
Если команда **sleep** без параметра, то программа остановится и будет ждать нажатия клавиши; с параметром - остановится на указанное количество миллисекунд.

Но чтобы решить задачу с другими данными нам нужно изменять каждый раз текст программы, пусть даже маленькую строку `R=17`. А не можно ли чтобы программа в процессе выполнения запрашивала нужные данные?
Для этого есть оператор **INPUT**
используется он так:
`INPUT "подсказка"; переменная, переменная...`
"Подсказка" - произвольный текст, где нужно обьяснить что и сколько параметров программа ожидает, далее идёт одна или несколько переменных.
Перепишем вторую строку - вместо `R=17` напишем
`INPUT "введите величину радиуса"; R`
Теперь можно не изменяя текст программы запускать её много раз и она выдаст результат для разных значений радиуса.
Лучше всё-таки перейти на FreeBASIC)) для этого прийдется ипользуемые переменные объявлять в начале программы, и определять их тип.
*В некоторых системах при выполнении программы вместо русских букв, кириллицы, отображаются непонятные символы. А функции для корректного отображения кириллицы есть во FreeBASIC, для этого и убираем директиву #lang "qb", а в начале программы нужно написать две строки `#include "windows.bi"` и
`SetConsoleCP(1251) : SetConsoleOutputCP(1251)`
Или если используете* `#lang "qb"` *тогда нужно вместо кириллических символов использовать латинские, транслитерацией - vot tak. И всё равно при копировании текста программы из этого окна и вставке его в fbIDE кириллические символы не переносятся, нужно русский текст перенабрать заново*
### Вычислить площадь треугольника по трем его сторонам.
Площадь вычисляется по формуле Герона.

а квадратный корень на FreeBASIC - sqr
в программе нам понадобятся пять вещественных переменных, a,b,c - стороны, промежуточная(вспомогательная) переменная - p для полупериметра, и S - для результата, сохранения пощади треугольника
`Dim as single a,b,c,p,s`
`INPUT "введите длины сторон треугольника"; a,b,c`
теперь нужно вычислить полупериметр
`p=(a+b+c)/2`
саму площадь -
`s=sqr(p*(p-a)*(p-b)*(p-c))`
и вывести результат на экран
`print "Треугольник со сторонами ";a;", ";b;" и ";c;" имеет площадь s=";s`
`sleep`
`#include "windows.bi"`
`SetConsoleCP(1251)`
`SetConsoleOutputCP(1251)`
`Dim as single a,b,c,p,s`
`INPUT "введите длины сторон треугольника"; a,b,c`
`p=(a+b+c)/2`
`s=sqr(p*(p-a)*(p-b)*(p-c))`
`print "Треугольник со сторонами ";a;", ";b;" и ";c;" имеет площадь s=";s`
`sleep`
### Давайте запишем данное трехзначное число задом наперёд, т.е. если у нас дано 678 программа должна вывести 876
Задачу решим двумя способами
Значала чистой математикой))
`input "введите трехзначное число"; a`
первой цифрой будет `a1=int(a/100)``
второй `a2=int(a-a1*100)/10`
а третья как остаток от деления на 10
`a3= a mod 10`
а второй способ через строки(символьные переменные)
сначала преобразуем число в строку
`astr=str(a)`
переь возьмем из поученной строки astr симол справа, посредине и слева и запишем их в новую строку
`rez=right(astr,1)+mid(astr,2,1)+left(a,1)`
и преобразуем строку rez в число
`r=val(rez)`
#### Давайте например определим, тысяча секунд - сколько это? А миллион?
возьмём сначала тысячу секунд
's = 1000',
чтобы узнать сколько здесь минут разделим s на 60
'm = s \ 60'.
Деление мы выберем целочисленное, ведь нам нужно узнать количество полных минут.
А в переменную c запишем остаток, сколько секунд осталось
'c = s mod 60'
Но минут может ведь тоже оказаться слишком много, больше 60 во всяком случае. Поэтому такие же действия произведём и с минутами выделяя из них часы.
'h = m \ 60'
и запишем теперь в минуты оставшиеся не полные минуты
'm = m mod 60'
Далее может оказаться что и часов получилось слишком много))) выделяем из них дни
'd = h \ 24'
а назад в h запишем остаток
'h = h mod 24'
За количество дней в месяце возьмём 30
Так как переменная m занята под минуты мы для переменной под месяц возьмём ms
'ms = d \30'
В d же записываем остаток
'd = d mod 30'
Осталось вывеси результат
'print s;" секунд - это ";ms;" месяцев ";d;" дней ";h;" часов ";m;" минут ";c;" секунд"'
`Dim As LongInt s,m,c,h,d,ms,y`
`s = 1000000000`
`m = s \ 60`
`c = s mod 60`
`h = m \ 60`
`m = m mod 60`
`d = h \ 24`
`h = h mod 24`
`ms = d \30`
`d = d mod 30`
`y=ms\12`
`ms=ms mod 12`
`print s;"секунд это ";y;"год ";ms;"месяц ";d;"день ";h;"часов ";m;"минут ";c;"секунд"`
`sleep`
**Очень многие удивляются тому зачению которое означает миллион секунд)))**
Решая указанные выше задачи можна было столкнуться с некорректными данными, например, когда вместо трехзначного числа человек сознательно или допустив ошибку вводит двух- или четырехзначное число. А в задаче на формулу Герона можно ввести такие стороны треугольника с которым не существует.
Как же быть?
Нужно как то анализировать вводимые данные - об этом в следующих уроках.
### предлагаю самим решить такие задачи
- записать четырехзначное число задом наперёд: 1205 -> 5021
- сделать из трехзначного числа число такого вида: 158 -> 15851
- вычислить диагональ квадрата со стороной а
- вычислить сторону квадрата если известна его диагональ
- вычислить сторону квадрата если известна его площадь

