Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Функции для работы с массивами


Автор: Axert 19.9.2006, 14:48
Подскажите функцию, которая возвращает минимальное значение массива. Что-то типа Min(array) в PHP.

Автор: Romikgy 19.9.2006, 15:13
писать самому имхо , или юзать чтот типа boost 
PS объясни по какой причине вообще взялся за си?
(имхо тяжко людям сначало юзавшим пхп переходить на си)

Автор: Axert 19.9.2006, 15:53
Я не работал с PHP. А на си надо программу для лабораторной сделать, вот и вожусь... Написал сам, но код громоздкий и мне не понравился, решил спросить тут....

Автор: Oleg_Ci 19.9.2006, 15:55
Код

#include<iostream>
#include<stdlib.h>
#include <algorithm> // <<<<<  от сюда
using namespace std; 

int main()    
{
    const int len = 5;
    int mas[len] = {4, 3, 65, 2, 23};

    int * min_int = min_element( mas, mas+len ); // <<<< вот "оно"

    std::cout << *min_int << "\n\n";
    system("pause");
    return 0;
}

Автор: EvgenZ 19.9.2006, 16:17
algorithm, ничего себе, а я думал что это только для векторов и т.д. ... куль.

Автор: Romikgy 19.9.2006, 16:24
EvgenZ, любой массив в памяти всеравно представлен в виде верктора!

Автор: EvgenZ 19.9.2006, 16:29
Это да, я теперь даже незнаю почему думал, что алгоритмы пременимы только для std:: шных ... А вот почему хз, домой приду поиграю...

Автор: Syberex 19.9.2006, 16:35
#pragma hdrstop
#include<iostream>
#include<stdlib.h>
#include <algorithm.h>
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
     const int len = 5;
    int mas[len] = {4, 3, 65, 2, 23};
    //int mas[len]; // len =4
       //mas[0]=4;mas[1]=3;mas[2]=65;mas[3]=2;mas[4]=23;

    int * min_int = min_element( mas, mas+len ); // <<<< âîò "îíî"

    std::cout << *min_int << "\n\n";
    cout<<mas[0]<<endl;
      cout<<mas[1]<<endl;
        cout<<mas[2]<<endl;
          cout<<mas[3]<<endl;
            cout<<mas[4]<<endl;
              cout<<mas[5]<<endl;
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
 

5 элемент что такое? почему ты объявляешь массив из пяти элементов а не из 4-рёх?  ведь x[5] содержит уже шесть элементов, и у тебя инициализация идут с 0 элемента.  smile 

Автор: MAKCim 19.9.2006, 16:49
Цитата

algorithm, ничего себе, а я думал что это только для векторов и т.д. ... куль. 

В STL используется концепция итераторов, она построена на шаблонах и обобщенных алгоритмах
а в данном случае int* является простейшим итератором

Автор: Romik_Yarosh 19.9.2006, 16:49
Цитата(Syberex @  19.9.2006,  16:35 Найти цитируемый пост)
ведь x[5] содержит уже шесть элементов

это почему 6 ?

Автор: Oleg_Ci 19.9.2006, 16:59
Цитата(Syberex @  19.9.2006,  20:35 Найти цитируемый пост)
5 элемент что такое? почему ты объявляешь массив из пяти элементов а не из 4-рёх?  ведь x[5] содержит уже шесть элементов, и у тебя инициализация идут с 0 элемента.
На самом деле оращаться надо с x[0] - до x[4]
x[5] - уже содержит мусор

Автор: Syberex 19.9.2006, 17:03
а ты нулевой сивол учитываешь ? в твоём коде что ты написал, в массиве от 0 до 4 включительно твои цифры, а в  5 уже бред, или вернее сказать указатель на переменную  min_int , эту же мне кажется утечка памяти.

Автор: Oleg_Ci 19.9.2006, 17:05
Код

const int len = 5;
int mas[len] = {1, 2, 3, 4, 5, 6};
Тогда почему не компилируется ?

Автор: zkv 19.9.2006, 17:16
Цитата(Олег4 @  19.9.2006,  17:05 Найти цитируемый пост)
int mas[len]


Цитата(Syberex @  19.9.2006,  17:03 Найти цитируемый пост)
а ты нулевой сивол учитываешь ?

smile smile smile Syberex, хочешь сказать, что в массив интов по дефолту в конец '\0' приписывается smile? интересно, зачем smile? 

int mas[5]; говорим, чтоб выделели память под 5 элементов, обращение к элементам:
первый -      mas[0]
второй -       mas[1]
третий       - mas[2]
четвертый - mas[3]
пятый -         mas[4]
никаких нуль-символов нигде нет

Автор: Syberex 20.9.2006, 07:49
неа, там 5 элемент прописано min_int , вот эта штука. Но я тоже не могу понять почему это не компилится? 

сonst int len = 5;
int mas[len] = {1, 2, 3, 4, 5, 6};

Добавлено @ 07:57 
кажись я догнал 5 элемент это уже выход за пределы массива, значит использовать надо только 0-4 , да ? smile 

Автор: EvgenZ 20.9.2006, 09:22
Цитата

кажись я догнал 5 элемент это уже выход за пределы массива, значит использовать надо только 0-4 , да ? 


да.

Автор: Syberex 21.9.2006, 13:00
long int* mas_Min(long int* first, long int* last)
 {
    long int* result=last;
    do {if(*first<*result){*result=*first;}} while(++first !=last);
    return first;
 };

Автор: Oleg_Ci 21.9.2006, 15:52
Syberex, небольшая ошибка smile 
Код

long int* mas_Min( long int* first, long int* last )
 {
    long int* result = last;
    do {
        if( *first < *result )  *result = *first;
    } while( ++first != last );
    return result;  //  << result  вместо first
 };

Автор: Syberex 22.9.2006, 08:44
Да ты прав, то я из другово куска,брал

  return result;  //  << result  вместо first , а так всё пашет, а главное без всяких там дополнительных подключений библиотек, и каких то там алгоритмов.

Автор: albertn 22.9.2006, 16:57
Цитата(Syberex @  20.9.2006,  07:49 Найти цитируемый пост)
неа, там 5 элемент прописано min_int , вот эта штука

В min_element вторым параметром указывается следующий за последним элементом, если ты про это.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)