Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Ввести 2 числа и посчитать сумму всех чисел между ними  (Прочитано 60318 раз)
0 Пользователей и 1 Гость смотрят эту тему.
g001501
Интересующийся

by
Offline Offline
Пол: Женский

« : 28-09-2010 13:28 » 

Здравствуйте!
Я начинающий программер на Си. Мне попалась такая задача:

Введите 2 числа и посчитать сумму всех чисел между ними.

Решебник предлагает такое решение:

Код:
#include<stdio.h>
void main()
{
int i,n,m,sum=0;
printf("Vvedite dva chelix chisla:");
scanf("%d%d",&n,&m);
if(n>m)
        {
           i=n;
   n=m;
   m=i;
        }

for (i=n;i<=m;i++);
{
            if(i!=n)
               printf("%+d",i);
    else
               printf("%d",i);
   sum+=i;
        }
printf("=%d\n",sum);

}


Синтаксических ошибок здесь, но решение неадекватное. Мне кажется, в этом коде содержится ошибка. Может, кто подскажет, где?
« Последнее редактирование: 28-09-2010 13:42 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 28-09-2010 13:43 » 

Синтаксических ошибок здесь, но решение неадекватное.

Нда...

Нууу смотря как считать точку  с запятой после оперетора for.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 28-09-2010 13:52 » 

м-да...
сумма арифметической прогрессии...

Срочно в школу!!!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 28-09-2010 18:03 » 

Sla, ну, думаю это задача на организацию циклов, а не на оптимизацию Улыбаюсь
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 28-09-2010 19:10 » 

Лучше читать книги, которые пишут профессионалы, а не другие начинающие. Попробуй в качестве m задать число 2147483647, и "домой" уже будет не суждено вернуться.
Записан
g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #5 : 01-10-2010 13:35 » 

Синтаксических ошибок здесь, но решение неадекватное.

Нда...

Нууу смотря как считать точку  с запятой после оперетора for.


ну да. Извините, там не нужна точка с запятой

Добавлено через 39 секунд:
м-да...
сумма арифметической прогрессии...

Срочно в школу!!!

Большое спасибо! как-то сама не догадалась!

Добавлено через 43 секунды:
Sla, ну, думаю это задача на организацию циклов, а не на оптимизацию Улыбаюсь

да, это задача с использованием  цикла for. А что такое оптимизация?
« Последнее редактирование: 01-10-2010 13:37 от g001501 » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 01-10-2010 13:54 » 

g001501, оптимизация - это улучшение характеристик алгоритма (быстродействие, расход памяти). В данном случае, без уточнения, что "задание на использование for", напрашивается более оптимальный по скорости (на больших интервалах) алгоритм вычисления суммы арифметической прогрессии, который делает это без нудного суммирования в цикле, а буквально в пару действий. Говоря сухим языком науки, вместо сложности O(N) получаем O(1).
« Последнее редактирование: 01-10-2010 13:56 от Вад » Записан
g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #7 : 01-10-2010 14:00 » 

Люди! Объясните, пожалуйста, как решена эта задача. Чего-то я думала, думала и все равно не могу понять!

Добавлено через 1 минуту и 54 секунды:
g001501, оптимизация - это улучшение характеристик алгоритма (быстродействие, расход памяти). В данном случае, без уточнения, что "задание на использование for", напрашивается более оптимальный по скорости (на больших интервалах) алгоритм вычисления суммы арифметической прогрессии, который делает это без нудного суммирования в цикле, а буквально в пару действий. Говоря сухим языком науки, вместо сложности O(N) получаем O(1).

Спасибо! теперь все понятно! но я не могу понять  решение задачи с использованием цикла for! Как-то все сложно.
« Последнее редактирование: 01-10-2010 14:02 от g001501 » Записан
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 01-10-2010 15:15 » 

Код:
	if(n>m)
        {
           i=n;
   n=m;
   m=i;
        }

если первое введённое число больше второго - меняем их местами. далее всегда считаем от младшего n до старшего m:

Код:
	for (i=n;i<=m;i++);
{
   sum+=i;
        }

если выкинуть весь трэш, то алгоритм тупо прибавляет к sum (которое инициализировано нулём) текущее значение i, а i, в свою очередь, пробегает все значения от n до m.
Записан

