Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2009, 20:45   #61
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от patriarch
а что за запись mas[i].x и что такое pow?
mas - массив структур
mas[i] - элемент массива (то есть, в данном случае, одна точка)
mas[i].x - обращение к элементу структуры

Вместо структуры сделайте два массива: x и y.
Вместо mas[i].x пишите x[i], а вместо mas[i].y - y[i].

Цитата:
с массивами это будет выглядеть так?
Вы изменили в коде 2 строчки. Естественно, это будет выглядеть не так!
Все, что нужно, написал выше.

Переделывать весь код не буду. Сами справитесь, если подумаете.

Цитата:
и что такое pow?
А это могли бы посмотреть в интернете. Это функция возведения в степень.
--------------------------
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.04.2009, 19:16   #62
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

ура вроде бы переписал!спасибо!
и можно ещё вопросы почему именно такие формулы? mas[i].y = rand()*(BMAX-TMAX)/(double)RAND_MAX+TMAX; и S += pow( pow(mas[j].x-mas[i].x,2) + pow(mas[j].y-mas[i].y,2),0.5);
А с замененной задачей не поможете?

Последний раз редактировалось patriarch; 12.04.2009 в 19:27.
patriarch вне форума Ответить с цитированием
Старый 12.04.2009, 19:44   #63
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
mas[i].y = rand()*(BMAX-TMAX)/(double)RAND_MAX+TMAX;
BMAX - нижний максимум
TMAX - верхний
rand() выдает целые числа. Чтобы получить рандомное вещественное число, нужно делить на RAND_MAX. Это будет случайное число от 0 до 1.
--------------
Код:
S += pow( pow(mas[j].x-mas[i].x,2) + pow(mas[j].y-mas[i].y,2),0.5);
Здесь правая часть - длина отрезка. Формула из школьного курса математики.
----------------------------------
Цитата:
А с замененной задачей не поможете?
Ну вы начинайте решать. Напишите свои мысли, наработки приведите.
Я до выходных врядли появлюсь. На данный момент решение для меня не очевидно.
Нужно думать. И в одиночку мне этого делать не хочется.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.04.2009, 19:53   #64
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

ну мое решение такое.Пользователь вводит с клавиатуры начальную формулу и конечную,и правила подстановки.Возьмем 3 строки.В одной будет начальная формула.В другой конечная.В третье промежуточные вычисления.Затем мы берем начальное слово и применяем к нему первую подстановку результат записываем в промежуточную строку.Затем к промежуточной формуле применяем ещё подстановки...Вопрос в том нужно ли к ней снова применять ту подстановку которую мы применили или перейти к другой.Это похоже просто перебор....Пока это только идея и похоже не слишком идеальная.
patriarch вне форума Ответить с цитированием
Старый 12.04.2009, 20:03   #65
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Пока еще плохо видно, но, возможно, программа сможет уйти в бесконечный цикл (при определенных правилах).
Цитата:
Вопрос в том нужно ли к ней снова применять ту подстановку которую мы применили или перейти к другой
Это интересный вопрос. И, вроде как, важный для данной задачи.
Цитата:
Это похоже просто перебор..
Естественно перебор. А как иначе?

Подумаю, как сделать через рекурсию. Но без компьютера врядли много надумаю. Посмотрим.

Начинайте реализовывать идеи (какие появятся).
Правила можно помещать в двумерный массив.
Вводить с помощью scanf
Код:
for(i=0;i<n;i++)
 scanf("%s->%s\n",&mas[i][0],&mas[i][1]);
как-то так
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 12.04.2009 в 20:06.
Sazary вне форума Ответить с цитированием
Старый 12.04.2009, 20:10   #66
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

идей пока нету.То что есть не совсем понимаю как реализовать.

P.S. Переписанная с массивами программа же такая будет?
Код:
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>



int main()
{
const int N = 10; // количество точек

const double LMAX=-10, RMAX=10; // левая и правая границы для генерации координат
const double TMAX=-10, BMAX=10; // верхняя и нижняя


double masX[N];
double masY[N];

int i,j,K;
double S,Smin;
srand(time(NULL));

for(i=0;i<N;i++)
{
// разбрасываем точки
masX[i] = rand()*(RMAX-LMAX)/(double)RAND_MAX+LMAX;
masY[i] = rand()*(BMAX-TMAX)/(double)RAND_MAX+TMAX;
printf("To4ka %d: %5.3lf %5.3lf\n",i,masX[i],masY[i]);
}
printf("\n"); 
//==================

K = 0; // считаем, что вершина K - то, что нам нужно
Smin = -1;
for(i=0;i<N;i++) // перебираем все возможные "корни куста"
{
S = 0; // изначально сумма равна 0
for(j=0;j<N;j++) // перебираем вершины куста
{
if(j==i) continue; // если текущая вершина - корень, пропускаем
S += pow( pow(masX[j]-masX[i],2) + pow(masY[j]-masY[i],2),0.5); 
}
if(Smin==-1) // если мы еще пока ничего не запомнили...
{
Smin = S; // то запоминаем эту сумму
K = i; // и номер вершины-корня
}
else
{
if(S<Smin) // иначе, если текущая сумма меньше
{
Smin = S; // запоминаем ее
K = i;
}
} 
}
//=======
printf("Vershina kusta: %5.3lf %5.3lf\n", masX[K],masY[K]);
printf("Summa reber = %5.3lf\n", Smin);
//---------
getch();
return 0;
}
patriarch вне форума Ответить с цитированием
Старый 12.04.2009, 21:33   #67
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от patriarch
P.S. Переписанная с массивами программа же такая будет?
Ну так запустите и увидите. Все так.
Цитата:
идей пока нету.То что есть не совсем понимаю как реализовать.
Ну тогда придумывайте. Это просто отговорка.
Если нет идей сейчас, то, может, появятся позже. Естественно, не с потолка свалятся. Нужно сидеть и думать.
Я вернусь, скорее всего, только в пятницу. Может, и придумаю что-нибудь к этому времени.

