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

Не большие операции с массивом. - C++

Восстановить пароль Регистрация
 
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 143
25.09.2011, 19:45     Не большие операции с массивом. #1
Доброго дня. Ни как не могу понять в чем причина не исполнения следующей программы.
Код ищет минимальный и максимальный элементы в массиве.(эта часть программы успешна)
Далее все элементы которые находятся в данном массиве между мин.эл. и макс.эл +=1;
Но это происходит только с первым элементом.
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
int main () {
    long i , imin ,imax,kmax,kmin;
    const int g = 10;
    int r[g]={-40,-9,9,4,2,54,3,24,23,42};
    for(i=0 ,imax=-99999999,imin=99999999;i < g;i++ )
    {
        if (r[i] < imin)  imin = r[i] , kmin=i;
        
        if (r[i] > imax) imax= r[i] , kmax = i;
        
    }
cout << "min " <<imin<< " max" << imax<<endl;
cout << "kmin " <<kmin << " kmax " <<kmax<<endl;
cout << "r[kmin+1] " << r[kmin+1]<< endl; 
int z ,d,q;
d=1;
q=1;
for (z=r[kmin+d]; kmin +q < kmax;d+=1)
{
    q+=1;
    z+=1;
    cout << "  " << z;
}
 
    return 0;
}
В чем недоработка?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2011, 19:45     Не большие операции с массивом.
Посмотрите здесь:

Операции с массивом. C++
Операции с массивом. C++
операции над двумерным массивом. C++
Задания С++ (операции с массивом ч.1) C++
Операции с одномерным массивом (ошибки) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2011, 19:55     Не большие операции с массивом. #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от scofielcl Посмотреть сообщение
В чем недоработка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
long i , imin = 0, imax = 0, kmax, kmin;
.....
for(i = 0; i < g; i++)
    {
        if (r[i] < imin){
            imin = r[i];
            kmin=i;
        }
        if (r[i] > imax){
            imax= r[i];
            kmax = i;
        }
        
    }
непишитеслитнооперацииспеременнымииконстантами
дальше вместо этого
C++
1
2
3
4
5
6
7
8
9
int z ,d,q;
d=1;
q=1;
for (z=r[kmin+d]; kmin +q < kmax;d+=1)
{
    q+=1;
    z+=1;
    cout << "  " << z;
}
лучше так
C++
1
2
3
4
5
6
7
8
9
if(kmin == kmax) std::cout <<  "массив забит одинаковыми числами" << "\n";
else if ((kmin - kmax == 1) || (kmin - kmax == -1))
      std::cout << "минимальный и максимальный элементы соседние";
else if(kmin < kmax)
      for(i = kmin + 1; i < kmax; ++i)
            std::cout << massiv[i] << " ";
else
      for(i = kmax + 1; i < kmin; ++i)
            std::cout << massiv[i] << " ";
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 20:27     Не большие операции с массивом. #3
Вот подправил, только поменял местами imin kmin и imax kmax т.к индексы идут по i и логично что imin соотвествует индексу минимума а не его величине, мне кажется так мнемонически понятней
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
#include <iostream>
#include <cstdlib>
 
using namespace std;
int main () 
{
    const int g = 10;
    int r[g]={-40,-9,9,4,2,54,3,24,23,42};
    long i, imin = 0 ,imax = 0,kmax = r[0],kmin = r[0];
    cout << "\tinput mass\r\n";
    for(i = 1; i < g;i++ )
    {
        if (r[i] < imin)  
        {
            imin = i; 
            kmin = r[i];
        }
        if (r[i] > imax) 
        {
            imax = i;
            kmax = r[i];
        } 
        cout<<r[i]<<" ";
    }
    cout<<endl;
    cout << "\tmin element\r\n";
    cout <<"index : "<<imin<< " value : " <<kmin<<endl;
    cout << "\tmin element\r\n";
    cout <<"index : "<<imax<< " value : " <<kmax<<endl;
 
    i = ((imin < imax) ? imin : imax);//Определяем что первым идёт мин или макс
    //если индекс макса меньше индекса мина, нужно стартовать с индекса макса
    //это ((лог выражение) ? если истина : если ложь) замна if
    
 
    //определяем конец диапазона мин-макс
    int end = ((imin < imax) ? imax : imin);
 
    //i + 1 чтобы не включать индекс не соотвествовал imin(imax)
    for (i = i + 1; i < end;i++)
        cout << "  " << (r[i] += 1);//Сразу и плюсуем и выводим
    cout<<endl;
    return 0;
}
Вывод прогрммы

input mass
-9 9 4 2 54 3 24 23 42
min element
index : 1 value : -9
min element
index : 9 value : 42
10 5 3 55 4 25 24
Press any key to continue
Press any key to continue


Добавлено через 9 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
C++
1
2
3
if(kmin == kmax) std::cout << *"массив забит одинаковыми числами" << "\n";
else if ((kmin - kmax == 1) || (kmin - kmax == -1))
  std::cout << "минимальный и максимальный элементы соседние";
Так проще будет
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
2
3
4
5
i = ((imin < imax) ? imin : imax);//Определяем что первым идёт мин или макс
  //если индекс макса меньше индекса мина, нужно стартовать с индекса макса
  //это ((лог выражение) ? если истина : если ложь) замна if
//определяем конец диапазона мин-макс
  int end = ((imin < imax) ? imax : imin);
(есть желание вообще без end обойтись можно) в условии окончания цикла
C++
1
i < ((imin < imax) ? imax : imin)
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2011, 20:28     Не большие операции с массивом. #4
-=ЮрА=-,
C++
1
2
const int g = 6;
int r[g]={1, 1, 1, 2, 1, 2};
Код
$ ./temp 
	input mass
1 1 2 1 2 
	min element
index : 0 value : 1
	min element
index : 3 value : 2
  2  2


C++
1
2
3
4
const int g = 6;
    int r[g]={2, 2, 1, 1, 2, 2};
...
cout << "  " << r[i] << " ";//Сразу и плюсуем и выводим

Код
$ ./temp 
	input mass
2 1 1 2 2 
	min element
index : 0 value : 2
	min element
index : 4 value : 2
  2   1   1
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 20:49     Не большие операции с массивом. #5
alkagolik, запутался с kmax и imax (тоже с мин здесь)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if (r[i] < imin)
, у меня это уже индексы были
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
#include <iostream>
#include <cstdlib>
 
using namespace std;
int main () 
{
    const int g = 10;
    int r[g]={-40,-9,9,4,2,54,3,24,23,42};
    long i, imin = 0 ,imax = 0,kmax = r[0],kmin = r[0];
    cout << "\tinput mass\r\n";
    for(i = 1; i < g;i++ )
    {
        if (r[i] < kmin)  
        {
            imin = i; 
            kmin = r[i];
        }
        if (r[i] > kmax) 
        {
            imax = i;
            kmax = r[i];
        } 
        cout<<r[i]<<" ";
    }
    cout<<endl;
    cout << "\tmin element\r\n";
    cout <<"index : "<<imin<< " value : " <<kmin<<endl;
    cout << "\tmin element\r\n";
    cout <<"index : "<<imax<< " value : " <<kmax<<endl;
 
    i = ((imin < imax) ? imin : imax);//Определяем что первым идёт мин или макс
    //если индекс макса меньше индекса мина, нужно стартовать с индекса макса
    //это ((лог выражение) ? если истина : если ложь) замна if
    
 
    //определяем конец диапазона мин-макс
    int end = ((imin < imax) ? imax : imin);
 
    //i + 1 чтобы не включать индекс не соотвествовал imin(imax)
    for (i = i + 1; i < end;i++)
        cout << "  " << (r[i] += 1);//Сразу и плюсуем и выводим
    cout<<endl;
    return 0;
}
input mass
-9 9 4 2 54 3 24 23 42
min element
index : 0 value : -40
min element
index : 5 value : 54
-8 10 5 3
Press any key to continue
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 20:58     Не большие операции с массивом. #6
scofielcl, вот алгоритм на плюсах который позволяет многократно заполнять целочисленный массив любой длинны случайными величинами и выполняет указанное в топике +1 элемент между мином и максом
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <time.h>
 
using namespace std;
int main () 
{
    int i,n;
    int * arr;
    int imin,imax;
    int kmin,kmax;
    do
    {
        srand(time(NULL));//для генерации действительно псевдослучайных чисел
        std::cout<<"Enter num of elements in array : ";
        std::cin>>n;
        arr = new int[n];
        std::cout<<"\tInput array\r\n";
        
        i = 0;
        imin = i;imax = i;
        cout<<(arr[i] = rand()%100)<<" ";
        kmin =arr[i]; kmax = arr[i];
        for(i = 1; i < n; i++)
        {
            arr[i] = rand()%100;//generation rand from 0 to 100
            //совмещаем инициализацию с поиском макс и мин элементов
            cout<<arr[i]<<" ";
            if (arr[i] < kmin)  
            {
                imin = i; 
                kmin = arr[i];
            }
            if (kmax < arr[i]) 
            {
                imax = i;
                kmax = arr[i];
            } 
        }
        std::cout <<"\r\n\tmin element\r\n";
        std::cout <<"index : "<<imin<< " value : " <<kmin<<"\r\n";
        std::cout <<"\tmax element\r\n";
        std::cout <<"index : "<<imax<< " value : " <<kmax<<"\r\n";
 
        i = ((imin < imax) ? imin : imax);//Определяем что первым идёт мин или макс
        //если индекс макса меньше индекса мина, нужно стартовать с индекса макса
        //это ((лог выражение) ? если истина : если ложь) замна if
        
        //определяем конец диапазона мин-макс
        n = ((imin < imax) ? imax : imin);
        //i + 1 чтобы не включать индекс не соотвествовал imin(imax)
        for (i = i + 1; i < n;i++)
            cout << "  " << (arr[i] += 1);//Сразу и плюсуем и выводим
        delete [] arr;
        std::cout<<"\r\nPress Y to new input\r\n";
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
Миниатюры
Не большие операции с массивом.  
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 143
25.09.2011, 21:27  [ТС]     Не большие операции с массивом. #7
это довольно красиво ,спасибо за код .
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2011, 22:09     Не большие операции с массивом. #8
это довольно красиво ,спасибо за код
будьте готовы уметь отстоять авторство этой красоты
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 22:15     Не большие операции с массивом. #9
Цитата Сообщение от alkagolik Посмотреть сообщение
если не трудно разъясните пожалуйста.
если юзать в цикле do{}while
rand без srand возможно повторение чисел заполняющих массив arr от итерации к итерации, подробней здесь http://www.cplusplus.com/reference/c...cstdlib/srand/
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2011, 22:25     Не большие операции с массивом. #10
-=ЮрА=-, я проверил и понял что к чему
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 143
27.09.2011, 19:34  [ТС]     Не большие операции с массивом. #11
#include <conio.h> . его нет в средах linux (netbeans).
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
27.09.2011, 19:48     Не большие операции с массивом. #12
scofielcl, правда классно что-то новое узнать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 20:08     Не большие операции с массивом.
Еще ссылки по теме:

C++ С одномерным массивом, состоящим из n вещественных элементов, произвести следующие операции:
С одномерным динамическим массивом, состоящим из n вещественных элементов, произвести следующие операции: C++
Произвести операции с динамическим массивом. C++

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

Или воспользуйтесь поиском по форуму:
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 143
27.09.2011, 20:08  [ТС]     Не большие операции с массивом. #13
почти согласен с вами .
Yandex
Объявления
27.09.2011, 20:08     Не большие операции с массивом.
Ответ Создать тему
Опции темы

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