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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
#1

Перегруз функции - C++

11.08.2009, 20:06. Просмотров 2061. Ответов 29

Вообще задание такое разработать функцию, вычисляющую максимальный элемент:
- в одномерном числовом массиве, состоящем из целых чисел;
- в одномерном числовом массиве, состоящим из вещественных чисел;
- в массиве строк (для этого массива функция должна находить строку с максимальной длиной). С помощью перегруза функции.
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
//---------------------------------------------------------------------------
 
#pragma hdrstop
#include <iostream.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
 
#pragma argsused
//---------------------------------------------------------------------------
int u1(int*op,int a,int max){
 ;
 for(int i=0;i<a;i++){
 if(op[i]>op[max])
   max=i;
 }
 return op[max];
 }
//---------------------------------------------------------------------------
float u2(float*op,int a,int max){
 for(int i=0;i<a;i++){
 if(op[i]>op[max])
    max=i;
 }
 return op[max];
 }
//---------------------------------------------------------------------------
char s3(char op[10], char a, char max){
 for(char i=0;i<a;i++){
 if(sizeof(op[i])>sizeof(op[max]))
    max=i;
 }
return op[max];
}
int main()
{int o,j;
 int*nt=new int[o];
 float*ft=new float[j];
 char l[10];
 cout<<"Vvedite razmer massiva"<<endl;
 cin>>o;
 cout<<"Vvedite razmer massiva"<<endl;
 cin>>j;
 cout<<"Vvedite zeloe chisla"<<endl;//для ввода в массив
  for(int i=0;i<o;i++){
   cin>>nt[i];
  }
 cout<<"Vvedite vehestvennor chisla"<<endl;//для ввода в массив
  for(int i=0;i<j;i++){
   cin>>ft[i];
  }
 cout<<"Vvedite stroku chisel"<<endl;//для ввода в массив строк
 for(int i=0;i<10;i++){
  cin>>(l);
  }
cout<<"Maxmal'nii element massiva zelih chisel= "<<u1(nt,o,0)<<endl;
 cout<<"Maxmal'nii element massiva vehestvennih chisel= "<<u2(ft,j,0)<<endl;
 cout<<"Maxmal'nii element massiva vehestvennih chisel= "<<s3(l,10,' ')<<endl;
        cin.get();
        cin.get();
        return 0;
вот сам текст программы, здесь у меня не работает только подсчет самой длинной строки, хотя если что-то не правильно кроме строк подскажите!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2009, 20:06     Перегруз функции
Посмотрите здесь:

C++ Найти среднее арифметическое значений функции f(x) в точках a, b, (a+b)/2 используя обращение к функции
C++ Табулирование заданной функции и определение максимального и минимального значения функции в таблице
Вычислить m значений функции f(x) на отрезке [a, b]. Вычисление величины f(x) оформить в виде функции C++
Вычислить функции с использованием их разложения в степенной ряд. Функции и Перегрузка функций C++
Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции C++
C++ Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу
Найти среднее арифметическое значений функции f(x) в точках а, b, (a+b)/2, используя обращение к функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
11.08.2009, 23:25     Перегруз функции #21
ну ну)) с шаблонами тут не получится!))

Не по теме:

точнее получится, но тогда нужно создавать чвой класс строки с перегруженном оператором сравнения



Добавлено через 1 минуту 32 секунды
а вот так делать - нехорошо
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
12.08.2009, 00:08     Перегруз функции #22
виноват: во всех трех ф-ях:

return iMax;
а не:
return i;
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
12.08.2009, 21:25  [ТС]     Перегруз функции #23
novi4ok,
Цитата Сообщение от novi4ok Посмотреть сообщение
int sz = ::strlen (*(pArg+i));
подскажи как эту строку сделать по проще или вообще убрать заменив на более простую и еще как теперь обращаться к этим функциям правильно.
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.08.2009, 00:17     Перегруз функции #24
Цитата Сообщение от crashc Посмотреть сообщение
novi4ok,

подскажи как эту строку сделать по проще или вообще убрать заменив на более простую и еще как теперь обращаться к этим функциям правильно.
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
#define MIN_DOUBLE -10e88
#define MIN_INT -0x7ffffffe
 
/////////////////
int getMax (const int *pArg, int size){
  int max = MIN_INT;
  int iMax = -1;
  for (int i = 0; i < size; i++){
    if (*(pArg+i) > max){
      max =  *(pArg+i);
      iMax = i;
    }
  }
  return iMax;
}
 
/////////////////
int getMax (const double *pArg, int size){
  double max = MIN_DOUBLE;
  int iMax = -1;
  for (int i = 0; i < size; i++){
    if (*(pArg+i) > max){
      max =  *(pArg+i);
      iMax = i;
    }
  }
  return iMax;
}
 
/////////////////
int getMax (const char **pArg, int size){
  int maxSize = 0;
  int iMax = -1;
  for (int i = 0; i < size; i++){
    int sz = ::strlen (*(pArg+i));
    if (sz > maxSize){
      maxSize = sz;
      iMax = i;
    }
  }
  return iMax;
}
 
 
//////////////////////////
//
void testFunc() {
    int intArray [10] = { 0,1,20,-200,3,5,6,7,2,-2};
    double dArray [10] = { 0,1,20,-200,3,5,6,7,2,-2};// for simplicity
    char *chArray [3] = { "asdfg", ";lksjd;flkajsd;flkja", "aaa" };
    int maxInt = 0;
    double maxDouble = 0;
    char *pMaxString = NULL;
 
    int indexOfMax = getMax (intArray, 10);
    if (indexOfMax != -1){
        maxInt = *(intArray+indexOfMax);// intArray[indexOfMax] если удобнее
    }
    indexOfMax = getMax (dArray, 10);
    if (indexOfMax != -1){
        maxDouble = *(dArray+indexOfMax);// dArray[indexOfMax] если удобнее
    }
    indexOfMax = getMax ((const char**)chArray, 3);
    if (indexOfMax != -1){
        pMaxString = *(chArray+indexOfMax);// chArray[indexOfMax] если удобнее
    }
}
MIN_DOUBLE и MIN_INT я взял с потолка. уточните сами какие значения правильные.

вместо
C++
1
int sz = ::strlen (*(pArg+i));
можете записать так:
C++
1
2
char *pChar = pArg+i;
int sz = ::strlen (pChar);
вам в функцию фактически передали указатель на первый указатель массива, каждый из которых указывает на строку. или другими словами "указатель на указатель на char". pArg указывает на первый указатель на строку, *pArg - на первую строку (ее первый символ), (pArg+i) - на i-тый указатель из этого массива указателей, *(pArg+i) - это указатель на первый символ i-той строки.
запутал окончательно? это хорошо
Alexen
5 / 5 / 0
Регистрация: 14.11.2008
Сообщений: 77
13.08.2009, 15:44     Перегруз функции #25
MIN_DOUBLE и MIN_INT
Они тебе вообще не нужны просто присвой первые значения массивов и потом с ними сравнивай.
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.08.2009, 16:52     Перегруз функции #26
Цитата Сообщение от Alexen Посмотреть сообщение
MIN_DOUBLE и MIN_INT
Они тебе вообще не нужны просто присвой первые значения массивов и потом с ними сравнивай.
логично
-=ЮрА=-
Заблокирован
Автор FAQ
13.08.2009, 17:46     Перегруз функции #27
crashc, перегрузка функций подразумевает использование функций с одинаковым именем, при этом аргументы функции различны, тогда это действительно перегрузка

Вот что у меня получилось по этой проблеме (кстати использовал свои же материалы http://www.cyberforum.ru/cpp-beginne...ost237890.html)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include <windows.h>
#include <shlobj.h>//Подключаем SHL Dialog - диалог выбора файла или каталога
#include <stdio.h>
 
//SHL Dialog, использую для считывания строк из файла, 
//удобней ввести строки в txt-шнике чем каждій раз их вбивать в консоли
//под строкой понимаю текст между символами '\n' [строка] '\n'
 
//функцию, вычисляющую максимальный элемент :
 
//- в одномерном числовом массиве, состоящем из целых чисел;
int findmax(int nCount, int * mass);
//- в одномерном числовом массиве, состоящим из вещественных чисел;
float findmax(int nCount, float * mass);
//- в массиве строк (для этого массива функция должна находить строку с максимальной длиной).
int findmax(int nCount, char ** mass);
 
LPTSTR SelectFile();//Выбор файла с текстом
 
//Подсчёт числа строк в текстовом блоке
//под строкой понимаю текст между символами '\n' [строка] '\n'
//iPos - содержит индексы символов '\n' в блоке str
int GetNumStrings(LPTSTR str);
 
 
int * imass = (int *)malloc(sizeof(int));
float * fmass = (float *)malloc(sizeof(float));
 
char * str = (char *)malloc(sizeof(char));
int * iPos = (int *)malloc(sizeof(int));
 
void main()
{
    FILE *f;char ** smass;
    printf("Enter num elements of int vector\r\n");
    int iCount,i;scanf("%d",&iCount);
    if(0 < iCount)
    {
        imass = (int *)realloc((void *)imass,iCount*sizeof(int));
        for(i = 0; i < iCount; i++)
        {
            printf("mass[%d] : ",i + 1);
            scanf("%d",&imass[i]);
        }
    }
    printf("Enter num elements of float vector\r\n");
    int fCount;scanf("%d",&fCount);
    if(0 < fCount)
    {
        fmass = (float *)realloc((void *)fmass,fCount*sizeof(float));
        for(i = 0; i < fCount; i++)
        {
            printf("mass[%d] : ",i + 1);
            scanf("%f",&fmass[i]);
        }
    }
    int nStrings, sLen;
    char sPath[MAX_PATH];sPath[0] = '\0';
    if(sprintf(sPath,SelectFile()))
    {
        if((f = fopen(sPath,"rb+")))
        {
            fseek(f,0,SEEK_END);
            sLen = ftell(f);
            fseek(f,0,SEEK_SET);
            str = (char *)realloc(str,sLen);
            fread(str,1,sLen,f);
            str[sLen - 1] = '\0';
            fclose(f);
            nStrings = GetNumStrings(str);
            smass = new char * [nStrings];
            for(int i = nStrings - 1; 0 <= i; i--)
            {
                sLen = strlen((LPCTSTR)(str + (iPos[i] + 1)));
                //Копируем строки из блока str в массив smass
                smass[nStrings - (i + 1)] = (char *)malloc(sLen*sizeof(int));
                strcpy(smass[nStrings - (i + 1)], str + (iPos[i] + 1));
                str[iPos[i]] = '\0';
            }
            iPos = (int *)realloc((void *)iPos,sizeof(int));
            if(str)
                str = (char *)realloc(str,sizeof(char));
        }
    }
    int iMAX = -1;
    if(0 < iCount)
        iMAX = findmax(iCount, imass);
    else
        iCount = -1;
    
    float fMAX = -1;
    if(0 < fCount)
        fMAX = findmax(fCount, fmass);
    else
        fCount = -1;
    
    int sMAX_INDEX = -1;
    if(0 < nStrings)
        sMAX_INDEX = findmax(nStrings, smass); 
 
    printf("\r\nMaximal element in int vecor : ");
    if(-1 < iCount)
        printf("%d",iMAX);
    else
        printf("Cann't be computed!");
 
    printf("\r\nMaximal element in float vecor : ");
    if(-1 < fCount)
        printf("%f",fMAX);
    else
        printf("Cann't be computed!");
 
    printf("\r\nMaximal element in string vecor : ");
    if(-1 < sMAX_INDEX)
        printf("%s",smass[sMAX_INDEX]);
    else
        printf("Cann't be computed!");
 
    //Чистим память
    imass = (int *)realloc((void *)imass,sizeof(int));
    fmass = (float *)realloc((void *)fmass,sizeof(float));
    for(i = nStrings - 1; 0 <= i; i--)
        free(smass[i]);
    printf("\r\nEnter NUM1 to enter new massivs\r\n");
    scanf("%d",&i);
    if(i == 1)
        main();
}
 
int findmax(int nCount, int * mass)
{
    int RetVal = mass[0];
    for(int i = 1; i < nCount; i++)
    {
        if(RetVal < mass[i])
            RetVal = mass[i];
    }
    return RetVal;
}
 
float findmax(int nCount, float * mass)
{
    float RetVal = mass[0];
    for(int i = 1; i < nCount; i++)
    {
        if(RetVal < mass[i])
            RetVal = mass[i];
    }
    return RetVal;
}
 
int findmax(int nCount, char ** mass)
{
    int RetVal = 0,sLen;
    for(int i = 0; i < nCount; i++)
    {
        sLen = strlen(mass[RetVal]);
        if(sLen < strlen(mass[i]))
            RetVal = i;
    }
    return RetVal;//Здесь возвращаем индекс строки а не саму строку!!!
}
 
LPTSTR SelectFile()
{
    char sPath[MAX_PATH];sPath[0] = '\0';
    LPCITEMIDLIST lpItemDList;
    BROWSEINFO bi = {NULL, NULL, sPath,
       "Выберите файл для обработки",
        BIF_DONTGOBELOWDOMAIN|BIF_BROWSEINCLUDEFILES,
        NULL,
        NULL,
        0
    };
    if((lpItemDList=SHBrowseForFolder(&bi)))
    {
        if(SHGetPathFromIDList(lpItemDList, sPath))
            GetShortPathName((LPCTSTR)sPath,sPath,strlen(sPath));
    }
    return &sPath[0];
}
 
int GetNumStrings(LPTSTR str)
{
    int RetVal = 0;
    //Вдруг вначале текста идут символы новой строки
    while(str[0] == '\n')
        str++;
    char * chBuf = strchr(str,'\n');
    //На случай если в файле всего 1 строка
    if(!chBuf && strlen(str))
    {
        iPos[RetVal] = 0;
        RetVal++;
    }
    while(chBuf)
    {
        iPos[RetVal] = strlen(str) - strlen(chBuf);
        RetVal++;
        chBuf++;
        if(chBuf)
            chBuf = strchr(chBuf,'\n');
        iPos = (int *)realloc((void *)iPos,sizeof(int)*(RetVal + 1));
    }
    return RetVal;
}
Миниатюры
Перегруз функции   Перегруз функции  
Вложения
Тип файла: txt text_block.txt (101 байт, 23 просмотров)
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
11.09.2009, 14:22  [ТС]     Перегруз функции #28
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 32658858. Read of address 66647361'. Process stopped. Use Step or Run to continue.
При запуске программы стала выходить такая ошибка. скажите почему? вроде всё сделал по аналогии с вашим примером novi4ok.
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
int u1(const int*op,int a){
 int max=0;
 int iMx;
 for(int i=0;i<a;i++){
 if(*(op+i)>max){
   max=*(op+i);
   iMx=i+1;
   }
 }
 return iMx;
 }
//---------------------------------------------------------------------------
float u1(const float*op,int a){
 float max=0;
 int iMx=0;
 for(int i=0;i<a;i++){
 if(*(op+i)>max){
    max=*(op+i);
    iMx=i+1;
    }
 }
 return iMx;
 
 }
//---------------------------------------------------------------------------
char u1(const char**op[10], int a){
 int maxSZ=0;
 int iMx=-1;
 for(char i=0;i<a;i++){
  int sz=::strlen(**(op+i));
   if(sz>maxSZ){
    maxSZ=sz;
    iMx=i+1;
   }
  }
return iMx;
}
int main(){
 int nt[10];
 float ft[10];
 char*l[3] = {"asdfg",";lksjd;flkajsd;flkja","aaa"};
 cout<<"Vvedite zeloe chisla"<<endl;//äëÿ ââîäГ* Гў Г¬Г*Г±Г±ГЁГў
  for(int i=0;i<10;i++){
   cin>>nt[i];
  }
 cout<<"Vvedite vehestvennor chisla"<<endl;//äëÿ ââîäГ* Гў Г¬Г*Г±Г±ГЁГў
  for(int i=0;i<10;i++){
   cin>>ft[i];
  } 
cout<<"Maxmal'nii element massiva zelih chisel= "<<u1(nt,10)<<endl;
 cout<<"Maxmal'nii element massiva vehestvennih chisel= "<<u1(ft,10)<<endl;
 cout<<"Maxmal'nii element massiva vehestvennih chisel= "<<u1((const char***)l,3)<<endl;
        cin.get();
        cin.get();
 delete nt;
 delete ft;
        return 0;
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
11.09.2009, 15:55     Перегруз функции #29
C++
1
2
3
4
5
 int nt[10];
 float ft[10];
//---
 delete nt;
 delete ft;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2009, 20:05     Перегруз функции
Еще ссылки по теме:

C++ Как будут инициализированы переменные в теле функции и вне тела функции?
C++ Вызов функции внутри другой функции с передачей локальной переменной по ссылке
C++ Различные функции, для которых можно создать массив указателей на функции
C++ Stack Overflow, перегруз буфера

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

Или воспользуйтесь поиском по форуму:
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
11.09.2009, 20:05  [ТС]     Перегруз функции #30
Да эту ошибку я нашел но ошибка то осталась!!!

Добавлено через 2 минуты
Ошибка осталась
Цитата Сообщение от crashc Посмотреть сообщение
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 32658858. Read of address 66647361'. Process stopped. Use Step or Run to continue.
Добавлено через 15 минут
я думаю что ошибка из-за вызова функции u1 для строки.
Yandex
Объявления
11.09.2009, 20:05     Перегруз функции
Ответ Создать тему
Опции темы

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