ввод только чисел и работа с ними

87
18 апреля 2021, 22:30

Из интернета "достал" три функции из интернета по теме : "ввод только чисел".

/* Чтение целого числа */
int getInteger()
{
    int number;
    char c; /* Временная переменная для проверки ввода */
    /* Бесконечный цикл, работающий до момента удачного считывания */
    while (1)
    {
        /* Читаем поток ввода, необходимо число завершаемое
        * символом перевода на новую строку и никак иначе
        */
        if (!scanf("%d", &number) || getchar() != '\n')
        {
            /* Очистка потока от оставшихся после чтения символов
            * для предотвращения их прочтения следующимим вызовами scanf
            */
            while ((c = getchar()) != '\n' && c != EOF);
        }
        else return number;
        printf("Необходимо ввести число.\nПовторите ввод: ");
    }
}
// Use setlocale(LC_NUMERIC, "C") for period delimeter.
double getDouble()
{
    double number;
    char c;
    while (1)
    {
        if (!scanf("%lf", &number) || getchar() != '\n')
        {
            while ((c = getchar()) != '\n' && c != EOF);
        }
        else return number;
        printf("Необходимо ввести число.\nПовторите ввод: ");
    }
}
long getTime()
{
    int hours, minutes;
    char c;
    while (1)
    {
        if (scanf("%d:%d", &hours, &minutes) < 2 || getchar() != '\n')
        {
            while ((c = getchar()) != '\n' && c != EOF);
        }
        else if (hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59)
        {
            return hours * 60 + minutes;
        }
        printf("Необходимо время в формате HH:MM.\nПовторите ввод: ");
    }
}

При вводе чисел всё шикарно, вводить можно только числа.

НО вот проблема когда я попробовал вводить числа для последующей работы с ними то получал не число, а будто бы "ссылку"

int main()
{
    setlocale(LC_NUMERIC, "C");
    // ввести число
    double X[3]; double Y[3]; // переменные (массивы) для ввода
    memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); // зануляем переменные(массивы)
    std::cout<< "Введите числа  векторов \n" << "------------------------ \n";
    int i = 0;  double value =0; //t int i1 =0; bool b_t =false;
    for(i =0; i<3; i++){
         printf("Введите X %d-вого вектора :", i+1);
        value=getDouble(); X[i] = value; printf(" !! %d !! ", value);
        printf("Введите Y %d-вого вектора :", i+1);
        value=getDouble(); Y[i] = value; printf(" !! %d !! ", value);
    }
//double *value1= (double *)malloc(256);
//value1=getDouble();         printf("!!!!!%d!!!!!:", value1);
    int value1 =0;
    for(i =0; i<3; i++){
         printf("Введите X %d-вого вектора :", i+1);
        value1=getInteger();  printf(" !! %d !! ", value1);
        printf("Введите Y %d-вого вектора :", i+1);
        value1=getInteger();  printf(" !! %d !! ", value1);
    }
    long value2 =0;
    for(i =0; i<3; i++){
         printf("Введите X %d-вого вектора :", i+1);
        value2=getInteger();  printf(" !! %d !! ", value2);
        printf("Введите Y %d-вого вектора :", i+1);
        value2=getInteger();  printf(" !! %d !! ", value2);
    }

for(i =0; i<=2;i++){
    printf("Вектор %d : X= %d, Y= %d \n" ,i+1, X[i], Y[i]);
}

Вот результат :

Введите числа  векторов 
------------------------ 
Введите X 1-вого вектора :1
 !! 10 !! Введите Y 1-вого вектора :2
 !! 10 !! Введите X 2-вого вектора :3
 !! 10 !! Введите Y 2-вого вектора :4
 !! 10 !! Введите X 3-вого вектора :5
 !! 10 !! Введите Y 3-вого вектора :6
 !! 10 !! Введите X 1-вого вектора :7
 !! 7 !! Введите Y 1-вого вектора :8
 !! 8 !! Введите X 2-вого вектора :9
 !! 9 !! Введите Y 2-вого вектора :11
 !! 11 !! Введите X 3-вого вектора :12
 !! 12 !! Введите Y 3-вого вектора :13
 !! 13 !! Введите X 1-вого вектора :14
 !! 14 !! Введите Y 1-вого вектора :15
 !! 15 !! Введите X 2-вого вектора :16
 !! 16 !! Введите Y 2-вого вектора :17
 !! 17 !! Введите X 3-вого вектора :18
 !! 18 !! Введите Y 3-вого вектора :19
 !! 19 !! Вектор 1 : X= 0, Y= 0 
