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

Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
19.06.2013, 21:43     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) #1
Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает верхнюю и нижнюю границы. Что произойдет, если числа 7 и 3 ввести именно в таком порядке? Запустите программу, введите 7 и 3. Добейтесь того, чтобы программа работала и при таком порядке ввода чисел.

Никак не могу сделать эту задачу. Как не бился. Без ифа никак(((
Хелп, что нужно добавить в этот код, чтобы он работал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main ()
{
    int v1,v2;
    cout<<"enter two nubers: "<<endl;
    cin>>v1>>v2;
    for (int i=v1; i<=v2; ++i)
        sum+=i;
    cout<<sum<<endl;
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2013, 21:43     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы)
Посмотрите здесь:

C++ Вывести числа в диапазоне от 0 до 500.которые делятся на 5 без остатка
C++ Написать программу, которая находит сумму всех целых нечетных чисел в диапазоне, указанном пользователя.
C++ Напишите программу, вычисляющую определенный интеграл на указанном пользователем промежутке и с указанным шагом разбиения этого промежутка
Определить все ли числа из массива лежат в указанном диапазоне C++
C++ Напишите программу! Сделал скин экрана. Самым простым способ (без массивов). Как можно быстрей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 02:22     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) #21

Не по теме:

Поняны, почему я до сих пор не увидел очевидного решения? Почему у всех какие-то ?:, && и циклы, которые на самом деле неявно используют ветвления?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
 
int sum(int a, int b)
{
    return (std::abs(a - b) + 1) * (a + b) / 2;
}
 
int main()
{
    int a;
    int b;
 
    std::cin >> a >> b;
    std::cout << sum(a, b);
}
Если что, то abs тоже можно написать без ветвлений:
C++
1
2
3
4
5
int abs(int x)
{
    int y = x >> 31;
    return (x ^ y) - y;
}
(Работает при условии, что компилятор определяет >> как арифметический сдвиг, а вместо 31 будет стоять реальное количество битов в инте без одного знакового.)



Добавлено через 5 минут

Не по теме:

Ну или так:

C++
1
2
3
4
5
int abs(int x)
{
    unsigned y = x;
    return x * (1 - 2 * !!(y & (y >> 1)));
}

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
20.06.2013, 05:52     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) #22
Цитата Сообщение от Croessmah Посмотреть сообщение
При выходе из цикла - когда v1!=v2 даст false.
ну да все правильно
пока v1 не равно v2 до него дело не дойдет
это у меня уже глаз "замылился"

Добавлено через 7 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
C++
1
2
3
4
5
int abs(int x)
{
  int y = x >> 31;
  return (x ^ y) - y;
}
(Работает при условии, что компилятор определяет >> как арифметический сдвиг, а вместо 31 будет стоять реальное количество битов в инте без одного знакового.)
это зависит от компилятора и размера инт в нем
а вот так должно быть переносимо
int abs(int x)
{
* * int y = x >> (sizeof(int)*8-1);
* * return (x ^ y) - y;
}

Не по теме:

я тоже хотел использовать знаковый бит
но про сдвиг забыл
нечего по ночам работать



Добавлено через 9 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
return x * (1 - 2 * !!(y & (y >> 1)));
x=y =3 (0011)
y>>1=1(0001)
0011 & (0001)) =0001
!!0001=1
в результате вместо 3 будет -3
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
20.06.2013, 09:20     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) #23
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение

Не по теме:

не увидел очевидного решения? Почему у всех какие-то ?:, && и циклы

да ладно, с самого начала этим направлением пошел , а потом
Цитата Сообщение от ValeryS Посмотреть сообщение
for нужен
переключился на другой фланг
но идеи ваши полезны

C++
1
2
3
4
5
6
7
8
int Sum(int a, int b)
{
   int sum, bit, znak;
   bit = ((b - a) >> (sizeof(a) * 8 - 1)) & 1;
   znak = 1 - 2 * bit;
   sum = (znak * (b - a) + 1) * (a + b) / 2;
   return sum;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 10:24     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) #24
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так должно быть переносимо
Строго говоря, это тоже непереносимо. В чаре не обязательно 8 битов, а int не обязательно использует все sizeof(int) * CHAR_BIT битов в своём представлении.

И сдвиг знаковых чисел вправо может быть как арифметическим, так и логическим: вместо знаковых битов могут записываться как нолики, так и значение знакового бита.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 10:39     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы)
Еще ссылки по теме:

C++ Вывод числа в столбик с первой цифры, без массива, без строк
C++ Напишите программу, которая вводит натуральное число n и находит все совершенные числа в диапазоне от 1 до n
Напишите программу, читающую строки со стандартного устройства ввода и суммирующую их в одну большую строку C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
20.06.2013, 10:39     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) #25
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Строго говоря, это тоже непереносимо. В чаре не обязательно 8 битов,
Теоретически да, практически давно не видел не 8 бит

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
И сдвиг знаковых чисел вправо может быть как арифметическим, так и логическим: вместо знаковых битов могут записываться как нолики, так и значение знакового бита.
а здесь это без разницы
знаковый бит переходит в первый и что там вначале стоит не имеет значения
арифметический
1111 1111 = 1111 1111
логический
1111 1111= 0000 0001
можно даже не проверять последний бит положительное 0(false) отрицательное не ноль (true)
да и в C арифметический для signed логический для unsigned


Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
а int не обязательно использует все sizeof(int) * CHAR_BIT битов в своём представлении.
не понял
по стандарту int измеряется в char(байт) и ты хочешь сказать что
sizeof(int) может быть например 1.5 ?
Yandex
Объявления
20.06.2013, 10:39     Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы)
Ответ Создать тему
Опции темы

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