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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
JaguarT51
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 9
#1

Можно ли использовать не целые числа в For? - C++

10.04.2014, 04:06. Просмотров 263. Ответов 8
Метки нет (Все метки)

Здравствуйте !
Мне необходимо провести примерно такое действие:
C++
1
2
for (x=0.2;x<0.6;x+0.1)
 {cin>>a;}
Как можно это сделать???Именно оператором For!!!И вообще это возможно???
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2014, 04:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли использовать не целые числа в For? (C++):

Задана строка, содержащая целые числа (максимум 15 чисел). Упорядочить целые числа в строке по убыванию. - C++
Задана строка, содержащая целые числа (максимум 15 чисел). Упорядочить целые числа в строке по убыванию. должно выглядеть что то...

Даны целые числа A B C, проверить можно ли из них составить геометрическую прогрессию - C++
Даны целые числа A B C , проверить можно ли из них составить геометрическую прогрессию. Если да, со ставьте из них возрастающую и убывающую...

Вводить с клавиатуры целые числа (>0) и выводить на экран квадраты этих чисел до тех пор, пока не будет введено число 0. Использовать цикл do...while. - C++
Вводить с клавиатуры целые числа (&gt;0) и выводить на экран квадраты этих чисел до тех пор, пока не будет введено число 0. Использовать цикл...

В порядке возрастания напечатать те целые числа из диапазона 1..10000, которые можно представить в указанном виде - C++
Задача №2. Множества В порядке возрастания напечатать те целые числа из диапазона 1..10000 , которые можно представить в виде . ...

Даны целые числа р и q. Получить все делители числа q, взаимно простые с р. - C++
Даны целые числа р и q. Получить все делители числа q, взаимно простые с р. Решите на С++. Заранее спасибо!

Даны целые числа р и q. Получить все делители числа q, взаимно простые с р - C++
Получить все делители числа q, взаимно простые с р.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2014, 04:31 #2
Цитата Сообщение от JaguarT51 Посмотреть сообщение
Именно оператором For!!!И вообще это возможно???
А попробовать, никак?

Добавлено через 4 минуты
Цитата Сообщение от JaguarT51 Посмотреть сообщение
x+0.1
x здесь никак не меняется.
JaguarT51
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 9
10.04.2014, 04:35  [ТС] #3
Я пробывал у меня цикл не мменяет переменную !Есть ли возможность её поменять???
Мизантроп_Лол
13 / 13 / 2
Регистрация: 26.02.2013
Сообщений: 285
Завершенные тесты: 1
10.04.2014, 04:38 #4
JaguarT51, именно оператором for - нельзя. Можно while
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.04.2014, 04:41 #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от JaguarT51 Посмотреть сообщение
Есть ли возможность её поменять???
Есть такая возможность:
C++
1
2
for (x=0.2;x<0.6;x+=0.1)
 {cin>>a;}
JaguarT51
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 9
10.04.2014, 04:42  [ТС] #6
Спасибо!!!
alkagolik
Заблокирован
10.04.2014, 08:19 #7
Цитата Сообщение от JaguarT51 Посмотреть сообщение
Как можно это сделать???Именно оператором For!!!И вообще это возможно???
На редкость интересный вопрос. В современных процессорах эта возможность есть. В с99 есть макросы для этих операций. Не помню, но знаю что есть. К размышлению:
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
union ieee754_float
  {
    float f;
 
    /* This is the IEEE 754 single-precision format.  */
    struct
      {
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int negative:1;
    unsigned int exponent:8;
    unsigned int mantissa:23;
#endif              /* Big endian.  */
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int mantissa:23;
    unsigned int exponent:8;
    unsigned int negative:1;
#endif              /* Little endian.  */
      } ieee;
  };
 