Вектор 2 : X= 0, Y= 0 
Вектор 3 : X= 0, Y= 0 

getDouble() почему то возвращает только десять , плюс к всему совершенно не кладёт в массивы X Y данные. Совершенно не могу понять почему так ???

Решил "подсмотреть" как пишут мастера (полный справочник по СИ/ СИ плюс плюс ) Герберт Шилдт.

Вот код:

//!!!!!!!!!!!!!!!!!!!!!!!
 printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
 double v; double j;
 printf("input chislo:");
 scanf("%e", &v);
 printf("input chislo:");
 scanf("%e", &j);
 printf ("V = %d,J = %d ", v, j);
 printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
//!!!!!!!!!!!!
 printf("--------------------------\n");
 int v1; int j1;
 printf("input chislo:");
 scanf("%o%x", &v1, &j1);
 printf ("V = %0,J = %x ", v1, j1);
 printf("\n------------------------\n");
//!

Вот вывод :

!!!!!!!!!!!!!!!!!!!!!!!!!!
input chislo:21
input chislo:31
V = -502073136,J = 0 
!!!!!!!!!!!!!!!!!!!!!!!!!!
--------------------------
input chislo:2
3
V = %0,J = 2 
------------------------

Какая-то белиберда :(

Answer 1

Спасибо @eanmos Поправил :3

Ошибался с выводом в printf выводил %d надо было использовать %f

Вот код :

 // ввести число
    double X[3]; double Y[3]; // переменные (массивы) для ввода
//    memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); // зануляем переменные(массивы)
    std::cout<< "Введите числа  векторов \n" << "------------------------ \n";
    int i = 0;  double value =0; //t int i1 =0; bool b_t =false;
    for(i =0; i<3; i++){
         printf("Введите X %d-вого вектора :", i+1);
        value=getDouble(); X[i] = value; printf(" !! %f !! ", value);
        printf("Введите Y %d-вого вектора :", i+1);
        value=getDouble(); Y[i] = value; printf(" !! %f !! ", value);
    }
    int Q[3];
    Q[0] = value; Q[1] = value; Q[2] = value;
for(i =0; i<=2;i++){
    printf("Вектор %d : X= %f, Y= %f \n" ,i+1, X[i], Y[i]);
    printf("Вектор %d : Q= %d. \n" ,i+1, Q[i]);
}

Вот результат:

Введите числа  векторов 
------------------------ 
Введите X 1-вого вектора :212
 !! 212.000000 !! Введите Y 1-вого вектора :23
 !! 23.000000 !! Введите X 2-вого вектора :32
 !! 32.000000 !! Введите Y 2-вого вектора :123
 !! 123.000000 !! Введите X 3-вого вектора :
432
 !! 432.000000 !! Введите Y 3-вого вектора :
545
 !! 545.000000 !! Вектор 1 : X= 212.000000, Y= 23.000000 
Вектор 1 : Q= 545. 
Вектор 2 : X= 32.000000, Y= 123.000000 
Вектор 2 : Q= 545. 
Вектор 3 : X= 432.000000, Y= 545.000000 
Вектор 3 : Q= 545. 

шильдовским вариантом не пользуйтесь при вводе 2123йуц231 он выведет 2123

READ ALSO
.onsubmit редиректит на php файл даже если return false

.onsubmit редиректит на php файл даже если return false

подскажите пожалуйста, в чем может быть проблема: если делаюonsubmit не в теге формы, то выполняется аякс, но все равно идет редирект на php файл,...

101
slick с постоянным слайдом

slick с постоянным слайдом

Есть вот такой слайдер:

124
Атрибут которого равен

Атрибут которого равен

Запилил слайдер! Мне нужно в активный слад вставить блок и нужно сделать это по атрибуту indexВот что я написал:

81