| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Программа на Си, помогите найти ошибку |
| Автор: Kruger2 9.1.2011, 16:07 | ||
Программа просит ввести значения оценок, затем после ввода -1 должна выдать среднюю.
Ввожу 20, затем 10, получаю 30. хотя average = (float) total / counter; никак не подразумевает сложения Модератор: не забываем пользоваться кнопочкой "Код" |
| Автор: Sosed 9.1.2011, 16:14 |
| Ввожу 20(counter = 0), затем 10(counter = 1), получаю 30(30/1 = 30). |
| Автор: Kruger2 9.1.2011, 16:19 | ||
Читаю как: пока grade не равно -1 выполнить сумма = сумма + оценка (прибавить оценку к общей сумме) счетчик = счетчик +1 (считаем кол-во оценок) ввести оценку принять целое число и присвоить переменной grade ввожу grade: 20 grade: 10 получаю след действия: прибавить к сумме 20, затем 10. всего 30. счетчик выполняет +1 дважды, значит = 2 average = (float) total / counter; 30 должно делить на 2. видимо не шарю) |
| Автор: Фантом 9.1.2011, 16:22 | ||
| А, это замечательная иллюстрация к шутке, что любая случайная последовательность символов является корректной программой на C. Посмотрите внимательно на вот эту строчку:
Вы переставили местами = и !. В итоге получается следующее: "!0" воспринимается как "не нуль", т.е. "не ложь" (благо в C булевого типа нет), стало быть, 1. Эта единица присваивается переменной counter, причем все присваивание в целом тоже имеет значение, равное 1. В итоге условие всегда выполняется, но counter после этого всегда равен единице, и "среднее" оказывается совпадающим с суммой введенных значений. |
| Автор: Kruger2 9.1.2011, 16:46 | ||
| большое спасибо за развернутый ответ помогите решить задачу по аналогии с этой. Значит программа подсчета расхода бензина. Вводим в литрах бензин, затем кол-во км. Получаем расход бензина, далее открываю цикл, пока а, т.е. кол-во бензина не равно 1 повторяем ввод и вывод расхода. После чего значение средней прибавляем к переменной тотал1 и прибавляем единицу к счетчику. Далее, если счетчик не равен 0, то переменную тотал1, которая собрала в себя суммы всех значений с (расходов при каждой заправке) делим на счетчик (кол-во циклов). Проблемы: 1. Цикл не заканчивается после ввода -1 2. После ввода -1 дважды, т.е. при вводе бензина и км, выдает #QNANO и предлагает дальше вводить зачения.
|
| Автор: Фантом 9.1.2011, 17:10 | ||||||||
Ну, тут все не так интересно. Сначала попробуйте после пар printf/scanf вставить вывод того, что Вы ввели - строку
и запустите получившееся. Думаю, Вы будете несколько удивлены. Причина этого безобразия в том, что в формате scanf целые и вещественные переменные различаются, а Вы пытаетесь вводить значения в переменные типа float с форматом %d - т.е. как целые. Замените форматы ввода на %f (или, если угодно, опишите a и b как int). Далее. После одного ввода "-1" цикл даже в исправленном варианте сразу же заканчиваться не будет, поскольку до проверки условия программа доберется только после ввода b и подсчетов. Если очень хочется, чтобы цикл заканчивался сразу при вводе -1, моменяйте его заголовок на white(1), а сразу после ввода a вставьте строку
И, кстати, во избежание тех же граблей, что в прошлый раз, полезно помнить, что вместо
можно спокойно писать
Добавлено через 2 минуты и 2 секунды Я тоже. |
| Автор: Kruger2 9.1.2011, 18:54 | ||
спасибо, выбора особо нет, в программе универа написано с\с++ и приходится мучиться, но главная проблема, это заочное обучение. спросить особо некого
поясните пожалуйста, что в этой строке так кардинально изменило программу? Смысл то я понял, но как по мне, цель этой строки должна быть чисто эстетической есть ли на форуме способы поставить плюсик в репу, без 100 постов?) |
| Автор: Фантом 9.1.2011, 19:47 | ||
Она и есть эстетическая. |
| Автор: Kruger2 9.1.2011, 20:59 |
| догнал, спасибо как набью 100 постов с меня + в репу |
| Автор: kemiisto 9.1.2011, 21:26 |
Kruger2, всегда можете попросить других участников плюсануть от Вашего имени. Я поставил. |
| Автор: bsa 10.1.2011, 14:07 | ||
|