Хотя я не буду говорить о правильности вашей реализации «Алгоритма Флойда Варшалла», я думаю, что могу помочь вам прочитать десятичные значения.
Сначала пара мыслей, указателей, подсказок.(1) ваш код на C и не имеет ничего общего с C ++, за исключением C ++, изначально создаваемого как супер-набор C много лет назад (теперь он сам по себе является языком, но все еще поддерживает возможность использовать традиционныйФункции библиотеки C);(2) избегайте использования <conio.h>
, это заголовок только для окон, и вы можете использовать стандартную библиотечную функцию getchar()
, чтобы держать терминал открытым, пока вы не нажмете клавишу возврата вместо использования getch()
, и в этом просто нет необходимостидля clrscr()
;и, наконец, (3) избегайте использования глобальных переменных , если это абсолютно не требуется.Объявите необходимые переменные в main()
и передайте их в качестве параметров любым функциям, которые их требуют.
Для начала правильные объявления для main
: int main (void)
и int main (int argc, char **argv)
(которые вы увидите написаннымис эквивалентом char *argv[]
). примечание: main
является функцией type int
и возвращает значение.См .: Стандарт C11 §5.1.2.2.1 Запуск программы p1 (черновик n1570) .См. Также: См. Что должно возвращать main () в C и C ++? .
Хорошо, когда вам нужна константа, использование #define
- это правильный способ определить один (или выможно использовать global enum
для достижения того же самого).
То, что может содержать переменная, определяется type
, который вы объявляете переменной.Ваши целочисленные типы - char, short, int, long, long long
(вместе с их unsigned
и exact-width
аналогами), а ваши типы для хранения десятичных ( с плавающей запятой ) значений - float
и double
.(как правило, 32-разрядный и 64-разрядный соответственно).Так что в вашем случае, если вы хотите, чтобы w
и d
могли содержать десятичные значения, вам нужно объявить их с правильным типом, например,
#define MAX 30
...
double w[MAX][MAX] = {{ 0.0 }}, /* double or float type */
d[MAX][MAX][MAX] = {{{ 0.0 }}}; /* to hold decimal values */
(это всегда хорошая идеяинициализировать массивы со всеми нулями, чтобы избежать непреднамеренной попытки чтения из элемента, для которого еще не установлено его значение.Это также различие между вашими глобальными объявлениями (по умолчанию инициализируется нулем) и при объявлении массивов в main()
с длительность автоматического хранения )
Когда вы принимаете пользовательский ввод - независимо от используемой вами функции, вам нужно проверить возврат функции ввода и проверить правильность ввода , если требуется, чтобы он находился в заданном диапазоне, например,
printf ("enter the no. of vertices\n");
if (scanf ("%d", &v) != 1) { /* always validate scanf return */
fprintf (stderr, "error: invalid integer input for v.\n");
exit (EXIT_FAILURE); /* exit on failure - adjust as desired */
}
if (v < 0 || v > MAX) { /* validate v within range of MAX */
fprintf (stderr, "error: v not within 0 - %d.\n", MAX);
exit (EXIT_FAILURE);
}
Чтобы прочитать значения double
, вам просто нужно изменить спецификатор преобразования с %d
(используетсячитать целочисленные значения) до %lf
(используется для чтения double
значений - модификатор 'l'
опускается для чтения float
).Вы все равно должны предоставить ту же проверку, например,
printf ("enter the weights\n");
for (i = 0; i < v; i++)
for (j = 0; j < v; j++)
if (scanf ("%lf", &w[i][j]) != 1) { /* use %lf for double */
fprintf (stderr, "error: invalid w[%d][%d].\n", i, j);
exit (EXIT_FAILURE);
}
Для объявления w
и d
в main()
потребуется передать w
и d
в качестве параметров в floyd()
, например
void floyd (double d[][MAX][MAX], double w[][MAX], int v);
, и вы называете его в main как:
floyd (d, w, v);
В целом, вы можете сделать что-то вроде следующего (примечание: я нахожусь в Linux и мне не нуженgetchar()
(или getch()
для удержания терминала открытым, поэтому я включил этот вызов в проверки препроцессора, чтобы он вызывался только в окнах):
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
double min (double a, double b)
{
return a < b ? a : b;
}
void floyd (double d[][MAX][MAX], double w[][MAX], int v);
int main (void) {
int i, j, v = 0;
double w[MAX][MAX] = {{ 0.0 }}, /* double or float type */
d[MAX][MAX][MAX] = {{{ 0.0 }}}; /* to hold decimal values */
// clrscr(); /* there is no need for clrscr() */
printf ("enter the no. of vertices\n");
if (scanf ("%d", &v) != 1) { /* always validate scanf return */
fprintf (stderr, "error: invalid integer input for v.\n");
exit (EXIT_FAILURE); /* exit on failure - adjust as desired */
}
if (v < 0 || v > MAX) { /* validate v within range of MAX */
fprintf (stderr, "error: v not within 0 - %d.\n", MAX);
exit (EXIT_FAILURE);
}
printf ("enter the weights\n");
for (i = 0; i < v; i++)
for (j = 0; j < v; j++)
if (scanf ("%lf", &w[i][j]) != 1) { /* use %lf for double */
fprintf (stderr, "error: invalid w[%d][%d].\n", i, j);
exit (EXIT_FAILURE);
}
floyd (d, w, v);
#if defined (_WIN32) || defined (_WIN64)
getchar(); /* only keep console open on windows - using getchar() */
#endif
return 0;
}
/* pass d and w as parameters */
void floyd (double d[][MAX][MAX], double w[][MAX], int v)
{
int k = 0, i, j;
for (i = 0; i < v; i++) /* assign values for k = 0 */
for (j = 0; j < v; j++)
d[k][i][j] = w[i][j];
for (k = 1; k < v; k++) /* index from 1 based on params for min */
for (i = 0; i < v; i++)
for (j = 0; j < v; j++) { /* assign min k = 1, 2 */
d[k][i][j] = min(d[k-1][i][j], d[k-1][i][k]+ d[k-1][k][j]);
}
/* display in matrix */
for (k = 0; k < v; k++)
{
printf (" k = %d\n", k);
for (i = 0; i < v; i++) {
putchar ('\n'); /* use putchar for single characters */
for (j = 0; j < v; j++)
printf(" %6.2f", d[k][i][j]);
}
printf ("\n\n");
}
}
Пример использования / Вывод
# ./bin/scanf_double_3d
enter the no. of vertices
3
enter the weights
1.1 2.2 3.3
4.4 5.5 6.6
7.7 8.8 9.9
k = 0
1.10 2.20 3.30
4.40 5.50 6.60
7.70 8.80 9.90
k = 1
1.10 2.20 3.30
4.40 5.50 6.60
7.70 8.80 9.90
k = 2
1.10 2.20 3.30
4.40 5.50 6.60
7.70 8.80 9.90
Просмотрите все и дайте мне знать, если это то, что вы хотели, и есть ли у вас какие-либо дополнительные вопросы. Проверка вашего алгоритма остается за вами.