Всем доброго времени суток. На практической я имел возможность ознакомиться вот с такой задачкой: Задано N точек на плоскости. Вычислить (N-1) не замкнутую ломаную кривую, которая проходит через все эти точки и не пересекает себя. Соседние отрезки ломаной могуть лежать на одной прямой.
Буду очень признателен, если поможете решыть задачку. И если вас не затруднит то напишыте кодом Turbo Pascal. Зарание спасибо!
М
Ну при чем тут многострадальный массив?? Хватит уже все валить на него.. В следующий раз вдумчивее подходи к названию темы. Переименовано. Lapp
Lapp
27.12.2009 10:09
Упорядочи их по возрастанию одной какой-то координаты (например, X) и соединяй в этом порядке. Если встретятся несколько подряд с одинаковым X, то внутри этой группы упорядочивай по Y.
Цитата(CormiX @ 27.12.2009 9:50)
И если вас не затруднит то напишыте кодом Turbo Pascal.
угу, и положЫте на блюдечко с голубой каемочкой.. Когда покажешь свои успехи в этой области - тогда поможем.
andriano
27.12.2009 10:36
Пока читал первый пост, естественно, пришел в голову алгоритм решения. Прочитав второй, понял, что мое решение является частным случаем описанного в нем, только для полярной системы координат.
PS. Кстати, этот вариант подходит и для замкнутых ломаных.
CormiX
27.12.2009 11:11
У меня практическая по массивам, и там была эта задачка....вот почему я хочу решить е с помощью массива.
andriano
27.12.2009 12:00
Да, массив - наиболее подходящая структура данных для этой задачи.
Lapp
27.12.2009 12:17
Цитата(CormiX @ 27.12.2009 11:11)
У меня практическая по массивам, и там была эта задачка....вот почему я хочу решить е с помощью массива.
Разумеется, с помощью массива. Но 99% задач решаются с помощью массивов (я говорю про учебные, производственные все 100%). Это все равно, что на форуме о русском языке назвать тему "слова". Старайся выразить в названии ТО, что тебе надо сделать. В подзаголовке уместно сказать, что желательно использовать. Если хочешь, добавь сейчас в подзаголовок этой темы (который у тебя был пустым, и я его пустым поэтому оставил) слово "массивы". Ты пройдись по форуму, найдешь ТЫСЯЧИ тем, названых "Массивы". По-твоему это помогает поиску?.. А для чего еще заголовок, если не для этого?
CormiX
27.12.2009 12:20
const n=100; var a:array[1..n] of real; i:integer; begin write('i='); readln(i); for i:=1 to n-1 do begin
только вот не знаю что дальше)
Lapp
27.12.2009 12:23
Цитата(CormiX @ 27.12.2009 12:20)
только вот не знаю что дальше)
Уже хорошо! Теперь ответь: как ты хочешь получать сам набор координат точек: вводом с клавиатуры или случайным образом (то есть без ввода)?
CormiX
27.12.2009 12:30
Нужно чтоб я сам вводил числа.
... write('n:='); ...
или как?
andriano
27.12.2009 12:52
i у тебя целая переменная, используемая в качестве переменной цикла. Во-первых, ты хочешь вводить вещественные значеия в массив, а во-вторых, значение i у тебя затирается (уничтожается) при организации цикла. Так что ты хочешь сделать?
Еще раз советую: сначал опиши алгоритм по-русски, и только потом пыайся перевести его на Паскаль.
CormiX
27.12.2009 13:08
Запутался я чето) Ну следуйщий шаг надо записать числа массива так?
for i:=1 to n-1 do begin write('a[',i,']='); readln(a[i]); end;
andriano
27.12.2009 13:28
В принципе верно, только почему у тебя цикл проходит n-1 раз вместо n? Обычно либо массив нумеруют с 0 и тогде последний элемент имеет индекс n-1, либо с 1 и тогда индекс последнего элемента n.
CormiX
27.12.2009 13:37
А у меня в задании ломаная N-1, ето не то?)
andriano
27.12.2009 13:54
Если речь идет о НЕЗАМКНУТОЙ ломаной, то между n точками у тебя получится n-1 звеньев ломаной. Но вводишь то ты точки. И, кстати, у точек на плоскости две координаты, а не одна.
CormiX
27.12.2009 13:59
Я продвинулся до этого:
const n=100; var a:array[1..n] of real; i,j:integer; begin write('i='); readln(i); write('j='); readln(j); for i:=1 to n do begin write('a[',i,']='); readln(a[i]); for j:=1 to n do write('a[',j,']='); readln(a[j]); end;
Так? Ктонить отзовитесь!)
andriano
27.12.2009 16:44
А теперь объясни, для чего нужна каждая строчка.
CormiX
27.12.2009 16:53
const n=100; задаем N var a:array[1..n] of real; задаем массив и переменные i,j:integer; begin write('i='); 1-я координата readln(i); write('j='); 2-я (ну ето есл я правильно понимаю) readln(j); for i:=1 to n do запускаем цикл begin write('a[',i,']='); задаем массив readln(a[i]); for j:=1 to n do write('a[',j,']='); readln(a[j]); end;
вроде все)
Lapp
27.12.2009 16:56
Цитата(CormiX @ 27.12.2009 13:59)
Так? Ктонить отзовитесь!)
Не так.. Ответь на вопрос andriano, плз. Или хотя бы объясни, зачем ты вводишь значения для переменных i и j. Что ты хотел этим сказать? Они же затираются потом, как переменные циклов.. И зачем тебе два цикла? Вводи одно число (число точек), а потом в цикле вводи для каждой точки в цикле координаты x и y.
CormiX
27.12.2009 17:01
Я думал i,j это обозначение точки массива, но он линейный а не матрица = / туплю блин.
Lapp
27.12.2009 17:02
Попробуй разобраться.
const m=100; // задаем максимально возможное число точек var x,y: array[1..m] of real; // определяем массивы координат i,n: integer; begin write('n='); // вводим реальное число точек readln(n); for i:=1 to n do begin write('x[',i,']='); readln(x[i]); write('y[',i,']='); readln(y[i]); end end.
(исправил)
CormiX
27.12.2009 17:06
const m=100; // задаем максимально возможное число точек var x,y: array[1..m] of real; // определяем массивы координат i: integer; begin write('n='); // вводим реальное число точек readln(n); for i:=1 to n do begin // запускаем цикл write('x[',i,']='); // вводим число координаты х readln(x[i]); write('y[',i,']='); // вернее получаем число координаты у readln(y[i]); end end.
Типа проверка?) Я думал что вы правильно пишете)
Lapp
27.12.2009 17:09
Цитата(CormiX @ 27.12.2009 17:06)
ето вся программа?
Это только подготовка данных..
Добавлено через 1 мин. ты скопировал первый вариант, в нем были опечатки. Я исправил в мессадже выше. исправь и ты у себя..
CormiX
27.12.2009 17:21
Я вот не понимаю что значит соеденить точки....В программе)
Lapp
27.12.2009 17:43
Цитата(CormiX @ 27.12.2009 17:21)
Я вот не понимаю что значит соеденить точки....В программе)
Может.. нарисовать?
CormiX
27.12.2009 17:54
Спасибо, имею ввиду что именно кодом не знаю как описать соединение)
Lapp
27.12.2009 17:57
Цитата(CormiX @ 27.12.2009 17:54)
Спасибо, имею ввиду что именно кодом не знаю как описать соединение)
Я и говорю: нарисовать.
Line(x[i],y[i],x[j],y[j])
CormiX
27.12.2009 17:59
Хм....Пасибо!)
Lapp
27.12.2009 18:09
Цитата(CormiX @ 27.12.2009 17:59)
Хм....Пасибо!)
Теперь понятно, что делать?
1. Ввод данных. Он у тебя есть, но я бы советовал все же вводить случайный ряд, если предполагается графмка. 2. Рассортировать данные по X (и Y внутри групп). 3. Инициализировать графику, нанести оси. 4. Нарисовать ломанную.
Вот, примерно так.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.