Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
24 / 24 / 2
Регистрация: 26.07.2009
Сообщений: 414

Перегруз функции

11.08.2009, 20:06. Показов 3687. Ответов 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;
вот сам текст программы, здесь у меня не работает только подсчет самой длинной строки, хотя если что-то не правильно кроме строк подскажите!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2009, 20:06
Ответы с готовыми решениями:

Перегруз
Можете помочь ошибку C2995, как правильно перегружать #include&quot;stdafx.h&quot; #include&lt;iostream&gt; using namespace std; template...

Stack Overflow, перегруз буфера
Добрый день, знаком с перегрузом буфера в теории, хотел бы перейти к практике. Написал простенькую программу, int main(int argc) ...

Перегруз процессора
Всегда было интересно, какие последствия могут быть у перегруза процессора, т.е. когда он загружен на 100%, из моих знаний - процессор не...

29
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
11.08.2009, 23:25
Студворк — интернет-сервис помощи студентам
ну ну)) с шаблонами тут не получится!))

Не по теме:

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



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

return iMax;
а не:
return i;
0
24 / 24 / 2
Регистрация: 26.07.2009
Сообщений: 414
12.08.2009, 21:25  [ТС]
novi4ok,
Цитата Сообщение от novi4ok Посмотреть сообщение
int sz = ::strlen (*(pArg+i));
подскажи как эту строку сделать по проще или вообще убрать заменив на более простую и еще как теперь обращаться к этим функциям правильно.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.08.2009, 00:17
Цитата Сообщение от 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-той строки.
запутал окончательно? это хорошо
1
6 / 6 / 1
Регистрация: 14.11.2008
Сообщений: 82
13.08.2009, 15:44
MIN_DOUBLE и MIN_INT
Они тебе вообще не нужны просто присвой первые значения массивов и потом с ними сравнивай.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.08.2009, 16:52
Цитата Сообщение от Alexen Посмотреть сообщение
MIN_DOUBLE и MIN_INT
Они тебе вообще не нужны просто присвой первые значения массивов и потом с ними сравнивай.
логично
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.08.2009, 17:46
crashc, перегрузка функций подразумевает использование функций с одинаковым именем, при этом аргументы функции различны, тогда это действительно перегрузка

Вот что у меня получилось по этой проблеме (кстати использовал свои же материалы https://www.cyberforum.ru/cpp-... 37890.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 байт, 24 просмотров)
0
24 / 24 / 2
Регистрация: 26.07.2009
Сообщений: 414
11.09.2009, 14:22  [ТС]
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;
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
11.09.2009, 15:55
C++
1
2
3
4
5
 int nt[10];
 float ft[10];
//---
 delete nt;
 delete ft;
0
24 / 24 / 2
Регистрация: 26.07.2009
Сообщений: 414
11.09.2009, 20:05  [ТС]
Да эту ошибку я нашел но ошибка то осталась!!!

Добавлено через 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 для строки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2009, 20:05

адский перегруз ЦП
Поле Значение Компьютер Тип компьютера ACPI компьютер на базе x86 Операционная система Microsoft Windows 7 Professional Пакет...

Работа с Socket и перегруз
Добрый день ! Недавно наткнулся на статью в которой говорилось о том что если запустить бесконечный цикл в другом потоке то возрастает...

Перегруз трафика, где искать
(Другой офис, другой комп) Превышение трафика, логи дают три ip адреса pppoe.spdop.ru фильмы не смотрели, обновления не качали. Все...

Перенос сайта, перегруз шлюза
По работе дали такие задания: 1)Нужно скопировать сайт с домена .com на домен .ru вот сайт http://www.konversia.com/ вобщем, как...

Перегруз на FloatToChar; Неупорядочный вывод массива
Нужно вывести 2х строковый массив (в форму) 1. Самый простой способ это вывести массив А на Lable: for i2:=1 to 2 do begin ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru