Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Программа на Си, помогите найти ошибку


Автор: Kruger2 9.1.2011, 16:07
Программа просит ввести значения оценок, затем после ввода -1 должна выдать среднюю.
Код
#include <stdio.h>

main ()
{
     float average;
     int counter, grade, total;
     counter = 0;
     total= 0;
     
        printf("enter garde - 1 to end:  ");
        scanf("%d", &grade);
    
           while (grade != -1) {
                 total += grade;    //тут
                 counter++;    //тут
                 printf("enter grade - 1 to end: ");
                 scanf("%d", &grade);
                 }
           if (counter =! 0 ) {
              average =  (float) total / counter;    //тут
              printf("class average is : %.2f", average);
                             }
           else
               printf("no grades were entered\n");
                 
                 
            system ("pause");
            return 0;
     }


Ввожу 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
Код
while (grade != -1) {
                 total += grade;
                 counter++;
                 printf("enter grade - 1 to end: ");
                 scanf("%d", &grade);
                 }


Читаю как:

пока 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.  smile 

Посмотрите внимательно на вот эту строчку:
Код

     if (counter =! 0 ) {

Вы переставили местами = и !. В итоге получается следующее: "!0" воспринимается как "не нуль", т.е. "не ложь" (благо в C булевого типа нет), стало быть, 1. Эта единица присваивается переменной counter, причем все присваивание в целом тоже имеет значение, равное 1. В итоге условие всегда выполняется, но counter после этого всегда равен единице, и "среднее" оказывается совпадающим с суммой введенных значений.

Автор: Kruger2 9.1.2011, 16:46
большое спасибо за развернутый ответsmile

помогите решить задачу по аналогии с этой.

Значит программа подсчета расхода бензина. Вводим в литрах бензин, затем кол-во км. Получаем расход бензина, далее открываю цикл, пока а, т.е. кол-во бензина не равно 1 повторяем ввод и вывод расхода. После чего значение средней прибавляем к переменной тотал1 и прибавляем единицу к счетчику.
Далее, если счетчик не равен 0, то переменную тотал1, которая собрала в себя суммы всех значений с (расходов при каждой заправке) делим на счетчик (кол-во циклов). 

Проблемы:
1. Цикл не заканчивается после ввода -1
2. После ввода -1 дважды, т.е. при вводе бензина и км,  выдает #QNANO и предлагает дальше вводить зачения.



Код

#include <stdio.h>

main ()
{
     float average, a, b, c;
     int counter, total1, total2;
     counter = 0;
     
     
        printf("Kol-vo benzina, - 1 to end:  ");
        scanf("%d", &a);
        printf("Proehal KM, - 1 to end:  ");
        scanf("%d", &b);
        
        c = (float) b / a;
        printf("Rashod is : %f\n\n", c);
    
           while (a != -1) {
                          
                           printf("Benzin -1 to end:  ");
                           scanf("%d", &a);
                           printf("KM- 1 to end:  ");
                           scanf("%d", &b);
                           
                           c = (float) b / a;
                           printf("Rashod is : %f\n\n", c);
                           
                 total1 += c;
                 counter++;
                 }
           if (counter != 0 ) {
              average =  (float) total1 / counter;
              printf("Rashod is : %f\n\n", average);
                             }
           else
               printf("Nothing =( \n");
                 
                 
            system ("pause");
            return 0;
     }


Автор: kemiisto 9.1.2011, 16:51
Цитата(Фантом @  9.1.2011,  14:22 Найти цитируемый пост)
А, это замечательная иллюстрация к шутке, что любая случайная последовательность символов является корректной программой на C.

 smile Не смог пройти мимо...

Автор: Фантом 9.1.2011, 17:10
Цитата(Kruger2 @  9.1.2011,  16:46 Найти цитируемый пост)
помогите решить задачу по аналогии с этой.

Ну, тут все не так интересно.   smile

Сначала попробуйте после пар printf/scanf вставить вывод того, что Вы ввели - строку 
Код

printf("Bylo vvedeno a=%d  b=%d\n",a,b);

и запустите получившееся. Думаю, Вы будете несколько удивлены.  smile 

Причина этого безобразия в том, что в формате scanf целые и вещественные переменные различаются, а Вы пытаетесь вводить значения в переменные типа float с форматом %d - т.е. как целые. Замените форматы ввода на %f (или, если угодно, опишите a и b как int).

Далее. После одного ввода "-1" цикл даже в исправленном варианте сразу же заканчиваться не будет, поскольку до проверки условия программа доберется только после ввода b и подсчетов. Если очень хочется, чтобы цикл заканчивался сразу при вводе -1, моменяйте его заголовок на white(1), а сразу после ввода a вставьте строку
Код

if(a==-1) break;


И, кстати, во избежание тех же граблей, что в прошлый раз, полезно помнить, что вместо
Код

if (counter != 0 )

можно спокойно писать
Код

if (counter)


Добавлено через 2 минуты и 2 секунды
Цитата(kemiisto @  9.1.2011,  16:51 Найти цитируемый пост)
Не смог пройти мимо... 

Я тоже.  smile  Заодно, кстати, это еще одна иллюстрация - того, что для начального обучения программированию язык C использовать не надо.  smile 

Автор: Kruger2 9.1.2011, 18:54

спасибо, выбора особо нет, в программе универа написано с\с++ и приходится мучиться, но главная проблема, это заочное обучение. спросить особо некогоsmile


Код
1:
printf("Bylo vvedeno a=%d  b=%d\n", a, b);


поясните пожалуйста, что в этой строке так кардинально изменило программу? Смысл то я понял, но как по мне, цель этой строки должна быть чисто эстетическойsmile

есть ли на форуме способы поставить плюсик в репу, без 100 постов?)

Автор: Фантом 9.1.2011, 19:47
Цитата(Kruger2 @  9.1.2011,  18:54 Найти цитируемый пост)

поясните пожалуйста, что в этой строке так кардинально изменило программу? Смысл то я понял, но как по мне, цель этой строки должна быть чисто эстетической


Она и есть эстетическая.  smile Демонстрация несоответствия реального содержимого переменных ожидаемому.

Автор: Kruger2 9.1.2011, 20:59
догнал, спасибоsmile

как набью 100 постов с меня + в репуsmile smile 

Автор: kemiisto 9.1.2011, 21:26
Цитата(Kruger2 @  9.1.2011,  18:59 Найти цитируемый пост)
как набью 100 постов с меня + в репу

Kruger2, всегда можете попросить других участников плюсануть от Вашего имени. Я поставил.

Автор: bsa 10.1.2011, 14:07

M
bsa
Kruger2, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)