2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Помогите найти ошибку в программе
Сообщение19.12.2008, 21:12 
Аватара пользователя


01/12/07
172
Алгоритм Дейкстры поиска кратчайшего пути на графе;программа не выводит кратчайший путь из start в finish :(
Код:
void main(){
   int start,finish,u;
   int dlina_puti[N];
   int put[N];
   int x[N];
   long infinity=99999999;
   printf("input start ");
   scanf("%d",&start);
   printf("input finish ");
   scanf("%d",&finish);
   for(u=0;u<N;u++){
         dlina_puti[u]=infinity;
         x[u]=0;
      }
   dlina_puti[start]=0;
   put[start]=start;
   x[start]=1;   
   int v=start;
   int w=infinity;
   while(1){
   for(u=0;u<N;u++){
         if(ports[u][v]==0) continue;
         if(dlina_puti[u]>dlina_puti[v]+ports[u][v]){
            dlina_puti[u]=dlina_puti[v]+ports[u][v];
            put[u]=v;
         }
         if(x[u]==0 && dlina_puti[u]<w){
            v=u;
            w=dlina_puti[u];
         }
      
      }
   




   if(v==finish){
      u=finish;
      while(u!=start){
         printf("%d\n",u);
         u=put[u];
      }
      printf("%d\n",dlina_puti[finish]);
      break;
   }
   x[v]=1;
   
   }
   
}

 Профиль  
                  
 
 
Сообщение19.12.2008, 22:50 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
Ну и кто же, кроме автора будет в этом разбираться? Пройдите по-шагово в дебаггере при небольших N. Проверяйте значения промежуточных переменных (результатов). :cry:

Кроме того, подумайте, глядя, например, на строчки кода

Код:
put[start]=start;
   x[start]=1; 


Что будет с Вашей программой при start >= N?

 Профиль  
                  
 
 
Сообщение20.12.2008, 14:25 


27/11/05
183
Северодонецк
Мой племянник, обучаючись в современной академии программированию, всегда говорит в случае каких-то проблем со своим ваянием: "Так она же странслировалась!?". Хотелось бы обратить внимание авторов (к примеру таких, как matan) программ на прохождение этими программами теста хотя бы на компиляцию...

 Профиль  
                  
 
 
Сообщение20.12.2008, 22:56 


28/05/07
153
такой отвратный код даже читать не хочется

 Профиль  
                  
 
 
Сообщение21.12.2008, 14:43 


28/10/08
33
>>жми сюда<<
Много чего есть, в т.ч. теория и пояснения :)

 Профиль  
                  
 
 
Сообщение21.12.2008, 20:15 


21/03/06
1545
Москва
Sherpa писал(а):
такой отвратный код даже читать не хочется

А чего в нем такого отвратного? :?

 Профиль  
                  
 
 
Сообщение21.12.2008, 23:10 


27/11/05
183
Северодонецк
Что в нем такого отвратного? Как говорится, найдите десять формальных отличий
(семантика программы сохранена, изменено только чистописание - жаль, что современным студентам-программистам не прививают нывык "чисто писать", как это делалось давным давно в первых классах школы):

Код:
void main()
{
   int  start, finish, u;
   int  dlina_puti[N];
   int  put[N];
   int  x[N];
   int  v;
   int  w;
   long infinity = 99999999;

   printf("input start ");
   scanf("%d", &start);
   printf("input finish ");
   scanf("%d", &finish);

   for(u = 0; u < N; ++u)
   {
      dlina_puti[u] = infinity;
      x[u]          = 0;
   }

   dlina_puti[start] = 0;
   put[start]        = start;
   x[start]          = 1;   
   v                 = start;
   w                 = infinity;

   for(;;)
   {
      for(u = 0; u < N; ++u)
      {
         if(ports[u][v] == 0)
            continue;
         if(dlina_puti[u] > dlina_puti[v] + ports[u][v])
         {
            dlina_puti[u] = dlina_puti[v] + ports[u][v];
            put[u]        = v;
         }
         if(x[u] == 0 && dlina_puti[u] < w)
         {
            v = u;
            w = dlina_puti[u];
         }
      }
   
      if(v == finish)
      {
         for(u = finish; u != start; u = put[u])
         {
            printf("%d\n", u);
         }
         printf("%d\n", dlina_puti[finish]);
         break;
      }
      x[v] = 1;
   }
}

 Профиль  
                  
 
 
