Как ввести десятичные числа в C++?

Я чрезвычайно новичок с точки зрения кодирования. Итак, я прошу своих друзей создать алгоритм Флойда Варшалла на C++ для моей диссертации. Вот код:

#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 ответ

Решение

Хотя я не буду говорить о правильности вашей реализации "алгоритма Флойда Варшалла", я думаю, что могу помочь вам прочитать десятичные значения.

Сначала пара мыслей, указателей, подсказок. (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 §5.1.2.2.1 Запуск программы p1 (черновик n1570). См. Также: См. Что должно возвращать main() в C и 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);

и вы называете это в основном как:

    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

Посмотрите вещи и дайте мне знать, если это то, что вы хотели, и есть ли у вас какие-либо дополнительные вопросы. Проверка вашего алгоритма остается за вами.

Другие вопросы по тегам