Ну вот первые идеи.

Будут две функции: стартовая и рекуррентная.
Пусть длина правила (точнее, одной его части. (длина правила ab->ba = 2)) будет lp.
В стартовой функции идем по исходному слову (in) от 0 до in.length()-lp.
Пусть будет булева переменная flag. На каждой итерации присваиваем ему true.
Флаг будет говорить о том, применялись ли какие-нибудь правила за данный проход.
Входим в цикл while. Условие - in[i]!=out[i] && flag, то есть пока текущий символ исходного слова не равен символу из конечного и установлен флаг (то есть были перестановки).
В цикле while ставим флаг в false и вызываем рекуррентную функцию fun.
Ее заголовок будет выглядеть примерно так:
Код:
string fun(string s, int pos, bool *flag, string t)
вызываем ее с такими параметрами:
Код:
fun(in,i,*flag,"");
после этого проверяем, были ли перестановки:
Код:
if(!flag) return false;
то есть если перестановок не было, то нельзя установить заданный символ с помощью имеющихся правил.

---------------------
В функции fun будет цикл от 0 до N-1 (где N - количество правил).
Там выделяем в sub подстроку:
Код:
string sub = s.substr(pos,lp);
Проверяем, есть ли такая подстрока в правилах. Если есть, то меняем в строке s эту подстроку на правило (и пишем, например, в tmp), ставим флаг в true и вызываем себя:
Код:
fun(tmp,pos+1,*flag,t);
Еще должно быть условие выхода, что-то вроде:
Код:
if(pos==in.length()-lp) return t;
---------------------
Ну вот. Естественно, это наброски, которые я писал на бумаге. Использовать их в таком виде нельзя.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Stilet; 15.06.2009 в 12:28.
Sazary вне форума Ответить с цитированием
Старый 14.04.2009, 20:06   #68
patriarch
Пользователь
 
Регистрация: 24.03.2009
Сообщений: 62
По умолчанию

я пытался сдать преподу задачу с деревьями.Он сказал что это простейший случай и нужно писать задачу рекурсией.Нужны случаи когда у вершины ещё могут быть сыновья.
patriarch вне форума Ответить с цитированием
Старый 14.04.2009, 20:15   #69
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Я балдею! То минимальное (по сумме рёбер) дерево — то сыновья!

Тогда надо поменять (ограничить) условие задачи. Странно, что это идёт вдогонку... сразу не сказать?

То, что Sazary уже сделал (по поиску минимального дерева) — это и есть решение. А у вас так:

— 2·2?
— 4.
— Это все знают. Найдите более сложное решение.

Цитата:
Сообщение от patriarch Посмотреть сообщение
нет Вы немного не поняли.Препод прикопался именно к условию задачи.
"построить дерево с вершинами в данных точках так,
чтобы была минимальной суммарная длина его рёбер."
Нужно построить именно дерево,а то что я пытался сдать это простейший случай дерева.
А более сложные случаи дерева — как правило*! — дают бульшую сумму рёбер. Именно поэтому мы и взяли «простейший случай дерева»: по одному сыну у каждой вершины, кроме последней. Это никоим образом (внешний вид в расчёт не берём) не противоречит определению дерева.

____________________________
* Так что препод в общем-то прав! Но он же заменил задачу про матрицу — как очень для вас сложную! А эта — ещё сложнее: надо делать полный перебор по простым, бинарным, тринарным, бинарно-тринарным, тринарно-бинарным и т. д. деревьям. К диплому дай бог успеть!

Последний раз редактировалось Sasha_Smirnov; 15.04.2009 в 04:43. Причина: правота препода.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 14.04.2009, 20:16   #70
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от patriarch
Он сказал что это простейший случай и нужно писать задачу рекурсией.Нужны случаи когда у вершины ещё могут быть сыновья.
В таком случае реализуйте какой-нибудь известный алгоритм для деревьев.

Sasha_Smirnov +1 ))
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение матрицы методом союзной матрицы dofmat Помощь студентам 6 03.10.2011 15:01
Чистый бинарный код НикСерг Общие вопросы C/C++ 16 09.11.2009 15:06
деревья ShenDy Общие вопросы C/C++ 0 13.03.2009 19:18
Деревья Mitron Общие вопросы Delphi 5 01.02.2008 10:09
Деревья Зёка_студент Помощь студентам 1 26.12.2007 21:47