Smart Task: Решебник задач по информатике

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Smart Task: Решебник задач по информатике » Алгоритмы и Программирование » Создание программ по заданному условию (Lazarus)


Создание программ по заданному условию (Lazarus)

Сообщений 1 страница 7 из 7

1

Задача 1. Составить программу на языке программирования Free Pascal и блок-схему для решения следующей задачи:
Вычислить расстояние между двумя точками с данными координатами  x1, y1  и x2, y2

Решение

Объявим переменные действительного типа x1, y1  и x2, y2 - для хранения координат точек и переменную r - для записи результата нахождения расстояния между этими точками.
Расстояние между точками вычисляется по формуле:
http://help-informatika.ru/pics/zadacha-na-pascal-27-1.JPG
Ввод переменных будет осуществляться с клавиатуры, через InputBox
Разработаем алгоритм программы в  виде блок-схемы:
http://help-informatika.ru/cache/6/86a6cf1b3514f87069e6dbccf9f5459d.JPG

Текст программы  на языке Free Pascal:

Код:
procedure TForm1.Button1Click(Sender: TObject); //начало событийной процедуры
var x1, x2, y1, y2, r: single; //объявление переменных
begin
 x1 := strtofloat(InputBox('Ввод координат', 'Пожалуйста, укажите координату x1', ''));
 x2 := strtofloat(InputBox('Ввод координат', 'Пожалуйста, укажите координату x2', ''));
 y1 := strtofloat(InputBox('Ввод координат', 'Пожалуйста, укажите координату y1', ''));
 y2 := strtofloat(InputBox('Ввод координат', 'Пожалуйста, укажите координату y2', '')); //ввод данных. Так как inputbox получает строковый тип, а нам нужен вещественный, используем strtofloat
r:=sqrt(sqrt(x2-x1)+sqrt(y2-y1));   // вычисление расстояния между точками
ShowMessage('Расстояние - '+floattostr(r));   // вывод результата, переводится обратно в строковый тип.
end;

2

Задача 2. Составить программу на языке программирования Free Pascal с использованием многозначного ветвления
http://s8.uploads.ru/t/wsFQx.png

Решение

Прежде всего, нужно составить блок-схему - она поможет определиться с порядком действий:
http://sa.uploads.ru/t/RsGPZ.png
После того, как составили схему, написание программы - дело техники.

Код:
var x, a, y: real;
begin
 x:=strtofloat(edit1.Text);
 a:=strtofloat(edit2.Text); //ввод данных
 if x > a then
         	 begin
              edit3.Text:=inttostr(1);  // для проверки правильности выбранного пути вычислений
              y:=x*power((x-a), 1/3);
              end
              else if x = a then //начало ветвления
                        	         begin
                        	         edit3.Text:=inttostr(2);
                                   y:=x*sin(x*a);
                       	         end
                        	         else
                                  begin
                                  edit3.Text:=inttostr(3);
                                  y:=exp(-a*x)*cos(a*x);	
                                  end;
edit4.Text:=floattostr(y);//вывод ответа

3

Задача 3. Составить программу на языке программирования Free Pascal для вычисления следующих выражений:
http://s7.uploads.ru/t/fAbpc.png

Решение

