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

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

Войти
Регистрация
Восстановить пароль
 
 
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
#1

Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть - C++

09.07.2015, 15:04. Просмотров 1164. Ответов 15
Метки нет (Все метки)

Здравствуйте, у меня тут такая задача, я что-то уже совсем запуталась с ней,
Необходимо отсортировать первые две трети массива в порядке возрастания если среднее арифметическое всех элементов больше заданного с клавиатуры значения; иначе - лишь первую треть. Остальную часть массива не сортировать а расположить в обратном порядке.
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
#include<iostream>
using namespace std;
void main()
{
const int size=10;
int Mas[size]={8,4,3,5,1,7,9,6,2,5};
int cursize=0;
cout<<"Please enter current size:\t";
cin>>cursize;
int max=Mas[0];
for(int i=0; i<cursize; i++)
{
    if(max<Mas[i])
        max=Mas[i];
}
int index=cursize/3;
int sum=0;
int aver=0;
for(int i=0; i<cursize; i++)
    {
        sum+=Mas[i];
    }
aver=sum/cursize;
int indexf=0;
int temp=0;
if(aver<max)
{
for(int i=0; i<index-1; i++)
    {
        indexf=i+1;
        temp=Mas[indexf];
        for(int j=i+1; j>0; j--)
        {
        if(temp<Mas[j-1])
        {
        Mas[j]=Mas[j-1];
        indexf=j-1;
        }
        Mas[indexf]=temp;
        }
    }
}
int temp1=0;
for(int i=index; i<cursize; i++)
    {
        temp1=Mas[i];
        Mas[i]=Mas[cursize-1];
        Mas[cursize-1]=temp1;
    
    }   
for(int i=0; i<cursize; i++)
    cout<<Mas[i];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть (C++):

Доделать и исправить. Дано слово из 12 букв. Поменять местами его трети: первую треть разместить на месте третьей, вторую на месте первой и 3 на 2 - C++
#include&lt;stdio.h&gt; #include&lt;iostream.h&gt; int main(void) { int i,j; char slovo; for(i=0;i&lt;4;i++) { for(j=0;j&lt;3;j++) ...

Первые десять элементов массива М(30) отсортировать в порядке возрастания, а остальные в порядке убывания - C++
Привет. Первые десять элементов массива М(30) отсортировать в порядке возрастания, а остальные в порядке убывания. Вот тут я сделал массив...

Отсортировать в порядке возрастания все положительные элементы массива - C++
В массиве из n вещественных чисел отсортировать в порядке возрастания все положительные элементы. Отрицательные и нулевые элементы оставить...

Не используя других массивов, отсортировать положительные элементы массива в порядке возрастания - C++
Нужно задать массив В целых чисел. Не используя других массивов, отсортировать положительные элементы массива в порядке возрастания, а...

Вывести в порядке возрастания элементы массива, целая часть которых - нечетное число - C++
в массиве 100 вещ чисел (от 3 до 35). как вывести в порядке возрастания элементы, целая часть которых нечетное число? знаю вроде только как...

Развернуть первую строку матрицы в обратном порядке - C++
{ for(i=0; i&lt;1; i++) for (j = g-1; j &gt;= 0; j--) cout&lt;&lt;*(*(x+i)+j)&lt;&lt;&quot; &quot;; cout&lt;&lt;endl; ...

15
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
09.07.2015, 15:52 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
дано массив из 18 чисел , если среднее знач 2/3 массива ( первых 12 чисел ) больше указаного то сортируем ети 2/3, если нет то 1/3 что в конце)

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
86
87
88
89
90
91
92
93
94
95
96
97
98
const int sz = 18;
 
void sortArrayOne(int arr[], int halfPath);
void sortArrayTwo(int arr[], int halfPath);
 
int main()
{
    setlocale(LC_ALL, "rus");
    int myArray[sz];
    float averageNum = 0.0;
    float resAV = 0.0;
    int halfPath = 0;
 
    cout << "\nВведите среднее значение -> ";
    cin >> averageNum;
 
    srand(time(NULL));
    halfPath = (sz / 3) * 2;
 
    //Заповняємо масив
    for (int i = 0; i < sz; i++)
    {
        myArray[i] = rand() % 100 + 1;
    }
    //Виводимо масив
    cout << "\nВыводим массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        cout << " " << myArray[i];
    }
    //Сумуємо 2/3 масиву не чіпаючи 1/3
    for (int i = 0; i < halfPath; i++)
    {
        resAV += myArray[i];
        if (i == halfPath - 1)
        {
            resAV = resAV / i;
        }
    }
 
    //Провірка нашого значення
    if (resAV > averageNum)
    {
        cout << "\n\nСортируем №1 \n";
        sortArrayOne(myArray, halfPath);
    }
    if (resAV < averageNum)
    {
        cout << "\n\nСортируем №2 \n";
        sortArrayTwo(myArray, halfPath);
    }
 
    //Вивід
    cout << "\n\nВыводим сортированный массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        cout << " " << myArray[i];
    }
    
    cout << "\n\n";
    return 0;
}
 
