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

Массивы(статические) - C++

Восстановить пароль Регистрация
 
Bleize
0 / 0 / 0
Регистрация: 17.10.2010
Сообщений: 26
26.11.2010, 21:59     Массивы(статические) #1
Найти максимальную по длине монотонную (т. е. либо неубывающую, либо невозрастающую) подпоследовательность заданного массива целых чисел
P.S. При выполнении работы используются статические массивы. Для организации статических массивов с псевдопеременными границами необходимо объявить массив достаточно большой длины N. Затем пользователь вводит реальную длину массива (не больше N) и работает с массивом той длины, которую он сам указал. Остальные элементы (хотя память под них и будет выделена) не рассматриваются. При уменьшении или увеличении длины массива необходимо изменять его реальную длину.

Добавлено через 4 минуты
[20:56:57]
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
 #include <iostream>
using namespace std;
 
void main()
{
 const int N = 1000;
 int a[N], size, i, k1, k2, k3, n, k;
 cout<<"Enter the size of the array: "; cin>>size;
 for(i=0;i<size;i++){cout<<"the "<<i+1<<"th element: ";cin>>a[i];}
 cout<<endl<<"Array: ";
 for(i=0;i<size;i++)cout<<a[i]<<" ";
 cout<<endl;
 for(i=0,k1=0,k2=1,n=0;i<size-1;i++)
 {if(a[i+1]<a[i])k1++; else{if(k1>=k2)k2=k1; k1=0;} if(k2<=k1)n=i+1;} 
 if(k2<k1) k2=k1;
 for(i=0,k1=0,k3=1,k=0;i<size-1;i++)
 {if(a[i+1]>a[i])k1++; else{if(k1>=k3)k3=k1; k1=0;} if(k3<=k1)k=i+1;}
 if(k3<k1) k3=k1;
 if(n==size-2) if(a[size-1]<a[n]) {n=size-1; k2++;}
 if(k==size-2) if(a[size-1]>a[k]) {k=size-1; k3++;}
 if(k3>k2){n=k; k2=k3;} else if(k3=k2) if(k>n){n=k; k2=k3;}
 cout<<"Maximum long period - "<<k2+1<<" element(s): ";
 for(i=n-k2;i<=n;i++) cout<<a[i]<<" "; 
 cout<<endl; 
}
или помогите исправить ошибку:
размер 10
10 9 8 7 6 7 6 5 10 20(р-тат неверен)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2010, 21:59     Массивы(статические)
Посмотрите здесь:

Одномерные статические массивы C++
двумерные статические массивы C++
Одномерные статические массивы C++
C++ Статические массивы
Статические массивы, члены класса C++
статические массивы C++
статические массивы C++
C++ Статические массивы
C++ Массивы. Статические и динамические
Взять статические строки заменить на динамические массивы и распечатать C++
C++ Динамические и статические массивы
C++ Статические массивы(был бы очень признателен)!

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ne6u4u
 Аватар для ne6u4u
12 / 12 / 0
Регистрация: 14.11.2010
Сообщений: 29
27.11.2010, 15:40     Массивы(статические) #2
простестил тока на твоем примере, так что 100% результат не гарантирую)) но предложу свою версию решения (если будет две одинаковые последовательности по длине, то должна выводить ту, которая встречается раньше)

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int N;
    const int MAX = 1000;
    int arr[MAX], temp_arr[MAX];
    
    //Ввод массива
    cout << "Введите размерность массива: ";
    cin >> N;
    cout << "Заполните массив:\n";
    for (int i=0; i<N; i++)
    {
        cout << i+1 << " элемент: ";
        cin >> arr[i];
    }
 
    //создаю массив для отслеживания последовательносетей
    for (int i=0; i<N-1; i++)
    {
        if ((arr[i] - arr[i+1]) == 1)
            temp_arr[i] = -1;
        else if ((arr[i] - arr[i+1]) == -1)
            temp_arr[i] = 1;
        else
            temp_arr[i] = 0;
    }
 
 
    //вычисление наибольшей последовательности
    int index=0, delta=0, temp_ind=0, temp_del=0;
    if (temp_arr[0]==1 || temp_arr[0]==-1)
    {
        temp_ind = 0; temp_del = 1;
    }
    for (int i=1; i<N; i++)
    {
        if((temp_arr[i]==1 && temp_arr[i-1]==1) || ((temp_arr[i]==-1 && temp_arr[i-1]==-1)))
        {
            temp_del++;
        }
        else if ((temp_arr[i]==1 && temp_arr[i-1]==-1) || ((temp_arr[i]==-1 && temp_arr[i-1]==1)))
        {
            if (temp_del > delta)
            {
                index = temp_ind;
                delta = temp_del;
            }
            temp_del = 1;
            temp_ind = i+1;
        }
        else
        {
            if (temp_del > delta)
            {
                index = temp_ind;
                delta = temp_del;
            }
            temp_del = 1;
            temp_ind = i;
        }
    }
    cout << endl;
 
    // Вывод введенного массива
    for (int i=0; i<N; i++)
        cout << arr[i] << " ";
    cout << endl;
    if(temp_arr[index] == 1)
        cout << "Наибольшая по длине последовательность монотонно возрастающая" << endl;
    if(temp_arr[index] == -1)
        cout << "Наибольшая по длине последовательность монотонно убывающая" << endl;
    cout << "Номер элемента с которого начинается данная последовательность - " << index+1 << endl;
    cout << "Последовательность состоит из " << delta+1 << " значений." << endl;
    cout << "Последовательность: ";
    for (int i=0; i<delta+1; i++)
    {
        cout << arr[index+i] << " ";
    }
    cout << endl;
    return 0;
}
Добавлено через 13 часов 19 минут
Не у меня с математикой плохо ночью) 1 3 5 тоже монотонная последовательность, тогда, наверно, так
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
61
62
63
64
65
66
67
68
69
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int N;
    const int MAX = 1000;
    int arr[MAX], temp_arr[MAX];
    
    //Ввод массива
    cout << "Введите размерность массива: ";
    cin >> N;
    cout << "Заполните массив:\n";
    for (int i=0; i<N; i++)
    {
        cout << i+1 << " элемент: ";
        cin >> arr[i];
    }
 
    //создаю массив для отслеживания последовательносетей
    for (int i=0; i<N-1; i++)
    {
        temp_arr[i] = arr[i] - arr[i+1];
    }
 
 
    //вычисление наибольшей последовательности
    int index=0, delta=0, temp_ind=0, temp_del=0;
    temp_ind = 0;
    temp_del = 1;
 
    for (int i=0; i<N; i++)
    {
        if (temp_arr[i] == temp_arr[i+1])
        {
            temp_del++;
        }
        else
        {
            if(temp_del > delta)
            {
                index = temp_ind;
                delta = temp_del;
            }
            temp_del = 1;
            temp_ind = i+1;
        }
    }
    cout << endl;
 
    // Вывод введенного массива
    for (int i=0; i<N; i++)
        cout << arr[i] << " ";
    cout << endl;
    if(temp_arr[index] < 0)
        cout << "Наибольшая по длине последовательность монотонно возрастающая" << endl;
    if(temp_arr[index] > 0)
        cout << "Наибольшая по длине последовательность монотонно убывающая" << endl;
    cout << "Номер элемента с которого начинается данная последовательность - " << index+1 << endl;
    cout << "Последовательность состоит из " << delta+1 << " значений." << endl;
    cout << "Последовательность: ";
    for (int i=0; i<delta+1; i++)
    {
        cout << arr[index+i] << " ";
    }
    cout << endl;
    return 0;
}
Yandex
Объявления
27.11.2010, 15:40     Массивы(статические)
Ответ Создать тему
Опции темы

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