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

Указатель на функцию - C++

Восстановить пароль Регистрация
 
Jim_Hunter
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 10
28.05.2016, 17:44     Указатель на функцию #1
Преподаватель сказал написать еще одну функцию, и добавить указатель на функцию.
Объясните пожалуйста по-проще что мне надо сделать, вот код:

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
136
137
138
139
140
141
142
#define _CRT_SECURE_NO_WARNINGS
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
 
#define SUBJECT 5
 
 
typedef struct
{
    char FIO[256];
    float Ball[SUBJECT]; // оценки по каждому из предметов
    float Reit; // Рейтинг
}student;
 
typedef struct
{
    int Students; // количество студентов
    char predm[5][255]; // названия предметов
    student *st; // указатель на массив студентов
    float sr_bal; // средний балл студента
}Group;
 
void Vvod(Group *mag)
{
    printf(" Колличество студентов: ");
    scanf_s("%d", &mag->Students);
    getchar();
 
    if (mag->Students > 0)
    {
        mag->st = (student*)malloc(sizeof(student)* mag->Students);
        if (!mag->st)
        {
            printf("Ошибка");
            mag->Students = 0;
            return;
        }
        printf(" Введите %d предметов: \n\n", SUBJECT);
        for (int i = 0; i < SUBJECT; i++)
        {
            printf("\t Предмет %d: ", i + 1);
            gets(mag->predm[i]);
        }
        printf("\n\n\t Информация о студентах:\n");
        for (int i = 0; i < mag->Students; i++)
        {
            printf(" Студент %d \n", i + 1);
            printf("\t ФИО: ");
            gets(mag->st[i].FIO);
            for (int j = 0; j < SUBJECT; j++)
            {
                printf("\t\t Балл по %s: ", mag->predm[j]);
                scanf_s("%f", &mag->st[i].Ball[j]);
                getchar();
            }
        }
        printf("\n Ввод завершен \n");
 
        return;
 
    }
    else
    {
        printf(" Ошибка: Неверное введено колличество студентов");
 
        mag->Students = 0;
    }
}
 
 
float Raschet(Group *mag)
{
    float sum = 0 ; // суммарный рейтинг студентов
    for (int i = 0; i < mag->Students; i++)
    {
        printf(" ФИО студента: ");
        puts(mag->st[i].FIO);
        mag->st[i].Reit = 0;
        for (int j = 0; j < SUBJECT; j++)
        {
            printf("\t%f\n", mag->st[i].Ball[j]);
            mag->st[i].Reit += mag->st[i].Ball[j];
        }
        mag->st[i].Reit /= (float)SUBJECT; // формула рейтинга: R = среднее баллов по предметам
        sum += mag->st[i].Reit;
 
        printf("\t Рейтинг: %f\n", mag->st[i].Reit);
    }
    return sum /= mag->Students;
}
 
 
int main()
{
 
    setlocale(0,"");
 
    Group magistratura={0} ;
 
    bool finish = false;
 
    while(!finish)
    {
    printf("\n Введите команду \n");
 
    printf("1 - ввести информацию о группе \n");
    printf("2 - расчет рейтинга \n");
    printf("3 - выход \n\n");
    printf("\t ->");
    
    int key = _getche();
    
    if(key =='3')
    {
        finish=true;
        break;
    }
 
        switch (key)
        {
 
        case '1': Vvod(&magistratura);
            break;
 
        case '2':
            printf("Рейтинг :%f\n", Raschet(&magistratura));
            break;
 
        default:
            printf("\n - Некорректный ввод \n");
        }
 
    }
 
    if (magistratura.Students)
        free(magistratura.st);
 
    _getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2016, 17:44     Указатель на функцию
Посмотрите здесь:

C++ Указатель на функцию
C++ Указатель на функцию
указатель на функцию C++
Указатель на функцию C++
Указатель на функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,951
28.05.2016, 21:30     Указатель на функцию #2
Причем тут раздел по плюсам, если код на чистом Си?
C++
1
2
void (*array[2])(Group *mag)={&Vvod,&Raschet};
(*array[key-'1'])(&magistratura);
Raschet при этом должен возвращать тоже что и Vvod. "Еще одну функцию" уже сочиняйте сами.
Jim_Hunter
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 10
29.05.2016, 23:15  [ТС]     Указатель на функцию #3
А как мне вызвать через него в саse 2 Raschet а в case 3 какую нибудь другую функцию?
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,951
29.05.2016, 23:18     Указатель на функцию #4
Цитата Сообщение от Jim_Hunter Посмотреть сообщение
А как мне вызвать через него в саse 2 Raschet а в case 3 какую нибудь другую функцию?
Это вместо switch/case.
Jim_Hunter
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 10
29.05.2016, 23:33  [ТС]     Указатель на функцию #5
Спасибо!!!))) не подскажешь, удаление памяти я правильно сделал?
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,951
29.05.2016, 23:37     Указатель на функцию #6
Не вникал, но проблем с удалением не вижу.
Yandex
Объявления
29.05.2016, 23:37     Указатель на функцию
Ответ Создать тему
Опции темы

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