void sortArrayOne(int arr[],int halfPath )
{
    int tmp = 0;
 
    for (int i = 0; i < halfPath; i++)
    {
        for (int j = i+1; j < halfPath; j++)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
 
void sortArrayTwo(int arr[], int halfPath)
{
    int tmp = 0;
 
    for (int i = halfPath; i < sz - 1; i++)
    {
        for (int j = i + 1; j < sz; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 11:33  [ТС] #3
Спасибо большое и действительно не правильно поняла суть задачи, но тем еще есть продолжение... нужно вторую часть отсортировать в противоположном направлении))
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 13:16 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавлено через 32 минуты
вот код который сортирует ( сори есле не так понял )

1 вариант :

2/3 от мин к макс | 1/3 от мак к мин
----------------> | <---------------

2 вариант:

2/3 от макс к мин | 1/3 от мин к макс
<----------------- | ----------------->

есле в if менять знаки можно изменить направление

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
const int sz = 18;
 
void sortArrayOne(int arr[], int halfPath);
void sortArrayTwo(int arr[], int halfPath);
void sortSecondPartOne(int arr[], int sz, int halfPath);
void sortSecondPartTwo(int arr[],int halfPath);
 
int main()
{
    setlocale(LC_ALL, "rus");
    int myArray[sz];
    float averageNum = 0.0;
    float resAV = 0.0;
    int halfPath = 0;
 
    cout << "\nВведите среднее значение -> ";
    cin >> averageNum;
 
    srand(time(NULL));
    halfPath = (sz / 3) * 2;
 
    //Заповняємо масив
    for (int i = 0; i < sz; i++)
    {
        myArray[i] = rand() % 100 + 1;
    }
    //Виводимо масив
    cout << "\nВыводим массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        if (i == 12)
        {
            cout << " |";
        }
        cout << " " << myArray[i];
    }
    //Сумуємо 2/3 масиву не чіпаючи 1/3
    for (int i = 0; i < halfPath; i++)
    {
        resAV += myArray[i];
        if (i == halfPath - 1)
        {
            resAV = resAV / i;
        }
    }
 
    //Провірка нашого значення
    if (resAV > averageNum)
    {
        cout << "\n\nСортируем №1 \n";
        sortArrayOne(myArray, halfPath);
    }
    if (resAV < averageNum)
    {
        cout << "\n\nСортируем №2 \n";
        sortArrayTwo(myArray, halfPath);
    }
 
    //Вивід
    cout << "\n\nВыводим сортированный массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        if (i == 12)
        {
            cout << " |";
        }
        cout << " " << myArray[i];
    }
 
    cout << "\n\n";
    return 0;
}
 
void sortArrayOne(int arr[], int halfPath)
{
    int tmp = 0;
 
    for (int i = 0; i < halfPath-1; i++)
    {
        if (i == halfPath - 2)
        {
            sortSecondPartOne(arr, sz, halfPath);
        }
        for (int j = i + 1; j < halfPath; j++)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }           
        }       
    }
}
 
