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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 05:21   #1
tema65
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 22
По умолчанию необходимо разобраться с кодом

Здравствуйте, может кто-нибудь прокомментировать что каждая функция в этом коде означает? Здесь рассмотрен метода Прима для нахождения наикратчайшего пути
Код:
int wpchk(int w, int *wpts)
{
int i=0;
int flg=0;
while(wpts[i]!=-1)
{
if(wpts[i]==w){flg=1;}
i++;
}
 
if (flg==0) {return 0;} else return 1;
}
 
void main()
{
srand( (unsigned)time( NULL ) );
 
//int prices[10][10];
int waypoint[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1};
int way[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int start=-1;
int end=-1;
int min;
int imin;
 
*/// 0 1 2 3 4 5 6 7 8 9
int prices[10][10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0
0, 0, 2, 9, 8, 0, 0, 0, 0, 0, //1
0, 2, 0, 3, 0, 20,0, 0, 0, 0, //2
0, 9, 3, 0, 7, 4, 0, 0, 0, 0, //3
0, 8, 0, 7, 0, 11,0, 0, 0, 0, //4
0, 0, 20,4, 11,0, 0, 0, 0, 0, //5
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //6
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //7
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //8
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//9
 
printf("Enter № of start location:");
scanf("%i",&start);
printf("Enter № of finish location:");
scanf("%i",&end);
waypoint[0]=start;
int n=0;
int w;
while(waypoint[n]!=end)
{
min=0;
w=waypoint[n];
for(int i=0;i<10;i++)
{
if(((min==0)||((prices[w][i]<min)&&(prices[w][i]>0)))&&wpchk(i,waypoint)==0) {min=prices[w][i];imin=i;}
}
n++;
waypoint[n]=imin;
}
 
printf("\nThe way is:\n");
int i=0;
while(waypoint[i]!=-1)
{
printf("%i ",waypoint[i]);
i++;
}
getchar();
getchar();
}

Последний раз редактировалось Stilet; 22.01.2012 в 12:19.
tema65 вне форума Ответить с цитированием
Старый 22.01.2012, 12:16   #2
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Надо было код хоть как-то разметить по-хорошему, чтоб красиво выглядел.
Алгоритма самого этого не знаю, но в коде разобраться попробовал. Вот что получилось:
Код:
int wpchk(int w, int *wpts)
{
int i=0;
int flg=0;
while(wpts[i]!=-1)//Пока мы не дошли до элемента со значением -1 (то есть ещё необработанного)
{
    if(wpts[i]==w)//Если он равен переданной точке
      flg=1;//То делаем возвращаемое значение один
    i++;
}
 if (flg==0) {return 0;} else return 1;
//Вывод:
//Функция проверяет, была ли переданная в первом аргументе точка уже включена в путь
//P. S.: А возвращаемое значение можно было бы и bool поставить
}

void main()//main - основная функция. Та функция, которая будет выполняться изначально при запуске программы
{
srand( (unsigned)time( NULL ) );
 
//int prices[10][10];
int waypoint[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1};//Если я правильно понял, то номера точек, через которые идёт путь
int way[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int start=-1;//Номер старстовой позиции
int end=-1;//Номер конечной позиции
int min;
int imin;
 
//Как я понял, это массив точек. Только странно как-то составленный, лучше было бы массив POINT-ов сделать
//Номер точки с координатами (x;y) является элементами массива с номерами [y][x] и [x][y]
// 0 1 2 3 4 5 6 7 8 9
int prices[10][10]=
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0
0, 0, 2, 9, 8, 0, 0, 0, 0, 0, //1
0, 2, 0, 3, 0, 20,0, 0, 0, 0, //2
0, 9, 3, 0, 7, 4, 0, 0, 0, 0, //3
0, 8, 0, 7, 0, 11,0, 0, 0, 0, //4
0, 0, 20,4, 11,0, 0, 0, 0, 0, //5
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //6
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //7
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //8
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};//9
 
printf("Enter № of start location:");//Функция printf - форматированный вывод на экран
scanf("%i",&start);//Функция scanf - форматированный ввод с клаиатуры
printf("Enter № of finish location:");
scanf("%i",&end);
waypoint[0]=start;
int n=0;
int w;
while(waypoint[n]!=end)//Пока мы не пришли в конечную точку
{
min=0;//Обнуляем min
w=waypoint[n];//-1 практически, кроме последнего
for(int i=0;i<10;i++)
{
    if (((min==0)||
         ((prices[w][i]<min)&&(prices[w][i]>0)))&&
        wpchk(i,waypoint)==0)//Последнее условие означает, что точка ранее не была пройдена
                             //Кстати, красивее выглядело бы !wpchk(i,waypoint)
    {
        min=prices[w][i];
        imin=i;
    }
}
n++;
waypoint[n]=imin;
}
 
printf("\nThe way is:\n");
int i=0;
while(waypoint[i]!=-1)//Выводить только "активированные" точки
{
printf("%i ",waypoint[i]);//Вывод точки
i++;
}
getchar();//Функция getchar() (или getch()) возвращает код нажатой клавиши. Здесь используется её свойство ожидать нажатие клавиши
getchar();//Только непонятно, зачем эта функция используется здесь два раза
}
БалаШагаЛ вне форума Ответить с цитированием
Старый 22.01.2012, 12:30   #3
tema65
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 22
По умолчанию

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

while(wpts[i]!=-1) \\а что выполняется в данной строке?

Последний раз редактировалось Stilet; 22.01.2012 в 13:33.
tema65 вне форума Ответить с цитированием
Старый 22.01.2012, 13:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В этой строке говорится что цикл будет крутиться пока wpts[i] равен -1-це
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2012, 17:16   #5
tema65
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 22
По умолчанию

а что хранит переменная wpchk? (кол-во точек через которые идет путь?)
tema65 вне форума Ответить с цитированием
Старый 22.01.2012, 17:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

wpchk это не переменная а функция.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.01.2012, 01:34   #7
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Это алгоритм нахождения минимального пути? Аааа! Так вы ж меня спасли, мне ж как раз он и нужен. Спасибо вам большое!
БалаШагаЛ вне форума Ответить с цитированием
Старый 23.01.2012, 02:14   #8
tema65
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
wpchk это не переменная а функция.
а для чего она используется?
tema65 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо разобраться с кодом. Программа управления автобусным парком. Gadjett Общие вопросы C/C++ 0 17.12.2011 06:10
Помочь разобраться с кодом Neolit1819 Фриланс 0 06.05.2011 13:55
Помочь разобраться с кодом Neolit1819 Фриланс 0 29.04.2011 18:43
Разобраться с кодом. Vlero PHP 2 20.01.2011 12:46
Помогите разобраться с кодом Superlotles Общие вопросы Delphi 6 19.08.2009 22:24