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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2013, 15:04   #1
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию Программа вычисляет сумму всех нечетных чисел в определенном диапазоне

Помогите написать программу, которая вычисляет сумму всех нечетных чисел в диапазоне от 80 до 130
Код:
#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
   int n;
   int sum;
   int i;
   
  
   for (i=1; i<=n; i++)
   sum=sum+i;
   cout<<"summa= "<<sum;
   cin>>sum;
   return 0;
}
Diana528 вне форума Ответить с цитированием
Старый 01.03.2013, 15:22   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) sum изначально равно чему угодно. (что угодно)+i = (что угодно). Нехорошо.
2) Вам нужно сумму не от 1 до n (и опять же, n равно чему угодно), а от 80 до 130.
3) Нужна сумма нечётных чисел, а не всех подряд. Условие "если k нечётное" пишется как
Код:
if(k%2 == 1)
Можно вместо этого начать суммирование с 81 и каждый раз прибавлять не 1 (i++), а 2 (i+=2).
Abstraction вне форума Ответить с цитированием
Старый 01.03.2013, 15:29   #3
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

Верно?
Код:
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
  
   int sum;
   int i;
   
  
   for (i=81; i<=130; i++)
    i+=2;
   sum=sum+i;
   cout<<"summa= "<<sum;
   cin>>sum;
   return 0;
}
Diana528 вне форума Ответить с цитированием
Старый 01.03.2013, 15:38   #4
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

Код:
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
  
   int sum;
   int i;
   sum=0;
  
   for (i=81; i<=130; i++)
    i+=2;
  sum=sum+i;
   cout<<"summa= "<<sum;
   cin>>sum;
   return 0;
}
Diana528 вне форума Ответить с цитированием
Старый 01.03.2013, 16:15   #5
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

В вашем коде ответ всегда будет 129 (цикл напрасно набивает i)
Если исправить и немного упростить, то выйдет такой вот код
Код:
int main()
{
   int sum=0;
   for (int i=81; i<=130; i+2)
    sum+=i;
   cout<<"summa= "<<sum;
   return 0;
}

Последний раз редактировалось Blind Guard; 01.03.2013 в 16:18.
Blind Guard вне форума Ответить с цитированием
Старый 01.03.2013, 16:16   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Катастрофа.
Ликбез. Категорически не понимаю, как Вы без этого знания сунулись к классам.
Цикл for имеет следующую форму:
Код:
for(<Инициализация>; <Условие>; <Действие в конце итерации>) <Тело цикла>
Инициализация - действия, выполняемые перед входом в цикл. Если этот элемент пуст, не выполняется ничего. Также здесь допустимо (в C++, не в чистом C) объявлять новые переменные.
Условие - условие, при котором цикл продолжается. Проверяется каждый раз перед началом выполнения тела цикла, в том числе в самом начале (т.е. если после инициализации результат вычисления условия есть false, тело цикла не выполнится ни разу). Если условие пусто, оно считается истинным.
Действие в конце итерации выполняется всякий раз, когда поток управления доходит до конца тела цикла. Это касается, среди прочего, эффекта ключевого слова continue (т.е. по continue происходит действие в конце итерации, и только потом новая проверка условия). Если действие пусто, не выполняется ничего.
Тело цикла выполняется первый раз после инициализации и проверки условия (если условие выполняется). Тело есть либо одиночная инструкция, оканчивающаяся оператором ;, либо блок инструкций, заключённый в операторные скобки {}. По окончании выполнения тела цикла (если только оно не вызвано ключевыми словами break, goto или throw, либо вызовом функции longjmp()), управление переходит на действия в конце итерации, после чего по-новой проверяется условие.
В целом, схему цикла for можно переписать следующим образом с использованием while:
Код:
<Инициализация>
while(<Условие>){
  <Тело цикла>
  <Действие в конце итерации>
}
Но. Компилятор определяет, что является телом цикла, посредством чтения кода, а не мыслей программиста. Поэтому, если за for() следует не открывающая скобка операторного блока {, телом цикла считается ровно одна инструкция, до первой ;.

Шаблонный пример в C++, "сделать 138 раз":
Код:
for(int i=0; i<138; ++i){
  //Требуемые действия
}
Что происходит: вначале объявляется переменная i, которой присваивается значение 0.
Затем проверяется, верно ли, что i меньше 138. Если нет, происходит выход из цикла.
Затем выполняются действия. Если нам нужно выполнить действие именно 138 раз, менять i при этом нельзя (см. ниже).
Затем выполняется ++i (это инкремент, увеличение значения i на 1; ++i эквивалентно i+=1).
Затем мы возвращаемся к проверке.
Легко видеть, что, если i изменялась только в действии в конце итерации и не было никаких пакостей вроде break, (требуемые действия) были выполнены ровно 138 раз.

Теперь грабли.
Код:
for(int i; i<138; ++i){
  //Требуемые действия
}
Сколько раз будут выполнены действия? Неизвестно. int i объявляет переменную, но не задаёт её значения. Вопрос: сколько раз будут выполнены действия, если изначальное значение i окажется равным 12? -36? 20539? А ведь всё это - возможные варианты. Поэтому. Всегда, если нет очень веских причин для иного, при объявлении переменной присваивайте ей какое-нибудь значение. Многие типы допускают инициализацию значением 0, так что в отсутствие более умных идей это вполне достойный вариант.
Код:
for(int i=0; i<138; ++i){
  //Требуемые действия
  i -= 3;
}
Если прочие действия не меняют i, сколько раз выполнится цикл? А? Э-э... А если эта строка выполняется только при каком-нибудь хитром условии, а не просто на каждой итерации? Если для иного нет очевидных причин, не меняйте значения переменной цикла в теле этого цикла. Эти причины, впрочем, возникают относительно часто... и служат довольно стабильным источником багов, увы.
Abstraction вне форума Ответить с цитированием
Старый 01.03.2013, 16:17   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

(Ненавижу лимиты по символам в сообщениях)
Код:
for(int i=0; i<138; ++i){
  //Требуемые действия
}
std::cout << i;
Что будет выведено на экран? 138? А вот фигушки. В лучшем случае, компилятор выдаст ошибку - ведь переменная, объявленная вот так внутри цикла, "живёт" только в теле этого цикла. В худшем - окажется, что снаружи объявлена ещё одна переменная с именем i. Эта внешняя переменная внутри цикла будет "скрыта" нашей i и не изменится, что является одновременно как хорошей, так и плохой новостью. Вот в этом случае - совершенно точно плохой:
Код:
int count = CountCrocodiles(); //число крокодилов
for(int count=0; count<138; ++count){ //Повторяем 138 раз
  //Требуемые действия, где-то в середине тридцати строк кода:
  cout << "Я вижу " << count << "крокодилов";
}
Внутри цикла имя count относится к переменной, объявленной в for. Соответственно, приведённая строка выведет числа от 0 до 137, а компилятор скромно промолчит - это легальный код. Поэтому. Категорически нежелательно объявлять в одной функции две переменных с одним именем, даже если компилятор даёт это сделать.
Код:
int i=0;
for(i=0; i<138; ++i){
  //Требуемые действия
}
std::cout << i;
А вот сейчас будет выведено 138. Или меньше, если выход из цикла произошёл по break. Почему бы тогда всё время не пользоваться такой схемой? Да потому, что в этом случае переменная будет "оставаться в живых" даже там, где она уже не нужна. И к ней можно будет нечаянно обратиться.
Код:
   for (i=81; i<=130; i++)
    i+=2;
   sum=sum+i;
Тело цикла - "i+=2". На выходе из цикла i=132 (вопрос Вам для самопроверки: почему значение будет именно таким?), дальше выполняется sum=sum+i. Компилятор ничего не заподозрил, а вот если бы никакой i раньше не объявлялось, а было бы
Код:
for (int i=81; i<=130; ++i)
    i+=2;
, то дальнейшие обращения к i повлекли бы ошибку.
Abstraction вне форума Ответить с цитированием
Старый 01.03.2013, 16:18   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
   int i;
   for (i=81; i<=130; i+2)
    sum+=i;
Blind Guard, ф-фе. Поздравляю с бесконечным циклом.
Abstraction вне форума Ответить с цитированием
Старый 01.03.2013, 16:22   #9
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

программа ничего не выводит
Diana528 вне форума Ответить с цитированием
Старый 01.03.2013, 16:24   #10
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Единственное что я исправил в изначальном цикле, это прыжок на 2, другое я не смотрел, там уже дело техники, а на моей данной технике нет С++
Blind Guard вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти сумму всех нечетных чисел в диапазоне от 42 до 73. mkerimkulov Общие вопросы C/C++ 11 29.09.2012 11:09
список всех четырехзначных нечетных чисел, делящихся без остатка на сумму своих цифр. Kami-sama Общие вопросы C/C++ 2 12.11.2010 17:07
Посчитать сумму всех целых чисел в этом диапазоне LION7777 Фриланс 14 15.06.2010 00:16
программа с использованием подпрограмм, создаёт односвязный список и вычисляет сумму положительных чисел LOVELY Паскаль, Turbo Pascal, PascalABC.NET 5 13.12.2008 01:27