void sortArrayTwo(int arr[], int halfPath)
{
    int tmp = 0;
    sortSecondPartTwo(arr, halfPath);
 
    for (int i = halfPath; i < sz - 1; i++)
    {
        for (int j = i + 1; j < sz; j++)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
 
void sortSecondPartOne(int arr[], int sz, int halfPath)
{
    int tmp = 0;
 
    for (int i = halfPath; i < sz-1; i++)
    {
        for (int j = i + 1; j < sz; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
 
void sortSecondPartTwo(int arr[],int halfPath)
{
    int tmp = 0;
 
    for (int i = 0; i < halfPath - 1; i++)
    {
        for (int j = i + 1; j < halfPath; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
Добавлено через 5 минут
C++
1
2
3
4
5
6
//Заголовочные файлы
#include <iostream>
#include <cstdlib> //for rand()
#include <ctime> //for srand(time(NULL));
 
using namespace std;
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 14:29  [ТС] #5
Спасибо, только у меня еще один вопрос, поскольку я еще не со всем тем что написано у тебя знакома, я по своему хочу вторую часть сделать, но почему-то не получается, это часть где нужно остаток то есть 1/3 массива расположить в обратном порядке.
Извини что надоедаю, но я с этим несколько часов уже сижу, где у меня тут ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int Mas[size]={8,4,3,5,1,7,9,6,2,5,7,3};
int segment=(cursize/3)*2
int cursize=12;
 
for(int i=segment; i<cursize; i++)
    {
        for (int j = cursize-1; j>segment; j--)
        {
        int temp1=Mas[i];
        Mas[i]=Mas[j];
        Mas[j]=temp1;
        
        }
    }
for(int i=0; i<cursize; i++)
    {
cout<<Mas[i];
}
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 14:40 #6
надо int cursize=12; определять первым а потом уже его использовать

Добавлено через 50 секунд
вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int Mas[12] = { 8, 4, 3, 5, 1, 7, 9, 6, 2, 5, 7, 3 };
    int cursize = 12;
    int segment = (cursize / 3) * 2;
        
 
    for (int i = segment; i<cursize; i++)
    {
        for (int j = cursize - 1; j>segment; j--)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
 
        }
    }
    for (int i = 0; i < cursize; i++)
    {
        cout << Mas[i];
    }
но кажись он у вас не правильно сортирует
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 14:52  [ТС] #7
Оно и так и так не работает, я не понимаю почему, переменная j не меняется,,,,

for(int i=segment; i<cursize; i++)
{
for (int j = cursize-1; j>segment; j--)
{
int temp1=Mas[i];
Mas[i]=Mas[j];
Mas[j]=temp1;
break;
}
}
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 14:52 #8
не меняеться потому что у вас есть break; ето = выход из цикла и при входе создаете новую переменную j
, приблизительно так :

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
int main()
{
    int Mas[12] = { 8, 4, 3, 5, 1, 7, 9, 6, 2, 5, 7, 3 };
    int cursize = 12;
    int segment = (cursize / 3) * 2;
 
 
    for (int i = segment; i<cursize-1; i++)//і буде йти до cursize-1
    {
        for (int j = i+1; j < cursize ; j++)//j присвоїли і+1 і будемо йти поки j < cursize
        {
            if (Mas[i] > Mas[j]) //провіряємо елемент за індексом і з всіма за індексом j
            {
                int temp1 = Mas[i];//ну тут все зрозуміло
                Mas[i] = Mas[j];
                Mas[j] = temp1;
            }
        }
    }
    for (int i = 0; i < cursize; i++)//виводимо 
    {
        cout << Mas[i] << " ";
    }
 
    cout << "\n\n";
    return 0;
}
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 15:09  [ТС] #9
Вот весь мой код
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
86
87
#include<iostream>
using namespace std;
void main()
{
const int size=12;
int Mas[size]={8,4,3,5,1,7,9,6,2,5,7,3};
int cursize=12;
cout<<"Please enter current size:\t";
cin>>cursize;
int max;
cout<<"Please enter digit:\t";
cin>>max;
int sum=0;
int segment=(cursize/3)*2;
for(int i=0; i<segment; i++)
    {
        sum+=Mas[i];
    
        if(i==segment-1)
        {
                sum=sum/segment;
        }
    }
int indexf=0;
int temp=0;
int radius=cursize/3;
if(max<sum)
{
     for (int i = 0; i < segment; i++)
    {
        for (int j = i; j < segment; j++)
        {
            if (Mas[i] > Mas[j])
            {
                temp = Mas[i];
                Mas[i] = Mas[j];
                Mas[j] = temp;
            }
        }
    }
 
for(int i=segment; i<cursize; i++)
    {
        for (int j = cursize-1; j>segment; j--)
        {
        int temp1=Mas[i];
        Mas[i]=Mas[j];
        Mas[j]=temp1;
        break;
        }
    }
for(int i=0; i<cursize; i++)
    {
    cout<<Mas[i];
    }
}
if(max>sum)
{
     for (int i = 0; i < radius; i++)
    {
        for (int j = i; j < radius; j++)
        {
            if (Mas[i] > Mas[j])
            {
                temp = Mas[i];
                Mas[i] = Mas[j];
                Mas[j] = temp;
            }
        }
    }
 
for(int i=radius; i<cursize; i++)
    {
        for (int j = cursize-1; j>radius; j--)
        {
        int temp1=Mas[i];
        Mas[i]=Mas[j];
        Mas[j]=temp1;
        
        }
    }
for(int i=0; i<cursize; i++)
    {
    cout<<Mas[i];
    }
}
}
Добавлено через 5 минут
я не про построение по порядку возрастания, а про расположение в обратном порядке., то есть

int Mas[size]={8,4,3,5,1,7,9,6,2,5,7,3}
сортируем конец то есть 1/3

должно получиться:
int Mas[size]={8,4,3,5,1,7,9,6,3,7,5,2}

Добавлено через 10 минут
Вы мне построение с возрастанием объясняете, спасибо, но мне не нужно проверять эти переменные а просто переставить их в обратном порядке,,
вот тут у меня беда
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 15:47 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
//=============================================================
if (max < sum)
{
    cout << "\nV 1 \n\n";
    
    for (int i = 0; i < segment; i++)
    {
        for (int j = i; j < segment; j++)
        {
            if (Mas[i] > Mas[j])
            {
                temp = Mas[i];
                Mas[i] = Mas[j];
                Mas[j] = temp;
            }
        }
    }
 
    for (int i = segment; i < cursize;)
    {
        for (int j = cursize - 1; j > segment + 1;)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
            j--;
            i++;
            continue;
        }
    }
 
    for (int i = 0; i<cursize; i++)
    {
        cout << Mas[i]<<" ";
    }
}
Добавлено через 15 минут
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
//=============================================================
if (max > sum)
{
    cout << "\nV 2 \n\n";
    for (int i = radius; i<cursize; i++)
    {
        for (int j = cursize - 1; j>radius; j--)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
 
        }
    }
 
    for (int i = radius; i<cursize; i++)
    {
        for (int j = cursize - 1; j>radius; j--)
        {
            temp = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp;
            j--;
            if (i == j)
            {
                i = 0123;//eror code
                break;
            }
            i++;
            continue;
         }
 
        if (i == 0123)
        {
            break;
        }
    }
    for (int i = 0; i < cursize; i++)
    {
        cout << Mas[i] << " ";
    }
}
//=============================================================
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 15:48  [ТС] #11
Спасибо огромное!!!!!!!!!!
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 16:07 #12
извините ошибся чуток ((( во 2 блоке из за
C++
1
2
3
4
5
6
7
8
9
10
for (int i = radius; i<cursize; i++)
    {
        for (int j = cursize - 1; j>radius; j--)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
 
        }
    }
не правильно сортирует есле и стереть то все норм

и забыл стереть j-- и i++.
правильно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for (int i = radius; i < cursize;)
    {
        for (int j = cursize - 1; j > radius+1;)
        {
            temp = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp;
            j--;
            if (i == j)
            {
                i = 0123;//eror code
                break;
            }
            i++;
            continue;
        }
 
        if (i == 0123)
        {
            break;
        }
    }
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 16:13  [ТС] #13
а что это такое?
(i == 0123)

Код ошибки, какой?
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 16:15 #14
когда і == j мы делаем break; но выходим только из 2 цикла чтоб выйти из 1 присвоили і значение 0123 и теперь когда і == 0123 мы выйдем и из 1 цикла.
1
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 126
10.07.2015, 16:20  [ТС] #15
то есть вместо i= 0123 можно присвоить i= 52142 Я правильно понимаю?
0
10.07.2015, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 16:20
Привет! Вот еще темы с ответами:

Отсортировать массив в порядке возрастания - C++
Помогите отсортировать массив в порядке возрастания. Input - 5 (кол-во элементов) 9 2 7 1 2 Output - 1 2 2 7 9

Отсортировать числа в порядке возрастания - C++
Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод или input.txt Вывод стандартный вывод или output.txt ...

Отсортировать матрицу в порядке возрастания элементов - C++
Здраствуйте! Прошу помочь написать код с помощью использования вложеных циклов, или как то так. Код не сильно заумным должен быть. Вот...

Отсортировать слова в строке в порядке возрастания - C++
Возможно неправильно сформулировал эту нубскую проблему в теме. Надеюсь меня поймете. :) Мне нужно отсортировать слова в строке в...


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

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

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