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

Массивы указателей - C++

Восстановить пароль Регистрация
 
Студентсмертный
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 39
14.01.2013, 00:15     Массивы указателей #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
#include "stdafx.h"
#include "stdlib.h"
#include "locale.h"
#include "stdio.h"
void p1(float &);
void p2(float &);
void p3(float &);
void p4(float &);
void p5(float &);
void p6(float &);
int _tmain(int argc, _TCHAR* argv[])
{
void (*p[6])(float &) = {p1, p2, p3, p4, p5, p6};
 int c;
bool l;
 
 float temp;
 setlocale(LC_ALL,"rus");
 printf("---------\nМеню.\n1: Текст задачи\n");
    printf("2: Ввод данных (градусы цельсия)\n");
    printf("3: пересчет в градусы Кельвина\n");
    printf("4: пересчет в градусы Фаренгейта \n");
    printf("5: пересчет в градусы Реомюра\n");
    printf("6: Выход\n---------\n");
for ( ; ; )
 {    printf ("Введите пункт меню(строго от 1 до 6)\n");
    if (scanf("%d",&c)==0)
{
printf ("Не правильный тип данных\n");
exit(0);}
if (l==false)
    if (c==1 || c==2 || c==6)
        (*p[c-1])(temp);
    else 
        printf ("Ошибка!\n");
else 
{
    if (c>0 && c<7)
        (*p[c-1])(temp);
}
}
 
}
void p1(float &temp)
{
printf("Написать программу, пересчета температуры из шкалы Цельсия в другие шкалы.Программа должна управляться с помощью меню из шести пунктов:\nТекст задачи\nВвод данных (градусы цельсия)\nпересчет в градусы Кельвина\nпересчет в градусы Фаренгейта\nпересчет в градусы Реомюра\nВыход\nМеню должно быть реализовано с помощью массива указателей на функции, в которых производятся действия выбранного пункта меню.\n");
}
void p2(float &temp)
{
    printf("Введите градусы Цельсия\n");
    scanf("%f",&temp);  
    l=true;
 
}
void p3(float &temp)
{  
    float kelv;
    kelv=temp-273;
    printf("градусы Кельвина\n%f\n", kelv);
}
void p4(float &temp)
{
    float far;
    far=(9*temp)/5+32;
    printf("градусы Фаренгейта \n%f\n",far);
}
void p5(float &temp)
{
    float reom;
        
    reom=4*temp/2;
        printf("градусы Реомюра\n%.2f\n",reom);
}
void p6(float &temp)
{
    printf("Выполнен выход из программы\n");
    exit(0);
}
 
 
 
 
 
 
не могу разобраться что здесь происходит:
if (l==false)
    if (c==1 || c==2 || c==6)
        (*p[c-1])(temp);
    else 
        printf ("Ошибка!\n");
