Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2011, 01:21   #1
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
Вопрос C++ среднее значение или средне арифметическое

Есть задача.

Напишите программу, которая подсчитывает и печатает среднее значение нескольких целых чисел. Считайте, что последняя вводимая величина является контрольным значением 9999. Типичная входная последовательность может иметь вид 10 8 11 7 9 9999.
Должно быть посчитано среднее значение чисел, предшествующих 9999.

Среднее значение я так понял это Средне Арифметическое. Т.к. в этой задаче явно не рассчитывают Медиану.

Вот код который я сделал(из расхода что это Средне Арифметическое с неопределенным кол-во цифр)

Код:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
    int i;
    int midl, x, sum;

    cout << "Введите последовательность целых чисел(9999 - прекращает цикл): ";
    cin >> x;


    for ( i = 1; x != 9999; i++)
    {
        sum = sum + x; // сложение последовательности чисел.
        cout << "Введите последовательность целых чисел(9999 - прекращает цикл): ";
        cin >> x;
    }
    if ( x == 9999 && i > 1)
    {
        midl = sum / i; // вычисление средне арифметического. 
        cout << "среднее значение: " << midl << endl;
    }
    else
        cout << "Данных не введено" << endl;
    return 0;
}
Но в итоге он выводит бешеное число. Думаю в сторону того что где то ошибся в логике вычисления. Но решение пока что в голову не лезет.
П.С.: Изначально код пытался сделать на while и на do...while, числа выходили те же самые, что и в этом случае.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 04.01.2011, 01:23   #2
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

Нашел небольшой косяк. sum в типе int печатал астрономические числа. Сделал его типом double но средне арифметическое считает все равно не правильно. Из введенных 5 чисел получилась сумма 15, а средне арифметическое 2.
Код ниже

Код:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
    int i;
    int midl, x;
    double sum;

    cout << "Введите последовательность целых чисел(9999 - прекращает цикл): ";
    cin >> x;


    for ( i = 1; x != 9999; i++)
    {
        sum = sum + x;
        cout << sum << endl;
        cout << "Введите последовательность целых чисел(9999 - прекращает цикл): ";
        cin >> x;        
    }
    if ( x == 9999 && i > 1)
    {
        midl = sum / i;
        cout << "среднее значение: " << midl << endl;
    }
    else
        cout << "Данных не введено" << endl;
    return 0;
}
Исправил инициатор счетчика на 0, теперь считает все правильно но разве это не ошибочно???
Добавил так же отоброжение счета счетчика и суммы.

Код ниже

Код:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
    int i;
    int midl, x;
    double sum;

    cout << "Введите последовательность целых чисел(9999 - прекращает цикл): ";
    cin >> x;


    for ( i = 0; x != 9999; i++)
    {
        sum = sum + x;
        cout << sum << endl; // дабы увидеть чему равен sum
        cout << i << endl; // дабы увидеть как идет i
        cout << "Введите последовательность целых чисел(9999 - прекращает цикл): ";
        cin >> x;        
    }
    if ( x == 9999 && i > 1)
    {
        cout << i << endl; // дабы увидеть чему равен i
        midl = sum / i;
        cout << "среднее значение: " << midl << endl;
    }
    else
        cout << "Данных не введено" << endl;
    return 0;
}
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.

Последний раз редактировалось Donatello; 04.01.2011 в 01:46. Причина: исправление ошибок своих же
Donatello вне форума Ответить с цитированием
Старый 04.01.2011, 01:41   #3
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

программу не читал но сразу вижу что sum у тебя изначально не равен 0лю. ты ему плюсуешь и плюсуешь значения, но изначально у тебя там астрономическое число и сидит. При объявлении переменной она автоматом не обнуляется!
UltimaBeaR вне форума Ответить с цитированием
Старый 04.01.2011, 01:45   #4
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

UltimaBeaR
во точно про это я и забыл спасибо.
Но не мог бы ты посмотреть последний код, он вроде все правильно делает и компилятор на него не жалуется, но у меня такое чувство что он либо не правильно сделан(в плане логики) или в плане еще чего нибудь.
Если конкретнее то мне не нравится то что пришлось установить i = 0
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 04.01.2011, 02:02   #5
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

у тебя тут последний элемент не просумируется (хотя наверно те и ненужно его прибавлять), с 0ля идет потому что у тебя на каждое валидное(не = 9999) число идет прибавление +1 тоесть 5 раз тело отработало будет 5 в i = количество элементов не считая последнего

ну и среднее число надо бы в дробном виде а то это уже не среднее выходит. а так вроде должно правильно быть, но стиль конечно индусский

ЗЫ: а то что ненравится с 0ля это плохо видать ты с паскаля перешел они там любят путаницу с этой единицей вводить. с 0ля обычно удобнее все делать, просто пойми что с 0ля это не счет идет а индексация

Последний раз редактировалось UltimaBeaR; 04.01.2011 в 02:05.
UltimaBeaR вне форума Ответить с цитированием
Старый 04.01.2011, 02:10   #6
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

да число 9999 не должно суммироваться, иначе бы использовал бы цикл do...while.
насчет прибавления я понял так, что в этом коде после введение 9999, i все равно увеличивается на единицу. Т.е. если i будет идти от 1 при вводе 5 чисел, он выведет что введено 6 чисел.
Среднее да дробным вот ток что переделал
Стиль индусский т.к. две недели C++ учу. До этого был паскаль в инсте один месяц, потом годовой перерыв до C++ в общем то . Вот стиль и кривой.
Учу кстати сам без учебки нигде сейчас не учусь.
Ну а так наверное все не так без надежно в моем случае
Спасибо за ответы и помощь.
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 04.01.2011, 02:47   #7
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

нет в этом коде при вводе 9999 после ввода тело цикла уже не выполнится и не выполнится i++

в твоем случае я бы сделал так:
Код:
#include <iostream>
using namespace std;

int main()
{
    int inputValue;
	int summ = 0;
	int numbersCount = 0;
	while (true)
	{
		cout << "vvod 4isla (9999 = konec): ";
		cin >> inputValue;
		if (inputValue != 9999)
		{
			numbersCount++;
			summ += inputValue;
		}
		else
			break;
	}

    if (numbersCount > 0)
        cout << "srednee zna4enie: " << (float)summ / numbersCount << endl;
    else
        cout << "4isel netu :(" << endl;
    return 0;
}
for обычно используют для прохода по массиву и тому подобного, для всего остального читабельнее юзать while. заметь что в отличие от твоего кода тут нет дублирующей строки ввода в начале и бессмысленной проверки после цикла на x == 9999. для выходного значения я не использовал переменную а выводил сразу, но выведется float значение. сам цикл тут бесконечный - каждую итерацию водится число и дальше проверка если число 9999 то цикл обламывается и код продолжается после цикла. еще про имена переменных - старайся выражать в них смысл того что они делают, если будет код в тысячу строк состоящий из i, a , b , z tempA, tempB, lala, var1 и тд то понять что там за что отвечает будет крайне сложно тебе самому
UltimaBeaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Делфи.среднее геометрическое элементов массива.среднее арифметическое каждой строки матрицы Karrina Помощь студентам 0 06.12.2010 18:32
средне горманическое значение nazamat Помощь студентам 0 22.11.2010 00:15
как посчитать среднее арифметическое значение CraZZy RabbIt Общие вопросы Delphi 5 14.03.2009 13:59