Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа на Си, помогите найти ошибку, При выполнении проги, вместо / выдает + 
V
    Опции темы
Kruger2
Дата 9.1.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Программа просит ввести значения оценок, затем после ввода -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; никак не подразумевает сложения


Модератор: не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 10.1.2011, 14:04
PM MAIL   Вверх
Sosed
Дата 9.1.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



Ввожу 20(counter = 0), затем 10(counter = 1), получаю 30(30/1 = 30). 
PM MAIL   Вверх
Kruger2
Дата 9.1.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Код
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.

видимо не шарю)

Это сообщение отредактировал(а) bsa - 10.1.2011, 14:05
PM MAIL   Вверх
Фантом
Дата 9.1.2011, 16:22 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



А, это замечательная иллюстрация к шутке, что любая случайная последовательность символов является корректной программой на C.  smile 

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

     if (counter =! 0 ) {

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



большое спасибо за развернутый ответ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;
     }



Это сообщение отредактировал(а) Kruger2 - 9.1.2011, 16:50
PM MAIL   Вверх
kemiisto
Дата 9.1.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



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

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


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Фантом
Дата 9.1.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(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 
PM   Вверх
Kruger2
Дата 9.1.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет




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


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


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

есть ли на форуме способы поставить плюсик в репу, без 100 постов?)
PM MAIL   Вверх
Фантом
Дата 9.1.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



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

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


Она и есть эстетическая.  smile Демонстрация несоответствия реального содержимого переменных ожидаемому.
PM   Вверх
Kruger2
Дата 9.1.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



догнал, спасибоsmile

как набью 100 постов с меня + в репуsmile smile 
PM MAIL   Вверх
kemiisto
Дата 9.1.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



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

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


--------------------
PM MAIL WWW GTalk Jabber   Вверх
bsa
Дата 10.1.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




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

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.