Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2011, 14:11   #1
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию В чем ошибка?

Подскажите, в чем ошибка. Нужно ввести 2 числа и подсчитать сумма всех промежуточных членов. Собственно сперва сумма их считается как нужно, а вот в конечном ответе почему-то не она ... в чем ошибка допереть что-то не могу ...

Код:
#include <iostream>

using namespace std;

int main()
{
	cout << "Please enter the first of your namber: ";
	int a = 0;
	cin >> a;

	cout << "Please enter the second of your namber: ";
	int b = 0;
	cin >> b;

	cout << "\n";

	int i, j;
	for (i = a, j = a; i > a, i <= b; i++, j += i)
		cout << j << "\t";

	cout << "\n\nSum of all terms: " << j;

	int x = 0;
	cin >> x;

	return 0;
}

L6go1as вне форума Ответить с цитированием
Старый 26.10.2011, 14:26   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

0) Условие (i > a, i <= b) - это оригинально. Оператор , вычисляет одно, другое, а в качестве ответа возвращает один из двух результатов. Для объединения логических условий его использовать не надо, но в данном случае я вообще не понимаю, зачем условие i>a.
В принципе, нежелательно объединять через запятую инструкции, порядок выполнения которых существенен (i++, j += i).

1) for(X; Y; Z) A;
Сначала выполняется X, затем проверяется Y, затем выполняется A, затем Z, и только затем снова проверяется Y.
Соответственно, в данном случае на последней итерации i=9, j=44 - вывели 44. Потом i++, j+=i, проверка условия (i<=b неверно) и мы выходим из цикла, но j уже 54.
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 14:49   #3
kypck
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
в чем ошибка допереть что-то не могу ...
Вот исправленный код. Ошибка в том, что после вывода последнего данного j увеличивается еще на i, в итоге сумма получается не та, что нужна.

Вот работающий код

Код:
#include <iostream>

using namespace std;

int main()
{
	cout << "Please enter the first of your namber: ";
	int a = 0;
	cin >> a;

	cout << "Please enter the second of your namber: ";
	int b = 0;
	cin >> b;

	cout << "\n";

	int i, j;
	for (i = a, j = a; i <= b; i++, j += i)
		cout << j << "\t";
        j-=i;

	cout << "\n\nSum of all terms: " << j;

	int x = 0;
	cin >> x;

	return 0;
}

Последний раз редактировалось kypck; 26.10.2011 в 14:52.
kypck вне форума Ответить с цитированием
Старый 26.10.2011, 14:56   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
for (i = a, j = a; i <= b; i++, j += i)
Код:
for (i = j = a; i <= b; j += ++i)
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 26.10.2011, 14:57   #5
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Abstraction, "i > a" - это условие еще с первой "ревизии", когда просто пытался диапазон нужный выделить, как итог добавил еще одно условия, при этом забыв убрать первое.

По пункту 1.) по моему, ты чутка напутал, выход из цикла происходит при достижения "i" заданного числа "b", в данном случае при достижения числа "9", при этом после проходения "j += i", и "j" равно "44", после чего выводится "j". Но вот почему 54 вместо 44 - не понимаю.

Syuf, "for (i = j = a; i <= b; j += ++i)" - результат тот же, 54 вместо 44 (если без других изменений в коде).

kypck, спасибо, теперь работает как нужно. Только вот почему по завершения цикла "j" увеличивается еще раз на "i" ?

Последний раз редактировалось L6go1as; 26.10.2011 в 15:04.
L6go1as вне форума Ответить с цитированием
Старый 26.10.2011, 15:05   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
Стрелка Интересно, кто из нас двоих плохо знает как работает for?..

Цитата:
Сообщение от L6go1as Посмотреть сообщение
Abstraction,

По пункту 1.) по моему, ты чутка напутал, выход из цикла происходит при достижения "i" заданного числа "b", в данном случае при достижения числа "9", при этом после проходения "j += i", и "j" равно "44", после чего выводится "j".
Нет, не напутал.
Выход из цикла происходит при условии, что выражение i<=b возвращает "ложь".
Вопрос: при каком минимальном i условие i<=9 ложно?
Второй вопрос: в описании for выше, выполняется ли A после того, как Y было вычислено и получилась "ложь"?
Abstraction вне форума Ответить с цитированием
Старый 26.10.2011, 15:20   #7
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Abstraction, теперь вроде бы разобрался, неправильно указал условие, если бы было просто i < b, + запутался как for испольняется. Поэтому смутился когда cout выдал значение 35 - что эквивалент 8, а не 9. Из-за этого добавил "=" - теперь cout выдает 44 - что эквивалент 9, но вот при финале еще идет последняя операция которая выдает уже 54 - что эквивалент уже 10 ...

Вообщем разобрался, спасибо. Ибо считал, что сперва испольняется все то, что в скобках, а потом уже блок ниже ...
L6go1as вне форума Ответить с цитированием
Старый 26.10.2011, 15:23   #8
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Syuf, "for (i = j = a; i <= b; j += ++i)" - результат тот же, 54 вместо 44 (если без других изменений в коде).
Я код и не смотрел, вы тут и без меня разберетесь, я просто показал, как лаконичнее записать цикл, и чтобы не возникало претензий по поводу запятой справа.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 26.10.2011, 15:29   #9
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Syuf, За это кстати отдельное спасибо, просто такий записи я еще не видел, но оно работает. Другое дело, что через запятую пока воспринимается как "ок", а ваша запись из будущего ))
L6go1as вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем ошибка!? Файзулка Помощь студентам 5 17.01.2011 10:27
В чем ошибка? Angelic_fiend Помощь студентам 12 02.06.2010 15:52
В чем ошибка? AleNa666 Паскаль, Turbo Pascal, PascalABC.NET 2 28.04.2009 14:28
в чем ошибка Arassir Помощь студентам 3 01.04.2009 21:51