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

Массив указателей на функцию - C++

Восстановить пароль Регистрация
 
Monika23
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 20
05.12.2013, 14:15     Массив указателей на функцию #1
Напишите программу, чтобы она управлялась при помощи меню. Программа должна предлагать пользователю выбор из нескольких команд примерно таким образом:
Выберите:
0 Вывести массив оценок
1 Найти минимальную оценку
2 Найти максимальную оценку
3 Вывести среднюю оценку для каждого студента
4 Выйти из программы

Существует одно ограничение на использование массивов указателей на функции, которое состоит в том, что все указатели должны иметь одинаковый тип. Указатели должны ссылаться на функции, возвращающие значение одного и того же типа и имеющие однотипные параметры. Функции должны возвращать результат одного типа и иметь одинаковый набор параметров. Модифицированные функции minimum и maximum должны выводить минимальную и максимальную оценки и ничего не возвращать. Функция average для команды меню 3 должна выводить средний балл для каждого студента (а не для одного). Функция average не должна ничего возвращать и должна иметь список параметров, одинаковый с функциями printArray, minimum и maximum. Сохраните указатели на четыре функции в массиве processGrades и используйте выбор, сделанный пользователем, в качестве индекса массива указателей для вызова нужной функции.

Примерно представляю как написать со структурами, а вот с указателями вообще ничего не понимаю. Помогите, плиз.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
05.12.2013, 14:27     Массив указателей на функцию #2
Думаю разберетесь

void(*f)(int) - указатель на функцию которая должна возвращать void и принимать во входящем параметре int
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
#include <iostream> 
 
void func1(int a)
{
     std::cout << "This is a func1 " << a << std::endl;
}
 
void func2(int a)
{
     std::cout << "This is a func2 " << a << std::endl;
}
 
void func3(int a)
{
     std::cout << "This is a func3 " << a << std::endl;
}
 
void total(void(*f)(int), int a)
{
     f(a);
}
int main()
{
  total(func1,10);
  total(func2,20);
  total(func3,30);
  
  
        system("PAUSE"); 
        return 0;
}
Monika23
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 20
05.12.2013, 15:32  [ТС]     Массив указателей на функцию #3
Вот код программы,но без указателей и без меню. Как сделать меню и переделать с ее с указателями?
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#define STUDENTS 3
#define GRADES 5
 
int min ( const int grades[][GRADES], int pupils, int tests);
int max ( const int grades[][GRADES], int pupils, int tests);
double average ( const int setOfGrades[], int tests);
void printArray ( const int grades[][GRADES], int pupils, int tests);
 
void init_list(), printArray(), minimum(), maximum(), average();
int menu();
 
using namespace std;
 
 
void main()
{
    int student; //счетчик студентов
    //инициализировать массив оценок 
    const int studentGrades [STUDENTS][GRADES] = 
    { { 54, 23, 68, 65, 65 },
      { 95, 97, 59, 46, 34 },
      { 87, 45, 78, 89, 23 } };
 
 
    cout << "The array is:\n "; //вывести массив оценок
    printArray ( studentGrades, STUDENTS, GRADES );
 
    //определить-вывести наибольшую и наименьшею оценку
    cout << "\n\nminimum grade: ";
    cout << min ( studentGrades, STUDENTS, GRADES ) << endl; 
    cout << "maximum grade: ";
    cout << max ( studentGrades, STUDENTS, GRADES ) << endl;
    
    //вычислить-вывести среднюю оценку для каждого студента
 
    for ( student = 0; student < STUDENTS; student++ ) {
        cout << "The average grade for student ";
        cout << student << "is ";
        cout << average ( studentGrades [student], GRADES) << endl;
    }
}
 
int min (const int grades[][GRADES], int pupils, int tests)
{
    int i; //счетчик студентов
    int j; //счетчик оценок
    int lowGrade = 100; //инициализировать максимумом
 
    for ( i =0; i < pupils; i++ ) { //цикл по строкам оценок
        for ( j = 0; j < tests; j++ ) { //цикл по столбцам оценок
 
            if ( grades [i][j] < lowGrade) {
                lowGrade = grades [i][j]; }
        }
    }
    return lowGrade; }
 
 
int max (const int grades[][GRADES], int pupils, int tests)
{
    int i; //счетчик студентов
    int j; //счетчик оценок
    int highGrade = 0; //инициализировать минимумом
 
    for ( i =0; i < pupils; i++ ) { //цикл по строкам оценок
        for ( j = 0; j < tests; j++ ) { //цикл по столбцам оценок
 
            if ( grades [i][j] > highGrade) {
                highGrade = grades [i][j]; }
        }
    }
    return highGrade; }
 
 
//Определение средней оценки студента 
double average ( const int setOfGrades[], int tests)
{
    int i; //счетчик оценок
    int total = 0; //сумма оценок 
 
    for ( i = 0; i < tests; i++ ) { //суммирование оценок студента 
        total += setOfGrades[i]; }
    return (double) total / tests;
}
 
 
void printArray ( const int grades[][GRADES], int pupils, int tests)
{
    int i; //счетчик студентов
    int j; //счетчик оценок
 
    cout.setf (ios::right);
    cout.width(24); cout << "[0]";
        cout << " [1]" << " [2]" << " [3]" << endl;
 
    //вывести оценки в формате таблицы
 
    for ( i =0; i < pupils; i++ ) {
        cout << "\nstudentGrades " << '[' << i << ']';
 
        //вывести оценки одного студента
        for ( j =0; j < tests; j++ ) {
            cout.width(7);
            cout << grades [i][j]; }
    }
}
Monika23
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 20
11.12.2013, 13:26  [ТС]     Массив указателей на функцию #4
Код программы к заданию:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include<stdio.h>
#include<iostream>
#define GRADES 5
#define STUDENTS 3
 
using namespace std;
 
int min ( const int grades[][GRADES], int pupils, int tests);
int max ( const int grades[][GRADES], int pupils, int tests);
double average ( const int setOfGrades[], int tests);
void printArray ( const int grades[][GRADES], int pupils, int tests);
int quit (int)
 
 
 
void main()
{
    void(*F[5])(int)={printArray, min, max, average, quit}; // объявление массива
    //указателей *F[5] на функции и инициализация его именами функций
 
int choice;
 
cout << "0  Elements of array is " << endl;
cout << "1  Minimum " << endl;
cout << "2  Maximum " << endl;
cout << "3  Averages grades " << endl;
cout << "4  Quit " << endl;
cin >> choice;
 
while( choice >= 0 && choice < 5)
{ 
    (*F[choice])(choice); // вызов функции при помощи разыменования
 // указателя на функцию. Указатель на функцию выбирается по индексу choice
 // вызванной функции в качестве аргумента передается переменная choice
 
    cout << "0  Elements of array is " << endl;
    cout << "1  Minimum " << endl;
    cout << "2  Maximum " << endl;
    cout << "3  Averages grades " << endl;
    cout << "4  Quit " << endl;
    cin >> choice;
}
 
cout << "Output value 5" << endl;
 
 
}
 
 
void printArray(int printArray)
{
    int n[3] = {45, 87, 93};
    int i;
 
    cout << "Element" << "\t  Value" << endl;
 
    //Вывод содержимого массива
    cout.setf (ios::right);
 
    for (i = 0; i < 3; i++) {
        cout.width (4);
        cout << i;
        cout.width (10);
        cout << n[i] << endl; }
        
}
 
 
 //определить-вывести наибольшую и наименьшею оценку
    cout << "\n\nminimum grade: ";
    cout << min ( studentGrades, STUDENTS, GRADES ) << endl; 
    cout << "maximum grade: ";
    cout << max ( studentGrades, STUDENTS, GRADES ) << endl;
 
 
 // вычисление минимальной оценки
int min (const int grades[][GRADES], int pupils, int tests)
{
    int i; //счетчик студентов
    int j; //счетчик экзаменов
    int lowGrade = 100; //инициализировать максимумом
 
    for ( i =0; i < pupils; i++ ) { //цикл по строкам оценок
        for ( j = 0; j < tests; j++ ) { //цикл по столбцам оценок
 
            if ( grades [i][j] < lowGrade) {
                lowGrade = grades [i][j]; }
        }
    }
    return lowGrade; 
}
 
// вычисление маесимальной оценки
void max(int max)
{
    int i; //счетчик студентов
    int j; //счетчик экзаменов
    int highGrade = 0; //инициализировать минимумом
 
    for ( i =0; i < pupils; i++ ) { //цикл по строкам оценок
        for ( j = 0; j < tests; j++ ) { //цикл по столбцам оценок
 
            if ( grades [i][j] > highGrade) {
                highGrade = grades [i][j]; }
        }
    }
    return highGrade; 
}
 
 
//вычислить-вывести среднюю оценку для каждого студента
 
    for ( student = 0; student < STUDENTS; student++ ) {
        cout << "The average grade for student ";
        cout << student << "is ";
        cout << average ( studentGrades [student], GRADES) << endl;
    }
 
 
//Определение средней оценки студента 
double average ( const int setOfGrades[], int tests)
{
    int i; //счетчик оценок
    int total = 0; //сумма оценок 
 
    for ( i = 0; i < tests; i++ ) { //суммирование оценок студента 
        total += setOfGrades[i]; }
    return (double) total / tests;
}
 
// выход из программы
void quit(int quit)
{ 
return 0;   
}
Выдает ошибку в строке

C++
1
void main()
syntax error : missing ';' before identifier 'main'. Скажите пожалуйста, как ее исправить, чтоб работало? И как дописать последнюю функцию quit, чтобы осуществлялся выход из программы?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.12.2013, 13:47     Массив указателей на функцию #5
Цитата Сообщение от Monika23 Посмотреть сообщение
syntax error : missing ';' before identifier 'main'.
Тебе говорят, что не хватает точки с запятой после прототипа ф-ии quit (12 строка).
Цитата Сообщение от Monika23 Посмотреть сообщение
C++
1
void main()
C++
1
int main()
Monika23
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 20
11.12.2013, 14:15  [ТС]     Массив указателей на функцию #6
Ага, точно) Но когда я поставила стало 40 ошибок.

(19) : error C2440: 'initializing' : cannot convert from '' to 'void (__cdecl *)(int)'
None of the functions with this name in scope match the target type
(19) : error C2440: 'initializing' : cannot convert from '' to 'void (__cdecl *)(int)'
None of the functions with this name in scope match the target type
(19) : error C2440: 'initializing' : cannot convert from '' to 'void (__cdecl *)(int)'
None of the functions with this name in scope match the target type
(19) : error C2440: 'initializing' : cannot convert from '' to 'void (__cdecl *)(int)'
None of the functions with this name in scope match the target type
(48) : warning C4508: 'main' : function should return a value; 'void' return type assumed
(71) : error C2143: syntax error : missing ';' before '<<'
(71) : error C2501: 'cout' : missing storage-class or type specifiers
(71) : error C2143: syntax error : missing ';' before '<<'
(72) : error C2143: syntax error : missing ';' before '<<'
(72) : error C2501: 'cout' : missing storage-class or type specifiers
(72) : error C2086: 'cout' : redefinition
(72) : error C2143: syntax error : missing ';' before '<<'
(73) : error C2143: syntax error : missing ';' before '<<'
(73) : error C2501: 'cout' : missing storage-class or type specifiers
(73) : error C2086: 'cout' : redefinition
(73) : error C2143: syntax error : missing ';' before '<<'
(74) : error C2143: syntax error : missing ';' before '<<'
(74) : error C2501: 'cout' : missing storage-class or type specifiers
(74) : error C2086: 'cout' : redefinition
(74) : error C2143: syntax error : missing ';' before '<<'
(78) : error C2143: syntax error : missing ';' before 'for'
(78) : error C2143: syntax error : missing ')' before ';'
(78) : error C2143: syntax error : missing ';' before '<'
(78) : error C2501: 'student' : missing storage-class or type specifiers
(78) : error C2143: syntax error : missing ';' before '<'
(78) : error C2143: syntax error : missing ';' before '++'
(78) : error C2501: 'student' : missing storage-class or type specifiers
(78) : error C2086: 'student' : redefinition
(78) : error C2143: syntax error : missing ';' before '++'
(78) : error C2059: syntax error : ')'
(78) : error C2143: syntax error : missing ';' before '{'
(78) : error C2447: missing function header (old-style formal list?)
(109) : error C2065: 'pupils' : undeclared identifier
(110) : error C2065: 'tests' : undeclared identifier
(112) : error C2065: 'grades' : undeclared identifier
(112) : error C2109: subscript requires array or pointer type
(112) : error C2109: subscript requires array or pointer type
(113) : error C2109: subscript requires array or pointer type
(113) : error C2109: subscript requires array or pointer type
(116) : error C2562: 'max' : 'void' function returning a value
(103) : see declaration of 'max'
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.12.2013, 14:21     Массив указателей на функцию #7
Monika23, у функций сигнатуры разные, один массив указателей на них всех создать не получиться. И как собирались их вызывать потом?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2013, 14:27     Массив указателей на функцию
Еще ссылки по теме:

Массив указателей на функцию в классе C++
Передать двумерный массив указателей в функцию C++
массив указателей на функцию C++

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

Или воспользуйтесь поиском по форуму:
Monika23
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 20
11.12.2013, 14:27  [ТС]     Массив указателей на функцию #8
А как же тогда? Так
C++
1
2
3
4
5
void(*F[0])(int) = {printArray};
    void(*F[1])(int) = {min};
    void(*F[2])(int) = {max};
    void(*F[3])(int) = {average};
    void(*F[4])(int) = {quit};
Так тоже ошибки
Yandex
Объявления
11.12.2013, 14:27     Массив указателей на функцию
Ответ Создать тему
Опции темы

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