- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在编码方面是个新手。所以,我要求我的 friend 用 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 ");
}
}
由于我的大部分数据都使用十进制数字而不是整数,因此程序不允许我输入它。我应该做出哪些改变?谢谢。
最佳答案
虽然我不会讨论您实现“Floyd Warshall 算法”的正确性,但我确实认为我可以帮助您读取十进制值。
首先,一些想法、指示和提示。 (1) 你的代码是 C 语言,与 C++ 无关,除了 C++ 最初是在很多年前作为 C 的超集派生的(它现在本身就是一种语言,但仍然保持使用传统语言的能力) C 库函数); (2)避免使用<conio.h>
,它是一个仅限Windows的头文件,您可以使用标准库函数 getchar()
保持终端打开,直到按回车键,而不是使用 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
对应项),用于保存小数(浮点)值的类型是 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()
来保持终端打开,所以我已将该调用包装在预处理器检查中)以便仅在 Windows 上调用):
#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
仔细检查一下,让我知道这是否是您的意图以及您是否还有其他问题。验证您的算法的工作由您负责。
关于c - C++中如何输入小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575927/
如何将整数类型转换为 double /浮点类型以显示小数点?例如,如果我想将数字转换为货币格式: 5 会变成 5.004.3 会变成 4.30 javascript 有什么东西可以用来做这种转换吗?
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18107586 出自【进步*于辰的博客】
我意识到这是一个重复的问题,但是 this 中提到的解决方案这个问题完全不适合我。 我目前的代码如下 Sub ConvertTextToNumber() Dim Area As Range, C As
我正在使用数学 javascript,但在用它来替换点的逗号和逗号的点时遇到了一些麻烦。我可以改变千位分隔符的逗号,但无法设法将小数点变成逗号。我尝试了其他帖子中的一些建议,但没有感到高兴。目标是实现
我正在尝试在 Android 中创建一个数字选择器,但轮子只增加 1。我想增加 0.1。我在网上查了一下,但我发现了一个格式化的浮点数组禁用了轮子。请帮助并为语法感到抱歉,我正在学习。 最佳答案 您可
我正在尝试在多个网站上获取利率。数据相当非结构化,但形式足够接近。我想要捕捉的内容: x.xx% 至 xx.xx% 数据示例: 由 FDIC 成员 WebBank 发放的所有贷款。您的实际利率取决于信
在 MySQL 表中,我有一个具有不同值的 VARCHAR 列,这些值可能代表字符串、整数、浮点、任意值。这些值作为特定于语言的字符串写入数据库,这意味着 123.45 的浮点值可以写为德语中的 "1
我想编写一个正则表达式,它允许整数或具有 0 - 2 个小数位的小数。 有效输入 1 1. 1.1 1.11 111111111 111111111. 111111111.1 111111111.11
我正在尝试为 nullable 实现客户端验证其小数点分隔符可以是逗号(例如:123,45)。 在我看来: ... @Html.LabelFor(model => model.Turnove
我找不到合适的正则表达式来仅从字符串中提取 float 。考虑以下字符串: $string = "8x2.1 3x2"; 我想提取 2.1,我尝试了以下操作,但这给了我整数和 float : preg
我希望使用正则表达式函数分离以下数据,如下所示: 要使用的功能: let fx=(text,regex)=> Web.Page( " var x='
我是 jquery 新手。我有一个带有两个输入框的表单。我实现了一些验证。 Min.Amount Max.Amount
我正在java中实现一个简单的算法,它接受一个整数数组,并查找并返回数组中相邻整数的最大乘积。 为此,我首先初始化了一个名为largestProduct的变量,我用它来跟踪当前找到的最大(最佳)产品。
在 JavaScript 中,我想定义小数点的位置。我只能在示例中真正展示它。 假设输入值为 1234 。 我希望输出为 123.4 。 或者,如果输入是 12345 ,我希望输出是 123.45 。
我有这段代码,只允许在 keypress() 的输入字段中输入数字 if (e.which != 8 && e.which != 0 && (e.which 57)) { return fa
我目前正在开发一些基于 Django 的 Web 项目,在这个 Web 开发过程中,我遇到了以下我无法正确理解的代码。 if price_product['price'] == Decimal('-1
这个问题在这里已经有了答案: How do I print a double value with full precision using cout? (17 个答案) 关闭 7 年前。 我试图在
这应该是微不足道的,但我正在兜圈子,也许有人可以提供帮助。 我有两个表(T1,T2),我希望从中提取每行中的多个值并更新第三个表(T3)的内容当且仅当)T1 中有两个 UQ,NN 字段,T2 匹配,在
如果数字不是十进制,我需要附加.00,但是当我尝试下面的代码时,它会将整个数字更改为0.00。例如,如果数字是12,200,它会将其更改为0.00,而不是在末尾添加.00 $('.total-amou
我正在尝试在容器 View 中设置 9:16 纵横比 View 。以下代码在 viewDidLayoutSubviews 中设置约束,以便在正确的位置考虑自动布局。它还调用 layoutIfNeede
我是一名优秀的程序员,十分优秀!