Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3 4 5   Вниз
  Печать  
Автор Тема: ЭВМ 1 курс.Алгоритмические языки. С++  (Прочитано 122281 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 27-09-2006 18:27 » 

Добрый день.

Я студент 1 курса, факультета ПМВТ, по специальности Электронно Вычисл. Машины, вычисления, системы, комплексы , сети.

У нас есть дисциплина, "Алгоритмические языки программирования" на которых сейчас идет курс лекций по С++.
Среда Borland C++ 3.1 .Лекции лекциями, а препод лишнего слова не скажет.
Лазил по поиску, нашел ваши уроки. Прочёл на данный момент 8,- элементарные математические задачи не вызывают никаких сложностей. Практикуюсь на примерах кот. только в голову придут-одним словом проблем нет, всё идет ок.
Но вот препод известил нас, что на след.неделе будет Лаб.Работа. "Задание такое-то .Решайте, как-мне всё равно."

Так вот, всё бы хорошо если бы задание было одно- сложное уровнение, включающее в себя большинство математических действий( sin ,arccos , ^x, / , ln , ... ). Так вот,- уравнение особых затруднений не вызывает, но второе задание- график.

График состоит из 2ух закрашенных областей, в виде треугольников. Имеется система координат, с заданным еденичным отрезком и координатами точек, обозначающими треугольники.

Вопрос. Вручную через cin>>x>>y; вводятся координата 2ух точек,по которой проверяется условие: входит или не входит точка в заштрихованную область 2ух треугольников. Вопрос:

Как осуществить описанное? Улыбаюсь
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #1 : 27-09-2006 18:38 » 

По идее надо проверять условие того, что точка входит в первый треугольник и во второй треугольник => она входит в область-пересечение 2-х треугольников. Или я не правильно понял суть, тогда прошу более конкретизировать.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 27-09-2006 18:41 » 

FallenSoul, На будушее, пожайлуста покорректнее пиши тему топика.

По твоей задаче. Проверять находится ли точка сразу в двух треугольниках.
Проверяеш первый треугольник на вхождение. Если есть вхождение, затем второй. Вы должны уже начать учить Аналитическую алгебру. Посмотри там свойства треугольника. И подумай, на чем можно узнать, входит ли точка в внутренее пространство треугольника или нет. Моё предложение узнавать плошади трех обозровавшихся треугольков , и сравнивать с плошадью большого треугольника. Если они равны, значит точка входит в треугольник, иначе не входит. 
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 27-09-2006 18:51 » 

Я немного неправильно сформулировал, на чертеже 2 треугольника. 1 с координатами точек:

(0,0) ; (3,0) ; (3;2).
Второй треугольник:
(6,3) ; (5,3) ; (6,4).

К сожалению не могу выложить картинку , так бы было более понятно. В координатной плоскости XY 2 треугольника, отдельных друг от друга пространством. Другими словами- 2 совершенно самостоятельных треугольника. Задача- по координате , вычислить -входит ли точка в заштрихованную область( внутренняя область треугольников ) . Надо рассматривать 2 треугольника, и записывать для каждого своё уравнение, которое будет проверять на пренадлежность точки, или же анализировать координатами ( if X>0 and Y ... ) -но это уже явно сложнее. Здесь была моя ладья...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 27-09-2006 18:56 » 

Прочитай мой пост. Для треугольника в лоб ты не сможеш опредилить вхождение. Надо искать другие пути.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 28-09-2006 02:05 » 

 Здесь была моя ладья...

Отсекая области, противоречащие координатам по Х и У , получились. 2 прямоугольника, включающие в себя по треугольнику. С прямоугольниками было бы просто Здесь была моя ладья... а вот как поступить с треугольниками? :\
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 28-09-2006 05:53 » 

Для розыска точки пересечения отрезка с выпуклым многоугольником, бывает, используют алгоритм Кируса-Бека. Идею метода определения факта нахождения точки внутри выпуклого многоугольника можно почерпнуть из этого алгоритма.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #7 : 28-09-2006 08:36 » 

Мы в свое время использовали векторное произведение для определения находится точка внутри фигуры или вне. Для треугольника там вообще просто и операций немного выходит.
Суть: последовательно находим векторное произведение векторов, которые создаетя с двумя соседними вершинами данная точка и если результирующий вектор направлен вверх по отношению к данной плоскости, то угол меджу начальными векторами добавляем к сумме углов, а если сниз, то вычитаем. Ну а потом рассматриваем варианты суммы. Там осталось сделать 1 шаг. Подумай маненько, ежели будет совсем невмоготу - пиши, продолжим...
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 28-09-2006 10:17 » 

Да всё намного проще, спасибо за помощь.

Сегодня ехал в транспорте, и вот что я обнаружил (=

Имеется прямая, проходящая через начало отсчета и точку с координатами (3,2). Из уровнения прямой, y = kx , я вывел зависимость Y от Х- это y= 2x\3 .Оба треугольника не имеют общих координат по Х или Y => отсекаем промежуточные области между треугольниками, и всё что за пределами этих треугольников( x>5 , x<0 , 3<=x<=5 , y>5 , y<0 ... ). Тем самым на чертеже остаются только 2 области - 2 прямоугольника, включающие в себя по треугольнику. Далее, с помощью отсеченных областей и уровнения прямой, можно вывести и само решение. y<=2x\3 а также x и y не входят в области, лежащие за пределами треугольника. => из 2ух треугольников, составляющих прямоугольник , y<=2x\3 будет обозначать все точки нижнего( а он то мне и нужен ). Х определен, Y вычисляется-ничего лишнего. Аналогично и со вторым треугольником. Всё просто, всё реально =)

Надосуге напишу код ,-если будет кто не сильно занят-просьба войти, посмотреть... Всем спасибо.

п.с. А 6 вариант просто ппц ... ( В центре дан прямоугольник,-написать для всего, что не входит в прямоугольник. ( if x>3 => True, if x<0 => True, if y>5 => True, if y<1 => True. Готово. Эх...).
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #9 : 28-09-2006 11:12 » 

Если честно, не совсем согласен с твоей радостью, FallenSoul, ибо ты решил задачу при твоих конкретных условиях, а они у тебя почти тривиальные, ибо оба треугольника (если я правильно себе представляю) являются прамоугольными с катетами, которые паралельны осям координат. А что будет с твоим алгоритмом ежели треугольники будут произвольными да еще с какими-нибудь веселыми вершинами. Или к примеру вершины треугольников надо будет вводить с клавиатуры? Тогда тебе придется во первых решать систему уравнений(причем не одну), а во вторых корректно выписывать все if-ы которые оконтурят твою область. Попробуй решать задачу более общно, чтоб не было мучительно больно за бесцельно прожитые годы, когда окажется, что в большей части случаев твой алгоритм работает некорректно.
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 28-09-2006 13:00 » 

У меня за спиной, 3 лекции по С++, 10 уроков с вашего сайта и ничего более. Я бы и рад, да не имею в данный момент никакой возможности  :\ Со временем...
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #11 : 28-09-2006 13:13 » 

Скажу тебе по секрету, что для построения нормального алгоритма знание языка стоит отнюдь не на 1 месте, для того алгоритма который предложил я надо знание простейших арифметических операций ну и пару функций, изучение которых будет только плюсом для тебя. Единственная загвоздка - ето то, что ты можешь еще не знать что такое векторное произведение. Но зато когда ты все найдешь и сделаешь, гордости будет!!! Мы вот на первом курсе вообще писали рекурсивные кривые (фракталы), а во втором семестре - калькулятор-интерпретатор. Так что не дрейфь, а читай хелпы и юзай форум!
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 28-09-2006 13:32 » 

10 уроков. Как дальше продолжить постепенное изучение ? Читать какие попало статьи , не лучше решение...

2Вопрос один возник. Как зделать следующий отрывок: Обозначить вторую функцию, и использовать её в коде главной(main) , например:

Если условие такое -то выполняется =>
  запуск функции , которая выдаёт на экран: "Точка не входит"
иначе
  ...
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #13 : 28-09-2006 13:58 » 

делается ето приблизительно следующтм образом:
Код:
#include <stdio.h>

void MyFunc();   // обьявляем прототип функции

int main()
{
    ........    // делаем действия которые должны пройти перед проверкой условия
    if(<условие>)
     {
       Myfunc();
     }
     else
      {
        .....    // делаеш то, что у тебя зашито в троеточии
      }
    ......    // выполняешь еще какие-то действия, которые должны идти после проверки условия и являются общими для всей програмы
    return 0;    // завершаеш работу
}

// реализация функции MyFunc()

void MyFunc()
 {
   
    printf("Точка не входит");

 }


причем вместо <условие> надо поставить то условие которое ты хочешь.
И я бы тебе советовал начать читать Керниган Ричи "Язык С" или Страуструпа точно не скажу как называется книга, но что-то типа полное руководство по С++
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #14 : 28-09-2006 14:10 » 

Коротко:

1. Задача не является программной - теюе постановка вопроса относится к геометрии за 5-6-й классы, к программиррованию никак не относится.

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

2. По поводу уроков. После 10 уроков с сайта и после начала лекций надо бы просто использовать неплохой борландовский Хелп вшитый в сам компилятор и среду 3.11
Я именно так начинал, т.е. брал задачку и решал ее.
Например написать простенький графический редактор.
Написать вычисление интегралов простейших.
Написть игру в виде тетриса или еще чего простого.

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

Удачи - студент!!!
Записан

А птичку нашу прошу не обижать!!!
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 28-09-2006 16:05 » 

Код практически готов. Остались последние штрихи, + ваши комментарии. Несколько вопросов:

1. Как забить код в буфер обмена
2. Как оформить русский язык в Borland C++ 3.1, и если он не установлен-что надо сделать. Брал болванку на которой лежала эта среда-скопировал себе на жесткий диск, прописал PATH, а с русским не лады :\
« Последнее редактирование: 28-09-2006 16:27 от FallenSoul » Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #16 : 28-09-2006 16:32 » 

1 Что значит "Забить код в буфер обмена"?
2. Если мне не изменяет память, то русский там не сильно предусмотрен особенно в полях PATH. И опиши проблему подробнее, если не тяжело.
3. Попробуй при всех числах с плавающей точкой поставить  .0, тоесть 1.0, 2.0, 3.0, а заодно проверь нет ли у тебя обьявления переменных x,y где-нибудь еще в виде int x,y. Потому что результат очень напоминает целочисленное деление.
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 28-09-2006 16:38 » 

Я убрал 3ий пункт из вопроса, потому что на самом деле y<=(x*2)/3 при х =2 и у =1 . После 20 минут подсчётов, я всё таки согласился с компьютером )

Что касается 2ух других вопросов:
1. Ctrl +C -> Копировать ... Как мне извлечь код из среды C++, для дальнейшей вставки предположим в том же .тхт или ворде-или надо спец. сохранять с расширением, или открывать .CPP файл текстовым редактором?
2. Русский язык. -Не могу писать комментарии русским языком,-хоть с английским проблемм особых нет, но не всё однако могу объяснить и не все мои комментарии сможет понять другой человек. Я хотел бы узнать,- возможно там специфическая раскладка смены языка, или же надо добавить\заменить какие-то файлы в корневом каталоге, чтобы был доступен русский язык в среде программирования. ?
« Последнее редактирование: 28-09-2006 16:41 от FallenSoul » Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #18 : 28-09-2006 16:47 » 

Извлечь код из среды ты никак не сможешь - буфера разные, посему надо открывать твой cpp-шник Блокнотом или Вордом, как понравится.
Оносительно написаний комментариев на русском языке - с етим у них траблы, посему единственный вариант для тебя - писать комментарии транслитом. По идее мы когда-то пытались заставить паскаль работать с рускими шрифтами, но дело ето неблагодарное, да и при открытии их под Виндой все камменты превращались в "арабскую вязь" Улыбаюсь, посему пиши транслитом ла и учи англицкий - без него тяжковато потом будет MSDN почитывать
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #19 : 28-09-2006 17:14 » 

А теперь ложка дегтя:
1 Прототипы функций нельзя описывать как переменные, по идее у тебя компилятор должен был выдать ошибку на строку
void True(),False();
стоило бы записать так:
void True();
void False();
2. Правильно все-же писать "OK", а не "oke"
3 Проверь свою программку при х==5.5 у==1
если я правильно понимаю, то ни в один из треугольников точка не вписывается. А что выдаст программа?
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #20 : 28-09-2006 17:18 » 

И не обижайся если чего не так сказал. На самом деле, если ты расщитывал на внеземные похвалы, то такое маловероятно ибо ведет к зазнанию и ленивости, а как результат - отсутствие должных знаний. Однако, как видиш, и пинать тебя до смерти никто не стал. А опыт как известно "сын ошибок трудных".
И кстати, на достигнутом тормозить не стоит. Бери новые задачи, разрабатывай алгоритмы, пиши проги. Однако настоятельно советую, довести до ума алгоритм для данной задачи.
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 28-09-2006 17:21 » 

Какие похвалы и пинки. Брось,- я выложил сюда код чтобы окончательно разобратся с написанным, и благодаря вашим комментариям оформить так как надо, чтобы в дальнейшем знать как всё делается грамотно. Чем больше поправок на начальном этапе, тем лучше! Несказав про х=5.5 , у=1 -алгоритм считался бы не верным , и у меня была бы иллюзия.

А что касается 5.5 , 1-и в самом деле программа выдаёт положительный результат, хотя на практике это ложно :\ хм...
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 28-09-2006 17:28 » 

Думаю , последним штрихом будет исключение еще одной области:

Код:
if(x>3 && y<3)
  {
    False();
    return 0;
  }

Однако я прекрасно понимаю, что все что написано выше-это частный случай и что надо задавать общие формулы для все возможных случаев,- проблемма только в том что я не имею представления каким уравнением и какими функциями можно это осуществить( в геометрии и мат. анализе ).
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #23 : 28-09-2006 17:35 » 

Читай посты выше, в частности мой, в которых приводятся намеки на алгоритмы, тебе ж их не зря писали. Опять же интернет есть, и поисковики слава богу существуют. Поищи ссылки на алгоритмы. Заодно можеш сходить на algolist.manual.ru И потом уже спрашивай чего неясно. Причем думать что все алгоритмы будут для треугольника - наивно, все они будут приводится обобщенно для многоугольников.
Записан
LP
Помогающий

ru
Offline Offline

« Ответ #24 : 29-09-2006 16:20 » 

FallenSoul, я здесь как-то выкладывал функцию для определения принадлежности точки треугольнику, но ту тему кажется удалили (она была в разделе СРОЧНО ПАМАГИТЕ!!!).

Есть книга: Майкл Ласло "Вычислительная геометрия и компьютерная графика на C++", в ней описан другой, по-моему, самый удачный алгоритм решения этой задачи. Книгу можно скачать на natahaus.ru или как уже сказали смотри algolist.manual.ru - там есть тот самый отрывок из этой книги.
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #25 : 29-09-2006 16:28 » 

LP, я помню смысл решения Улыбаюсь - сумма площадей трёх треугольников (образованных точкой и тремя вершинами) должна быть == площади исходного тр-ка
Записан

LP
Помогающий

ru
Offline Offline

« Ответ #26 : 29-09-2006 18:06 » 

Я тоже помню, просто заново писать лень. Улыбаюсь Лучше взять готовое с algolist'a, тем более что в том способе учитывается, например, случай когда точка лежит на стороне треугольника и т.д.
« Последнее редактирование: 15-12-2007 15:05 от Алексей1153++ » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 30-09-2006 19:25 » 

Спасибо.

Сейчас решил написать небольшую програмку, которая будет осуществлять действия над матрицами,-однако с самого начала уже возник вопрос. Как оформить ввод координат с клавиатуры командой "cin" в строку? Допустим:

x11= ввод значения x12= ввод значения х13= ввод значения ...
х12= ввод значения ...
...

Дело в том , что по стандартной схеме cin>>x11>>x12... -каждое значение вводится с новой строчки :\
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #28 : 30-09-2006 19:55 » 

FallenSoul, вводи через запятую каждую строчку

или курсор переводи назад
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 30-09-2006 20:19 » 

В уроках такого не видел, можно краткую справку по обоим пунктам?!
Записан
Страниц: [1] 2 3 4 5   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines