Как написать программу для вычисления формулы

0 / 0 / 1

Регистрация: 03.11.2020

Сообщений: 8

1

Создать программу для расчета формулы

03.11.2020, 22:01. Показов 9570. Ответов 8


Ребят , очень нужна помощь , не могу разобраться с данной задачей , заранее спасибо!

Создать программу для расчета формулы

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



0 / 0 / 1

Регистрация: 03.11.2020

Сообщений: 8

03.11.2020, 22:14

 [ТС]

2

b = 47.4
c = 25
D = 2.6
E = 2.3

a = b + c — (D / (E + b))
только не могу понять как правильно написать код под это дело



0



Gdez

6970 / 3893 / 1741

Регистрация: 27.03.2020

Сообщений: 6,702

03.11.2020, 22:18

3

PeTp0,

Python
1
2
3
4
5
b = 47.4
c = 25
D = 2.6
E = 2.3
print(b + c - (D / (E + b)))



0



0 / 0 / 1

Регистрация: 03.11.2020

Сообщений: 8

03.11.2020, 22:28

 [ТС]

4

Спасибо , но я хочу разобраться как написать программу для вычисления по формуле



0



Gdez

6970 / 3893 / 1741

Регистрация: 27.03.2020

Сообщений: 6,702

03.11.2020, 22:35

5

PeTp0,

Python
1
2
3
b, c, D, E = map(float(input().split()))
a = b + c - (D / (E + b))
print(a)

Или условия, что именно требуется…



0



isaak

158 / 91 / 25

Регистрация: 17.10.2010

Сообщений: 1,064

03.11.2020, 23:02

6

Цитата
Сообщение от Gdez
Посмотреть сообщение

Python
1
2
b, c, D, E = map(float(input().split()))
a = b + c - (D / (E + b))

print(a)

Как вводить данные, ошибка выскакивает??????

Миниатюры

Создать программу для расчета формулы
 



1



Gdez

6970 / 3893 / 1741

Регистрация: 27.03.2020

Сообщений: 6,702

03.11.2020, 23:07

7

isaak,

Python
1
2
3
b, c, D, E = map(float,input().split())
a = b + c - (D / (E + b))
print(a)

Извиняюсь



1



PeTp0

0 / 0 / 1

Регистрация: 03.11.2020

Сообщений: 8

05.11.2020, 23:07

 [ТС]

8

Лучший ответ Сообщение было отмечено Рыжий Лис как решение

Решение

Спасибо ребята) разобрался , в общем должно было выглядеть вот так:

Python
1
2
3
4
5
6
b=float(input( 'b='))
c=int(input( 'c='))
D=float(input(' D='))
E=float(input(' E='))
a = b + c - (D / (E + b)) 
print('a=' , a )

вдруг кому-нибудь понадобится



0



Модератор

Эксперт функциональных языков программированияЭксперт Python

33998 / 19004 / 4007

Регистрация: 12.02.2012

Сообщений: 31,860

Записей в блоге: 13

06.11.2020, 07:44

9

Не по теме:

Цитата
Сообщение от PeTp0
Посмотреть сообщение

вдруг кому-нибудь понадобится

— какая щедрость!

Добавлено через 1 минуту
isaak, добрый совет: не начинай с заглавных букв имена простых переменных. Заглавные буква — для имен классов!



0



Одна из распространенных задач в практических или лабораторных работах по C++ — это вычисление по формуле. Сами по себе такие задачи не отличаются сложностью, но нередко требуется введение данных с клавиатуры – вот здесь и могут вылезти некоторые подводные камни визуал студио C++.

Итак, предположим, что нам надо решить вариант номер 6 из задания ниже:

Быстренько набрасываем вот такой вот код в консольном приложении C++:

И, увы, видим, следующие ошибки:

То есть, компилятор пишет что нужно проверить scanf, и используется тип данных не double, a double. Добавляем & перед переменной и теперь получаем новую ошибку:

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

Еще немного меняем код, используем scanf_s:

Теперь компилируется без ошибок, но ничего не выводит на экран. В чем же проблема? Надо преобразовать double перед выводом в printf. Итак, конечный код будет такой:

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

int _tmain(int argc, _TCHAR* argv[])
{
double x, y, a, c; 

printf("Enter xn"); 

scanf_s("%lf", &x); 
a = pow(x, 3) - 0, 8 * x - 0, 75; 
if (a == 0) 
{ 
printf("Error"); 
} 
else 
{ 
c = cos(x); 
if (c == 0) 
{ 
printf("Error"); 
} 
else 
{ 
y = (7, 3 * pow(x, 3) + pow(tan(x), 1 / 5)) / (pow(x, 3) - 0, 8 * x - 0.75); 
printf("%3fn", y); 
_getch(); 
} 
} 
return 0; 
}


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си плюс плюс, формулы, вычисления, visual studio

Практическая
работа 4

Тема:
Запись
математических выражений на языке
Pascal

Цель:
Научиться записывать математические
выражения на языке Pascal.

Теория

Выражение
– это правило вычисления значения. В
выражении участвуют операнды,
объединенные знаками
операций.
Операндами
могут быть константы, переменные и
вызовы функций. Операции выполняются
в определенном порядке в соответствии
с приоритетами.
Порядок
выполнения операций изменяется круглыми
скобками.

Правила
записи математических выражений:

  1. все
    символы пишутся в одну строку;

  2. нельзя
    пропускать знаки действий; два подряд
    идущих знака разделяют скобками;

  3. приоритет:

    1. унарные
      операции (смена знака), вычисление
      значения функции;

    2. *,
      /, div,
      mod;

    3. +,
      -;

  4. целая
    и дробная часть числа разделяются
    точкой;

  5. Аргументы
    функций записываем в круглых скобках;

  6. в
    тригонометрических функциях углы
    записываются в радианах.

Математическая
запись

Запись
на языке Паскаль

=3,14159…

Pi

cos
x

Cos
(
x)

sin
x

Sin
(
x)

tg
x

Sin
(
x)
/
Cos
(
x)

ctg
x

Cos
(
x)
/
Sin
(
x)

arctg
x

Acrtan
(x)


абсолютное
значение числа
x

Abs
(
x)

Дробная
часть числа
x

Frac
(
x)


целая часть числа
x

Int
(
x)

Ln
x
– натур. логарифм числа
x

Ln
(x)

Lg
x

0.4*Ln(x)

Ln(a)/Ln(b)

Генератор
случайных величин – выдает случайное
число из интервала [0;1)

Random

Генератор
случайных величин – выдает случайное
число из интервала [0;
x)

Random
(x)

x2

Sqr
(x)

Sqrt
(x)

ex

Exp
(x)

Exp
(y * Ln (x))

Exp(a
/
b
*
Ln
(
x))

Перевод
градусов в радианы

x
* Pi / 180

Пример:
Записать
на языке Паскаль выражения:

1);

2)

Для
проверки синтаксиса программы наберите
программу, вычисляющую значение z
и f.

Например,
вычислим сумму и произведение чисел x
и y.

program
a1;{название программы}

var
x,y,z,f:real;{раздел описания переменных}

begin
{начало}

writeln
(‘Vvedite x,y’); {сообщение о том, значения
каких переменных нужно ввести}

readln(x,y);
{ввод значений}

z:=x+y;{вычисление
z}

f:=x*y;{вычисление
f}

writeln(‘z=’,z:4:2,’
‘,’f=’,f:4:2);{вывод значений на экран}

end.
{конец}

Для
x
= 12.355, y
= 2.3 получим z
= 14.66 и f=28.42.
Ввод чисел через пробел и завершить
нажатием клавиши «Enter»
или нажатием клавиши «Enter»
после записи каждого числа.

варианта

Задание
1. Запишите на языке
Pascal

Задание
2. Запишите на языке
Pascal

Подсказка

program
a1;{название программы}

var
x,y,z,f:real;{раздел описания переменных, вы
берете переменные из вашего задания}

begin
{начало}

writeln
(‘Vvedite x,y’); {меняете на свои переменные}

readln(x,y);
{перечисляем имена своих переменных}

z:=x+y;{вычисление
z
– записываем свою формулу}

f:=x*y;{вычисление
f
– записываем свою формулу}

writeln(‘z=’,z:4:2,’
‘,’f=’,f:4:2);{вывод значений на экран не
изменяем}

end.
{конец}

Для
запуска
программы

нажимаем клавишу F10,
клавишами движения курсора переходим
на команду меню «RUN»,
нажимаем дважды «Enter».
Для
просмотра

– Alt
+ F5.

Контрольные
вопросы:

1)
Что такое выражение?

2)
Перечислите правила записи математических
выражений.

Практическая
работа 5

Тема:
Составление
линейных программ. Вычисление по формулам

Цель:
Научиться решать линейные задачи,
применяя вычисления по формуле.

Теория

Пример.
Найти решение значения функции
,
еслии,
гдеa=
1, b=2,
c=3.

1.
Математическая модель:

Чтобы
найти z,
нужно выполнить

вычисления в
следующей

последовательности:

  1. Ввести
    значения a,
    b,
    c;

  2. Вычислить
    x;

  3. Вычислить
    y;

  4. Вычислить
    z;

  5. Вывести
    значение z
    на экран

2.
Алгоритмический язык:

алг
a1

арг
a,
b,
c
(вещ)

рез
x,
y,
z
(вещ)

нач

ввод
a, b, c

вывод
z

кон

  1. Блок-
    схема.

4.
Программа:

program
a1;

uses
crt; {модуль
работы с экраном}

var
a,b,c,x,y,z: real; {описание
переменных}

begin

writeln(‘Введите
a,b,c’); {сообщение
о том, какие переменные вводить}

readln
(a,b,c);

x:=2*a+3*b+c;

y:=1/x;

z:=sqrt
(abs(y+x));

writeln(‘z=’,z:6:2);

readkey;
{позволяет
просмотреть результат, ждет нажатия
любой клавиши на клавиатуре}

end.

Задание.
Запишите математическую модель, алгоритм
на языке блок-схем, на алгоритмическом
языке и на языке программирования
решение задачи нахождения значения
z
, если известны значения
a,
b,
c
и зависимости переменных
x
и
y
.

Вариант
1

,

,
,
где
a=2,1,
b=0,3,
c=1,02.

Вариант
2

,

,

, где
a=2,6,
b=5,1,
c=0,3.

Вариант
3

, , ,
где a=2,6, b=7,21, c=0,25.

Вариант
4

,
,


, где a=4,3, b=1,2, c=0,4.

Вариант
5

,

,

,
где
a=4,03,
b=1,32,
c=0,06.

Вариант
6

, , ,
где
a=1,2,
b=3,2,
c=0.

Вариант
7

,

,

,
где a=4,02, b=0,1, c=2,05.

Вариант
8

,

,

,
где a=2,04, b=0,5, c=4.

Вариант
9

,

,

,
где a=5,5, b=0,4, c=3,02.

Вариант
10

,

,

,
где a=0,7, b=2, c=1.

Вариант
11

,

,

,
где a=0,3, b=4,5, c=0,2.

Вариант
12

,
,,
где
a=2,1,
b=0,6,
c=1.

Вариант
13

,

, ,
где
a=0,5,
b=6,
c=0,3.

Вариант
14

,

,

,
где
a=1,2,
b=5,1,
c=2.

Вариант
15

,

,

,
где
a=2,3,
b=5,3,
c=0,4.

Вариант
16

,

,

,
где
a=1,3,
b=5,1,
c=0,3.

Вариант
17

,

,

,
где
a=2,4,
b=0,1,
c=2,3.

Вариант
18

,

,

,
где
a=1,8,
b=9,1,
c=3.

Вариант
19

,



,
где
a=4,2,
b=0,3,
c=1,5.

Вариант
20

,

,
где
a=0,5,
b=4,7,
c=0,2.

Вариант
21

,

,

,
где
a=4,5,
b=7,
c=3,2.

Вариант
22

,

,

,
где a=0,25,
b=1,7,
c=9.

Вариант
23

,

,

,
где
a=0,5,
b=3,2,
c=4,1.

Вариант
24

,

,

,
где
a=7,1,
b=0,8,
c=3,2.

Вариант
25

,

,

,
где
a=1,1,
b=2,5,
c=3,1.

Вариант
26

,

,

,
где
a=5,6,
b=3,7,
c=0,1.

Вариант
27

,

,

,
где
a=1,3,
b=4,8,
c=1,2.

Вариант
28

,

,

,
где
a=5,6,
b=2,
c=3,2.

Вариант
29

,

,

,
где
a=1,2,
b=3,02,
c=0,2.

Вариант
30

,

,

,
где
a=0,4,
b=5,1,
c=2.

Вариант
31

,

,

,
где
a=2,1,
b=3,5,
c=2,8.

Вариант
32

, ,

,
где
a=4,8,
b=0,5,
c=3,2.

Вариант
33

,

, ,
где
a=2,4,
b=1,2,
c=3,4.

Вариант
34

, , ,
где
a=0,8,
b=0,5,
c=0,4.

Вариант
35

, ,

,
где
a=1,2,
b=3,5,
c=1,7.

Контрольные
вопросы: 1) Назовите формат операторов
ввода, вывода и присвоения.

2)Как
записываются математические выражения
на языке Паскаль?

Практическая
работа 6

Тема:
Составление
линейных программ в математических
задачах

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

Теория

ЛИНЕЙНЫМИ
АЛГОРИТМАМИ

называются
алгоритмы, в которых все этапы решения
задачи выполняются строго последовательно

н


Program
название;


Var
список
переменных : тип
;

Begin


Операторы;

End.

ач

действие
1

действие
2

действие
n

кон

Пример:
Определить расстояние на плоскости
между двумя точками с заданными
координатами M1(x1,y1) и M2(x2,y2)
Этапы
решения задачи:

  1. Математическая
    модель:

    расстояние на плоскости между двумя
    точками M1(x1,y1) и M2(x2,y2) высчитывается по
    формуле

  2. Составим
    блок-схему
    алгоритма

Переведем
блок-схему наязык
Паскаль
.

program
a1;

var
x1, x2, y1, y2: integer;

d:real;

begin

write(‘x1=
‘); readln(x1);

write(‘y1= ‘);readln(y1);

write(‘x2= ‘);readln(x2);

write(‘y2=
‘);readln(y2);

d:=Sqrt(Sqr(x2-x1)+Sqr(y2-y1));

writeln(‘d=’,d);

end.

Алгоритмический
язык

алг
а1

арг
x1,x2,y1,y2
(
цел)

рез

d
(
вещ)

нач

ввод
x1,
x2,
y1,
y2

вывод
d

кон

Индивидуальное
задание

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

Вариант
1

  1. Вычислить
    длину окружности и площадь круга одного
    и того же заданного радиуса R.

  2. Найти
    синус одного из углов треугольника со
    сторонами а, b, с.

Вариант
2

1.
Заданы координаты трех вершин треугольника
(х1 , у1,), (х2 , y2), (х3, У3). Найти его периметр.

2.
Даны два действительных числа х и у.
Вычислить их сумму, разность, произведение
и частное.

Вариант
3

  1. Написать
    программу, которая выводит на экран
    первые четыре степени числа .

  2. Вычислить
    периметр и площадь прямоугольного
    треугольника по длинам а и b двух катетов.

Вариант
4

1.
Дана длина ребра куба. Найти площадь
грани, площадь полной поверхности и
объем этого куба.

2.
Три сопротивления R1 , R2 , R3 соединены
параллельно. Найдите сопротивление
соединения.

Вариант
5

1.
Дана сторона равностороннего треугольника.
Найти площадь этого треугольника,

его
высоту, радиусы вписанной и описанной
окружностей.

2.
Известна длина окружности. Найти площадь
круга, ограниченного этой окружностью.

Вариант
6

1.
Составить программу для вычисления
пути, пройденного лодкой, если ее скорость

в
стоячей воде V
км/ч, скорость течения реки V1
км/ч, время движения по озеру t1 ч, а
против течения реки — t2 ч.

2.
Найти радиус основания конуса, если
даны высота и объем конуса.

Вариант
7

1.
Найти площадь кольца, внутренний радиус
которого равен r, а внешний — R (R> r).

2.
Треугольник задан величинами своих
углов (в градусах) и радиусом описанной
окружности. Найти стороны треугольника.

Вариант
8

1.Найти
площадь равнобедренной трапеции с
основаниями а, b и углом 
при большем основании а.

2.
Вычислить корни квадратного уравнения
ах2+
bх + с = 0 с заданными коэффициентами a, b
и с (предполагается, что а ≠ 0 и что
дискриминант уравнения неотрицателен).

Вариант
9

  1. Вычислить
    высоты треугольника со сторонами а, b,
    с. Высоты можно выразить из формулы:
    ,
    где

  2. Составить
    программу вычисления объема цилиндра
    и конуса, которые имеют одинаковую
    высоту Н и одинаковый радиус основания
    R.

Вариант
10

1.
Дано действительное число х. Не пользуясь
никакими другими арифметическими
операциями, кроме умножения, сложения
и вычитания, вычислить за минимальное
число операций
4-3x3
+ 4х2-5х
+6.

2.
Найти сумму членов арифметической
прогрессии, если известны ее первый
член, знаменатель и число членов
прогрессии.

Вариант
11

1.
Составить программу вычисления объема
цилиндра и конуса, которые имеют
одинаковую высоту Н и одинаковый радиус
основания R.

2.
Дано значение х. Получить значения
выражения 2x + 3x2
— 4х3
и 1 + 2х + 3х2
+ 4х3.
Позаботиться об экономии операций.

Вариант
12

1.
Найти площадь треугольника, две стороны
которого равны а и b, а угол между этими
сторонами с.

2.
Дана величина А, выражающая объем
информации в байтах. Перевести А в более
крупные единицы измерения информации.

Вариант
13

1.
Дано значение х. Получить значения
выражения 5x — 2x2
— 6х3
и 1 + 2х + 2х2
+ 6х3.
Позаботиться об экономии операций.

2.
Найти синус угла треугольника, две
стороны которого равны а и b, а площадь
равна S.

Вариант
14

  1. Дана
    величина А, выражающая объем информации
    в битах. Перевести А в байты, в килобайты,
    в мегабайты.

  2. Дано
    значение а, не используя никаких функций
    и никаких операций, кроме умножения,
    получить а8
    за три операции.

Вариант
15

1.
Дано значение а, не используя никаких
функций и никаких операций, кроме
умножения, получить а10
за четыре операции.

2.
Найти площадь круга, вписанного в
треугольник с заданными сторонами.

Вариант
16

1.Составить
программу вычисления объема усеченного
конуса, если известны радиусы оснований
R
и r,
высота усеченного конуса h.

2.
Найти радиус вписанной в треугольник
окружности, если даны стороны треугольника.

Вариант
17

1.Три
сопротивления R1, R2, R3 соединены параллельно.
Найти сопротивление соединения.

2.
Вычислить площадь поверхности куба и
его объем по стороне а.

Вариант
18

  1. Вычислить
    радиус окружности и площадь круга, если
    известна длина окружности.

  2. Известен
    синус одного из углов треугольника и
    стороны а, b, образующие этот угол. Найти
    третью сторону треугольника.

Вариант
19

1.
Заданы координаты трех вершин треугольника
(х1 , у1,), (х2 , y2), (х3, У3). Найти площадь
треугольника.

2.
Даны два действительных числа х и у.
Вычислить значение выражения 3x+4y2-5.

Вариант
20

  1. Написать
    программу, которая выводит на экран
    значение объема куба, если известна
    площадь полной поверхности куба.

  2. Вычислить
    площадь прямоугольного треугольника
    по длинам катета а и гипотенузы с.

Вариант
21

1.
Дана площадь грани куба. Найти площадь
полной поверхности и объем этого куба.

2.
Три сопротивления R1 , R2 , R3 соединены
параллельно. Найдите сопротивление R3,
если известны сопротивления R1, R2 и общее
сопротивление R.

Вариант
22

1.
Дана площадь равностороннего треугольника.
Найти сторону этого треугольника,

его
высоту, радиусы вписанной и описанной
окружностей.

2.
Найти длину окружности, если известна
площадь круга.

Вариант
23

1.
Три сопротивления R1 , R2 , R3 соединены
последовательно. Найдите сопротивление
R3, если известны сопротивления R1, R2 и
общее сопротивление R.

2.
Дан радиус основания и объем конуса,
найти высоту конуса.

Вариант
24

1.
Найти внутренний радиус кольца R1, если
известны внешний радиус R2 (R2 > R1) и
площадь кольца.

2.
Дана высота и объем конуса, найти радиус
основания конуса.

Вариант
25

1.
Дана равнобедренная трапеция с основаниями
a и b. Найти угол 
при большем основании а, если известны
площадь и длины оснований.

2.
Вычислить корни уравнения ах2+
bх = 0 с заданными коэффициентами a и b
(предполагается, что а ≠ 0 и что уравнение
имеет решение).

Вариант
26

  1. Вычислить
    высоты треугольника со сторонами а, b,
    с. Высоты можно выразить из формулы:
    ,
    где

  2. Составить
    программу вычисления объема цилиндра
    и конуса, которые имеют одинаковую
    высоту Н и одинаковый радиус основания
    R.

Вариант
27

  1. Дано
    действительное число х. Не пользуясь
    никакими другими арифметическими
    операциями, кроме умножения, сложения
    и вычитания, вычислить за минимальное
    число операций
    2х5 — 3×3 + 2х2 — 3х + 2.

  2. Найти
    n — число членов арифметической прогрессии,
    если известны ее первый член – a1,
    знаменатель q и сумма n членов прогрессии.

Вариант
28

  1. Составить
    программу вычисления объема конуса,
    если известны объем цилиндра и радиус.
    Цилиндр имеет одинаковую высоту Н и
    одинаковый радиус основания R с конусом.

  2. Дано
    значение х. Получить значения выражения
    4x + 3x2
    — 7х3
    и 1 + 4х + 3х2
    + 7х3.
    Позаботиться об экономии операций.

Вариант
29

1.
Найти площадь треугольника, две стороны
которого равны а и b, а угол между этими
сторонами 300.

2.
Дана величина А, выражающая объем
информации в байтах. Перевести А в
гигабайты и мегабайты.

Вариант
30

1.
Дано значение х. Получить значения
выражения 3x — 8x2
— 9х3
и 1 + 3х + 8х2
+ 9х3.
Позаботиться об экономии операций.

2.
Найти синус угла треугольника, две
стороны которого равны а, b и с.

Вариант
31

  1. Дана
    величина А, выражающая объем информации
    в битах. Перевести А в гигабайты.

  2. Дано
    значение а, не используя никаких функций
    и никаких операций, кроме умножения,
    получить а7
    за четыре операции.

Вариант
32

1.
Дано значение а, не используя никаких
функций и никаких операций, кроме
умножения, получить а12
за четыре операции.

2.
Найти площадь круга, вписанного в квадрат
с заданной стороной.

Вариант
33

1.Составить
программу вычисления объема усеченного
конуса, если известны радиусы оснований
R1
и R2
и объем цилиндра с основанием равным
радиусу R1.

2.
Найти радиус вписанной в треугольник
окружности, если даны стороны треугольника.

Вариант
34

1.
Найти площадь круга, описанного около
квадрата с заданной стороной.

2.
Дано значение х. Получить значения
выражения 5x — 3x2
— 9х3
и 1 + 5х + 3х2
+ 9х3.
Позаботиться об экономии операций.

Вариант
35

1.
Дано значение а, не используя никаких
функций и никаких операций, кроме
умножения, получить а14
за пять операций.

2.
Найти площадь круга, описанного около
правильного треугольника с заданной
стороной.

Формулы

Теорема
косинусов:

Теорема
синусов:

Cокр=2r
Sкруга
=r2

,
где

,
где

,
где r
— радиус вписанной окружности, R
— радиус описанной окружности, p
— полупериметр.


для параллельного соединения

R=R1+R2+R3
– для последовательного соединения

Равносторонний
треугольник:
,
,,.


скорость

,

,

Контрольные
вопросы:

  1. Как
    запустить программу на трансляцию и
    выполнение?

  2. Как
    записываются операторы начала и конца
    программы?

  3. Из
    каких разделов состоит программа на
    языке Pascal?

  4. В
    какой последовательности должны быть
    записаны разделы программы на языке
    Pascal?

  5. Как
    записываются операторы вывода на экран
    в Pascal?

Практическая
работа 7

Тема:
Составление линейных программ. Описание
графической области логическими
выражениями

Цель
работы:
научиться
использовать логические отношения при
решении математических задач.

Теоретическая
часть

Логические
операции
выполняются над операндами булева типа.
Имеются четыре логические операции:
Not
— отрицание; And

логическое умножение (конъюнкция); Оr
— логическое сложе­ние (дизъюнкция).
Кроме этих трех обязательных операций
в Тур­бо Паскале имеется еще операция
исключающее
ИЛИ.
Ее
знак — служебное слово Хоr.
Это двухместная операция, которая в
ре­зультате дает значение истина,
если оба операнда имеют разные логические
значения.

В
Паскале логические значения обозначаются
служебными сло­вами false
(ложь) и true
(истина), а идентификатор логическо­го
типа — boolean.
Кроме величин (констант и переменных)
типа boolean
логи­ческие значения false,
true
принимают результаты операций отношения.

Операции
отношения имеют самый низкий приоритет.
Поэто­му если операндами логической
операции являются отношения, то их
следует заключать в круглые скобки.
Например, математи­ческому неравенству
1 ≤ х

50
соответствует следующее логичес­кое
выражение: (1<=Х) And
(X<=50)

Логическое
выражение
есть
логическая формула, записанная на языке
программирования. Логическое выражение
состоит из логических операндов,
связанных логическими операциями и
круг­лыми скобками. Результатом
вычисления логического выражения
является булева величина (false
или true).

Пример.

Для
данной области составить программу,
которая печатает true,
если точка с координатами (x,
y)
принадлежит закрашенной области, и
false
– в противном случае.

Решение:

Для
того чтобы решить данную задачу, нужно
описать закрашенную область с помощью
неравенств. Для этого найдем для всех
линий на рисунке уравнения. Будем
считать, что границы области входят в
закрашенную часть.

  1. Найдём
    уравнение прямой AB.
    Точки A(5;
    7) и B(-6;
    -5) выбираем сами по рисунку. Используем
    формулу уравнения прямой, проходящей
    через две точки:
    .
    Получим,
    т. е.,
    следовательно.
    Получаем уравнение:.

  2. Найдём
    уравнение прямой CD.
    Точки C(7;
    1) и D(-4;
    -5) выбираем сами по рисунку. Составим
    уравнение:
    .
    Получаем уравнение.

  3. Найдем
    уравнение окружности по формуле:
    ,
    где (x0;
    y0)
    – центр окружности, R
    – радиус окружности. В нашем случае
    центр — (0; 0), радиус равен 5. Получаем
    .

  4. Закрашенная
    область находиться ниже прямой AB,
    значит, точки области удовлетворяют
    условию:
    .
    Закрашенная область выше прямойCD,
    значит, точки области удовлетворяют
    условию:
    .
    Кроме того, искомая область находится
    внутри окружности, значит.

  5. Э

    Алгоритм
    решения задачи сводится к следующему:

      1. Вводим
        координаты точки (x,
        y).

      2. Проверяем
        выполнение системы неравенств.

      3. В
        случае положительного результата
        выводим сообщение true,
        в противном случае – false.

    ти условия должны выполняться
    одновременно, т. е. должна выполняться
    система неравенств:

Программа

program
a1;

var
x, y:real; z: boolean;

begin

writeln
(‘
Введите
x, y’);

readln
(x,y);

z:=(y<=12/11*x+17/11)
and (y>=6/11*x-31/11) and (sqrt(sqr(x)+sqr(y))<=5);

writeln
(
z);

readln

end.

Задание
Для данной
области составить программу, которая
печатает true,
если точка с координатами (x,
y)
принадлежит закрашенной области, и
false
– в противном случае.

Вариант
1 Вариант 2 Вариант 3

Вариант
4 Вариант 5 Вариант 6

Вариант
7 Вариант 8 Вариант 9

Вариант
10 Вариант 11 Вариант 12

Вариант
13 Вариант 14 Вариант 15

Вариант
16 Вариант 17 Вариант 18

Вариант
19 Вариант 20 Вариант 21

Вариант
22 Вариант 23 Вариант 24

Вариант
25 Вариант 26 Вариант 27

Вариант
28 Вариант 29 Вариант 30

Вариант
31 Вариант 32 Вариант 33

Вариант
34


Контрольные
вопросы:

  1. Как записать
    уравнение окружности и прямой?

  2. Какие логические
    операции применяются в логических
    выражениях?

  3. Какие значения
    принимают логические выражения?

Практическая
работа 8

Тема:
Составление разветвляющихся программ.
Вычисление значения функции

Цель
работы:

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

Общие
сведения

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

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

П


если
условие


то
серия команд


кв

если
условие

то
серия команд1

иначе
серия команд 2

кв

олная форма ветвления
Сокращенная
форма ветвления

Условный
оператор

IF
условие
THEN
оператор1

ELSE
оператор2;

(если
условие, то
оператор1,
иначе
оператор2)

Если
в качестве оператора должна выполнятся
серия операторов, то они объединяются
в операторные скобки Begin
End.

Пример
№ 1
Даны
два числа а и в. Найти наибольшее из них
и вывести на экран.

Программа

Program
primer1; {название
программы}

Var
a,
b:
real; {описание
переменных: вещ.}

Begin {начало}

Writeln
(‘Введите
числа А и В’); {вывод текста}

Readln
(
a,
b); {ввод
чисел через пробел}

If
a>b
then
writeln
(a)
else
if
A=B
then writeln

(‘A=B’)
else
writeln
(b); {
сравнение
и
вывод
наибольшего}

End. {конец
программы}

Пример
№ 2
Написать
программу для вычисления значений
значение функции

Привет!

Калькулятор у нас почему-то ассоциируется с чем-то, что должен написать каждый новичок. Возможно потому, что исторически компьютеры с той целью и создавались, чтобы считать. Но мы будем писать непростой калькулятор, не sympy конечно, но чтобы умел базовые алгебраические операции, типа дифференциирования, симплификации, а также фичи типа компиляции для ускорения вычислений.

Меньше воды! О чем статья?

Здесь будет поверхностно о построении выражения, парсинге из строки, подстановки переменной, аналитической производной, численным решении уравнения и определенного интеграла, рендеринг в формат LaTeX, комплексных числах, компиляцией функций, упрощении, раскрытии скобок, и бла бла бла. Вероятно, не в одной статье.
Для тех, кому нужно срочно что-нибудь склонировать, ссылка на репозиторий.

Берем оставшиеся с нового года печеньки, и погнали!

Для кого эта статья?

Я думаю, что статья может быть полезна новичку, но может быть те, кто чуть поопытнее, тоже найдут что-то интересное. Впрочем, я надеюсь написать статью так, чтобы ее можно было читать и не будучи C# программистом вообще.

Сборка выражения

Что такое «выражение»?

Когда я был маленький…

То я конечно хотел написать калькулятор. Что он должен уметь делать? Четыре основные операции, и в принципе куда еще больше. Так, моей задачей было посчитать значение строкового выражения, например «1 + (3 / 4 — (5 + 3 * 1))». Я взял мою любимую дельфи, и написал парсер, который сначала рекурсивно уходил в скобочки, а потом выражение в скобках заменял на значение, а скобки убирал. В принципе, вполне рабочий способ для меня в то время.

Конечно, это не строка. Довольно очевидно, что математическая формула — это либо дерево, либо стек, и здесь мы остановимся на первом. То есть каждая нода, каждый узел этого дерева, это какая-то операция, переменная, либо константа.

Операция — это либо функция, либо оператор, в принципе, примерно одно и то же. Ее дети — аргументы функции (оператора).

Иерархия классов в вашем коде

Разумеется, реализация может быть любой. Однако идея в том, что если ваше дерево состоит только из узлов и листьев, то они бывают разными. Поэтому я называю эти «штуки» — сущностями. Поэтому верхним классом у нас будет абстрактный класс Entity.

Абстрактный?

Как все знают из базового изучения языка, абстрактный класс хорош тем, что с одной стороны обобщает какие-то классы, с другой стороны позволяет разделить логику и поведение некоторых объектов. Объект абстрактного класса нельзя создать, а вот его наследника — можно.

А также будет четыре класса-наследника: NumberEntity, VariableEntity, OperatorEntity, FunctionEntity.

Как построить выражение?

Для начала мы будем строить выражение в коде, то есть

var x = new VariableEntity("x");
var expr = x * x + 3 * x + 12;

Если объявить пустой класс VariableEntity, то такой код выкинет вам ошибку, мол не знает как умножать и суммировать.

Переопределение операторов

Очень важная и полезная фича большинства языков, позволяя кастомизировать выполнение арифметических операций. Синтаксически реализуется по-разному в зависимости от языка. Например, реализация в C#

public static YourClass operator +(YourClass a, YourClass b) {
    return new YourClass(a.ToString() + b.ToString());
}

Подробнее о переопределении операторов в C#
В репе реализовано тут.

(Не)явное приведение типов

В компилируемых языках типа C# такая штука обычно присутствует и позволяет без дополнительного вызова myvar.ToAnotherType() привести тип, если необходимо. Так, например, было бы удобно писать

NumberEntity myvar = 3;

Вместо привычного

NumberEntity myvar = new NumberEntity(3);

Подробнее о приведении типов в C#
В репе реализовано на этой строке.

Подвешивание

Класс Entity имеет поле Children — это просто список Entity, которые являются аргументами для данной сущности.

Мысли

Вообще-то детей могут иметь объекты лишь двух классов: OperatorEntity и FunctionEntity. То есть в принципе можно было бы создать какой-нибудь NodeEntity и у него унаследовать эти два класса, и создать LeafEntity и от него унаследовать VariableEntity и NumberEntity.

Когда у нас вызывается функция или оператор, нам стоит создать новую сущность, и в ее дети положить то, от чего вызывается функция или оператор. К примеру, сумма по идее должна выглядить примерно так:

public static Entity operator +(Entity a, Entity b){ 
    var res = new OperatorEntity("+");
    res.Children.Add(a);
    res.Children.Add(b);
    return res;
}

То есть теперь если у нас есть сущность x и сущность 3, то x+3 вернет сущность оператора суммы с двумя детьми: 3 и x. Так, мы можем строить деревья выражений.

Вызов функции более простой и не такой красивый, как с оператором:

public Entity Sin(Entity a)
{
    var res = new FunctionEntity("sin");
    res.Children.Add(a);
    return res;
}

Подвешивание в репе реализовано тут.

Отлично, мы составили дерево выражений.

Подстановка переменной

Здесь все предельно просто. У нас есть Entity — мы проверяем является ли он сам переменной, если да, возвращаем значение, иначе — бежим по детям.

В этом огромном 48-строчном файле реализована столь сложная функция.

Вычисление значения

Собственно то, ради чего все это. Здесь мы по идее должны добавить в Entity какой-то такой метод

public Entity Eval()
{
    if (IsLeaf)
    {
        return this;
    }
    else
        return MathFunctions.InvokeEval(Name, Children);
}

Листик без изменений, а для всего остального у нас кастомное вычисление. Опять же, приведу лишь пример:

public static Entity Eval(List<Entity> args)
{
    MathFunctions.AssertArgs(args.Count, 1);
    var r = args[0].Eval();
    if (r is NumberEntity)
        return new NumberEntity(Number.Sin((r as NumberEntity).Value));
    else
        return r.Sin();
}

Если аргумент — число, то произведем численную функцию, иначе — вернем как было.

Number?

Это самая простая единица, число. Над ним можно проводить арифметические операции. По умолчанию оно комплексное. Также у него определены такие операции как Sin, Cos, и некоторые другие.

Если интересно, Number описан тут.

Производная

Численно производную посчитать может кто угодно, и такая функция пишется поистине в одну строку:

public double Derivative(Func<double, double> f, double x) => (f(x + 1.0e-5) - f(x)) * 1.0e+5;

Но разумеется нам хочется аналитическую производную. Так как у нас уже есть дерево выражений, мы можем рекурсивно заменить каждый узел в соответствии с правилом дифференциирования. Работать оно должно примерно так:

Вот, к примеру, как реализованна сумма в моем коде:

public static Entity Derive(List<Entity> args, VariableEntity variable) {
    MathFunctions.AssertArgs(args.Count, 2);
    var a = args[0];
    var b = args[1];
    return a.Derive(variable) + b.Derive(variable);
}

А вот произведение

public static Entity Derive(List<Entity> args, VariableEntity variable)
{
    MathFunctions.AssertArgs(args.Count, 2);
    var a = args[0];
    var b = args[1];
    return a.Derive(variable) * b + b.Derive(variable) * a;
}

А вот сам по себе обход:

public Entity Derive(VariableEntity x)
{
    if (IsLeaf)
    {
        if (this is VariableEntity && this.Name == x.Name)
            return new NumberEntity(1);
        else
            return new NumberEntity(0);
    }
    else
    return MathFunctions.InvokeDerive(Name, Children, x);
}

Это метод Entity. И как видим, что у листа всего два состояния — либо это переменная, по которой мы дифференциируем, тогда ее производная равна 1, либо это константа (число либо VariableEntity), тогда ее производная 0, либо узел, тогда идет отсылка по имени (InvokeDerive обращается к словарю функций, где и находится нужная (например сумма или синус)).

Заметьте, я здесь не оставляю что-то типа dy/dx и сразу говорю, что производная от переменной не по которой мы дифференциируем равна 0. А вот здесь сделано по-другому.

Все дифференциирование описано в одном файле, а больше и не надо.

Упрощение выражения. Паттерны

Упрощение выражения в общем случае в принципе нетривиально. Ну например, какое выражение проще: $x^2 - y^2$ или $(x - y)(x+y)$? Но мы придерживаемся каких-то представлений, и на основе них хотим сделать те правила, которые точно упрощают выражение.

Можно при каждом Eval писать, что если у нас сумма, а дети — произведения, то переберем четыре варианта, и если где-то что-то равно, вынесем множитель… Но так делать конечно же не хочется. Поэтому можно догадаться до системы правил и паттернов. Итак, что мы хотим? Примерно такой синтаксис:

{ any1 / (any2 / any3)   ->   any1 * any3 / any2 },
{ const1 * var1 + const2 * var1   ->   (const1 + const2) * var1 },
{ any1 + any1 * any2   ->   any1 * (Num(1) + any2) },

Вот пример дерева, в котором нашлось поддерево (обведено в зеленый), отвечающее паттерну any1 + const1 * any1 (найденное any1 обведено в оранжевый).

