我在编码方面非常初学。所以,我要求我的朋友们为我的论文用C ++创建Floyd Warshall算法。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 30
void floyd(int);
int w[MAX][MAX], d[MAX][MAX][MAX];
void main()
{
int i,j,v;
clrscr();
printf("enter the no. of vertices\n");
scanf("%d",&v);
printf("enter the weights \n");
for(i=1;i<=v;i++)
{
for(j=1;j<=v;j++)
scanf("%d",&w[i][j]);
}
floyd(v);
getch();
}//end of main
void floyd(int v)
{
int k, i,j;
k=0;
for(i=1;i<=v;i++)
{
for(j=1;j<=v;j++)
d[k][i][j]=w[i][j];
}
for(k=1;k<=v;k++)
{
for(i=1;i<=v;i++)
{
for(j=1;j<=v;j++)
d[k][i][j]=min(d[k-1][i][j], d[k-1][i][k]+ d[k-1][k][j]);
}
}
//displayin matrix
for(k=0;k<=v;k++)
{
printf(" k=%d \n",k);
for(i=1;i<=v;i++)
{
printf("\n");
for(j=1;j<=v;j++)
printf("\t %d",d[k][i][j]);
}
printf("\n \n ");
}
}
由于我的大多数数据都使用十进制数而不是整数,因此程序不允许我输入它。我应该做些什么改变?感谢。
答案 0 :(得分:0)
虽然我没有说明你执行&#34; Floyd Warshall算法&#34;的正确性,但我认为我可以帮你读取小数值。
首先,一些想法,指示,提示。 (1)你的代码是C并且与C ++无关,除了C ++最初是多年前作为C的超集导出的(它现在是一种语言,但仍然保持使用传统的能力) C库函数); (2)避免使用<conio.h>
,它是一个仅限Windows的标题,您可以使用标准库函数getchar()
来保持终端打开,直到您按下return而不是getch()
为止,并且根本不需要clrscr()
;最后(3)除非绝对必要,否则避免使用全局变量。在main()
中声明所需的变量,并将它们作为参数传递给任何需要它们的函数。
首先,main
的正确声明为int main (void)
和int main (int argc, char **argv)
(您将看到使用等效char *argv[]
编写的声明)。 注意: main
是type int
的函数,它返回一个值。见:C11 Standard §5.1.2.2.1 Program startup p1 (draft n1570)。另见:See What should main() return in C and C++?。
做得好,当你需要使用#define
的常量时,是定义一个常量的正确方法(或者你可以使用全局 enum
来完成同样的事情)。
变量可以容纳的值由您声明变量的type
确定。您的整数类型为char, short, int, long, long long
(以及它们的unsigned
和exact-width
对应项),并且用于保存十进制(浮点)值的类型为{{1} }和float
。 (通常分别为32位和64位)。因此,在您的情况下,如果您希望double
和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()
你在main中称之为:
void floyd (double d[][MAX][MAX], double w[][MAX], int v);
总而言之,您可以执行以下操作(注意:我在Linux上并且不需要 floyd (d, w, v);
(或getchar()
来保持终端打开,所以我已经在预处理程序检查中包装了该调用,因此只在Windows上调用它:
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");
}
}
仔细看看,如果这是您的意图,请告诉我,以及您是否还有其他问题。验证您的算法留给您。