g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #9 : 02-10-2010 08:57 » 

Код:
	if(n>m)
        {
           i=n;
   n=m;
   m=i;
        }

если первое введённое число больше второго - меняем их местами. далее всегда считаем от младшего n до старшего m:

Код:
	for (i=n;i<=m;i++);
{
   sum+=i;
        }

если выкинуть весь трэш, то алгоритм тупо прибавляет к sum (которое инициализировано нулём) текущее значение i, а i, в свою очередь, пробегает все значения от n до m.

Спасибо большое! Только я не совсем понимаю логику поменять числа местами. Как это они так хитро их поменяли?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 03-10-2010 17:56 » 

Только я не совсем понимаю логику поменять числа местами. Как это они так хитро их поменяли?

Твоё предложение? Менять можно разными способами. Что именно хитрого ты видишь в данном способе?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 04-10-2010 14:36 » 

После этого блока
Код:
	if(n>m)
        {
           i=n;
   n=m;
   m=i;
        }
Ты всегда можешь сказать, что у тебя m>=n, а значит следующий цикл у тебя выполнится хотя бы 1 раз.
А в самой замене ничего хитрого нет: просто попробуй нарисовать для каждой строки таблицу со значениями каждой перменной (на каком-то примере) и поймешь:
nmi
if(n>m)105?
i=n;
n=m;
m=i;
Записан
g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #12 : 05-10-2010 12:33 » 

Kivals,  Спасибо большое! Теперь я поняла!

Добавлено через 19 часов, 10 минут и 34 секунды:
У меня такой вопрос:
Есть задача: Посчитать количество четных положительных чисел, ввод чисел завершается, когда вводим 0.
Есть решение:

Код:
#include<stdio.h>
void main()
{
int x,k=0;
printf("Vvedite chislo:");
scanf("%d", &x);
while (x)
{
if(x%2==0&&x>0)
k++;
printf("Vvedite chislo:");
scanf("%d", &x);
}
printf (Kol-vo chetnix polozitel'nix chisel =%d\n", k);
}
 



Зачем нужна строка по вводу чисел, если она есть в цикле while? И что такое за условие while(x)? Это значит , что while (x!=0)? Или нет?
« Последнее редактирование: 06-10-2010 07:44 от g001501 » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 06-10-2010 07:57 » 

существуют циклы с предусловием и постусловием

в данном случаем используется цикл с предусловием. Т.е. истинность цикла проверяется на ВХОДЕ
При постусловии Истинность цикла проверяется на выходе.
Поэтому  и существует первая строка ввода.

А книШку по С читала?
« Последнее редактирование: 06-10-2010 09:05 от Джон » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 06-10-2010 08:32 » 

Я бы в подобной задаче использовал вечный цикл с выходом по условию
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 06-10-2010 08:35 » 

g001501, для понимания кода (своего или чужого) - форматируй!!!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #16 : 06-10-2010 12:48 » 

существуют циклы с предусловием и постусловием

в данном случаем используется цикл с предусловием. Т.е. истинность цикла проверяется на ВХОДЕ
При постусловии Истинность цикла проверяется на выходе.
Поэтому  и существует первая строка ввода.

А книШку по С читала?


О, да! Я читала. Но я, наверное, блондинка. Хотя цвет волос вроде бы темный.

Добавлено через 5 часов, 40 минут и 9 секунд:
 Такая задача: нужно напечатать числа от 1 до 10, пропустив 5.

Решение:
Код:
#include<stdio.h>
void main()
{
int x=1;
while(x<=10)
{if(x==5)
{x++;
continue;}
printf("%d",x);
x++;}}
Не понимаю увеличение х на единицу в операторе if. Причем, если x++ поставить после continue, задача выводит только первые четыре числа. Может, кто подскажет.
« Последнее редактирование: 06-10-2010 18:29 от g001501 » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 06-10-2010 18:41 » 

смотри
x=1  вывести x x=x+1
x=2  вывести x x=x+1
x=3   вывести x x=x+1
x=4   вывести x x=x+1
                      x=5 не выводить x=x+1 continue говорит о том чтобы пойти в начало цикла
x=6   вывести x x=x+1
x=7   вывести x x=x+1
x=8   вывести x x=x+1
x=9   вывести x x=x+1
x=10  вывести x
« Последнее редактирование: 06-10-2010 18:43 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 07-10-2010 03:44 » 

А так?
Код:
#include<stdio.h>
void main()
{
   int x=1;
   while(x<=10)
   {
       if(x!=5) printf("%d",x);
       x++;
   }
}

Записан

С уважением, Oldy.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 07-10-2010 05:37 » 

Не понимаю увеличение х на единицу в операторе if.

Верное замечание. Поскольку это цикл с перебором, значение x должно увеличиваться на каждой итерации независимо от какого-либо условия.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 07-10-2010 06:24 » 

Не понимаю увеличение х на единицу в операторе if.

Если ПРАВИЛЬНО форматировать код (что уже настоятельно советовали сделать):

Код:
#include<stdio.h>
void main()
{
int x=1;
while(x<=10)
{
if(x==5)
{
x++;
continue; //<<<<
}
printf("%d",x);
x++;
}
}

легко заметить, что после х++; стоит оператор continue - те с этого места цикл переходит сразу в начало и остальная часть тела цикла не выполняется.
В чём ты сама убедилась:

Причем, если x++ поставить после continue, задача выводит только первые четыре числа.

Так что всё правильно. Другое дело, а стоит ли так программировать? Но это уже другой вопрос.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 07-10-2010 07:15 » 

Такая задача: нужно напечатать числа от 1 до 10, пропустив 5.

Если это упражнение по языку C, то в духе этого языка скорее будет такая конструкция:

Код:
int x;
for (x = 0; ++x <= 10; (x != 5) && printf("%d\n", x));

Лучше сразу привыкать, чтобы потом глаз не резало.
« Последнее редактирование: 07-10-2010 07:20 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 07-10-2010 07:18 » 

1. Откуда берутся коды, которые показывает ТС?
  Не сама пишет - 100%
2. Зачем спрашивает?
  Не понимает, но пытается понять.
3. Будем дальше продолжать оптимизировать?
  А почему бы и нет?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 07-10-2010 08:29 » 

Парни, вы только не забывайте, что раздел для начинающих. Оптимизация - это уже следующих шаг. И приводимый код как раз призван разобраться с логикой работы операторов, а не оптимально решить задачу, или сократить код насколько это позволяет язык. Подобные непонятные, хоть и короткие, конструкции:

Код:
int x=10;
while(x--&&((x!=5)?printf("%d",10-x):1));

ИМХО вызовут у них только отвращение.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 07-10-2010 08:45 » 

Тут, что называется, назвался груздем (выбрал C) - полезай... В том же букваре Кернигана и Ричи, который рассчитан отнюдь не на экспертов, читатель натыкается, скажем, на такую реализацию копирования строк:

Код:
while (*s++ = *t++);

И авторский комментарий:

Цитата
Хотя на первый взгляд то, что мы получили, выглядит загадочно, все же такая запись значительно удобнее, и следует освоить ее, поскольку в Си-программах вы будете с ней часто встречаться.

К сожалению, они не обманывают, встречаться будете чаще, чем хотелось бы. Поэтому лучше сразу обзавестись иммунитетом. С волками сишниками жить...
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 07-10-2010 21:23 » 

Код:
while (*s++ = *t++);
так это нормально вполне

Код:
while(x--&&((x!=5)?printf("%d",10-x):1));
а вот это уже говнокод. чем-то даже перл напоминает  Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #26 : 08-10-2010 06:32 » 

а вот это уже говнокод

Во-во. А представь какие ощущения он у новичка вызывает. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #27 : 09-10-2010 13:00 » 

что такое цикл с перебором?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 09-10-2010 14:11 » 

g001501, это вроде такого
Код:
for(int i=0; i<N; i++)
{
   ...
}
Записан

g001501
Интересующийся

by
Offline Offline
Пол: Женский

« Ответ #29 : 10-10-2010 08:50 » 

g001501, это вроде такого
Код:
for(int i=0; i<N; i++)
{
   ...
}




а какие еще циклы бывают, кроме цикла с перебором?
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines