Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
03.07.2011, 00:29     Функции языка с++ и считывание данных в массив #1
Помогите найти ошибку в решении задачки на функции с++ и хранение данных в массиве. Программа должна запрашивать ввод данных (счета при какой-то игре) и сохранять их в массив, после чего считать средний результат. Счет данных и подсчет среднего значения должны управляться отдельными функциями. Максимальное кол-во данных - 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 (или какая нибудь другая чушь в этом роде) ???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2011, 00:29     Функции языка с++ и считывание данных в массив
Посмотрите здесь:

Функции языка С++ C++
Функции языка С++ C++
C++ Стандартные и пользовательские функции языка С
Функции языка с++ C++
C++ Стандартные и пользовательские функции языка С
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 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;
}
Yashman
 Аватар для 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;
?
talis
 Аватар для talis
789 / 541 / 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.
Yashman
 Аватар для Yashman
1 / 3 / 0
Регистрация: 02.07.2011
Сообщений: 90
03.07.2011, 12:30  [ТС]     Функции языка с++ и считывание данных в массив #5
Видимо все дело в компиляторе, потому, что у меня Dev-C++ и там можно просто делить на count.
talis
 Аватар для talis
789 / 541 / 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).
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
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), то это, похоже, ошибка компилятора.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
03.07.2011, 13:29     Функции языка с++ и считывание данных в массив #8
grizlik78, скорее всего. Я сейчас компилировал это под cygwin, Dev-C++, в линуксе... Везде работает так, как говорит Yashman.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2011, 15:04     Функции языка с++ и считывание данных в массив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.07.2011, 15:04     Функции языка с++ и считывание данных в массив #9
Цитата Сообщение от talis Посмотреть сообщение
return sum / (double)count;
А по-моему так в любом случае правильнее. Будет там в компиляторе ошибка, или не будет - это как повезёт... А от явного приведения типов хуже точно не станет.
Yandex
Объявления
03.07.2011, 15:04     Функции языка с++ и считывание данных в массив
Ответ Создать тему
Опции темы

Текущее время: 16:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru