(1 курс ФИИТ) ОП - лекц - 2015 (устарело)

Задача про треугольник.

{Дан треугольник ABC и точка M. Проверить принадлежность точки M к ABC
Пацеев Андрей}
begin
  var ax,ay,bx,by,cx,cy,mx,my:real;
  writeln('Введите координаты точки A');
  readln(ax,ay);
  writeln('Введите координаты точки B');
  readln(bx,by);
  writeln('Введите координаты точки C');
  readln(cx,cy);
  writeln('Введите координаты точки M');
  readln(mx,my);
  var u1 := (ax - mx) * (by - ay) - (bx - ax) * (ay - my);
  var u2 := (bx - mx) * (cy - by) - (cx - bx) * (by - my);
  var u3 := (cx - mx) * (ay - cy) - (ax - cx) * (cy - my);
  
  if (u1 = 0) or (u2 = 0) or (u3 = 0) then
    writeln('Точка лежит на грани треугольника')
  else
    if (sign(u1) = sign(u2)) and (sign(u2) = sign(u3)) then
      writeln('Точка лежит внутри треугольника')
    else
      writeln('Точка лежит вне треугольника')
end.

Задача про существование 4-угольника.

begin
  var x1 := readlnreal('Введите x1: ');
  var y1 := readlnreal('Введите y1: ');
  var x2 := readlnreal('Введите x2: ');
  var y2 := readlnreal('Введите y2: ');
  var x3 := readlnreal('Введите x3: ');
  var y3 := readlnreal('Введите y3: ');
  var x4 := readlnreal('Введите x4: ');
  var y4 := readlnreal('Введите y4: ');
  var ab, bc, cd, da : real; //длины векторов.
  var a, b, c, d : real; // углы.
  ab := sqrt(sqr(x2 - x1) + sqr(y2 - y1));
  bc := sqrt(sqr(x3 - x2) + sqr(y3 - y2));
  cd := sqrt(sqr(x4 - x3) + sqr(y4 - y3));
  da := sqrt(sqr(x1 - x4) + sqr(y1 - y4));
  a := radtodeg(arccos(((x2 - x1) * (y2 - y1) + (x4 - x1) * (y4 - y1)) / ab * da));
  b := radtodeg(arccos(((x3 - x2) * (y3 - y2) + (x1 - x2) * (y1 - y2)) / bc * ab));
  c := radtodeg(arccos(((x4 - x3) * (y4 - y3) + (x2 - x3) * (y2 - y3)) / cd * bc));
  d := radtodeg(arccos(((x1 - x4) * (y1 - y4) + (x3 - x4) * (y3 - y4)) / ab * da));
  writeln('Существует? ', a + b + c + d = 360)
end.

http://en.cppreference.com/w/cpp/language/override

выдает неверный результат только в том случае, если все 4 точки находятся на 1 прямой

Самолёты не падают в 75% случаев, что тоже ничего :((

Нет, не только.

так это и не четырех угольник, нарисуй его, это типичные песочные часы

Так значит всё правильно :slight_smile:

Скажите, пожалуйста, будет ли завтра разговор об операторе выбора (case)?

Да. Только послезавтра. И потом сразу начнутся циклы

Sides 2.0 Работает также, но исправлена глупая ошибка, и теперь работает лучше чем самолеты в 1.(3) раз.

var a,x1,x2,x3,y1,y2,y3,x,y:real;
    f1:boolean;
function sides(x,y,x1,y1,x2,y2:real):real;
 begin
   result:=(y1-y2)/(x1-x2)*(x-x1)+(y1-y);
 end;    
begin
 writeln('x,y');// точка на плоскости
 readln(x,y);
 writeln('x1,y1'); //вершины треугольника
 readln(x1,y1);
 writeln('x2,y2');
 readln(x2,y2);
 writeln('x3,y3');
 readln(x3,y3);
 f1:=(sides(x,y,x1,y1,x2,y2)*sides(x3,y3,x1,y1,x2,y2)>=0);// для стороны x1y1_x2y2
 f1:=f1 and ((sides(x,y,x3,y3,x2,y2)*sides(x1,y1,x3,y3,x2,y2))>=0); // для стороны x3y3_x2y2
 f1:=f1 and ((sides(x,y,x3,y3,x1,y1)*sides(x2,y2,x3,y3,x1,y1))>=0); // для стороны x3y3_x1y1
 writeln('Точка в треугольнике:',f1);
end.

По тексту - лучше, но в sides может возникнуть деление на 0

Алгоритм умножения через операции сложения и сдвига применяется в микроконтроллерах, не имеющих аппаратной операции умножения. Например микроконтроллеры серии PIC16. Система команд. Пример реализации алгоритма.

Этот пример - частный случай. Большинство современных процессоров имеют аппаратную операцию умножения.

1 лайк

Вот реализованный алгоритм циклического сдвига на k элементов вправо. Работает правильно. Насчет возможной оптимизации этого кода - не знаю.

begin
  var a := Arr(1, 3, 5, 7, 9, 8);
  var k := 4;
  
  var n := a.Length;
  
  var k1 := n - k;
  
  for var i := 0 to (k1 div 2) - 1 do
    Swap(a[i], a[k1 - i - 1]);
  
  for var i := 0 to (k div 2) - 1 do
    Swap(a[k1 + i], a[n - i - 1]);
  
  for var i := 0 to (n div 2) - 1 do
    Swap(a[i], a[n - i - 1]);
  
  Writeln(a);
end.
2 лайка

Сравнила время работы сортировки выбором и “пузырьком”. При массиве из десяти тысяч элементов, каждому из которых задаётся случайное значение в диапазоне от 10 до 10000, второй способ “уступает” во времени выполнения примерно в два раза (среднее значение времени сортировки выбором - 560 миллисекунд, “пузырьком” - 1050).

2 лайка

Н. Вирт. Алгоритмы + Структуры данных = Программы

2 лайка

Наглядный пример работы алгоритмов сортировки

Показывалось ли на лекциях, как вводить с клавиатуры значение перечислимого типа?

Да, всё правильно.

Нет