else 
{
    if (c>0 && c<7)
        (*p[c-1])(temp);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
14.01.2013, 00:34     Массивы указателей #2
Ну у вас есть массив указателей на функции. Вы разыменовываете указатель, берёте функцию и вызываете её с параметром tempю, исходя из if-ов
Студентсмертный
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 39
14.01.2013, 02:15  [ТС]     Массивы указателей #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
#include "stdafx.h"
#include "stdlib.h"
#include "locale.h"
#include "stdio.h"
void p1(float &);
void p2(float &);
void p3(float &);
void p4(float &);
void p5(float &);
void p6(float &);
int _tmain(int argc, _TCHAR* argv[])
{
void (*p[6])(float &) = {p1, p2, p3, p4, p5, p6}; //массив указателей
 int c;
bool l;//логический тип который принимает значения только true (единица, истина) или false (ноль, ложь)
 
 float a,d,h,n,m;
 setlocale(LC_ALL,"rus");//Русский язык в консоли
 printf("---------\nМеню.\n1: Текст задачи\n");
    printf("2: Ввод данных для квадрата)\n");
    printf("3: Ввод данных для треугольника\n");
    printf("4: ввод данных для прямоугольника\n");
    printf("5: расчет и вывод в\n");
    printf("6: Выход\n---------\n");
for ( ; ; )
 {    printf ("Введите пункт меню(строго от 1 до 6)\n");
    if (scanf("%d",&c)==0)
{
printf ("Не правильный тип данных\n");
exit(0);//данная функция вызывает немедленное нормальное завершение программы
    }
if (l==false)
    if (c==1 || c==6)
        (*p[c-1])(a);
    else 
        printf ("Ошибка!\n");
else 
{
    if (c>0 && c<7)
        (*p[c-1])(a);
}
 
}
 
}
void p1(float &a)
{
printf("Написать программу, вычисления площади фигуры Программа должна управляться с помощью меню из шести пунктов:\nТекст задачи\nВвод данных для квадрата\nВвод данных для треугольника\nВвод данных для прямоугольника\nрассчет и вывод\nВыход\nМеню должно быть реализовано с помощью массива указателей на функции, в которых производятся действия выбранного пункта меню.\n");
}
void p2(float &a)
{
    bool l;
    printf("Введите данные для квадрата\n");
    scanf("%f",&a); 
    l=true;
 
}
void p3(float &d,float &h)
{  
    bool l;
    printf("Введите данные для треугольника\n");
    scanf("%f%f",&d,&h);    
    l=true;
}
void p4(float &n,float &m)
{
    bool l;
    printf("Введите данные для прямоугольника\n");
    scanf("%f%f",&n,&m);    
    l=true;
}
void p5(float &a,float &d,float &h,float &n,float &m)
{
    float S1,S2,S3;
        
    S1=a*a;
    S2=(d*h)/2;
    S3=n*m;
 
        printf("площадь квадрата = %f\n площадь треугольника = %f\n площадь прямоугольника = %f\n",S1,S2,S3);
}
void p6(float &a)
{
    printf("Выполнен выход из программы\n");
    exit(0);
}
Исправьте пожалуйста программу и объясните исправления.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
14.01.2013, 07:41     Массивы указателей #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
#include "stdlib.h"
#include "locale.h"
#include "stdio.h"
void p1();
void p2();
void p3();
void p4();
void p5();
void p6();
 
bool GameOver = false;
float a(0),d(0),h(0),n(0),m(0);
 
int main()
{
    void (*p[6])(void) = {p1, p2, p3, p4, p5, p6}; //массив указателей на фцнкции
    unsigned c(0);
 
    setlocale(LC_ALL,"rus");//Русский язык в консоли
    while(!GameOver){
        system("cls");
        printf("-----------------  Меню  -----------------\n");
        printf("1: Текст задачи\n");
        printf("2: Ввод данных для квадрата\n");
        printf("3: Ввод данных для треугольника\n");
        printf("4: Ввод данных для прямоугольника\n");
        printf("5: Расчет и вывод на экран\n");
        printf("6: Выход\n");
        printf("------------------------------------------\n");
        printf("Введите пункт меню (строго от 1 до 6) : ");
 
        if(scanf("%d",&c)==0){
            printf ("Ошибка ввода\n");
        }else if (c<1 || c>6){
            printf ("Такого пункта нет в меню!\n");
        }else{
            system("cls");
            (*p[c-1])();
        }
        printf("\n");
        system("pause");
    }
    return 0;
}
 
void p1()
{
    printf("Написать программу, вычисления площади фигуры.\n");
    printf("Программа должна управляться с помощью меню из шести пунктов:\n");
    printf("Текст задачи\n");
    printf("Ввод данных для квадрата\n");
    printf("Ввод данных для треугольника\n");
    printf("Ввод данных для прямоугольника\n");
    printf("Рассчет и вывод\n");
    printf("Выход\n");
    printf("Меню должно быть реализовано с помощью массива указателей на функции,\n");
    printf("в которых производятся действия выбранного пункта меню.\n");
}
void p2()
{
    printf("Введите данные для квадрата\n");
    printf("Сторона   : "); scanf("%f",&a); 
}
void p3()
{
    printf("Введите данные для треугольника\n");
    printf("Основание : "); scanf("%f",&d);
    printf("Высота    : "); scanf("%f",&h);
}
void p4()
{
    printf("Введите данные для прямоугольника\n");
    printf("Сторона 1 : "); scanf("%f",&n); 
    printf("Сторона 2 : "); scanf("%f",&m);
}
void p5()
{
    float S1,S2,S3;
    S1=a*a;
    S2=(d*h)/2;
    S3=n*m;
    printf("\n  Площадь квадрата = %f\n  Площадь треугольника = %f\n  Площадь прямоугольника = %f\n",S1,S2,S3);
}
void p6()
{
    printf("Выполнен выход из программы\n");
    GameOver = true;
}
Добавлено через 2 минуты
не знаю правда как отреагирует ваша среда разработки, у меня всё работает MS VC++2010 (который бесплатный)
Yandex
Объявления
14.01.2013, 07:41     Массивы указателей
Ответ Создать тему
Опции темы

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