g001501
Интересующийся
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 от Джон »
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
|
|
« Ответ #2 : 28-09-2010 13:52 » |
|
м-да... сумма арифметической прогрессии...
Срочно в школу!!!
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Kivals
|
|
« Ответ #3 : 28-09-2010 18:03 » |
|
Sla, ну, думаю это задача на организацию циклов, а не на оптимизацию
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #4 : 28-09-2010 19:10 » |
|
Лучше читать книги, которые пишут профессионалы, а не другие начинающие. Попробуй в качестве m задать число 2147483647, и "домой" уже будет не суждено вернуться.
|
|
|
Записан
|
|
|
|
g001501
Интересующийся
Offline
Пол:
|
|
« Ответ #5 : 01-10-2010 13:35 » |
|
Синтаксических ошибок здесь, но решение неадекватное. Нда... Нууу смотря как считать точку с запятой после оперетора for. ну да. Извините, там не нужна точка с запятой Добавлено через 39 секунд:м-да... сумма арифметической прогрессии...
Срочно в школу!!!
Большое спасибо! как-то сама не догадалась! Добавлено через 43 секунды:Sla, ну, думаю это задача на организацию циклов, а не на оптимизацию да, это задача с использованием цикла for. А что такое оптимизация?
|
|
« Последнее редактирование: 01-10-2010 13:37 от g001501 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #6 : 01-10-2010 13:54 » |
|
g001501, оптимизация - это улучшение характеристик алгоритма (быстродействие, расход памяти). В данном случае, без уточнения, что "задание на использование for", напрашивается более оптимальный по скорости (на больших интервалах) алгоритм вычисления суммы арифметической прогрессии, который делает это без нудного суммирования в цикле, а буквально в пару действий. Говоря сухим языком науки, вместо сложности O(N) получаем O(1).
|
|
« Последнее редактирование: 01-10-2010 13:56 от Вад »
|
Записан
|
|
|
|
g001501
Интересующийся
Offline
Пол:
|
|
« Ответ #7 : 01-10-2010 14:00 » |
|
Люди! Объясните, пожалуйста, как решена эта задача. Чего-то я думала, думала и все равно не могу понять! Добавлено через 1 минуту и 54 секунды:g001501, оптимизация - это улучшение характеристик алгоритма (быстродействие, расход памяти). В данном случае, без уточнения, что "задание на использование for", напрашивается более оптимальный по скорости (на больших интервалах) алгоритм вычисления суммы арифметической прогрессии, который делает это без нудного суммирования в цикле, а буквально в пару действий. Говоря сухим языком науки, вместо сложности O(N) получаем O(1).
Спасибо! теперь все понятно! но я не могу понять решение задачи с использованием цикла for! Как-то все сложно.
|
|
« Последнее редактирование: 01-10-2010 14:02 от g001501 »
|
Записан
|
|
|
|
x77
Команда клуба
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
Интересующийся
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. Спасибо большое! Только я не совсем понимаю логику поменять числа местами. Как это они так хитро их поменяли?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
|
|
« Ответ #11 : 04-10-2010 14:36 » |
|
После этого блока if(n>m) { i=n; n=m; m=i; } Ты всегда можешь сказать, что у тебя m>=n, а значит следующий цикл у тебя выполнится хотя бы 1 раз. А в самой замене ничего хитрого нет: просто попробуй нарисовать для каждой строки таблицу со значениями каждой перменной (на каком-то примере) и поймешь: | n | m | i | if(n>m) | 10 | 5 | ? | i=n; | | | | n=m; | | | | m=i; | | | |
|
|
|
Записан
|
|
|
|
g001501
Интересующийся
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
|
|
« Ответ #13 : 06-10-2010 07:57 » |
|
существуют циклы с предусловием и постусловием
в данном случаем используется цикл с предусловием. Т.е. истинность цикла проверяется на ВХОДЕ При постусловии Истинность цикла проверяется на выходе. Поэтому и существует первая строка ввода.
А книШку по С читала?
|
|
« Последнее редактирование: 06-10-2010 09:05 от Джон »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Kivals
|
|
« Ответ #14 : 06-10-2010 08:32 » |
|
Я бы в подобной задаче использовал вечный цикл с выходом по условию
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 06-10-2010 08:35 » |
|
g001501, для понимания кода (своего или чужого) - форматируй!!!
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
g001501
Интересующийся
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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #19 : 07-10-2010 05:37 » |
|
Не понимаю увеличение х на единицу в операторе if. Верное замечание. Поскольку это цикл с перебором, значение x должно увеличиваться на каждой итерации независимо от какого-либо условия.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #22 : 07-10-2010 07:18 » |
|
1. Откуда берутся коды, которые показывает ТС? Не сама пишет - 100% 2. Зачем спрашивает? Не понимает, но пытается понять. 3. Будем дальше продолжать оптимизировать? А почему бы и нет?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
|
|
« Ответ #24 : 07-10-2010 08:45 » |
|
Тут, что называется, назвался груздем (выбрал C) - полезай... В том же букваре Кернигана и Ричи, который рассчитан отнюдь не на экспертов, читатель натыкается, скажем, на такую реализацию копирования строк: И авторский комментарий: Хотя на первый взгляд то, что мы получили, выглядит загадочно, все же такая запись значительно удобнее, и следует освоить ее, поскольку в Си-программах вы будете с ней часто встречаться. К сожалению, они не обманывают, встречаться будете чаще, чем хотелось бы. Поэтому лучше сразу обзавестись иммунитетом. С волками сишниками жить...
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #25 : 07-10-2010 21:23 » |
|
так это нормально вполне while(x--&&((x!=5)?printf("%d",10-x):1)); а вот это уже говнокод. чем-то даже перл напоминает
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
Интересующийся
Offline
Пол:
|
|
« Ответ #27 : 09-10-2010 13:00 » |
|
что такое цикл с перебором?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 09-10-2010 14:11 » |
|
g001501, это вроде такого for(int i=0; i<N; i++) { ... }
|
|
|
Записан
|
|
|
|
g001501
Интересующийся
Offline
Пол:
|
|
« Ответ #29 : 10-10-2010 08:50 » |
|
g001501, это вроде такого for(int i=0; i<N; i++) { ... }
а какие еще циклы бывают, кроме цикла с перебором?
|
|
|
Записан
|
|
|
|
|