Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
#1

Функции языка с++ и считывание данных в массив - C++

03.07.2011, 00:29. Просмотров 812. Ответов 8
Метки нет (Все метки)

Помогите найти ошибку в решении задачки на функции с++ и хранение данных в массиве. Программа должна запрашивать ввод данных (счета при какой-то игре) и сохранять их в массив, после чего считать средний результат. Счет данных и подсчет среднего значения должны управляться отдельными функциями. Максимальное кол-во данных - 10. У пользователя должна быть возможность прерывать ввод данных при вводе буквы вместо числа. Вот мои соображения по поводу этой задачки:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
 
using namespace std;
 
const int Max = 10;
 
int info();
double average(int array[], int);
int i = 0;
int main()
{
    cout << "Enter 10 games results ( 's' to terminate):\n";
    
    info();
    int results[Max-1];
    double avg = average(results, i);    // по окончанию функции info() переменная 'i' будет равна кол-ву 
                                         // считанных данных, поделив сумму которых на 'i', можно будет                    
                                        // найти средний результат                                
    cout << "Average score: " << avg << ";\n";
    system ("PAUSE");
    return 0;
}
 
int info()
{
    int results[Max-1];
    for (int c = 0; c < Max; c++)  
    results[c] = 0;
    
       cout << "score #1: ";
       while (i < Max && cin >> results[i])
       {
             if (++i < Max)
             cout << "score #" << i+1 << ": ";
             else
             break;
       }
       return results[Max];
}
 
double average(int results[], int i)
{
       int sum = 0;
       for (int b = 0; b < Max; b++)
       sum += results[b];
       double avg = sum/i;
       return avg;
}

Пример выполнения программы по моему коду:
Enter 10 games results ('s' to terminate) :
score #1: 5
score #2: 5
score #3: 5
score #4: 5
score #5: 5
score #6: 5
score #7: 5
score #8: 5
score #9: 5
score #10: 5
Average score: 2.03915e+008

А теперь внимание вопрос : почему средний результат, который должен быть равен 5, у компьютера получается 2.03915e+008 (или какая нибудь другая чушь в этом роде) ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2011, 00:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функции языка с++ и считывание данных в массив (C++):

Считывание данных из файла в массив - C++
Не получается считать дробные числа из файла. Первое число считывает, а потом ставит непонятные числа и все #include &lt;fstream&gt; ...

Считывание данных из файла.тхт в массив - C++
доброго времени суток. я новичок и поставлена одна задача(скорее игровая). у меня есть текстовый файл в котором первая строка содержит...

Считывание данных из файла в массив и дальнейшая их сортировка - C++
Здравствуйте! В общем, задача такая: есть файл с двумя столбцами из чисел (числа с запятой). Нужно считать числа из второго столбца, затем...

Неверное считывание символов русского языка - C++
Visual Studio 2013. При считывании русских символов всеми возможными средствами (cin, scanf, getch и др.) считывается неверный код, который...

Функции языка С++ - C++
Написать функции сложения матрицы с константой, умножения и деления матрицы на константу. Заранее спасибо:)

Функции языка с++ - C++
Пожалуйста не поленитесь, прочитайте всё и помогите :) . Заранее СПАСИБО! Разработайте функцию calculate(), принимающую два значения...

8
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.07.2011, 00:43 #2
Первая ошибка, которая бросается в глаза - у вас и в main(), и в info() определены int results[Max-1];. Однако это два разных массива. Один находится в (пространстве имён) main, другой - в info. Передавайте results в info по указателю:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
const int Max = 10;
 
int info( int * results );
double average(int array[], int);
int i = 0;
int main()
{
    cout << "Enter 10 games results ( 's' to terminate):\n";
 
    int results[Max-1];
    info( results );
    double avg = average(results, i);    // по окончанию функции info() переменная 'i' будет равна кол-ву
                                         // считанных данных, поделив сумму которых на 'i', можно будет
                                        // найти средний результат
    cout << "Average score: " << avg << ";\n";
    system ("PAUSE");
    return 0;
}
 
int info( int * results )
{
    for ( int c = 0; c < Max; c++ )
       results[c] = 0;
 
    cout << "score #1: ";
 
    while (i < Max && cin >> results[i])
    {
       if (++i < Max)
          cout << "score #" << i+1 << ": ";
       else
          break;
    }
 
    return results[Max];
}
 
double average(int results[], int i)
{
       int sum = 0;
       for (int b = 0; b < Max; b++)
       sum += results[b];
       double avg = sum/i;
       return avg;
}
Ну и далее, причёсывая программу:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
const int Max = 10;
 
int info( int * results );
double average(int array[], int);
 
int main()
{
    int results[ Max - 1 ];
 
    cout << "Enter 10 games results ( 's' to terminate):\n";
 
    // MY_EDIT: вызов. info возвращает количество элементов, введённых в result, которое
    //          тут же передаётся в average
 
    cout << "Average score: " << average( results, info( results ) ) << ";\n";
 
    system ("pause > nul");
 
    return 0;
}
 
int info( int * results )
{
    for ( int c = 0; c < Max; c++ )
       results[c] = 0;
 
    cout << "score #1: ";
 
    int i = 0;
    while ( i < Max && cin >> results[i] )
    {
       if (++i < Max)
          cout << "score #" << i+1 << ": ";
       else
          break;
    }
 
    return i; // MY_EDIT: вернуть количество введённых элементов
}
 
double average( int * results, int count )
{
       double sum = 0; // MY_EDIT
 
       for (int b = 0; b < Max; b++)
          sum += results[b];
 
       return sum / (double)count;
}
0
Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
03.07.2011, 00:56  [ТС] #3
Спасибо за быструю реакцию и понятное объяснение . Кстати зачем вы в 59-ой строке написали
C++
1
return sum / (double)count;
если хватает просто
C++
1
return sum / count;
?
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.07.2011, 01:02 #4
У меня (gcc version 4.4.1 (TDM-2 mingw32)) вариант return sum / count; кушал дробную часть. Видимо, компилятор приводил sum к typeof(count), то есть к int, вычислял, а потом результат вычеслений (типа int) приводил опять к double и возвращал. А нужно было наоборот - привести count к типу double и вычислить. В этом случае не терялась бы дробная часть при делении. По-этому пришлось явно привести count к double.
0
Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
03.07.2011, 12:30  [ТС] #5
Видимо все дело в компиляторе, потому, что у меня Dev-C++ и там можно просто делить на count.
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.07.2011, 13:16 #6
Yashman, если это тот Dev-C++, о котором я думаю, то он ипользует gcc version 3.4.2 (mingw-special). А у меня в Code::Blocks 10.05 использует gcc version 4.4.1 (TDM-2 mingw32).
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
03.07.2011, 13:25 #7
Цитата Сообщение от talis Посмотреть сообщение
У меня (gcc version 4.4.1 (TDM-2 mingw32)) вариант return sum / count; кушал дробную часть. Видимо, компилятор приводил sum к typeof(count), то есть к int, вычислял, а потом результат вычеслений (типа int) приводил опять к double и возвращал. А нужно было наоборот - привести count к типу double и вычислить. В этом случае не терялась бы дробная часть при делении. По-этому пришлось явно привести count к double.
Непонятно тогда, чем руководствовался компилятор. Если это действительно так (при sum объявленном как double), то это, похоже, ошибка компилятора.
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.07.2011, 13:29 #8
grizlik78, скорее всего. Я сейчас компилировал это под cygwin, Dev-C++, в линуксе... Везде работает так, как говорит Yashman.
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
03.07.2011, 15:04 #9
Цитата Сообщение от talis Посмотреть сообщение
return sum / (double)count;
А по-моему так в любом случае правильнее. Будет там в компиляторе ошибка, или не будет - это как повезёт... А от явного приведения типов хуже точно не станет.
1
03.07.2011, 15:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2011, 15:04
Привет! Вот еще темы с ответами:

Функции языка С++ - C++
Задана матрица x(n,m). Сформировать вектор y(n), содержащий сумму элементов строк. Найти максимальную сумму строки. Заранее спасибо.

Стандартные и пользовательские функции языка С - C++
1) Найти периметр и площадь прямоугольного треугольника, если данные длины его катетов a и b. 2) Дано три действительных числа X, Y, Z....

Стандартные и пользовательские функции языка С - C++
Помогите пожалуйста написать программы на чистом Си в одном проекте. 1) Для нагрева 300 л. воды от 10 oС до 100 oС необходимо сжечь...

Стандартные и пользовательские функции языка С - C++
Помогите написать на чистом Си в одном проекте. 1) Даны три целые числа. Поднять квадрату отрицательные числа и к кубу -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru