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

Простая сортировка выбором с использованием указателей - C++

Восстановить пароль Регистрация
 
dasisasha
0 / 0 / 0
Регистрация: 19.03.2014
Сообщений: 12
19.03.2014, 15:25     Простая сортировка выбором с использованием указателей #1
Всем доброго времени суток! Прошу участников форума подсказать как доработать программу, чтобы ее работа была корректной.
Нужно произвести сортировку массива по возрастанию (По возрастанию |masi|> x)
Программу написал, по возрастанию сортирует, но не могу понять как задать это значение x. Должна получиться сортировка массива меньше заданного х. Если не затруднит, можете подсказать как доработать программу?

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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
FILE *f_out=fopen("z8_out.txt","w");
time_t t;
time(&t);
printf("        %s", ctime(&t));
 
int z,im,x,n,mas[]={44,55,12,42,94,18,06,67,19,39,20,11,-19,51,29};
{printf("\n input n\n");
scanf("%d",&n);
printf(" value n=%2i\n",n);}
if(n>15)
{
printf("Error - n > size mas[]\n");
fprintf(f_out,"Error - n > size mas[]\n");
goto metka;
}
else
for(int i=0;i<n;i++) printf("%3i",mas[i]);
for(int i=0;i<n;i++) fprintf(f_out,"%3i",mas[i]);
printf("\n");
fprintf(f_out,"\n");
for(int k=n-1;k>=1;k--)
 
{im=0; x=1e-6;
for(int i=0;i<=k;i++)
if(abs(mas[i])>abs(x))
 
{
im=i;
x=*(mas+im);
}
 
*(mas+im)=*(mas+k);
*(mas+k)=x;
 
printf("\n  k=%d min element mas[i]=%d\n",k,x);
for(int j=0;j<n;j++)
printf("%3i", *(mas+j));
}
printf("\n");
for(int i=0;i<n;i++)
fprintf(f_out,"%3i",*(mas+i));
getch();
fclose(f_out);
metka:
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StelSvip
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 24
19.03.2014, 15:33     Простая сортировка выбором с использованием указателей #2
Ну например: забить все элементы массива которые меньше x, в новый массив. И потом уже отсортировать.
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
19.03.2014, 15:49     Простая сортировка выбором с использованием указателей #3
C++
1
2
3
4
5
6
7
{
 im=i;
 x=*(mas+im);
 }
 
 *(mas+im)=*(mas+k);
 *(mas+k)=x;
я так понимаю тут ты меняешь значения двух переменных, если это так то у тебя логическая ошибка

Добавлено через 1 минуту
связанная с областью видимости. Так же поясни что надо делать со значениями по модулю меньше х оставлять на месте или убирать из масива

Добавлено через 1 минуту
или оставлять их на левом краю?
StelSvip
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 24
19.03.2014, 15:57     Простая сортировка выбором с использованием указателей #4
Если нужна вывести все числа которые меньше x, то так можно:
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
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "");
    int N, x, k = 0;
    std::cout << "Введите N: ";
    std::cin >> N;
    int *arr = new int [N];
    for(int i = 0; i < N; i++)
    {
        std::cout << "arr[" << i << "] = ";
        std::cin >> arr[i];
    }
    std::cout << "Введите x: ";
    std::cin >> x;
    int *arr2 = new int [N];
    for(int i = 0; i < N; i++)
    {
        if(arr[i] < x)
        {
            arr2[k] = arr[i];
            k++;
        }
    }
    for(int i = 0; i < k; i++)
    {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }
    system("pause");
    return 0;
}
Ну и отсортировать если оно надо.

Добавлено через 5 минут
И еще у вас выход из программы при ошибке реализован через goto, не легче ли сделать exit(-1)?
dasisasha
0 / 0 / 0
Регистрация: 19.03.2014
Сообщений: 12
19.03.2014, 16:07  [ТС]     Простая сортировка выбором с использованием указателей #5
Цитата Сообщение от Winorun Посмотреть сообщение
Так же поясни что надо делать со значениями по модулю меньше х оставлять на месте или убирать из масива
Добавлено через 1 минуту
или оставлять их на левом краю?
сначала отсортировать массив по возрастанию, затем все числа(уже отсортированного массива), большие заданного х оставить в результат, остальные отбрасываются
StelSvip
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 24
19.03.2014, 16:11     Простая сортировка выбором с использованием указателей #6
C++
1
2
3
4
5
6
7
8
9
10
for(int i = 0 ; i < size ; i++) 
    { 
       for(int z = 0 ; z < size - i - 1 ; z++) 
       {  
           if(arr[z] > arr[z+1]) 
           {           
              int tmp = arr[z]; arr[z] = arr[z+1] ; arr[z+1] = tmp; 
           }
        }
    }
Вот вам сортировка по возрастанию. А как отсеять я выше писал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 17:41     Простая сортировка выбором с использованием указателей
Еще ссылки по теме:

C++ Обработка строки с использованием указателей
C++ Динамический массив с использованием указателей
Программа с использованием указателей C++

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

Или воспользуйтесь поиском по форуму:
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
19.03.2014, 17:41     Простая сортировка выбором с использованием указателей #7
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
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
 
void swap(int *n){
    int x=*n;
    *n=*(n+1);
    *(n+1)=x;
}
 
int main(){
ifstream in("input.txt");
ofstream out("out.txt");
 
if(!in){
    cerr << "file not font\n";
    return 1;
}
if(!out){
    cerr << "I can't open file\n";
    return 2;
}
 
int max;
in >> max;
 
int *mas = new int [max];
for(int i=0;i<max;i++){
    in >> mas[i];
}
in.close();
 
// сортируем, для простоты примера возмем обычный пузырек 
for(int i_1 = 0 ; i_1 < max ; i_1++) 
    for(int i_2 = 0 ; i_2 < max - i_1 - 1 ; i_2++) 
        if(abs(*(mas+i_2))>abs(mas[i_2+1]))swap(mas+i_2);
            
cout << "input x:";
int x;
cin >> x;
 
int pos;
for(int i=max-1;i!=-1;i--) // поиск в сортированом масиве(для лабораторной сойдет)
    if(abs(mas[i])>x)pos=i;
 
int *sortMas= new int [max-pos];
for(int i=pos,k=0;i<max;i++)// тут лудше использовать копирование памяти
        sortMas[k++]=mas[i]; // но можно и так
max=max-pos;
delete [] mas;
mas = sortMas;
 
for(int i=0;i<max;i++){
    out << mas[i] << " ";
    cout << mas[i] << " ";
}
 
out.close();
delete [] mas;
return 0;
}
Добавлено через 10 минут
сортировку только поправь у тебя алгоритм рабочий
Yandex
Объявления
19.03.2014, 17:41     Простая сортировка выбором с использованием указателей
Ответ Создать тему
Опции темы

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