Как видим, иногда нам важно, что одна и та же сущность должна повторяться, например чтобы сократить выражение x + a * x нам необходимо, чтобы и там и там был x, ведь x + a * y уже не сокращается. Поэтому нам нужно сделать алгоритм, который не только проверяет, что дерево соответсвует паттерну, но и

  1. Проверять, что одинаковые паттерновые Entity соответствуют одинаковым Entity.
  2. Записывать, что чему соответствует, чтобы потом подставить.

Точка входа выглядит примерно так:

internal Dictionary<int, Entity> EqFits(Entity tree)
{
    var res = new Dictionary<int, Entity>();
    if (!tree.PatternMakeMatch(this, res))
        return null;
    else
        return res;
}

А в tree.PaternMakeMatch мы рекурсивно наполняем словарь ключами и их значениями. Вот пример списка самих паттерных Entity:

static readonly Pattern any1 = new Pattern(100, PatType.COMMON);        
static readonly Pattern any2 = new Pattern(101, PatType.COMMON);
static readonly Pattern const1 = new Pattern(200, PatType.NUMBER);
static readonly Pattern const2 = new Pattern(201, PatType.NUMBER);
static readonly Pattern func1 = new Pattern(400, PatType.FUNCTION);

Когда мы будем писать any1 * const1 — func1 и так далее, у каждой ноды будет номер — это и есть ключ. Иначе говоря, при заполнении словаря, ключами выступят как раз эти номера: 100, 101, 200, 201, 400… А при постройке дерева мы будем смотреть на значение, соответствующее ключу, и подставлять его.

Реализовано тут.

Упрощение. Сортировка дерева

В статье, к которой я уже обращался, автор решил сделать просто, и отсортировал практически по хешу дерева. Ему удалось сократить a и -a, b + c + b превратить 2b + c. Но мы, конечно, хотим и чтобы (x + y) + x * y — 3 * x сокращалось, и в целом более сложные штуки.

Паттерны не работают?

Вообще, то, что мы сделали до этого, паттерны — чудовищно замечательная штука. Она позволит вам сокращать и разность квадратов, и сумму квадрата синуса и косинуса, и другие сложные штуки. Но элементарную пальму, ((((x + 1) + 1) + 1) + 1), она не сократит, ведь здесь главное правило — коммутативность слагаемых. Поэтому первый шаг — вычленить «линейных детей».

«Линейные дети»

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

Это в принципе несложно. Пусть функция LinearChildren(Entity node) возвращает список, тогда мы смотрим на child in node.Children: если child — это не сумма, то result.Add(child), иначе — result.AddRange(LinearChildren(child)).

Не самым красивым образом реализовано тут.

Группировка детей

Итак, у нас есть список детей, но что дальше? Допустим, у нас есть sin(x) + x + y + sin(x) + 2 * x. Очевидно, что наш алгоритм получит пять слагаемых. Далее мы хотим сгруппировать по похожести, например, x похож на 2 * x больше, чем на sin(x).

Вот хорошая группировка:

Так как в ней паттерны дальше справятся с преобразованием 2*x + x в 3*x.

То есть мы сначала группируем по некоторому хешу, а затем делаем MultiHang — преобразование n-арного суммирования в бираное.

Хеш узла

С одной стороны, $x$ и $x+1$ следует поместить в одну группу. С другой стороны, при наличии $a * x$ помещать в одну группу с $y * (x + 1)$ бессмысленно.

Мысли

Если подумать, то $a*x + y*(x + 1) = (a + y) * x + y$. Хотя мне кажется, это практически не проще, и уж точно не нужно. Да и вообще, упрощение — вещь ни разу неочевидная, и уж это точно не первое, что стоит писать при написании «калькулятора».

Поэтому мы реализовываем многоуровневую сортировку. Сначала мы делаем вид, что $x+1$ — одно и то же. Посортировали, успокоились. Потом делаем вид, что $x+1$ можно помещать только с другими $x+1$. И вот уже наши $a * (x + 1)$ и $y * (x + 1)$ наконец объединились. Реализовано достаточно просто:

internal string Hash(SortLevel level)
{
    if (this is FunctionEntity)
        return this.Name + "_" + string.Join("_", from child in Children select child.Hash(level));
    else if (this is NumberEntity)
        return level == SortLevel.HIGH_LEVEL ? "" : this.Name + " ";
    else if (this is VariableEntity)
        return "v_" + Name;
    else
        return (level == SortLevel.LOW_LEVEL ? this.Name + "_" : "") + string.Join("_", from child in Children where child.Hash(level) != "" select child.Hash(level));
}

Как видим, функция по-любому влияет на сортировку (разумеется, ведь $f(x)$ с $x$ вообще никак в общем случае не связана). Как и переменная, $x$ с $y$ ну никак не получится смешать. А вот константы и операторы учитываются не на всех уровнях. В таком порядке идет сам процесс упрощения

public Entity Simplify(int level)
{
    // Сначала мы делаем самую простую симплификацю: вычисление значений там, где это возможно, умножение на ноль и т. д.
    var stage1 = this.InnerSimplify();
    Entity res = stage1;
    for (int i = 0; i < level; i++)
    {
        // Этот блок ответственнен за сортировку. Сначала мы группируем что-то типа x и x+1 (переменные и функции), затем что-то типа x-1 и x+1 (переменные, функции и константы), затем что-то типа x+1 и x+1 (учитывается все).
        switch (i)
        {
            case 0: res = res.Sort(SortLevel.HIGH_LEVEL); break;
            case 2: res = res.Sort(SortLevel.MIDDLE_LEVEL); break;
            case 4: res = res.Sort(SortLevel.LOW_LEVEL); break;
        }
        // Здесь мы заменяем паттерны.
        res = TreeAnalyzer.Replace(Patterns.CommonRules, res).InnerSimplify();
    }
    return res;
}

Мысли

Самая ли это лучшая реализация? Пихните в личные сообщения, может быть будут идеи получше. Я долго думал, как сделать это макимально красиво, хотя по моему мнению, до «красиво» здесь далеко.

Дерево сортирую тут.

«Компиляция» функций

В кавычках — так как не в сам IL код, а лишь в очень быстрый набор инструкций. Но зато очень просто.

Проблема Substitute

Чтобы посчитать значение функции, нам достаточно вызвать подстановку переменной и eval, например

var x = MathS.Var("x");
var expr = x * x + 3;
var result = expr.Substitute(x, 5).Eval();

Но это работает медленно, около 1.5 микросекунды на синус.

Инструкции

Чтобы ускорить вычисление, мы делаем вычисление функции на стеке, а именно:

1) Придумываем класс FastExpression, у которого будет список инструкций

2) При компиляции инструкции складываются в стек в обратном порядке, то есть если есть функция x * x + sin(x) + 3, то инструкции будут примерно такими:

PUSHVAR 0   // Подстановка переменной номер 0 - x
CALL 6         // Вызов функции номер 6 - синуса
PUSHCONST 3
CALL 0         // Вызов функции номер 0 - суммы
PUSHVAR 0
PUSHVAR 0
CALL 2
CALL 0

Далее при вызове мы прогоняем эти инструкции и возвращаем Number.

Пример выполнения инструкции суммы:

internal static void Sumf(Stack<Number> stack)
{
    Number n1 = stack.Pop();
    Number n2 = stack.Pop();
    stack.Push(n1 + n2);
}

Вызов синуса сократился с 1500нс до 60нс (системный Complex.Sin работает за 30нс).
В репе реализовано тут.

Фух, вроде бы пока все. Хотя рассказать еще есть о чем, но мне кажется объем для одной статьи достаточный. Интересно ли кому-нибудь продолжение? А именно: парсинг из строки, форматирование в латех, определенный интеграл, и прочие плюшки.

Ссылка на репозиторий со всем кодом, а также тестами и самплами.

Мысли

Вообще-то я продолжаю работать над этим проектом. Распространяется он под MIT (то есть делайте с ним что хотите), и он никогда не станет ни закрытым, ни коммерческим. Более того, если есть идеи для улучшения и вклада — pull-реквесты очень приветствуются.

Спасибо за внимание!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Делать следующую часть?

Проголосовали 167 пользователей.

Воздержались 36 пользователей.

Расскажу вам небольшой секрет, который сохранит вам многие часы жизни:

Если вам дали задание написать что-то на ассемблере, то не надо писать это на ассемблере — напишите код на C, а потом скомпилируйте и посмотрите, какой ассемблерный код сгенерировал компилятор.

Например, в вашем случае, пишем нужную программу на C:

void
calc(void)
{
    /* Значения могут быть любыми. */
    int a = 2;
    int b = 3;
    int c = 5;
    int d = 7;

    int result = (4 * b + c - d) * (2 * b + 5 * (3 * c + 5 * a)) / (4 * a * b + 5 * c - 8 * d);
}

Затем компилируем её с выключенной оптимизацией (-O0) и с выдачей ассемблерного листинга (-S). Флаги -fno-asynchronous-unwind-tables и -fno-dwarf2-cfi-asm сделают ассемблерный листинг немного чище:

# p.c — название файла с исходным кодом
gcc -O0 -S -fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm p.c

На выходе получаем вот такой вот ассемблерный листинг:

    .file   "p.c"
    .text
    .globl  calc
    .type   calc, @function
calc:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $2, -20(%rbp)
    movl    $3, -16(%rbp)
    movl    $5, -12(%rbp)
    movl    $7, -8(%rbp)
    movl    -16(%rbp), %eax
    leal    0(,%rax,4), %edx
    movl    -12(%rbp), %eax
    addl    %edx, %eax
    subl    -8(%rbp), %eax
    movl    %eax, %ecx
    movl    -16(%rbp), %eax
    leal    (%rax,%rax), %esi
    movl    -12(%rbp), %edx
    movl    %edx, %eax
    addl    %eax, %eax
    leal    (%rax,%rdx), %edi
    movl    -20(%rbp), %edx
    movl    %edx, %eax
    sall    $2, %eax
    addl    %edx, %eax
    leal    (%rdi,%rax), %edx
    movl    %edx, %eax
    sall    $2, %eax
    addl    %edx, %eax
    addl    %esi, %eax
    imull   %eax, %ecx
    movl    %ecx, %edx
    movl    -20(%rbp), %eax
    imull   -16(%rbp), %eax
    leal    0(,%rax,4), %esi
    movl    -12(%rbp), %ecx
    movl    %ecx, %eax
    sall    $2, %eax
    addl    %ecx, %eax
    leal    (%rsi,%rax), %ecx
    movl    -8(%rbp), %eax
    sall    $3, %eax
    subl    %eax, %ecx
    movl    %edx, %eax
    cltd
    idivl   %ecx
    movl    %eax, -4(%rbp)
    nop
    popq    %rbp
    ret
    .size   calc, .-calc
    .ident  "GCC: (GNU) 10.2.0"
    .section    .note.GNU-stack,"",@progbits

Иногда бывает удобнее использовать такой инструмент как Compiler Explorer.


Если вы занимаетесь для себя и хотите научится писать на ассемблере — все то же самое. Попытайтесь написать программу сами, если не получается, напишите тот же самый код на C и посмотрите, во что компилятор его перевел, какие конструкции ассемблера он использовал.

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

int a = 4;         // movl $4, -4(%rbp)
int b = 7;         // movl $7, -8(%rbp)
                   // movl -4(%rbp), %edx
                   // movl -8(%rbp), %eax
                   // addl %edx, %eax
int c = a + b;     // movl %eax, -12(%rbp)
int a = 5;         //   movl $5, -4(%rbp)
                   //   jmp .L2
                   // .L3:
while (a > 0) {    //   movl $0, %eax
    foo();         //   call foo
    a--;           //   subl $1, -4(%rbp)
}                  // .L2:
                   //   cmpl $0, -4(%rbp)
                   //   jg .L3

Разработка программы вычисления выражения, реализованного отдельной функцией. Элемент управления PictureBox


Содержание

  • Условие задачи
  • Соображения
  • Выполнение
    • 1. Запустить MS Visual Studio. Создать проект по шаблону Windows Forms Application
    • 2. Проектирование основной формы
      • 2.1. Размещение элементов управления на форме
      • 2.2. Настройка элементов управления Form, Label, Button
      • 2.3. Настройка элемента управления PictureBox
    • 3. Добавление текста функции к программному коду
      • 3.1. Добавление текста функции в модуль Form1.h
      • 3.2. Текст модуля «Form1.h» главной формы программы
    • 4. Программирование обработчика события клика на кнопке «Вычислить»
    • 5. Запуск программы
  • Связанные темы

Поиск на других ресурсах:

Условие задачи

Рассчитать значения x, определив и использовав соответствующую функцию:

Соображения

Если внимательно посмотреть на выражение, то можно заметить схожесть между каждым его слагаемым. В общем случае каждое слагаемое можно представить выражением

где a – некоторое число. В нашем случае a = 6, 13, 22.

Поэтому, целесообразно реализовать функцию, которая получает входным параметром переменную a и вычисляет данное выражение.

Выполнение

1. Запустить MS Visual Studio. Создать проект по шаблону Windows Forms Application

После загрузки MS Visual Studio нужно создать проект по шаблону Windows Forms Application. Подробный пример создания проекта по шаблону Windows Forms Application описывается в теме:

  • Создание приложения типа Windows Forms Application в Microsoft Visual Studio. Обзор основных файлов проекта

Следует напомнить, что проект создается командой

File->New Project...

В результате откроется окно «New Project», изображенное на рисунке 1. В этом окне задается вкладка «Visual C++» и выбирается шаблон «Windows Forms Application». В поле Name задается имя проекта, например MyApp01. В поле «Location:» задается папка, в которой будут размещаться рабочие файлы проекта (в нашем случае это папка D:ProgramsCPP).

Рис. 1. Окно создания нового проекта

После выбора OK система создаст новую форму, как показано на рисунке 2.

Рис. 2. Форма приложения после создания

2. Проектирование основной формы

2.1. Размещение элементов управления на форме

В соответствии с условием задачи, в программе ничего не вводится, только проводится расчет на основе известных значений. С учетом этого, на форме размещаются следующие элементы управления:

  • один элемент управления типа Label. Автоматически создается объект (переменная) класса Label с именем label1. С помощью этого имени можно иметь доступ к результату;
  • один элемент управления типа Button. Автоматически создается объект с именем button1. Этот элемент управления будет выводить текст условия задачи;
  • один элемент управления типа PictureBox (см. рис. 3). Этот элемент управления используется для визуализации сложной формулы. Формула представляется в виде файла с расширением *.jpg. В результате создается объект с именем pictureBox1;
  • один элемент управления типа Label в нижней части формы. Этот элемент управления будет выводить результат.

После размещения элементов управления Label, Button, PictureBox форма программы будет иметь вид, как показано на рисунке 3.

Рис. 3. Форма приложения после размещения элементов управления

2.2. Настройка элементов управления Form, Label, Button

Нужно настроить следующие свойства элементов управления:

  • в элементе управления label1 свойство Text = «Рассчитать значение x»;
  • в элементе управления button1 свойство Text = «Вычислить»;
  • в элементе управления label2 свойство Text = «Результат»;
  • в форме Form1 свойство Text = «Программа вычисления выражения».

Дополнительно можно настроить другие свойства по собственному усмотрению.



2.3. Настройка элемента управления PictureBox

Поскольку элемент управления PictureBox предназначен для отображения рисунка на форме, то сначала нужно выбрать этот рисунок. Это осуществляется кликом мышкой на стрелке вправо в верхнем правом углу PictureBox, как показано на рисунке 4.

Рис. 4. Выбор меню задач PictureBox

В меню задач PictureBox выбирается команда «Choose Image…». В результате откроется стандартное окно Windows «Open», в котором нужно задать файл рисунка, который содержит формулу.

В нашем случае файл с формулой можно взять здесь. Этот файл был подготовлен раньше с помощью графического редактора.

После выбора файла рисунка форма приложения будет иметь вид, как показано на рисунке 5.

Рис. 5. Форма приложения после загрузки файла рисунка

Как видно из рисунка 5 отображается только часть формулы. Чтобы поправить ситуацию нужно выполнить следующие действия:

  • активировать (выделить) элемент управления PictureBox;
  • с помощью мышки увеличить ширину окна PictureBox;
  • свойство SizeMode установить в значение StretchImage (масштабирование) как показано на рисунке 6.

Возможен и другой вариант настройки отображения формулы с помощью свойства SizeMode.

Рис. 6. Форма приложения после настройки и свойство SizeMode

3. Добавление текста функции к программному коду

3.1. Добавление текста функции в модуль Form1.h

Функция вычисления выражения может размещаться в модуле «Form1.h» (не обязательно). Пусть эта функция называется Calc. В соответствии с условием задачи и соображений, функция должна получать один параметр целого типа. Результат работы функции есть вещественное число. Поэтому, функция будет возвращать значение типа double.

Поскольку, вся работа выполняется в одной форме, то и реализация тела функции будет внутри кода класса Form1.

Таким образом, в нижнюю часть тела класса Form1 нужно добавить следующий программный код

// реализация функции Calc
double Calc(int a)
{
    double res, t;
    t = (double)a;
    res = (Math::Sqrt(t)+t)/2.0;
    return res;
}

В теле функции используется функция Sqrt(), которая вычисляет корень квадратный.

3.2. Текст модуля «Form1.h» главной формы программы

На данный момент текст класса Form1 в сокращенном виде следующий:

#pragma once

namespace MyApp01 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// Summary for Form1
    /// </summary>

    public ref class Form1 : public System::Windows::Forms::Form
    {
        public:
        Form1(void)
        {
            ...
        }

        protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            ...
        }

        private: System::Windows::Forms::Button^ button1;
        protected:
        private: System::Windows::Forms::Label^ label1;
        private: System::Windows::Forms::PictureBox^ pictureBox1;
        private: System::Windows::Forms::Label^ label2;

        private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            ...
        }
#pragma endregion

        // реализация функции Calc
        double Calc(int a)
        {
            double res, t;
            t = (double)a;
            res = (Math::Sqrt(t)+t)/2.0;
            return res;
        }
    };
}

4. Программирование обработчика события клика на кнопке «Вычислить»

Последний этап разработки программы, это программирование события Click клика на кнопке «Вычислить». Пример программирования события клика на кнопке подробно описывается в теме:

  • Пример разработки простейшего приложения типа Windows Forms на языке C++ в MS Visual Studio

В нашем случае, обработчик события будет иметь следующий вид:

private: System::Void button1_Click(System::Object sender, System::EventArgs e)
{
    // вычисление
    double x;

    x = Calc(6) + Calc(13) + Calc(22); // вызов функции

    label2->Text = "Результат = " + x.ToString();
}

5. Запуск программы

Теперь можно запускать программу на выполнение. На рисунке 7 изображен результат выполнения программы

Рис. 7. Выполнение программы


Связанные темы

  • Описание функции. Фактические и формальные параметры. Передача параметров в функцию по значению и по адресу. Прототип функции
  • Функции и массивы. Передача одномерного и многомерного массива в функцию. Передача структуры и класса в функцию

Ваше решение записывайте как комментарий к данной странице (пример оформления).
Решены задачи: 1-22, 24,27 Не решены: 23,25,26,28. Для многих задач есть варианты решений с обсуждениями, смотрите.

Задачи

S2.1. Составить программу:
а) вычисления значения функции y=7x2+3x+6 при любом значении x;
б) вычисления значения функции x=12a2+7a+12 при любом значении а.

S2.2. Дана сторона квадрата. Найти его периметр. — решение.

S2.3. Дан радиус окружности. Найти ее диаметр. — решение.

S2.4. Считая, что Земля — идеальная сфера с радиусом R=6350 км, определить расстояние до линии горизонта от точки В с заданной высотой h=AB над Землей.

S2.5. Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности. — решение

S2.6. Дан радиус окружности. Найти длину окружности и площадь круга.

 S2.7. Даны два целых числа. Найти: а) их среднее арифметическое; б) их среднее геометрическое.

S2.8. Известны объем и масса тела. Определить плотность материала этого тела.

S2.9. Известны количество жителей в государстве и площадь его территории. Определить плотность населения в этом государстве.

S2.10. Составить программу решения линейного уравнения ax+b=0 (a ≠ 0).

S2.11. Даны катеты прямоугольного треугольника. Найти его гипотенузу.

S2.12. Найти площадь кольца по заданным внешнему и внутреннему радиусам.

S2.13.  Даны катеты прямоугольного треугольника. Найти его периметр.

S2.13А. Даны два числа. Найти среднее арифметическое и среднее геометрическое их  модулей.

S2.14. Даны основания и высота равнобедренной трапеции. Найти ее периметр.

S2.14А. Даны стороны прямоугольника. Найти его периметр и длину диагонали.

S2.15. Даны два числа. Найти их сумму, разность, произведение, а также частное от деления первого числа на второе.

S2.16. Даны длины сторон прямоугольного параллелепипеда. Найти его объем и площадь боковой поверхности.

S2.17. Известны координаты на плоскости двух точек. Составить программу вычисления расстояния между ними.

S2.18. Даны основания и высота равнобедренной трапеции. Найти периметр трапеции.

S2.19. Даны основания равнобедренной трапеции и угол при большем основании. Найти площадь трапеции.

S2.20. Треугольник задан координатами своих вершин. Найти периметр и площадь треугольника.

S2.21. Выпуклый четырехугольник задан координатами своих вершин. Найти площадь этого четырехугольника как сумму площадей треугольников.

S2.22. Известна стоимость 1 кг конфет, печенья и яблок. Найти стоимость всей покупки, если купили x кг конфет, у кг печенья и z кг яблок.

S2.23. Известна стоимость монитора, системного блока, клавиатуры и мыши. Сколько будут стоить 3 компьютера из этих элементов? N компьютеров?

S2.24. Возраст Тани — X лет, а возраст Мити — Y лет. Найти их средний возраст, а также определить, на сколько отличается возраст каждого ребенка от среднего значения.  —  решение

S2.25. Два автомобиля едут навстречу друг другу с постоянными скоростями V1 и  V2 км/час. Определить, через какое время автомобили встретятся, если расстояние между ними было S км.

S2.26. Два автомобиля едут друг за другом с постоянными скоростями V1 и  V2 км/час (V1>V2). Определить, какое расстояние будет между ними через 30 минут после того, как первый автомобиль опередил второй на S км.

S2.27. Известно значение температуры по шкале Цельсия. Найти соответствующее  значение температуры по шкале: а) Фаренгейта; б) Кельвина. Для пересчета по шкале Фаренгейта необходимо исходное значение температуры умножить на 1,8 и к результату прибавить 32, а по шкале Кельвина абсолютное значение нуля соответствует 273,15 градуса по шкале Цельсия.

S2.28. У американского писателя-фантаста Рэя Бредбери есть роман «450 градусов  по Фаренгейту». Какой температуре по шкале Цельсия соответствует указанное в названии значение? (См. предыдущую задачу).

Пример оформления:

Задача S2.3

static void Main(string[] args)
{
   Console.Write("Введите радиус окружности : ");
   double r = Convert.ToDouble(Console.ReadLine());
   double d = 2 * r;
   Console.WriteLine("Диаметр окружности = {0}", d);
}

NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделить с друзьями:
  • Как написать программу для видеонаблюдения
  • Как написать программу для взлома вайфая
  • Как написать программу для взлоmа
  • Как написать программу для андроид на java
  • Как написать программу для автомойки