Как ввести десятичные числа в C ++? - PullRequest
0 голосов
/ 29 мая 2018

Я чрезвычайно новичок в плане кодирования.Итак, я прошу своих друзей создать алгоритм Флойда Варшалла на 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 Ответ

0 голосов
/ 29 мая 2018

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

Сначала пара мыслей, указателей, подсказок.(1) ваш код на C и не имеет ничего общего с C ++, за исключением C ++, изначально создаваемого как супер-набор C много лет назад (теперь он сам по себе является языком, но все еще поддерживает возможность использовать традиционныйФункции библиотеки C);(2) избегайте использования <conio.h>, это заголовок только для окон, и вы можете использовать стандартную библиотечную функцию 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 - это правильный способ определить один (или выможно использовать global 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() для удержания терминала открытым, поэтому я включил этот вызов в проверки препроцессора, чтобы он вызывался только в окнах):

#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

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

...