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

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

Войти
Регистрация
Восстановить пароль
 
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
#1

Перегружаемые функции - C++

05.03.2010, 09:47. Просмотров 735. Ответов 10
Метки нет (Все метки)

Помогите привести в рабочее состояние, а то хз че - не компилиться((( Надо создать 3 перегружаемые функции, которые выделяют память в куче и возвращают указатель на созданный массив. Принимать 2 первые должны ТОЛЬКО размер массива, третья еще и формулу. С третьей проблем нет, а вот отличить первые две для компилятора оказалось не под силу, как бы я не пытался. И еще не уверен на счет правильности обращения к элементам массива, потому-что числа вроде получались не такими, какими должны быть. Вобщем вот он - код:
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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 
float perimetr(int x1, int y1, int x2, int y2, int x3, int y3)
{
    float len1, len2, len3;
    len1=sqrt(pow(x2-x1,2.)+pow(y2-y1,2.));
    len2=sqrt(pow(x2-x3,2.)+pow(y2-y3,2.));
    len3=sqrt(pow(x1-x3,2.)+pow(x1-x3,2.));
    return len1+len2+len3;
}
 
float func(float x, int formul)
{
    if(formul==49) return pow(cos(x+0.7),3.);
    if(formul==50) return atan(x-2)*atan(x+0.5)-0.45;
    if(formul==51) return 0.7*(x-1)*log(x+0.001);
    return 0;
}
 
float *crAr(int const m)
{
    float *s=new float[m];
    int scale=100;
    for(int i=0;i<m;i++) *(s+i)=((random(500)*scale)+scale)/(double)scale;
    return s;
}
 
float *crAr(float m)
{
    m=(int)m;
    float *s=new float[m];
    for(int i=0;i<m;i++)
    {
        printf("Set mas[%d] element: ", i+1);
        scanf("%d",&(*(s+i)));
    }
    return s;
}
 
float *crAr(int const m, int formul)
{
    float *s=new float[m];
    for(int i=0;i<m;i++) *(s+i)=func(i,formul);
    return s;
}
 
void printArray(float *s, int m)
{
    for(int i=0; i<m; i++) printf("mas[%d]=%-5d ", *(s+i));
}
 
void main()
{
    int mv, pf, m, da, db, af; //mv - метод ввода; af - выбор функции; m - длинна массива; *s - указатель на массив; da, db - диапазон от a до b
    float *x,*y,xx[3],yy[3];
    float per, perMax;
    clrscr();
    randomize();
    printf("Dlinna massiva:");
    scanf("%d", &m);
    printf("Vyberite metod vvoda:\n\n");
    printf("1 - zapolnenie slu4ainymi 4islami\n2 - vvod s klaviatury\n3 - vy4islit` po formule\n");
    mv=getch();
    if(mv==49)
    {
        *x=crAr((int const)m);//вызываем случайное заполнение
        *y=crAr((int const)m);
    }
    if(mv==50)
    {
        *x=crAr((float)m);
        *y=crAr((float)m); //вызываем ввод с клавиатуры
    }
    if(mv==51)
    {
        do
        {
            printf("\nChoose a function:\n1) (cos(x+0.7))^3+1\n2) arctg(x-2)*arctg(x+0.5)-0.45\n3) 0.7(x-1)*ln(x+0.001)");
            af=getch(); 
            if(af!=49||af!=50||af!=51) printf("\nEROOR FUCTION! RETRY!\n");
        }
        while(af!=49||af!=50||af!=51);
        *x=crAr(m,af); //вызываем ф-цию от 0 до m и передаем ей 'af'
        *y=crAr(m,af);      
    }
    printArray(x,m);
    printArray(y,m);
    printf("\n");
    for(int i=0;i<m-2;i++)
    {
        for(int j=i+1;j<m-1;j++)
        {
            for(int k=j+1;k<m;k++)
            {
                per=perimetr(x[i],y[i],x[j],y[j],x[k],y[k]);
                if(per>perMax)
                {
                    perMax=per;
                    xx[0]=x[i];
                    xx[1]=x[j];
                    xx[2]=x[k];
                    yy[0]=y[i];
                    yy[1]=y[j];
                    yy[2]=y[k];
                }
            }
        }
    }
    printf("\nSamyi bol`shoi treugol`nik imeet perimet %10.2f\nEgo to4ki:\nx[1]=%d\ty[1]=%d\nx[2]=%d\ty[2]=%d\nx[3]=%d\ty[3]=%d\n",perMax,xx[0],yy[0],xx[1],yy[1],xx[2],yy[2]);
    delete x;
    delete y;
    getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2010, 09:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегружаемые функции (C++):

перегружаемые функции - C++
Есть задание для массивов типа int и double: 1. найти сумму положительных элементов массива 2. произведение элементов, находящихся между...

Перегружаемые функции - C++
помогите с программой, и если с можете поясните сами функции, а то совсем в них запуталась, сколько не читала теории. а понять не могу ...

Написать перегружаемые функции умножения разного количества параметров - C++
Помогите пожалуйста с задачей ничего не понимаю: Написать перегружаемые функции умножения разного количества параметров: 2,3,4. При...

Создать перегружаемые функции и шаблоны для типов int и double - C++
Создать перегружаемые функции и шаблоны для типов int и double. Передачу параметров в функцию осуществить различными способами: с помощью...

можно ли делать виртуальными перегружаемые операторы? - C++
например так: virtual a&amp; a::operator=(a&amp; b);

Как совместить код, реализующий методы и перегружаемые операции - C++
Есть такое задание::::) Разработать класс «Вектор» – Vektor размерности n . Определить несколько конструкторов, в том числе конструктор...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
05.03.2010, 10:39 #2
float *x - x указатель на float
crAr((int const)m); - возвращает указатель на float;
*x=crAr((int const)m); зачем в первый элемент массива х засовывать указатель....
пиши просто x=crAr((int const)m);

То что не верно определяется сигнатура, возможно преобразование переменных при вызове функции не верно работает, создай еще одну переменную типа float и ее помещай как аргумент функции.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
05.03.2010, 16:30  [ТС] #3
Цитата Сообщение от vitaly1981 Посмотреть сообщение
float *x - x указатель на float
crAr((int const)m); - возвращает указатель на float;
*x=crAr((int const)m); зачем в первый элемент массива х засовывать указатель....
пиши просто x=crAr((int const)m);

То что не верно определяется сигнатура, возможно преобразование переменных при вызове функции не верно работает, создай еще одну переменную типа float и ее помещай как аргумент функции.
убрал звездочки, но вот что выдает (заполняю случайно)
Dlinna massiva:5
Vyberite metod vvoda:

1 - zapolnenie slu4ainymi 4islami
2 - vvod s klaviatury
3 - vy4islit` po formule
mas[0]=8192 mas[0]=8192 mas[0]=8192 mas[0]=0 mas[0]=0 mas[0]=0 ma
s[0]=0 mas[0]=0 mas[0]=0 mas[0]=0

Samyi bol`shoi treugol`nik imeet perimet 808.72
Ego to4ki:
x[1]=0 y[1]=8192
x[2]=-5243 y[2]=-16273
x[3]=0 y[3]=0
Добавлено через 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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 
float perimetr(float x1, float y1, float x2, float y2, float x3, float y3)
{
    float len1, len2, len3;
    len1=sqrt(pow(x2-x1,2.)+pow(y2-y1,2.));
    len2=sqrt(pow(x2-x3,2.)+pow(y2-y3,2.));
    len3=sqrt(pow(x1-x3,2.)+pow(x1-x3,2.));
    return len1+len2+len3;
}
 
float func(float x, int formul)
{
    if(formul==49) return pow(cos(x+0.7),3.);
    if(formul==50) return atan(x-2)*atan(x+0.5)-0.45;
    if(formul==51) return 0.7*(x-1)*log(x+0.001);
    return 0;
}
 
float *crAr(int const m)
{
    float *s=new float[m];
    int scale=100;
    for(int i=0;i<m;i++) *(s+i)=((random(500)*scale)+scale)/(double)scale;
    return s;
}
 
float *crAr(unsigned m)
{
    float *s=new float[m];
    for(int i=0;i<m;i++)
    {
        printf("Set mas[%d] element: ", i+1);
        scanf("%10.2f",&(*(s+i)));
    }
    return s;
}
 
float *crAr(int const m, int formul)
{
    float *s=new float[m];
    for(int i=0;i<m;i++) *(s+i)=func(i,formul);
    return s;
}
 
void printArray(float *s, int m)
{
    for(int i=0; i<m; i++) printf("mas[%d]=%-10.2f ", *(s+i));
}
 
void main()
{
    int mv, pf, m, da, db, af; //mv - метод ввода; af - выбор функции; m - длинна массива; *s - указатель на массив; da, db - диапазон от a до b
    float *x,*y,xx[3],yy[3];
    float per, perMax;
    clrscr();
    randomize();
    printf("Dlinna massiva:");
    scanf("%d", &m);
    printf("Vyberite metod vvoda:\n\n");
    printf("1 - zapolnenie slu4ainymi 4islami\n2 - vvod s klaviatury\n3 - vy4islit` po formule\n");
    mv=getch();
    if(mv==49)
    {
        x=crAr((int const)m);//вызываем случайное заполнение
        y=crAr((int const)m);
    }
    if(mv==50)
    {
        x=crAr((unsigned)m);
        y=crAr((unsigned)m); //вызываем ввод с клавиатуры
    }
    if(mv==51)
    {
        do
        {
            printf("\nChoose a function:\n1) (cos(x+0.7))^3+1\n2) arctg(x-2)*arctg(x+0.5)-0.45\n3) 0.7(x-1)*ln(x+0.001)");
            af=getch(); 
            if(af!=49||af!=50||af!=51) printf("\nEROOR FUCTION! RETRY!\n");
        }
        while(af!=49||af!=50||af!=51);
        x=crAr(m,af); //вызываем ф-цию от 0 до m и передаем ей 'af'
        y=crAr(m,af);       
    }
    printArray(x,m);
    printArray(y,m);
    printf("\n");
    for(int i=0;i<m-2;i++)
    {
        for(int j=i+1;j<m-1;j++)
        {
            for(int k=j+1;k<m;k++)
            {
                per=perimetr(x[i],y[i],x[j],y[j],x[k],y[k]);
                if(per>perMax)
                {
                    perMax=per;
                    xx[0]=x[i];
                    xx[1]=x[j];
                    xx[2]=x[k];
                    yy[0]=y[i];
                    yy[1]=y[j];
                    yy[2]=y[k];
                }
            }
        }
    }
    printf("\nSamyi bol`shoi treugol`nik imeet perimet %10.2f\nEgo to4ki:\nx[1]=%10.2f\ty[1]=%10.2f\nx[2]=%10.2f\ty[2]=%10.2f\nx[3]=%10.2f\ty[3]=%10.2f\n",perMax,xx[0],yy[0],xx[1],yy[1],xx[2],yy[2]);
    delete x;
    delete y;
    getch();
}
kuroiryuu
316 / 300 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
05.03.2010, 16:41 #4
а переменную perMax чем инициализируете?
советую пройтись по варнингам, и довести их число до 0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
05.03.2010, 16:53  [ТС] #5
вот правильней
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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 
 
float perimetr(float x1, float y1, float x2, float y2, float x3, float y3)
{
    float len1, len2, len3;
    len1=sqrt(pow(x2-x1,2.)+pow(y2-y1,2.));
    len2=sqrt(pow(x2-x3,2.)+pow(y2-y3,2.));
    len3=sqrt(pow(x1-x3,2.)+pow(x1-x3,2.));
    return len1+len2+len3;
}
 
float func(float x, int formul)
{
    if(formul==49) return pow(cos(x+0.7),3.);
    if(formul==50) return atan(x-2)*atan(x+0.5)-0.45;
    if(formul==51) return 0.7*(x-1)*log(x+0.001);
    return 0;
}
 
float *crAr(int const m)
{
    float *s=new float[m];
    int scale=100;
    for(int i=0;i<m;i++) *(s+i)=((random(500)*scale)+scale)/(double)scale;
    return s;
}
 
float *crAr(unsigned m)
{
    float *s=new float[m];
    for(int i=0;i<m;i++)
    {
        printf("Set mas[%d] element: ", i+1);
        scanf("%10.2f",&*(s+i));
    }
    return s;
}
 
float *crAr(int const m, int formul)
{
    float *s=new float[m];
    for(int i=0;i<m;i++) *(s+i)=func(i,formul);
    return s;
}
 
void printArray(float *s, int m)
{
    for(int i=0; i<m; i++) printf("mas[%d]=%-10.2f\t",i+1, *(s+i));
}
 
void main()
{
    int mv, pf, m, da, db, af; //mv - метод ввода; af - выбор функции; m - длинна массива; *s - указатель на массив; da, db - диапазон от a до b
    float *x,*y,xx[3],yy[3];
    float per, perMax;
    clrscr();
    randomize();
    printf("Dlinna massiva:");
    scanf("%d", &m);
    printf("Vyberite metod vvoda:\n\n");
    printf("1 - zapolnenie slu4ainymi 4islami\n2 - vvod s klaviatury\n3 - vy4islit` po formule\n");
    mv=getch();
    if(mv==49)
    {
        x=crAr((int const)m);//вызываем случайное заполнение
        y=crAr((int const)m);
    }
    if(mv==50)
    {
        x=crAr((unsigned)m);
        y=crAr((unsigned)m); //вызываем ввод с клавиатуры
    }
    if(mv==51)
    {
        do
        {
            printf("\nChoose a function:\n1) (cos(x+0.7))^3+1\n2) arctg(x-2)*arctg(x+0.5)-0.45\n3) 0.7(x-1)*ln(x+0.001)");
            af=getch(); 
            if(af!=49||af!=50||af!=51) printf("\nEROOR FUCTION! RETRY!\n");
        }
        while((af!=49)||(af!=50)||(af!=51));
        x=crAr(m,af); //вызываем ф-цию от 0 до m и передаем ей 'af'
        y=crAr(m,af);       
    }
    printArray(x,m);
    printArray(y,m);
    printf("\n");
    for(int i=0;i<m-2;i++)
    {
        for(int j=i+1;j<m-1;j++)
        {
            for(int k=j+1;k<m;k++)
            {
                per=perimetr(x[i],y[i],x[j],y[j],x[k],y[k]);
                if(per>perMax)
                {
                    perMax=per;
                    xx[0]=x[i];
                    xx[1]=x[j];
                    xx[2]=x[k];
                    yy[0]=y[i];
                    yy[1]=y[j];
                    yy[2]=y[k];
                }
            }
        }
    }
    printf("\nSamyi bol`shoi treugol`nik imeet perimet %8.2f\nEgo to4ki:\nx[1]=%8.2f\ty[1]=%8.2f\nx[2]=%8.2f\ty[2]=%8.2f\nx[3]=%8.2f\ty[3]=%8.2f\n",perMax,xx[0],yy[0],xx[1],yy[1],xx[2],yy[2]);
    delete x;
    delete y;
    getch();
}
Добавлено через 1 минуту
Цитата Сообщение от kuroiryuu Посмотреть сообщение
а переменную perMax чем инициализируете?
советую пройтись по варнингам, и довести их число до 0
да с этим вроде уже впорядке все (а с perMax у меня проблем и не было)
нужно подравнять ввод с клавиатуры и по формуле, а то он крутит цикл do while (при выборе формулы), хотя он должен из него выходить...
kuroiryuu
316 / 300 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
05.03.2010, 17:13 #6
этот блок работает нормально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(mv == 49)
{
    x = crAr((int const)m);//вызываем случайное заполнение
    y = crAr((int const)m);
}
if(mv == 50)
{
    x = crAr((float)m);
    y = crAr((float)m); //вызываем ввод с клавиатуры
}
if(mv == 51)
{
    do
    {
        printf("\nChoose a function:\n1) (cos(x+0.7))^3+1\n2) arctg(x-2)*arctg(x+0.5)-0.45\n3) 0.7(x-1)*ln(x+0.001)\n");
        af = _getch(); 
        if(af!=49 && af!=50 && af!=51) //здесь должно быть &&, а не ||
            printf("\nEROOR FUCTION! RETRY!\n");
    }
    while(af!=49 && af!=50 && af!=51); //тоже самое что и с if
    x = crAr(m, af); //вызываем ф-цию от 0 до m и передаем ей 'af'
    y = crAr(m, af);          
}
что касается других функций....

вот правильная функция printArray
C++
1
2
3
4
5
void printArray(float *s, int m)
{
    for(int i=0; i<m; i++) 
        printf("mas[%d]=%5f ",i, *(s+i));
}
далее:
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
float perimetr(int x1, int y1, int x2, int y2, int x3, int y3)
{
        float len1, len2, len3;
        len1 = (float)sqrt(pow((double)(x2-x1),2)+pow((double)(y2-y1),2));
        len2 = (float)sqrt(pow((double)(x2-x3),2)+pow((double)(y2-y3),2));
        len3 = (float)sqrt(pow((double)(x1-x3),2)+pow((double)(x1-x3),2));
        return len1 + len2 + len3;
}
 
float func(float x, int formul)
{
        if(formul==49) return (float)pow(cos(x+0.7),3.);
        if(formul==50) return (float)(atan(x-2)*atan(x+0.5)-0.45);
        if(formul==51) return (float)(0.7*(x-1)*log(x+0.001));
        return 0;
}
 
float* crAr(int const m)
{
    srand(500);// у меня нет borland c++
    float *s=new float[m];
    int scale=100;
    for(int i=0;i<m;i++) 
        *(s+i)= (float)(((rand() * scale) + scale)/(double)scale);
    return s;
}
 
float* crAr(float m)
{
    float *s = new float[(int)m];
    for(int i = 0; i < (int)m; i++)
    {
        printf("Set mas[%d] element: ", i+1);
        scanf_s("%f",&s[i]);
    }
    return s;
}
 
float* crAr(int const m, int formul)
{
    float *s = new float[m];
    for(int i=0;i<m;i++) 
        *(s+i) = func((float)i, formul);
    return s;
}
а вот этот мистический кусок вообще не представляю что делает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for(int i=0;i<m-2;i++)
{
    for(int j=i+1;j<m-1;j++)
    {
        for(int k=j+1;k<m;k++)
        {
            per = perimetr((int)x[i],(int)y[i],(int)x[j],(int)y[j],(int)x[k],(int)y[k]);
            if(per > perMax)
            {
                perMax = per;
                xx[0]=x[i];
                xx[1]=x[j];
                xx[2]=x[k];
                yy[0]=y[i];
                yy[1]=y[j];
                yy[2]=y[k];
            }
        }
    }
}
Добавлено через 4 минуты
Цитата Сообщение от Iworb Посмотреть сообщение
да с этим вроде уже впорядке все (а с perMax у меня проблем и не было)
а чему тогда он равен, когда проверка начинается?

кстати delete x; не правильно, правильно delete[] x;
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
05.03.2010, 17:16  [ТС] #7
этот блок работает нормально
не сказал бы - do while крутит все время, даже когда значения равны 49 или 50 или 51
а вот этот мистический кусок вообще не представляю что делает:
берет три точки и считает периметр треугольника, построенных на них, если он больше максимального - запоминает точки и периметр

Добавлено через 43 секунды
а чему тогда он равен, когда проверка начинается?
спс, тепь нулю))
kuroiryuu
316 / 300 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
05.03.2010, 17:20 #8
Цитата Сообщение от Iworb Посмотреть сообщение
не сказал бы - do while крутит все время, даже когда значения равны 49 или 50 или 51
вы внимательно смотрели код?
советую внимательно на него посмотреть, и сравнить со своим
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
05.03.2010, 17:32  [ТС] #9
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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 
 
float perimetr(float x1, float y1, float x2, float y2, float x3, float y3)
{
    float len1, len2, len3;
    len1=(float)sqrt(pow((double)(x2-x1),2)+pow((double)(y2-y1),2));
    len2=(float)sqrt(pow((double)(x2-x3),2)+pow((double)(y2-y3),2));
    len3=(float)sqrt(pow((double)(x1-x3),2)+pow((double)(x1-x3),2));
    return len1+len2+len3;
}
 
float func(float x, int formul)
{
    if(formul==49) return (float)pow(cos(x+0.7),3.);
    if(formul==50) return (float)atan(x-2)*atan(x+0.5)-0.45;
    if(formul==51) return (float)0.7*(x-1)*log(x+0.001);
    return 0;
}
 
float *crAr(int const m)
{
    float *s=new float[m];
    int scale=100;
    for(int i=0;i<m;i++) *(s+i)=((random(500)*scale)+scale)/(double)scale;
    return s;
}
 
float *crAr(unsigned m)
{
    float *s=new float[m];
    for(int i=0;i<m;i++)
    {
        printf("Set mas[%d] element: ", i+1);
        scanf("%10.2f",&s[i]);
    }
    return s;
}
 
float *crAr(int const m, int formul)
{
    float *s=new float[m];
    for(int i=0;i<m;i++) *(s+i)=func((float)i,formul);
    return s;
}
 
