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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 16:11   #1
Junior777
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 3
По умолчанию Язык программирования С. Задана Система двусторонних дорог...

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

Исходный код программы:
Код:
#include <stdio.h>
#include <conio.h>
#define NMAX 100
int vvodmr (int n, int g[][NMAX]) /*Ввод матрицы расстояний*/
{ int i,j;
scanf ("%d",&n); /*Ввод количества городов */
for (i=0; i<n; i++)
{ for (j=0; j<n; j++)
scanf ("%d",g[i][j]);} /*Ввод элементов матрицы расстояний*/
return n;
}
int pkrkg (int n, int g[][NMAX]) /* Поиск кратчайшего пути между двумя городами по алгоритму Флойда-Уоршелла*/
{ int i,j,k;
 for (k=0; k<n; k++)
 { for (i=0; i<n; i++)
  { for (j=0; j<n; j++)
  { g[i][j]=g[j][i];
  if (g[i][j]>(g[i][k]+g[k][j]))
  g[i][j]=g[i][k]+g[k][j]; }
  }
 }
 return g[i][j];
}
int pminsr (int g[][NMAX]) /*Определение города с минимальной суммой расстояний*/
{ int i,j,n,result,sum,MinColumn;
 for (i=0; i<n; i++)
 { sum=0;
 for (j=0; j<n; j++)
 sum+=g[i][j];
  if (result>sum)
 {
  result=sum;
  MinColumn=i; }
 }
 return MinColumn;
}
void main()
{ int n;
int g[NMAX][NMAX];
int i,j,MinColumn;
printf ("\nVvedite matricu rasstoyanii\n");
vvodmr (n,g);
g[i][j]=pkrkg (n,g);
MinColumn=pminsr (g);
printf ("\nGorod: %d\n", MinColumn);
getch ();
}
Тест программы:
n=3 (n - количество городов)
Матрица расстояний:
i 0 1 2
j
0 0 1 2
1 1 0 2
2 1 2 0

при выводе нужного города выводит Gorod: 1258
Хотя их всего 3)
Подскажите пожалуйста где ошибка (или ошибки =) ).

Последний раз редактировалось Junior777; 11.11.2011 в 18:52.
Junior777 вне форума Ответить с цитированием
Старый 11.11.2011, 16:31   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Когда Вы передаёте аргумент в функцию "по значению" (в случае C++, аргументы "по умолчанию", без дополнительных выкрутасов, передаются именно так) - например,
Код:
printf ("\nVvedite matricu rasstoyanii\n");
vvodmr (n,g);
для функции создаётся своя, "персональная" копия аргумента, изменения которой никак не отражаются на оригинале. Другими словами, в переменной n из main как был записан мусор, так мусор после этого вызова и останется. Массивы - исключение, они всегда передаются "по ссылке" (это потому что переменная g - это на самом деле адрес первого элемента, &g[0][0]).
Что делать? Можно передать n по ссылке (в заголовке функции vvodmr написать int* n и в main передать ей &n, как в scanf). А можно, и, ИМХО, лучше - сделать так, чтобы vvodmr возвращала размерность введённой матрицы (int vvodmr(int g[][NMAX]). n внутри vvodmr при этом становится локальной переменной, а n в main инициализируется при вызове:
Код:
printf ("\nVvedite matricu rasstoyanii\n");
n = vvodmr(g);
Далее. Совершенно непонятно, что возвращает эта функция:
Код:
int pkrkg (int n, int g[][NMAX])
Далее. Совершенно непонятно, как эта функция
Код:
int pminsr (int g[][NMAX])
собирается сообразить, какой реальный размер матрицы расстояний.

В общем, хорошо бы Вы повторили код, заключив его в тег CODE и малость разбавив комментариями.
Abstraction вне форума Ответить с цитированием
Старый 11.11.2011, 18:37   #3
Junior777
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 3
По умолчанию

Спасибо! Сейчас будем править

Последний раз редактировалось Junior777; 11.11.2011 в 20:08.
Junior777 вне форума Ответить с цитированием
Старый 11.11.2011, 20:21   #4
Junior777
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 3
По умолчанию

Не смог разобраться только с этой частью:
Цитата:
Далее. Совершенно непонятно, что возвращает эта функция:
Код:


int pkrkg (int n, int g[][NMAX])
Junior777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык программирования D russian-stalker Свободное общение 2 07.02.2011 20:51
Язык программирования С++ Jasper92 Свободное общение 2 09.11.2009 13:51
Язык программирования C Jasper92 Свободное общение 17 06.09.2009 11:13
язык программирования Си Ruslan0990kz Общие вопросы C/C++ 1 03.06.2009 22:01