Сообщение21.12.2008, 23:57 


12/09/08

2262
bekas в сообщении #169804 писал(а):
Как говорится, найдите десять формальных отличий
Да уж красотища немерянная :lol: Позаменять везде 'while' на 'for', даже для бесконечного цикла, да повыностить открывающие фигурные скобки в отдельные строки — это несущественно для восприятия (а скобки наоборот транжирят вертикальное пространство). Понятное дело, в некоторых coding styles это обязательно, но к красоте никакого отношения не имеет. Причем, что интересно, массив с безобразным именем 'dlina_puti' и константу 'infinity' с более чем странным значением Вы не тронули :)

 Профиль  
                  
 
 
Сообщение22.12.2008, 00:22 


19/11/08
347
Сразу бросилось в глаза:
Код:
         if(x[u] == 0 && dlina_puti[u] < w)
         {
            v = u;
            w = dlina_puti[u];
         }


При первом же обращении к этому месту w примет маленькое значение (может даже ноль) и больше это условие никогда не исполнится.
Т.е. v - так навсегда и останется случайной ближайшей к start вершиной и никогда не станет равной finish.

 Профиль  
                  
 
 
Сообщение22.12.2008, 01:18 


21/03/06
1545
Москва
bekas писал(а):
Что в нем такого отвратного? Как говорится, найдите десять формальных отличий
(семантика программы сохранена, изменено только чистописание - жаль, что современным студентам-программистам не прививают нывык "чисто писать", как это делалось давным давно в первых классах школы):

Овчинка выделки не стоит. Такой простой код легко читается и в том виде, как он написан у автора. А такое:
Код:
   dlina_puti[start] = 0;
   put[start]        = start;
   x[start]          = 1;   
   v                 = start;
   w                 = infinity;

выглядит конечно, немерянно красиво, но это так долго набирать, что вообще-то, ИМХО, неюзабельно в принципе. Для #define это сойдет, но чтобы в тексте функции так изгаляться (он правится десятки раз) - увольте.

вздымщик Цыпа писал(а):
Причем, что интересно, массив с безобразным именем 'dlina_puti' и константу 'infinity' с более чем странным значением Вы не тронули

Наскоряк написанная функция не обязана быть оформлена по всем канонам с использованием limits.h и синтаксически правильных английских слов :).

 Профиль  
                  
 
 
Сообщение22.12.2008, 02:08 


12/09/08

2262
e2e4 в сообщении #169855 писал(а):
Наскоряк написанная функция не обязана быть оформлена по всем канонам с использованием limits.h и синтаксически правильных английских слов
Спору нет. Но я же не изначальный код критиковал, а художественное его переоформление, в котором как раз главного сделано и не было :)

 Профиль  
                  
 
 
Сообщение22.12.2008, 19:37 


27/11/05
183
Северодонецк
1.
"Причем, что интересно, массив с безобразным именем 'dlina_puti' и константу 'infinity' с более чем странным значением Вы не тронули" - и не собирался трогать, я же четко написал - правка коснулась всего лишь чистописания.

2.
"Наскоряк написанная функция не обязана быть оформлена по всем канонам с использованием limits.h и синтаксически правильных английских слов" - это мне напоминает ситуацию с человеком, который говорит, что когда наступит момент совершить подвиг, так он обязательно его сделает, а пока будет допускать мелкие прегрешения в виде перебежки улицы на красный цвет светофора - ну не поверю!

3.
"повыностить открывающие фигурные скобки в отдельные строки — это несущественно для восприятия" - ага, если не знать, что IDE Visual C++ позволяет искать парные скобки (в том числе и фигурные по Ctrl+} или Ctrl+{) - когда скобки в конце оператора - придется попрыгать по тексту