void printArray(float *s, int m)
{
    for(int i=0; i<m; i++) printf("mas[%d]=%-10.2f\t",i+1, *(s+i));
}
 
void main()
{
    int mv, pf, m, da, db, af; //mv - метод ввода; af - выбор функции; m - длинна массива; *s - указатель на массив; da, db - диапазон от a до b
    float *x,*y,xx[3],yy[3];
    float per, perMax=0;
    clrscr();
    randomize();
    printf("Dlinna massiva:");
    scanf("%d", &m);
    printf("Vyberite metod vvoda:\n\n");
    printf("1 - zapolnenie slu4ainymi 4islami\n2 - vvod s klaviatury\n3 - vy4islit` po formule\n");
    mv=getch();
    if(mv==49)
    {
        x=crAr((int const)m);//вызываем случайное заполнение
        y=crAr((int const)m);
    }
    if(mv==50)
    {
        x=crAr((unsigned)m);
        y=crAr((unsigned)m); //вызываем ввод с клавиатуры
    }
    if(mv==51)
    {
        do
        {
            printf("\nChoose a function:\n1) (cos(x+0.7))^3+1\n2) arctg(x-2)*arctg(x+0.5)-0.45\n3) 0.7(x-1)*ln(x+0.001)");
            af=getch();
            if((af!=49)||(af!=50)||(af!=51)) printf("\nERROR FUNCTION!!! RETRY!!!\n\n");
        }
        while((af!=49)||(af!=50)||(af!=51));
        x=crAr(m,af); //вызываем ф-цию от 0 до m и передаем ей 'af'
        y=crAr(m,af);       
    }
    printArray(x,m);
    printArray(y,m);
    printf("\n");
    for(int i=0;i<m-2;i++)
    {
        for(int j=i+1;j<m-1;j++)
        {
            for(int k=j+1;k<m;k++)
            {
                per=perimetr(x[i],y[i],x[j],y[j],x[k],y[k]);
                if(per>perMax)
                {
                    perMax=per;
                    xx[0]=x[i];
                    xx[1]=x[j];
                    xx[2]=x[k];
                    yy[0]=y[i];
                    yy[1]=y[j];
                    yy[2]=y[k];
                }
            }
        }
    }
    printf("\nSamyi bol`shoi treugol`nik imeet perimet %8.2f\nEgo to4ki:\nx[1]=%8.2f\ty[1]=%8.2f\nx[2]=%8.2f\ty[2]=%8.2f\nx[3]=%8.2f\ty[3]=%8.2f\n",perMax,xx[0],yy[0],xx[1],yy[1],xx[2],yy[2]);
    delete[] x;
    delete[] y;
    getch();
}
Осталось 2 проблемы: ввод с клавиатуры и этот грёбаный цикл do while
P.S. при вводе с клавиатуры дает такое чудо
Dlinna massiva:3
Vyberite metod vvoda:

1 - zapolnenie slu4ainymi 4islami
2 - vvod s klaviatury
3 - vy4islit` po formule
Set mas[1] element: Set mas[2] element: Set mas[3] element: Set mas[1] element:
Set mas[2] element: Set mas[3] element: mas[1]=0.00 mas[2]=-183.92
mas[3]=0.00 mas[1]=0.00 mas[2]=-1551765199052387
73000000000.00 mas[3]=0.00

Samyi bol`shoi treugol`nik imeet perimet 310353039810477545000000000.00
Ego to4ki:
x[1]= 0.00 y[1]= 0.00
x[2]= -183.92 y[2]=-155176519905238773000000000.00
x[3]= 0.00 y[3]= 0.00
Причем, после того как я выбрал ввод (нажал 2) программа выдает это и завершается (я фактически ничего не ввожу)

Добавлено через 1 минуту
с do while отбой, спасибо))

Добавлено через 8 минут
все, разобрался что было

Добавлено через 48 секунд
сравнив с вашим кодом))
Так, спасибки вроде проставил, еще раз огромное спасибо, вроде все исправно работает))
kuroiryuu
316 / 300 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
05.03.2010, 17:34 #10
у вас там не нормально работает при выборе "заполнять массивы через формулы"
там загвостка в том, что если программа ни разу не зайдет в тот мега-if, то массивы yy и xx будут содержать мусор
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
05.03.2010, 18:00  [ТС] #11
Цитата Сообщение от kuroiryuu Посмотреть сообщение
у вас там не нормально работает при выборе "заполнять массивы через формулы"
там загвостка в том, что если программа ни разу не зайдет в тот мега-if, то массивы yy и xx будут содержать мусор
Она по-любому туда зайдет. perMax я поставил 0, а любой периметр больше нуля, поэтому он в xx и уу запишет нужные значения
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2010, 18:00
Привет! Вот еще темы с ответами:

Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции - C++
Написал код, в котором 2 функции одна возвращает стринговое значение, вторая должна бы вернуть значение, отталкиваясь от первой. Возможно...

Перегружаемые и виртуальные методы (ошибка) - Delphi
Ребята, выручайте! Программа должна выводить рандомные числа. Возникает ошибка при запуске. unit Unit1; interface uses ...

excel. создать таблицу значение кусочно-непрерывной функции y на интервале [xmin; xmax] с шагом h, для расчета функции y используя логические функции - Delphi

Для функции y=f(x) получить таблицу значений и график этой функции на отрезке - Pascal ABC
Для функции y=f(x) получить таблицу значений и график этой функции на отрезке. Количество точек на промежутке задается пользователем....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.03.2010, 18:00
Ответ Создать тему
Опции темы

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