Как ввести десятичные числа в 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
Посмотрите вещи и дайте мне знать, если это то, что вы хотели, и есть ли у вас какие-либо дополнительные вопросы. Проверка вашего алгоритма остается за вами.