Эта задача абсолютно линейна, потому блок-схемы для ее решения не требуется (важно лишь помнить о последовательности "ввод-операция-вывод". Единственный хитрый момент - сама запись этих выражений (s:= power(x, 3)*tan(x+b)*tan(x+b)+a/sqrt(x+b); q:= b*(power(x, 2)-a)/(exp(a*x)-1);
. Для того, чтобы лазарус воспринимал необходимые для решения команды, нужно подключить библиотеку Math. Делаем это в разделе implementation, дописывая Math в строчку к uses. Теперь можно написать код

Код:
var a, b, x, q, s: single; // объявление переменных
begin
     a:= strtofloat(edit1.Text);
     b:= strtofloat(edit2.Text);
     x:= strtofloat(edit3.Text); //ввод данных
     s:= power(x, 3)*tan(x+b)*tan(x+b)+a/sqrt(x+b);
     q:= (b*power(x, 2)-a)/(exp(a*x)-1); //оба выражения
     edit4.Text:= floattostr(s);
     edit5.Text:= floattostr(q); //вывод ответа
end;

4

Задача 4. Составить программу на языке программирования Free Pascal, не используя встроенные min и max
http://sh.uploads.ru/t/C5m3H.png

Решение

Важный кусок блок-схемы, на котором показаны все ветвления http://s2.uploads.ru/t/enpbK.png
Преобразуем получившееся в код

Код:
var x, a, b, f: single;
begin
  x:=strtofloat(edit1.Text); 
  a:=strtofloat(edit2.Text);
  b:=strtofloat(edit3.Text); //ввод данных
  if (x>0) and (x<=1) then
                     	 begin
                      	 f:=(x-a)/x;
                          	if sqrt(a)+x<f then
                                             f:=sqrt(a)+x;
                         	 if sin(x)<f then
                                        f:=sin(x);
                       end
                          else if x>1 then
                                        begin
                                        f:=sqrt(x);
                                        if a*x>f then
                                                 f:=a*x;
                                        end
                                           else
                                           f:=a*x+b;//следуя ветвлениям блок-схемы..
 edit4.Text:=floattostr(f); //вывод ответа
end;

5

Задача 5. Построение правильных многоугольников в среде Lazarus, с заданным количеством углов и длинами сторон.

Решение

Сначала нужно создать форму, на которой следует расположить следующие объекты:     
Button1: TButton;  \\ кнопка для рисования многоугольников
    Edit1: TEdit; \\ содержит количество углов
    Edit2: TEdit;  \\ содержит длину стороны
    Image1: TImage; \\ объект на котором будем рисовать
    Label1: TLabel;  \\ метка для описания интерфейса
    Label2: TLabel;   \\ метка для описания интерфейса.

Теперь необходимо разобраться, как же рисовать сами многоугольники.
Вначале необходимо нарисовать прямую линию нужного размера, это будет основа многоугольника. Затем нужно нарисовать линию того же размера но повернутую на угол вычисленный по формуле (180*(n-2))/n.
Для того чтобы повернуть линию будем использовать формулу:
x := Round(x + dim* cos(u));
y := Round(y - dim* sin(u));
Тут главная переменная u, которая содержит угол поворота линии.
Вот код который строит линию, повернутую на угол u:
form1.Image1.Canvas.Line(x, y, Round(x + dim * cos(u)), Round(y - dim * sin(u)));
x,y – начало линии.
Dim – длинна линии.
Если взять u=(108*(n-2))/n то при программировании не чего не получиться, так как в Lazarus  углы откладываются от одной и той же линии, которая является нулем. Если построить две линии для u=0 и для u=(108*(n-2))/n, то получим:
http://ret-prog.do.am/_pu/0/s58051308.jpg
Горизонтальная линия построенна при угле в нуль градусов. И вторая построенна при угле 0+(108*(n-2))/n
А нам необходим вот этот угол:
http://ret-prog.do.am/_pu/0/s76384120.jpg
Этот угол найти нетрудно он равен 180-(108*(n-2))/n.
Теперь можно переходить к программированию. Вначале необходимо задать начальные значения переменных:
         x:=300;  \\ координата  x начала многоугольника
        y:=600;  \\ координата  y начала многоугольника
     count:=strtoint(edit1.Text);  \\ количество углов многоугольника
     dim:=strtoint(edit2.Text);  \\ длина стороны многоугольника
     p:=pi-((pi*(count-2))/count); \\ вычисление угла в многоугольнике
     u:=0;  \\ значение угла для первой линии многоугольника
Далее необходимо задать цикл который будет строить линии постоянно поворачивая их на угол 180-(108*(n-2))/n, но так как нужно строить не от нуля мы будем прибавлять к старому углу новое значение.
Получим выражение
U:=u+p;
Так как p:= 180-(108*(n-2))/n,
Остается лишь построить линию с такими координатами. Вот весь код обработчика событий для кнопки:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,dim,count,x,y:integer;
  u,p:real;
begin
        Image1.Canvas.Brush.Color:=clwhite;
  Image1.Canvas.Pen.Color:=clblue;
Image1.Canvas.Pen.Width:=5;
  Image1.Canvas.FillRect(0,0,form1.Width,form1.Height);
        x:=300;
        y:=600;
     count:=strtoint(edit1.Text);
     dim:=strtoint(edit2.Text);
     p:=pi-((pi*(count-2))/count);
     u:=0;
     for i:=1 to count do
       begin
           form1.Image1.Canvas.Line(x, y, Round(x + dim * cos(u)), Round(y - dim * sin(u)));\\ строим линию
           x := Round(x + dim* cos(u));\\вычисляем новые координаты
                   y := Round(y - dim* sin(u)); \\вычисляем новые координаты
           u:=u+p; \\ получаем новый угол
       end;
end;

Окно рабочей программы:
http://ret-prog.do.am/_pu/0/s91142783.jpg

6

Задача 6.   В одномерном массиве случайных чисел отыскать первый элемент кратный и 5 и 3. Размер массива равен 100 элементов.

Решение

Понятно, что можно перебрать все элементы, но искомый элемент найдется быстрее, чем через 100 шагов и все остальные шаги будут лишним. Поэтому после нахождения искомого элемента необходимо будет прервать работу цикла.
Задаем массив:
var
   f:array[1..100] of integer;

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
    i,g:integer;
begin
Randomize;
      for i:=1 to 100 do
      begin
          g:=random(500);
          f[i]:=g;
          Memo1.Lines.Append(inttostr(g));
      end;
end;

Процедура поиска:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
    j:integer;
begin
    for j:=1 to 100 do
    begin
        if (f[j] mod 5=0) and (f[j] mod 3=0) then \\ Если найден искомый элемент, то
        begin
          memo2.Lines.Append(inttostr(f[j])+'   №'+inttostr(j)); \\ Записываем этот элемент и его номер
          break;  \\ прекращаем работу цикла
        end;
    end;
end;

Вот окно программы после выполнения 23 циклов поиска:
http://ret-prog.do.am/_pu/0/s16589474.jpg

7

Задача 7. Написать программу для решения квадратного уравнения.

Решение

Начать нужно с самого квадратного уравнения. Из курса алгебры мы знаем, что квадратным уравнением называется уравнение вида ax2+bx+c=0, где x – переменная, a, b и с – некоторые числа, причем a не равно нулю.
Из определения видно, что в уравнении меняются только коэффициенты a, b и c. Вот эти параметры мы и будем вводить в нашу программу, а для этого создадим три поля ввода из компонентов.
Так же из определения следует, что a не равно нулю. В этом случае уравнение не будет квадратным. И это условие мы будем проверять в первую очередь. Создадим кнопку «Решить» и ее разработчике событий при помощи оператора if проверим  условие a не равно нулю. И, если a=0, сообщим что наше уравнение не квадратное.
Вот обработчик событий для кнопки:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c:real;
begin
   a:=strtofloat(edit1.Text);
   b:=strtofloat(edit2.Text);
   c:=strtofloat(edit3.Text);
   if a=0 then  Label4.Caption:='Уравнение не является квадратным';
end;

Теперь необходимо описать, что будет происходить, если же уравнение квадратное. Это тоже будет в том же операторе if  после слова else и при использовании составного оператора.
Если уравнение квадратное, то будем сразу его решать по формуле дискриминанта и корней квадратного уравнения. Дискриминант найдем по формуле:  D:=b*b – 4*a*c; Если дискриминант меньше нуля то уравнение не имеет решений. Это опишется так:
If d<0 then label4. Caption:=’Уравнение не имеет решений’ else …
А после else пойдет непосредственный поиск корней уравнения по формулам:
X1:=(-b+sqrt(D))/2*a;
X2:=(-b-sqrt(D))/2*a;
Вот полный код оператора if:

Код:
if a=0 then  Label4.Caption:='Уравнение не является квадратным' else
     begin
       D:=b*b-4*a*c;
       if d<0 then Label4.Caption:='Уравнение не имеет решений' else
           begin
               X1:=(-b+sqrt(D))/2*a;
               X2:=(-b-sqrt(D))/2*a;
               Label4.Caption:='X1='+floattostr(x1)+'   X2='+floattostr(x2);
           end;
     end;

Вы здесь » Smart Task: Решебник задач по информатике » Алгоритмы и Программирование » Создание программ по заданному условию (Lazarus)


Рейтинг форумов | Создать форум бесплатно