Форум программистов, компьютерный форум CyberForum.ru

Цикл for проверка 0 - C++

Восстановить пароль Регистрация
 
Helo
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 52
11.07.2013, 06:55     Цикл for проверка 0 #1
Здравствуйте подскажите если не трудно. Пишу программу и нужно чтобы вводимые данные проверялись на <= 0.
Так вот когда ввожу меньше 0 цикл работает, но если ввести 0 происходит зацикливание. Как изменить код?
Какие еще способы печати таблицы результатов вы знаете?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* Ввод данных */
    printf ( "\n%3s", " Введите начало диапазона: " );
    Input_Validation ( start_of_range );
    printf ( "\n%3s", " Введите конец  диапазона: " );
    Input_Validation ( end_of_range );
    printf ( "\n%3s", " Введите шаг табулирования: " );
    do{
    Input_Validation ( step_tabulation );
    /* Если шаг табулирования <= 0 */
    if ( step_tabulation <= 0 ) 
    {
        printf ( "\n%3s", " Шаг табулирования не может быть <= 0 Повторите ввод данных: " );
        continue;}
    else break;}
    while (step_tabulation != 0);
 
    /* Шапка таблицы */
    printf ( " ________________________________\n" );
    printf ( " | N |\t X\t|\tY\t|\n" );
    /* Цикл for от начала диапазона до конца  диапазона с заданным шагом табулирования */
    for ( function = start_of_range; function <= end_of_range; function += step_tabulation )
        /* Вывод резултатов вычисления функции */
        printf ( " |%3d|%4.5g\t|%12.8g\t|\n", point_tabulation ++, function, pow ( function, function ) * pow ( exponent, - function ) );
    /* Завершение таблицы */
    printf ( " --------------------------------\n" );
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
11.07.2013, 07:12     Цикл for проверка 0 #2
function, start_of_range, end_of_range какого типа?
Helo
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 52
11.07.2013, 07:13  [ТС]     Цикл for проверка 0 #3
Цитата Сообщение от Kukurudza Посмотреть сообщение
function, start_of_range, end_of_range какого типа?
double
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
11.07.2013, 07:19     Цикл for проверка 0 #4
при зацикливании какие значения вводите?
ну и функцию Input_Validation в студию.
Helo
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 52
11.07.2013, 07:21  [ТС]     Цикл for проверка 0 #5
если ввожу 0 в шаг табулирования, могу выложить весь код если необходимо
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
11.07.2013, 07:25     Цикл for проверка 0 #6
Цитата Сообщение от Helo Посмотреть сообщение
вожу 0 в шаг табулирования
тогда возможно ясно. вы вводите 0, но в дабле это может быть вовсе не ноль а очень маленькое число ~ 1e-15. смысл понятен?
Helo
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 52
11.07.2013, 07:29  [ТС]     Цикл for проверка 0 #7
Цитата Сообщение от Kukurudza Посмотреть сообщение
при зацикливании какие значения вводите?
ну и функцию Input_Validation в студию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* Tabulation of functions of one variable.cpp: определяет точку входа для консольного приложения */
 
#include "stdafx.h"
 
/*_______________________________________________ Подключаемые директивы препроцессора ___________*/
 
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <cmath>
 
/*_______________________________________________ Прототипы функций ______________________________*/
 
void Input_Validation ( double & );                                  /* Проверка ввода */
void Tabulation_of_functions ( double &, double &, double & );       /* Табулирование функции */
 
/*_______________________________________________ Основная программа _____________________________*/
 
int _tmain(int argc, _TCHAR* argv[])  /* Старт программы */ 
{
    /* Локальная установка */
    setlocale (LC_ALL,"RUSSIAN");
    /* Строковой тип данных */
    std::string
        choice;
    /* Вещественный тип данных */
    double
        start_of_range      /* Начало диапазона  */,
        end_of_range        /* Конец  диапазона  */,
        step_tabulation     /* Шаг табулирования */;
    do      /* Начало цикла */
    {
        system ("cls");     /* Очистка окна консоли */
        Tabulation_of_functions ( start_of_range, end_of_range, step_tabulation );     /* Вызов функции */
        /* Запрос на завершение работы программы */
        start:printf ( "\n%3s", " Завершить работу программы: (Y/N) " );
        /* Ввод */
        choice = _getch ();
        if ( ( choice == "n" ) || ( choice == "N" ) )          /* Если n или N то продолжить */
            continue;
        else if ( ( choice == "y" ) || ( choice == "Y" ) )     /* Если y или Y то выход */
            exit ( 0 );
        else printf ( "\n%3s", " Ошибка! (неправильный символ) Повторите ввод: " ); goto start;     /* Если неправильный ввод */
    }
    while ( ( choice == "n" ) || ( choice == "N" ) );     /* Проверка условия и завершение цикла */
    _getch ();     /* Пауза */
    return 0;      /* Завершение программы */
}
 
/*_______________________________________________ Проверка ввода _________________________________*/
 
void Input_Validation ( double & number )
{
    std::string symbol;
    do  /* Начало цикла */
    {
        /* Ввод символа */
        std::cin >> number;
        /* Проверка является ли символ числом */
        if ( std::cin.fail () )
        {
            /* Если нет вывод ошибки и запрос на повторный ввод */
            std::cin.clear ();
            std::cin >> symbol;
            printf ( " %s\n ", " Это не число! Повторите ввод данных: " ); continue;
        }
        /* Если да завершение цикла */
        else break;
    }
    while ( true );     /* Проерка условия и завершение цикла */
}
 
/*_______________________________________________ Табулирование функции __________________________*/
 
void Tabulation_of_functions ( double & start_of_range, double & end_of_range, double & step_tabulation )
{
    /* Вещественный тип данных */
    double
        function,                     /* Функция f(x) */
        exponent = 2.7182818285;      /* Константа числа е */
    /* unsigned безнаковый, short короткий, int целый тип данных */
    unsigned short int
        point_tabulation = 1; /* Точки табулирования, начальное значение равно 1 */
    /* Ввод данных */
    printf ( "\n%3s", " Введите начало диапазона: " );
    Input_Validation ( start_of_range );
    printf ( "\n%3s", " Введите конец  диапазона: " );
    Input_Validation ( end_of_range );
    printf ( "\n%3s", " Введите шаг табулирования: " );
    //while ( step_tabulation != 0 )
    do{
    Input_Validation ( step_tabulation );
    /* Если шаг табулирования <= 0 */
    if ( step_tabulation <= 0 ) 
    {
        printf ( "\n%3s", " Шаг табулирования не может быть <= 0 Повторите ввод данных: " );
        continue;}
    else break;}
    while (step_tabulation != 0);
    /* Шапка таблицы */
    printf ( " ________________________________\n" );
    printf ( " | N |\t X\t|\tY\t|\n" );
    /* Цикл for от начала диапазона до конца  диапазона с заданным шагом табулирования */
    for ( function = start_of_range; function <= end_of_range; function += step_tabulation )
        /* Вывод резултатов вычисления функции */
        printf ( " |%3d|%4.5g\t|%12.8g\t|\n", point_tabulation ++, function, pow ( function, function ) * pow ( exponent, - function ) );
    /* Завершение таблицы */
    printf ( " --------------------------------\n" );
}
Добавлено через 3 минуты
Цитата Сообщение от Kukurudza Посмотреть сообщение
тогда возможно ясно. вы вводите 0, но в дабле это может быть вовсе не ноль а очень маленькое число ~ 1e-15. смысл понятен?
А можно ли все таки как исправить или придется менять тип на int?
Kukurudza
104 / 85 / 6
Регистрация: 29.08.2012
Сообщений: 539
11.07.2013, 07:34     Цикл for проверка 0 #8
Цитата Сообщение от Helo Посмотреть сообщение
А можно ли все таки как исправить
да запросто. если вы сравниваете два дабла, то вы должны сравнивать их с установленной вами погрешностью. например сравнение двух даблов между собой правильно делается как минимум так:
Код
bool eq (const double a, const double b, const double EPS = 1e-7) {
    return fabs(a - b) <= EPS;
}
где EPS выбирается из ваших потребностей в точности
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
11.07.2013, 09:22     Цикл for проверка 0 #9
Helo, не используйте комментарии там где они излишни. Пренебрежение этим правилом делает вашу программу менее читабельной чем вообще без комментариев.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 10:00     Цикл for проверка 0
Еще ссылки по теме:

C++ Почему цикл на при 1 уходит в бесконечный цикл?
Задание на цикл с параметром и цикл с постусловием C++
C++ Цикл while

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Helo
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 52
11.07.2013, 10:00  [ТС]     Цикл for проверка 0 #10
Цитата Сообщение от Ilot Посмотреть сообщение
Helo, не используйте комментарии там где они излишни. Пренебрежение этим правилом делает вашу программу менее читабельной чем вообще без комментариев.
Данную программу пишу человеку который совсем не понимает в программировании поэтому и комментирую каждый свой шаг
Yandex
Объявления
11.07.2013, 10:00     Цикл for проверка 0
Ответ Создать тему
Опции темы

Текущее время: 23:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru