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


Автор: SkoobyDoo 19.12.2008, 19:40
Доброго времени суток! Помогите разобратся, пытаюсь найти минимальный элемент массива. При вводе чисел в массив от 1 до 6, программа выдает в результате 6! Как это так? 
Вывод:
Код

mojo@host:~$ ./problem_2 
Введите элемент B[0]: 1
Введите элемент B[1]: 2
Введите элемент B[2]: 3
Введите элемент B[3]: 4
Введите элемент B[4]: 5
Введите элемент B[5]: 6
Мин. элемент 6 с индексом 5

Код:
Код

#include <stdio.h>

#define BSIZE 6        // Размер массива B

int main( void ) 
{
    int B[BSIZE];
        // Заполняем числами массив B
    for ( int j = 0; j < BSIZE; j++ )
    {
        printf("Введите элемент B[%d]: ", j);
        scanf("%d", &B[j]);
    }

    int min, index_min;

    for ( int x = 0; x < BSIZE; x++ )
    {
        for ( int z = 0; z < BSIZE; z++ )
        {
            if( B[x] > B[z] )
            {
                min = B[z];
                index_min = z;
            }     
            else 
            { 
                min = B[x];
                index_min = x;
            }
        }
    }

    printf("Мин. элемент %d с индексом %d\n", min, index_min);

    return 0;
}


Автор: FoV 19.12.2008, 19:56
Код

int min = 0,index_min;;
for ( int x = 0; x < BSIZE; x++ )
{
   if(B[i] < min){
      min = B[x];
      index_min = i;
    }
}


Автор: avlzll 19.12.2008, 20:04
FoV , это неправильно. 

Тогда так уж.

Код


int min = 0, index_min = 0;
min = B[0];
for ( int i = 1; i < BSIZE; i++ )
{
   if (B[i] < min) {
      min = B[i];
      index_min = i;
    }
}


Автор: SkoobyDoo 19.12.2008, 20:05
Код

Введите элемент B[0]: 1
Введите элемент B[1]: 2
Введите элемент B[2]: 3
Введите элемент B[3]: 4
Введите элемент B[4]: 5
Введите элемент B[5]: 6
B[-1076509688]: 1

Автор: FoV 19.12.2008, 20:08
avlzll
Ну да,твой вариант правильнее,хотя мой тоже работать будет. 

Автор: SkoobyDoo 19.12.2008, 20:10
извините пожалуйста, вы бы не могли подсказать как отсортировать массив и все элементы записать в другой массив по убыванию?

Автор: mes 19.12.2008, 20:15
Цитата(FoV @  19.12.2008,  20:08 Найти цитируемый пост)
Ну да,твой вариант правильнее,хотя мой тоже работать будет. 

позвольте узнать, каким таким чудом ?  smile 
Цитата(FoV @  19.12.2008,  19:56 Найти цитируемый пост)
for ( int x = 0; x < BSIZE; x++ )
{
   if(B[i] < min){

переменая цикла х, а используйте для доступа к элементу i 

ну а во вторых после  min=0,  минимальное в цикле сможет найтись  только  если присутствуют отрицательные значения.

Автор: FoV 19.12.2008, 20:16
SkoobyDoo
Код

#include <stdio.h>
#include <stdlib.h>

#define BSIZE 6        // Размер массива B

int main( void ) 
{
    int B[BSIZE];
        // Заполняем числами массив B
    for ( int j = 0; j < BSIZE; j++ )
    {
        printf("Введите элемент B[%d]: ", j);
        scanf("%d", &B[j]);
    }

    int min = B[0], index_min = 0;
    for ( int i = 1; i < BSIZE; i++ )
{
   if (B[i] < min) {
      min = B[i];
      index_min = i;
    }
}
    printf("Element:%d index: %d",min,index_min);
    system("pause");

}

SkoobyDoo, 
Это вывод минимального элемента и его индекса,рабочий,я проверил.

Добавлено @ 20:17
Цитата(mes @  19.12.2008,  20:15 Найти цитируемый пост)
переменая цикла х, а используйте для доступа к элементу i 

Точно,очепятка smile 

Автор: SkoobyDoo 19.12.2008, 20:27
Вообще задача такая:
Даны два массива А1 .. А10 и В1 .. В12
в каждом их них есть нескоколько одинаковых минимальных элементов
вывести их индексы по массиву А и массиву В.

Я хотел отсортировать массив B по убыванию (пологаю индексы надо сохранить в другой массив) smile и затем через цикл сравнивать с массивом A и выводить индексы одинаковых элементов. Как думаете?

Ребят! помогите а? smile завтра сдать надо :( 

Автор: mes 19.12.2008, 20:56
непонял насколько пересекаются эти массивы . 

вывести все индексы минимального значения :
1. для массива А [1..10]
2. для массива А [1..12]
так ?

P.S.  индексы  с единицы  smile - наверно задание с паскаля портировано.

Автор: SkyCoder 19.12.2008, 20:58
Цитата(SkoobyDoo @  19.12.2008,  20:27 Найти цитируемый пост)
в каждом их них есть нескоколько одинаковых минимальных элементов

Извини, не могу вкурить в то, что это значит. Приведи пример.

Автор: SkoobyDoo 19.12.2008, 21:12
Например даны два массива:
Код

A[0]: 5     B[0]: 3
A[1]: 1     B[1]: 15
A[2]: 3     B[2]: 10
A[3]: 2     B[3]: 2
A[4]: 9     B[4]: 1
                B[5]: 4


Надо вывести:
Код

A[1] = B[4]
A[3] = B[3]
A[2] = B[0]
...

Вот.

Автор: mes 19.12.2008, 21:24
а для такого массива 
Цитата

А     B
1     4
3     4 
4     3
4     3


что надо вывести ?

Автор: SkoobyDoo 19.12.2008, 21:28
Цитата(mes @ 19.12.2008,  21:24)
а для такого массива 
Цитата

А     B
1     4
3     4 
4     3
4     3


что надо вывести ?

A[1] = B[3]
A[2] = B[0]

по одному совпадению

Автор: mes 19.12.2008, 22:33
вот набросок:
Код

#include <iostream>

int mas1 [] = { 1, 2,4,4,3,-6,-4}; // первый массив для теста
int mas2 [] = { -6, 1,2,4,3,4}; // второй массив для теста
const int size1 = sizeof(mas1)/sizeof(int*); // рамер первого массива
const int size2 = sizeof(mas2)/sizeof(int*); // рамер второго массива
int mas[size1];

void swap (int& x, int& y) { int i=x; x=y; y=i; }  // обмен значений

int min (int * begin, int * end) // поиск минимального в ряду
{
    int min=*begin;
    for (int *p =begin+1; p<end; ++p) if (min>*p) min=*p;
    return min;
}

void copy (int * begin, int * end, int *dst) // копирование элементов массива
{
    for (int *p =begin; p<end; ++p,++dst) *dst = *p;
}

void sort (int * begin, int * end) // сортировка
{
    for (int *p =begin+1; p<end; ++p)
    for (int *p1 =p; p1>begin; --p1)
    if (*p1 < *(p1-1)) swap (*p1,*(p1-1));
    else break;
}

int * find (int * begin, int * end, int key)
{
     for (int *p =begin; p<end; ++p) if (*p==key) return p; // если ключ найден то возвращает указатель на элеммент
     return end; // иначе указатель на конец
}

void print (const char * text, int* begin, int * end) // тестовый вывод
{
    std::cout << text <<*begin;
    for (int *p =begin+1; p<end; ++p)
    std::cout<<", "<<*p;
    std::cout <<". "<<std::endl;
}

int main( void )
{

     int * end1 = mas1+size1;// расчитываем конец первого массива
     int * end2 = mas2+size2;// расчитываем конец второго массива

     copy (mas1, end1, &mas[0]);  // копируем в дополнительный масссив
     int * end = mas+size1;     //расчитываем конец дополнительного массива
     print ("after copy : ", mas, end); // тест

     sort (mas, end); // сортируем дополнительный массив
     print ("after sort : ", mas, end); // тест

     std::cout <<std::endl;

     for (int *p=mas; p<end; ++p)
     {
        if (p!=end) if (*p==*(p+1)) continue;  // отсеивание неуникальных значений для сортированного массива
        int * p1 = find (mas1, end1, *p); // поиск текущего значения в первом массиве
        int * p2 = find (mas2, end2, *p); // поиск текущего значения вo втором массиве

        if (p1!=end1 && p2 != end2) // если найденны значения в обоих массивах
        {
           std::cout << "A["<<p1-mas1<<"]=B["<<p2-mas2<<"]="<<*p<<std::endl;
        }

     }

    std::cout <<std::endl;

    system("pause");
}



примечание : end указывает на следующий элемент после последнего.
то есть если надо к примеру скопировать один элемент то copy (mas, mas+1, ...);

Автор: SkoobyDoo 19.12.2008, 23:10
Спасибо огромнейшее, скомпилил - работает.  smile 

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