4.
"выглядит конечно, немерянно красиво, но это так долго набирать" - ага, это если не знать, что для этого надо использовать Tab.

5.
"Такой простой код легко читается и в том виде, как он написан у автора" - ага, надо при этом обладать талантом Кашперовского, чтобы сообразить, где заканчивется цикл и где его тело, когда все выравнено как в Ассемблере по одной линии - это что, делается специально, чтобы трудностей не бояться?

 Профиль  
                  
 
 
Сообщение22.12.2008, 22:35 


12/09/08

2262
bekas в сообщении #170061 писал(а):
"Наскоряк написанная функция не обязана быть оформлена по всем канонам с использованием limits.h и синтаксически правильных английских слов" - это мне напоминает ситуацию с человеком, который говорит, что когда наступит момент совершить подвиг, так он обязательно его сделает, а пока будет допускать мелкие прегрешения в виде перебежки улицы на красный цвет светофора - ну не поверю!
А имитатор перфекциониста будет строить сарай для лопат и грабель из красного дерева, тщательно шлифуя и полируя стыки, ага.
bekas в сообщении #170061 писал(а):
"повыностить открывающие фигурные скобки в отдельные строки — это несущественно для восприятия" - ага, если не знать, что IDE Visual C++ позволяет искать парные скобки (в том числе и фигурные по Ctrl+} или Ctrl+{) - когда скобки в конце оператора - придется попрыгать по тексту
Да, подстраивать стиль под специфику IDE Visual C++ — это куда как правильнее, чем выбросить его нафиг и не вспоминать об этом убожестве.
bekas в сообщении #170061 писал(а):
"выглядит конечно, немерянно красиво, но это так долго набирать" - ага, это если не знать, что для этого надо использовать Tab.
Tab в середине строки? Расстрелять.
bekas в сообщении #170061 писал(а):
"Такой простой код легко читается и в том виде, как он написан у автора" - ага, надо при этом обладать талантом Кашперовского, чтобы сообразить, где заканчивется цикл и где его тело, когда все выравнено как в Ассемблере по одной линии - это что, делается специально, чтобы трудностей не бояться?
Если кто неспособен на глаз воспринять вложенность уровня 2 без отступов в 8 позиций, то его вслед за тем, кто вставляет табы в середину строки.

И еще, Вы уже три года на форуме. Может освоите таки кнопку «вставка»?

 Профиль  
                  
 
 
Сообщение23.12.2008, 07:43 


27/11/05
183
Северодонецк
IDE Visual C++ - это убожество!? Однако, батенька, вы рэвольюционэр, как говорили у нас некогда на Майдане...

И помните: программист в первую очередь не писатель, а читатель - то что он напишет один раз в порыве творческого энтузиазма в стиле а-ля Пикассо (этот художник мне, правда, нравится), будет потом сам (или другие, что более грустно) читать много-много раз, если конечно это будет являться его основной работой хотя-бы лет на десять, а не просто сдачей очередной "лабы"...

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

 Профиль  
                  
 
 
Сообщение23.12.2008, 14:01 


12/09/08

2262
bekas в сообщении #170193 писал(а):
IDE Visual C++ - это убожество!?
Конечно. Любой IDE — убожество, а этот еще и без компилятора толком. Впрочем, на игровой консоли компайлер и не очень нужен :)
bekas в сообщении #170193 писал(а):
И помните: программист в первую очередь не писатель, а читатель
Вот именно. У Вас размер табуляции 4 позиции (судя по отступам), а у читателя 8 или 2. Потому, никаких пробелов в начале строк и никаких табуляций в их серединах — это важное правило.
bekas в сообщении #170193 писал(а):
разговоры по поводу колючей проволоки вокруг некоторых областей года четыре назад были
Разговоры разговорами, но отгородить кое-кого там не мешало бы, только не колючей проволокой а нормальной госграницей и пусть вступают сами во что хотят.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group