gpt4 book ai didi

c - C++中如何输入小数?

转载 作者:行者123 更新时间:2023-11-30 20:31:31 28 4
gpt4 key购买 nike

我在编码方面是个新手。所以,我要求我的 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()中声明您需要的变量并将它们作为参数传递给任何需要它们的函数。

首先,正确声明 mainint main (void)int main (int argc, char **argv) (您将看到用等效的 char *argv[] 编写的)。 注意: maintype 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 (以及它们的 unsignedexact-width 对应项),用于保存小数(浮点)值的类型是 floatdouble 。 (通常分别为 32 位和 64 位)。所以在你的情况下,如果你想要 wd为了能够保存十进制值,您需要使用正确的类型来声明它们,例如

#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);
}

声明wdmain()将要求您通过 wd作为 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com