#define IEEE754_FLOAT_BIAS  0x7f /* Added to exponent.  */
 
 
union ieee754_double
  {
    double d;
 
    /* This is the IEEE 754 double-precision format.  */
    struct
      {
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int negative:1;
    unsigned int exponent:11;
    /* Together these comprise the mantissa.  */
    unsigned int mantissa0:20;
    unsigned int mantissa1:32;
#endif              /* Big endian.  */
#if __BYTE_ORDER == __LITTLE_ENDIAN
# if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
    unsigned int mantissa0:20;
    unsigned int exponent:11;
    unsigned int negative:1;
    unsigned int mantissa1:32;
# else
    /* Together these comprise the mantissa.  */
    unsigned int mantissa1:32;
    unsigned int mantissa0:20;
    unsigned int exponent:11;
    unsigned int negative:1;
# endif
#endif              /* Little endian.  */
      } ieee;
<tag>Сравнение чисел с плавающей точкой</tag>.
zss
Модератор
Эксперт С++
6365 / 5929 / 1923
Регистрация: 18.12.2011
Сообщений: 15,237
Завершенные тесты: 1
10.04.2014, 12:36 #8
Комментарий.
Вопрос похоже возник из-за непонимания смысла for
C++
1
2
3
4
5
for( 
x=0.1; // любой оператор, который выполняется один раз в начале цикла
x<=0.6; // оператор, принимающий логическое значение, 
            //которое является основанием для повторения тела цикла
x+=0.1) // любой оператор, который выполняется в конце цикла перед проверкой на повторение
BlackSpace
137 / 130 / 52
Регистрация: 15.03.2014
Сообщений: 277
10.04.2014, 14:25 #9
JaguarT51, необходимо понимать, что дробные числа представляются с ограниченной точностью в памяти.
Не рекомендую сравнивать напрямую два вещественных числа, так как можно получить неожиданные результаты.
Постараюсь пояснить на примерах.

Пример 1. Тут, вполне возможно, все будет работать как и ожидалось.
C++
1
2
3
4
5
...
    double x;
    for ( x = 0.2; x < 0.6; x += 0.1 )
        cout << x << endl;
...
Вывод программы
Кликните здесь для просмотра всего текста
0.2
0.3
0.4
0.5


Пример 2. Однако, в следующем пример вывод программы может быть несколько не такой какой хотелось бы.
C++
1
2
3
4
5
...
double x;
    for ( x = 0.299; x < 0.3; x += 0.0001 )
        cout << x << endl;
...
Вывод программы
Кликните здесь для просмотра всего текста
0.299
0.2991
0.2992
0.2993
0.2994
0.2995
0.2996
0.2997
0.2998
0.2999 // должно быть последним в выводе
0.3 // откуда ? : )

Дело в том, что последнее в выводе значение 0.3 округленное.

Можно сделать вывод с повышенной точностью.
C++
1
2
3
4
5
6
7
8
...
#include <iomanip>
...
double x;
    cout << fixed << setprecision( 16 );
    for ( x = 0.299; x < 0.3; x += 0.0001 )
        cout << x << endl;
...
Тогда вывод будет
Кликните здесь для просмотра всего текста
0.2990000000000000
0.2991000000000000
0.2992000000000000
0.2993000000000000
0.2993999999999999
0.2994999999999999
0.2995999999999999
0.2996999999999999
0.2997999999999999
0.2998999999999999 // должно быть последним в выводе
0.2999999999999999 // этого тут не должно было быть, но оно меньше чем 0.3 и оно тут есть


В некоторых местах данного вывода хорошо видно что вещественные числа хранятся с ограниченной точностью.

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

Пример 3. Приведу программу полностью.
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
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
int main() {
 
    // считаем, что мы уверены, что a, b и h положительные
    // а также, что b > a и h <= b - a
    double a = 5.5551; // нижняя граница
    double b = 5.5552; // верхняя граница
    double h = 0.00001; // шаг вычислений
 
    // считаем количество шагов
    int count = fabs( floor( ( ( b - a ) /  h ) + 0.5 ) ); // важно верно посчитать количество шагов
    // fabs( floor( ( ( b - a ) /  h ) + 0.5 ) ) + 1; // + 1 если включаем в расчет верхнюю границу ( 5.5552 в нашем случае )
 
    cout << "Количество шагов = " << count << endl;
 
    cout << fixed << setprecision( 16 );
    for ( int i = 0; i < count; ++i ) { // тут уже целочисленное сравнение
        double x = a + h * i;
        cout << x << endl; // и вывод, который ожидаем
    }
 
    return 0;
}
Вывод программы
Кликните здесь для просмотра всего текста
Количество шагов = 10
5.5551000000000004
5.5551100000000000
5.5551200000000005
5.5551300000000001
5.5551400000000006
5.5551500000000003
5.5551600000000008
5.5551700000000004
5.5551800000000000
5.5551900000000005


Существует и другой путь.
Сравнивать два вещественных числа с определенной точностью.

Пример 4.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main() {
 
    // считаем, что мы уверены, что a, b и h положительные
    // а также, что b > a и h <= b - a
    double a = 0.0003;//5.55551; // нижняя граница
    double b = 0.0004;//5.55552; // верхняя граница
    double h = 0.000001; // шаг вычислений
    double eps = 0.0000001; // точность вычисления должна быть на порядок выше чем шаг вычислений
 
    cout << fixed << setprecision( 16 );
 
    for ( double x = a; ( b - x ) > eps; x += h ) // сравниваем с определнной точностью
        cout << x << endl;
 
    return 0;
}
Вывод программы как и ожидалось.
Кликните здесь для просмотра всего текста
...
0.0003940000000000
0.0003950000000000
0.0003960000000000
0.0003970000000000
0.0003980000000000
0.0003990000000000


При работе с вещественными числами нужно проявлять повышенную внимательность и контроль. Также необходимо помнить о том, что при расчетах может накапливаться погрешность.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 14:25
Привет! Вот еще темы с ответами:

Дано два числа А и В (А<В). Вывести в порядке увеличения все целые числа - C++
Дано два числа А и В (А&lt;В). Вывести в порядке увеличения все целые числа, расположеные между А и В(не включая чисед А и В), а также...

Даны два целых числа M но N. Вывести все целые числа из промежутка [M,n] - C++
Даны два целых числа M но N. Вывести все целые числа из промежутка , которые делящиеся 2, но не делящиеся на 4, а также количество K этих...

Даны целые числа, удалить все числа со значением максимального из них - C++
Даны целы числа х1,...,xn . удалить все числа со значением max(х1,...,xn) Не могу найти ошибку... #include&lt;iostream&gt; using...

В одномерном массиве, элементы которого - целые числа, удалить все четные числа - C++
В одномерном массиве, элементы которого - целые числа, удалить все четные числа именно удалить а не оставить все не четные удалить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2014, 14:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru