Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 145
#1

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

25.09.2011, 19:45. Просмотров 603. Ответов 12
Метки нет (Все метки)

Доброго дня. Ни как не могу понять в чем причина не исполнения следующей программы.
Код ищет минимальный и максимальный элементы в массиве.(эта часть программы успешна)
Далее все элементы которые находятся в данном массиве между мин.эл. и макс.эл +=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;
}
В чем недоработка?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2011, 19:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не большие операции с массивом. (C++):

Операции над динамическим массивом - C++
Написать программу, которая будет создавать массив, длина которого задается с клавиатуры, и предлагать 3 операции: добавить данные в...

Работа с массивом - предусмотреть все базовые операции - C++
. Постановка задачи 1) Сформировать массив из n элементов с помощью датчика случайных чисел (n задается пользователем с клавиатуры). ...

Бинарный файловый ввод/вывод: реализовать операции для работы с массивом структур типа WORKER - C++
Здравствуйте, видел очень много подобных программ, но у меня особый случай в общем суть программы: Описать структуру с именем WORKER, что...

Перегрузить операции сравнения комплексных чисел и операции потокового вывода - C++
Создать класс комплексное число. Перегрузить операции сравнения комплексных чисел! =, ==,&gt;, &lt;,&gt; =, &lt;= И операции потокового ввода-вывода. ...

Заменить операции ifstream на операции fprintf - C++
Собственно как и написано в заголовке заменить операции ifstream на fprintf со всеми вытекающими(типо getline) необходимо мне. Помогите...

Битовые операции и операции смещения языка С - C++
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает верно(переводит обычные числа в 16-ти ричные),а...

12
alkagolik
Заблокирован
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] << " ";
1
-=ЮрА=-
Заблокирован
Автор 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)
0
alkagolik
Заблокирован
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
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
0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Не большие операции с массивом.  
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 145
25.09.2011, 21:27  [ТС] #7
это довольно красиво ,спасибо за код .
0
alkagolik
Заблокирован
25.09.2011, 22:09 #8
это довольно красиво ,спасибо за код
будьте готовы уметь отстоять авторство этой красоты
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 22:15 #9
Цитата Сообщение от alkagolik Посмотреть сообщение
если не трудно разъясните пожалуйста.
если юзать в цикле do{}while
rand без srand возможно повторение чисел заполняющих массив arr от итерации к итерации, подробней здесь http://www.cplusplus.com/reference/clibrary/cstdlib/srand/
1
alkagolik
Заблокирован
25.09.2011, 22:25 #10
-=ЮрА=-, я проверил и понял что к чему
0
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 145
27.09.2011, 19:34  [ТС] #11
#include <conio.h> . его нет в средах linux (netbeans).
0
alkagolik
Заблокирован
27.09.2011, 19:48 #12
scofielcl, правда классно что-то новое узнать?
0
scofielcl
4 / 4 / 0
Регистрация: 11.09.2011
Сообщений: 145
27.09.2011, 20:08  [ТС] #13
почти согласен с вами .
0
27.09.2011, 20:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 20:08
Привет! Вот еще темы с ответами:

Массивом и динамическим массивом - C++
Составить программу, в которой 1) организовать ввод матрицы размера mxn из целых чисел; 2) вычислить сумму ненулевых элементов, кратных...

Записать логические выражения, используя условные операторы, операции отношений и логические операции - C++
Записать логические выражения, используя условные операторы, операции отношений и логические операции алгоритмического языка ...

Операции с массивом - Delphi
сгенерировать массив из целочисленных чисел размерностью в 10 элементов ,инициализировать его случайными числами от 0 до 100, найти в...

1C 8.x Операции с массивом - 1С
Добрый день всем! Есть такая ситуация: // =================================== Процедура ЧтотоТут() МассивСчет =...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru