Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция определяющая наибольшее значение 
V
    Опции темы
agentjamesbolt007
Дата 30.10.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 5.9.2012

Репутация: нет
Всего: нет



Всем привет.Помогите разобраться с программой.
Нужно написать функцию, которая принимает в качестве аргумента адрес массива и количество элементов в нем, а возвращает индекс наибольшего элемента.

Код

#include <iostream>
using namespace std;

const int NUM =3;
void maxint(int funmass[NUM]);//объявление
int main()
{
    int mass [NUM];
    cout <<"Vvedite neskolko cifr." <<endl;
    cout <<"Programa opredelit naibolschee iz nih" <<endl;
    maxint(mass);//вызов функции
    return 0;
}
void maxint(int funmass[NUM])//определение функции
{
  for(int j =0; j <NUM; j++)
  cin >>funmass[j];
                               //zdes' navernoe doljen bit' cikl opredelyayuchiy naibolschiy element
}                            


Это сообщение отредактировал(а) agentjamesbolt007 - 30.10.2012, 15:35
PM MAIL   Вверх
digidrofosfat
Дата 30.10.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.10.2012

Репутация: нет
Всего: 1



Код

void maxint(int *funmass,  int length)
{
  int maxnum=0;
  int maxval=funmass[0];
  for(int j =1; j <length; j++)
   if(funmass[j]>maxval)
   {
     maxval=funmass[j];
     maxnum=j;
   }
   return maxnum;                            
}                


P.s. Это не помогите разобраться, а напишите мне прогу



Это сообщение отредактировал(а) digidrofosfat - 30.10.2012, 15:52
PM MAIL   Вверх
Cheloveck
Дата 30.10.2012, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Код

# include <iostream>


size_t maxint(int * arr, size_t size)
{
    if(size < 2) return 0;
    size_t result = 0;
    for(size_t i = 1; i < size; ++i)
    {
        if(arr[i] > arr[result])
            result = i;
    }
    return result;
}

int main()
{
    int arr[] = { 100, 250, 10, 2, 30, 360, 40, 5, 8, 3 };
    std::cout << maxint(arr, sizeof(arr) / sizeof(int));
    std::cin.get();
    return 0;
}



--------------------
user posted image
PM Jabber   Вверх
baldina
Дата 30.10.2012, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Cheloveckdigidrofosfat, ваш код не работает для size = 1

agentjamesbolt007, у тебя одно задание, а делаешь нечто другое.

Цитата(agentjamesbolt007 @  30.10.2012,  15:33 Найти цитируемый пост)
Нужно написать функцию, которая принимает в качестве аргумента адрес массива и количество элементов в нем, а возвращает индекс наибольшего элемента.

сначала придумаем функции имя, пусть будет maxint.
теперь определим прототип функции: параметры и возвращаемое значение. он прямо вытекает из условия: возвращает индекс элемента, т.е. int, а принимает указатель и целое число
Код

int maxint (int *array, int n) {
}

теперь думаем.
чтобы определить максимальный элемент придется проверить все элементы массива, сохраняя в переменной текущее значение индекса максимального элемента. т.е. делаем цикл по всем элементам. в качестве начального возьмем значение индекса первого (нулевого) элемента массива, т.е. 0:
Код

int maxint (int *array, int n) {
  int index = 0;

  for (int i=1; i < n; ++i)
   if (array[i] > array[index]) // если i-й элемент больше текущего максимума
     // то делаем его текущим максимумом
     index = i;

 // по окончании цикла index хранит индекс максимального элемента, его нам нужно вернуть
 return index;
}

в этом коде есть ма-аленькая проблема: а что, если массив пустой (n=0)?
в этом случае максимального элемента нет, а значит нет и его индекса. более того, мы не имеем право обращаться к array[0], т.к. это за пределами (пустого) массива.
значит нужно дополнить нашу функцию проверкой и в случае пустого массива вернуть какое-то специальное значение.
т.к. индексы в массиве неотрицательны, в качестве специального значения выберем отрицательное число, например -1
Код

int maxint (int *array, int n) {
  if (n == 0)
    return -1;

  int index = 0;

  for (int i=1; i < n; ++i)
   if (array[i] > array[index]) // если i-й элемент больше текущего максимума
     // то делаем его текущим максимумом
     index = i;

 // по окончании цикла index хранит индекс максимального элемента, его нам нужно вернуть
 return index;
}

готово. область определения нашей функции - адрес массива и его размер - неотрицательное число.
теперь функцию можно использовать:
Код

int main () {
  int a[] = { 4, 2, 1, 5, 3 };
  cout << maxint (a, 5) << endl;

  cout << maxint (0, 0) << endl;
}

http://codepad.org/XG2dOTGv

Это сообщение отредактировал(а) baldina - 30.10.2012, 16:49
PM MAIL   Вверх
digidrofosfat
Дата 30.10.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.10.2012

Репутация: нет
Всего: 1



Вообще-то мой код работает для size=1.
А проверку на наличие чего-то да не делал, но раз уж спускаться до проверок на дурака, то  надо бы заодно проверить инициализирован ли вообще массив и проверку на длину делать не равную нулю а меньше 1. 


PM MAIL   Вверх
baldina
Дата 30.10.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(digidrofosfat @  30.10.2012,  17:01 Найти цитируемый пост)
Вообще-то мой код работает для size=1.

простите. я хотел сказать для size=0

Добавлено через 1 минуту и 35 секунд
Цитата(digidrofosfat @  30.10.2012,  17:01 Найти цитируемый пост)
но раз уж спускаться до проверок на дурака

это не проверка на дурака. пустой массив вполне нормальная и распространенная весчь
Цитата(digidrofosfat @  30.10.2012,  17:01 Найти цитируемый пост)
проверить инициализирован ли вообще массив

интересно, как вы это сделаете  smile 
PM MAIL   Вверх
borisbn
Дата 30.10.2012, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(baldina @  30.10.2012,  17:10 Найти цитируемый пост)
Цитата(digidrofosfat @  30.10.2012,  17:01 Найти цитируемый пост)
проверить инициализирован ли вообще массив


интересно, как вы это сделаете

Поддерживаю вопрос. Как определить, что массив (или пусть даже указатель) неинициализирован ?

Добавлено через 1 минуту и 11 секунд
Цитата(digidrofosfat @  30.10.2012,  17:01 Найти цитируемый пост)
проверку на длину делать не равную нулю а меньше 1. 

достаточно тип размера сделать size_t, как у Cheloveck


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 30.10.2012, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(borisbn @  30.10.2012,  17:21 Найти цитируемый пост)
достаточно тип размера сделать size_t

для размера использовать size_t конечно правильно, но тогда возникнут небольшие проблемы, связанные со смешением int и unsigned
потому удобнее было бы в стиле stl работать с итераторами, но в задаче говорится про индексы.

Добавлено через 1 минуту и 46 секунд
а уж проверку на size<1 делать не по-дейкстровски  smile 
PM MAIL   Вверх
agentjamesbolt007
Дата 31.10.2012, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 5.9.2012

Репутация: нет
Всего: нет



ok, спасибо всем за подробный разбор, только забыл сказать, простите, что указатели использовать нельзя, как можно сделать без них? Я то думал к той проге, что я сделал нужно добавить небольшой цикл на проверку наибольшего элемента и все, а тут такой разбор...
PM MAIL   Вверх
feodorv
Дата 31.10.2012, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(agentjamesbolt007 @  31.10.2012,  08:21 Найти цитируемый пост)
указатели использовать нельзя

Дас ист фантастиш smile Условие задачи с самого начала звучало так:
Цитата(agentjamesbolt007 @  30.10.2012,  16:33 Найти цитируемый пост)
Нужно написать функцию, которая принимает в качестве аргумента адрес массива и количество элементов в нем

Без указателя - никак. Другое дело, что формально можно оформить функцию как
Код

int maxint (int array[], int n)
{
 ...
}

Вроде как явных указателей нет (фактически же есть). Так подойдёт?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
agentjamesbolt007
Дата 31.10.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 5.9.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  31.10.2012,  08:32 Найти цитируемый пост)
Вроде как явных указателей нет (фактически же есть). Так подойдёт?


да, спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0990 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.