如何在C ++中输入十进制数?

时间:2018-05-29 03:31:14

标签: c scanf

我在编码方面非常初学。所以,我要求我的朋友们为我的论文用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 ");
  }
}

由于我的大多数数据都使用十进制数而不是整数,因此程序不允许我输入它。我应该做些什么改变?感谢。

1 个答案:

答案 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[]编写的声明)。 注意: 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对应项),并且用于保存十进制(浮点)值的类型为{{1} }和float。 (通常分别为32位和64位)。因此,在您的情况下,如果您希望doublew能够保存十进制值,则需要使用正确的类型声明它们,例如

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); } 中声明wd将要求您将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");
    }
}

仔细看看,如果这是您的意图,请告诉我,以及您是否还有其他问题。验证您的算法留给您。