05 [FreeBASIC] - решаем задачи

F
freebs
В этот раз мы немного попрограммируем, порешаем некоторые, пока весьма маленькие, задачки, а заодно и разберёмся что к чему. ![](https://serey.io/imageupload_data/26dd3fe483bf177bb55801d20fb984b663b448d0) Начнём с простеньких задачек. ### По заданному радиусу определить длину окружности и площадь круга. Здесь нам понадобится три переменные 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** без параметра, то программа остановится и будет ждать нажатия клавиши; с параметром - остановится на указанное количество миллисекунд. ![](http://ipic.su/img/img7/fs/4.1529090401.jpg) Но чтобы решить задачу с другими данными нам нужно изменять каждый раз текст программы, пусть даже маленькую строку `R=17`. А не можно ли чтобы программа в процессе выполнения запрашивала нужные данные? Для этого есть оператор **INPUT** используется он так: `INPUT "подсказка"; переменная, переменная...` "Подсказка" - произвольный текст, где нужно обьяснить что и сколько параметров программа ожидает, далее идёт одна или несколько переменных. Перепишем вторую строку - вместо `R=17` напишем `INPUT "введите величину радиуса"; R` Теперь можно не изменяя текст программы запускать её много раз и она выдаст результат для разных значений радиуса. Лучше всё-таки перейти на FreeBASIC)) для этого прийдется ипользуемые переменные объявлять в начале программы, и определять их тип. *В некоторых системах при выполнении программы вместо русских букв, кириллицы, отображаются непонятные символы. А функции для корректного отображения кириллицы есть во FreeBASIC, для этого и убираем директиву #lang "qb", а в начале программы нужно написать две строки `#include "windows.bi"` и `SetConsoleCP(1251) : SetConsoleOutputCP(1251)` Или если используете* `#lang "qb"` *тогда нужно вместо кириллических символов использовать латинские, транслитерацией - vot tak. И всё равно при копировании текста программы из этого окна и вставке его в fbIDE кириллические символы не переносятся, нужно русский текст перенабрать заново* ### Вычислить площадь треугольника по трем его сторонам. Площадь вычисляется по формуле Герона. ![](https://i.imgur.com/8Tlmlxl.png) а квадратный корень на 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 - вычислить диагональ квадрата со стороной а - вычислить сторону квадрата если известна его диагональ - вычислить сторону квадрата если известна его площадь

Comments