Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 222
#1

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

19.06.2013, 21:43. Просмотров 1403. Ответов 24
Метки нет (Все метки)

Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2013, 21:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор for, без if (Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает границы) (C++):

Напишите программу, вычисляющую определенный интеграл на указанном пользователем промежутке и с указанным шагом разбиения этого промежутка - C++
Напишите программу, вычисляющую определенный интеграл на указанном пользователем промежутке и с указанным шагом разбиения этого промежутка,...

Напишите программу, которая в указанном пользователем каталоге и его подкаталогах выполняет поиск файла - Delphi
Напишите программу, которая в указанном пользователем каталоге и его подкаталогах выполняет поиск файла. // Поиск файла в указанном...

Функция, заполняющая массив псевдослучайными числами в заданном пользователем диапазоне без повторений - C++
Тема: Функции2. 4. Реализовать функцию RandWithoutRepetition, с помощью которой можно было бы заполнить массив псевдослучайными числами в...

С помощью оператора while напишите программу определения суммы всех нечетных чисел в диапазоне от 1 до 99 включительно. - Pascal ABC
Практическая работа Задание 9. С помощью оператора while напишите программу определения суммы всех нечетных чисел в диапазоне от 1 до...

С помощью оператора while напишите программу определения суммы всех нечетных чисел в диапазоне от 1 до 99 включительно. - Turbo Pascal
Помогите кто может найти решения!!! С помощью оператора while напишите программу определения суммы всех нечетных чисел в диапазоне от...

Используя оператор while напишите программу определения всех чисел в диапазоне от 1 до 100 включительно, кото - Delphi
С помощью оператора while напишите программу определения всех чисел в диапазоне от 1 до 100 включительно, которые нацело делятся на 12.

24
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
19.06.2013, 22:53 #16
Цитата Сообщение от Аццкий Прогер Посмотреть сообщение
Напишите программу, суммирующую числа в указанном пользователем диапазоне, но без оператора if, который устанавливает верхнюю и нижнюю границы.
Цитата Сообщение от zer0mail Посмотреть сообщение
Можно тернарную операцию использовать...
Можно так еще
C++
1
2
for (int i=(v2-v1>0)?v1:v2; i<=(v2-v1>0)?v2:v1; ++i)
        sum+=i;
но лично мне это не нравится

Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
((sum+=v1) && false)
а в чем смысл false?
всегда ложь
тогда это выражение
Цитата Сообщение от Croessmah Посмотреть сообщение
v1!=v2 || ((sum+=v1) && false)
превращается в
C++
1
v1!=v2
или я чегойто недопонял?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
19.06.2013, 22:58 #17
Цитата Сообщение от ValeryS Посмотреть сообщение
превращается в
тогда пропустим суммирование последнего элемента

Цитата Сообщение от ValeryS Посмотреть сообщение
а в чем смысл false?
в том, чтобы не допустить общего true
выражение целиком построено на лентяях
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
19.06.2013, 23:14 #18
Цитата Сообщение от Croessmah Посмотреть сообщение
в том, чтобы не допустить общего true
переведи
все врубился
ну ты и закрутил пришлось в ручную цикл проходить
и возник вопрос

Цитата Сообщение от Croessmah Посмотреть сообщение
* * for (; v1!=v2 || ((sum+=v1) && false) ; v1+=step)
здесь sum каждую итерацию будет прибавляться или только один раз при входе в цикл?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
19.06.2013, 23:25 #19
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
#include <iostream>
using namespace std;
int main(){
setlocale(0,"rus");
const int lower=1;
const int upper=111;
cout<<"Для выхода из цикла запросов введите отрицательное для любого числа "<<endl;
int f_numb=0;
int s_numb=0;
do{
cout<<"\nВведите 1-е число ";
cin>>f_numb;
cout<<endl;
cout<<"Введите 2-е число ";
cin>>s_numb;
cout<<endl;
while( lower <= f_numb && f_numb <= upper && lower <= s_numb && s_numb <= upper ){
cout << "Величины в диапазоне от " << lower << " до " << upper << endl;
cout << "Их сумма равна " << (f_numb + s_numb)<<endl;
break;
}
while( (f_numb >= 0 && f_numb >=0) && lower > f_numb || f_numb > upper || lower > s_numb || s_numb > upper ){
cout << "Величины НЕ в диапазоне от " << lower << " до " << upper << endl;
break;
}
}while( f_numb >= 0 && s_numb >= 0 );
 
while ( f_numb < 0 || s_numb < 0 ){
cout<<"\nДавай, - досвидания!";
break;
}
cin.get();
cin.get();
}
Ни ифа ни фора.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.06.2013, 01:20 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
здесь sum каждую итерацию будет прибавляться или только один раз при входе в цикл?
При выходе из цикла - когда v1!=v2 даст false. Но можно внести в условие так, что сам цикл останется пустым
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 02:22 #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)));
}

2
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
20.06.2013, 05:52 #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
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
20.06.2013, 09:20 #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;
}
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 10:24 #24
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так должно быть переносимо
Строго говоря, это тоже непереносимо. В чаре не обязательно 8 битов, а int не обязательно использует все sizeof(int) * CHAR_BIT битов в своём представлении.

И сдвиг знаковых чисел вправо может быть как арифметическим, так и логическим: вместо знаковых битов могут записываться как нолики, так и значение знакового бита.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
20.06.2013, 10:39 #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 ?
0
20.06.2013, 10:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 10:39
Привет! Вот еще темы с ответами:

Реализовать заполнение массива случайными числами в диапазоне, указанном пользователем (функции) - C++
Добрый день, подскажите как сделать это задание.... За ранее благодарен!!! По возможности, комментируйте каждое действие. Описать...

Вывести на экран данные о рейсах самолетов, время вылета которых находится в диапазоне, указанном пользователем. - Pascal
Вывести на экран данные о рейсах самолетов (место назначения, авиакомпания), время вылета которых находится в диапазоне, указанном...

Вывести числа в диапазоне от 0 до 500.которые делятся на 5 без остатка - C++
создать программу которая выводит на экран числа в диапазоне от 0 до 500.которые делятся на 5 без остатака.Заранее спасибо)))))

Напишите программу, читающую строки со стандартного устройства ввода и суммирующую их в одну большую строку - C++
1. Напишите программу, читающую строки со стандартного устройства ввода и суммирующую их в одну большую строку. Отобразите полученную...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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