Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577

Выполнить сортировку элементов последовательности по возрастанию

06.03.2018, 19:54. Показов 2535. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дано натуральное число N и одномерный массив A1, A2, ..., AN символьных элементов. Выполнить сортировку элементов последовательности по возрастанию.

Если нужно выполнить сортировку, то символы массива - числа, я правильно понимаю?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2018, 19:54
Ответы с готовыми решениями:

Выполнить сортировку массива чисел по возрастанию методом пузырька
Из файла числа вводит, сортировку по возрастанию делает, но почему-то выводит мусор в файл. Подскажите пожалуйста, в чем проблема ...

Выполнить сортировку элементов массива по возрастанию
Дан массив А. Выполнить сортировку элементов массива по возрастанию. Вывести новый массив на печать. Найти сумму всех нечётных элементов...

Выполнить сортировку по возрастанию элементов массива кратных 3 и 5
Сформировать массив 25 целых случайных чисел в диапазоне от минус 40 до 60. Напечатать его. Выполнить сортировку по возрастанию только...

37
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.03.2018, 13:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от drfaust Посмотреть сообщение
1251 - обе многобайтные кодировки
Нет.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
19.03.2018, 14:26
1251 - 2 байта, а не один, а значит многобайтная, напрямую в wchar_t не закинуть, т.к. wchar_t подразумевает utf-16 или utf-32(в зависимости от реализации), но не мелкософтовый cp1251 (именно поэтому они сделали MultiByteToWideChar() - перекидывают свою cp1251(или что там, в зависимости от локали) в utf-fixed_size (utf-8 не фиксирован, может быть разной длины))
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
19.03.2018, 14:36
Цитата Сообщение от easybudda Посмотреть сообщение
Как же в этих ваших виндовсах всё непросто...
Это вы зря.. В виндовс ещё всё ОСТАЛОСЬ по уму, так как нужно..
Цитата Сообщение от easybudda Посмотреть сообщение
Как же в этих ваших виндовсах всё непросто...
Виндовс здесь ни причём.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
19.03.2018, 15:32
Цитата Сообщение от drfaust Посмотреть сообщение
1251 - 2 байта,
Дико извиняюсь, действительно CP1251 обнобайтная и схожа в этом с CP866. Т.е. если мы уверены, что входная кодировка точно CP1251 то можем её сортировать как обычный unsigned char.
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
19.03.2018, 16:11  [ТС]
Много заумных фраз и определений для начинающего. Я так и не понял что делать с моим кодом. Понятно дело, что нужно сортировать как unsigned char, но как это реализовать? Наброски есть(выше кидал).
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
19.03.2018, 16:23
Для большинства простых сортировок необходимо 2 цикла, а не один: http://algolist.manual.ru/sort/bubble_sort.php
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
19.03.2018, 16:43
Teylor, я бы Ваш код подправил следующим образом:
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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    unsigned char str[256];
    int n, i, j;
    unsigned char ch;
 
    printf("Введите строку элементов массива:\n");
    gets_s((char*)str, 256);
 
    n = strlen((char*)str);
 
    printf("\nМассив имеет вид: ");
    printf("%s", str);
 
    for(i = 0; i<n-1; i++)
    {
        for(j=i+1; j<n; j++)
            if (str[j] < str[i])
            {
                ch = str[i];
                str[i] = str[j];
                str[j] = ch;
            }
    }
 
    printf("\n\nОтсортированный массив: ");
    printf("%s\n\n", str);
    return 0;
}
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
19.03.2018, 20:27  [ТС]
liv, нужно с указателями и динамическим массивом.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
19.03.2018, 20:34
Teylor, ну сделайте с указателями и динамическим массивом... Что мешает?
Сделайте, покажите, мы подправим, если что.
Кстати, в условии об этом не сказано ни слова...
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
19.03.2018, 20:40  [ТС]
liv, уточняю в чем проблема: в уже отсортированном массиве выводит те же символы, что и до якобы сортировки. Нужно символы типа unsigned char преобразовать ascii коды и уже их сравнивать, верно? но как преобразовать unsigned char в ascii? На всякий случай, скину еще раз то, что есть.
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "rus");
    unsigned char *ptr = NULL;
    unsigned char *t;
    unsigned char *ptr_end;
    int n;
    printf("Введите количество элементов: ");
    scanf("%d", &n);
 
    ptr = (unsigned char *) malloc(n*sizeof(unsigned char));
    if(!ptr){
        printf("Память не выделена!");
        exit(1);
    }
    ptr_end = ptr + n;
    printf("Введите элементы массива через пробел:\n");
    for(t = ptr; t<(ptr_end+1+(n-1)); t++){
        *t = getchar();
    }
 
    printf("\nМассив имеет вид: ");
    for(t = ptr; t<(ptr_end+1+(n-1)); t++){
        printf("%c", *t);
    }
 
    int j, buf, bufMassiv[100];
    for(t = (ptr_end) - 1; t >= ptr; t--){
            for(j = 0; j<*t; j++){
        if (*ptr > (*t) + 1)
                    {
                        buf = bufMassiv[j];
                        bufMassiv[j] = bufMassiv[j + 1];
                        bufMassiv[j + 1] = buf;
                    }
              }
        }
 
 
    printf("\n\nОтсортированный массив: ");
    for(t = ptr; t<(ptr_end+1+(n-1)); t++){
        printf("%c", *t);
    }
    printf("\n\n");
    free(ptr);
 return 0;
}
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
19.03.2018, 20:45
Посмотрите, как у меня сделана сортировка (в два цикла).
Творчески переработайте. У себя посмотрите, зачем Вам массив bufMassiv?

Добавлено через 1 минуту
И ничего не надо преобразовывать. Просто берете элементы массива и сравниваете...
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
20.03.2018, 17:08  [ТС]
Вроде все уладил, кроме сортировки(переделанной), но теперь один символ как будто вылетает, т.к. вывод абсолютно не его. Почему так?
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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main()
{
    system ("chcp +1251> nul");
    unsigned char *ptr = NULL;
    unsigned char *t, *k;
    unsigned char *ptr_end;
    int n;
    printf("Введите количество элементов: ");
    scanf("%d", &n);
 
    ptr = (unsigned char *) malloc(n*sizeof(unsigned char));
    if(!ptr){
        printf("Память не выделена!");
        exit(1);
    }
    int i = 0;
    ptr_end = ptr + n;
    for(t = ptr; t<ptr_end; t++){
        printf ("Введите %d элемент массива:", i+1);
        i += 1;
        getchar();
        ptr[*t] = getchar();
    }
 
    printf("\nМассив имеет вид: ");
    for(t = ptr; t<ptr_end; t++){
        printf("%c", ptr[*t]);
    }
 
    for(t = ptr; t < ptr_end; t++){
            for(k = ptr; k<ptr_end-1; k++){
                if (ptr[*k] > ptr [*k])
                    {
                        int buf = ptr[*k];
                        ptr[*k] = ptr[*k + 1];
                        ptr[*k + 1] = buf;
                    }
              }
        }
 
    printf("\n\nОтсортированный массив: ");
    for(t = ptr; t<ptr_end; t++){
        printf("%c", ptr[*t]);
    }
    printf("\n\n");
    free(ptr);
 return 0;
}
Миниатюры
Выполнить сортировку элементов последовательности по возрастанию  
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
20.03.2018, 17:23
Цитата Сообщение от Teylor Посмотреть сообщение
C
1
2
getchar();
ptr[*t] = getchar();
Зачем первый getchar?

Добавлено через 1 минуту
Цитата Сообщение от Teylor Посмотреть сообщение
ptr[*t]
А это что? обращаемся к массиву по индексу, который равен некоему символу(который располагается по адресу t)
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
20.03.2018, 17:34  [ТС]
drfaust, если убрать *, то компилятор ругается, т.к. не int. Если убрать
getchar();
, то ввод начнется с второго символа. У меня уже диссонанс.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
20.03.2018, 17:56
Лучший ответ Сообщение было отмечено Teylor как решение

Решение

Просто надо вычищать символьный буффер:
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
#include    <stdio.h>
#include    <stdlib.h>
 
int main(void)
{
    unsigned char *ptr = NULL;
    unsigned char *t, *k;
    unsigned char *ptr_end;
    int n;
    printf("Введите количество элементов: ");
    scanf("%d", &n);
 
    ptr = (unsigned char *) malloc(n*sizeof(unsigned char));
    if(!ptr){
        printf("Память не выделена!");
        return 1;
    }
 
    ptr_end = ptr + n;
    n=0; /*n нам больше не нужна*/
 
    for(t = ptr; t<ptr_end; t++){
    while (getchar() != '\n'); /*вычищаем буфер ввода*/
        printf ("Введите %d элемент массива:", n+1);
        n += 1;
        *t = (unsigned char)getchar(); /*t у нас указатель на текущий символ в массиве, вот по его месту и записываем считанное, предварительно преобразовав из инта*/
    }
 
    printf("\nМассив имеет вид: ");
 
    for(t = ptr; t<ptr_end; t++){
        printf("\t%c", *t);
    }
return 0;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[faust@archlinux РАзная всячина]$ gcc --ansi 1.c 
[faust@archlinux РАзная всячина]$ ./a.out
Введите количество элементов: 10
Введите 1 элемент массива:sd
Введите 2 элемент массива:bh
Введите 3 элемент массива:sdfg
Введите 4 элемент массива:654
Введите 5 элемент массива:3456
Введите 6 элемент массива:3
Введите 7 элемент массива:78
Введите 8 элемент массива:9
Введите 9 элемент массива:2w
Введите 10 элемент массива:56
 
Массив имеет вид:     s   b   s   6   3   3   7   9   2   5[faust@archlinux РАзная всячина]$
0
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
20.03.2018, 18:47  [ТС]
drfaust, а с какой целью его нужно вычищать?
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
20.03.2018, 21:07
Потому что там висит "\r\n" (для DOS) или "\n"(для linux), которые были нажаты ранее (на scanf(размер массива) или что-то ещё), вот getchar его и ловит - для человека получается, что вводим не то что хотим. Если без него можно ввести сразу "10asdfghjkl; Enter" - тогда отработает нормально и без очистки буфера (10 возбмёт scanf, остальные символы getchar), но что если мы введём "10 0987654321"(без пробела) - тогда сканф попытается считать все цифры, что влезут в переменную(для long int вроде все втиснуться)

Добавлено через 2 минуты
Методов море, но большинство работает в той или иной среде(что работает под виндой - fflush(stdin) может не работать под линухой). У этого метода тоже есть недостатки, если я хочу ввести символы подряд(без Ентер`ов между ними - он считает только первый символ - остальные "зачистит" цикл_getchar)
1
14 / 14 / 0
Регистрация: 01.12.2017
Сообщений: 577
20.03.2018, 22:37  [ТС]
Спасибо всем, кто помогал.

Вот код рабочей проги, может кому-то пригодится

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 <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <locale.h>
 
int main()
{
    //system ("chcp +1251> nul");
    setlocale(LC_ALL, "rus");
    unsigned char *ptr = NULL;
    unsigned char *t, *k;
    unsigned char *ptr_end;
    int n;
    printf("Введите количество элементов: ");
    scanf("%d", &n);
 
    ptr = (unsigned char *) malloc(n*sizeof(unsigned char));
    if(!ptr){
        printf("Память не выделена!");
        return 1;
    }
 
    ptr_end = ptr + n;
    n = 0; /*n нам больше не нужна*/
 
    for(t = ptr; t<ptr_end; t++){
    while (getchar() != '\n'); /*вычищаем буфер ввода*/
        printf ("Введите %d элемент массива:", n+1);
        n += 1;
        *t = (unsigned char)getchar(); /*t у нас указатель на текущий символ в массиве, вот по его месту и записываем считанное, предварительно преобразовав из инта*/
    }
 
    printf("\nМассив имеет вид: ");
 
    for(t = ptr; t<ptr_end; t++){
        printf("%c  ", *t);
    }
 
    for(t = ptr; t < ptr_end; t++){
            for(k = ptr; k<ptr_end-1; k++){
                if (*k > *t)
                    {
                        unsigned char tmp = *t;
                        *t = *k;
                        *k = tmp;
                    }
              }
        }
 
    printf("\n\nОтсортированный массив: ");
    for(t = ptr; t<ptr_end; t++){
        printf("%c  ",  *t);
    }
    printf("\n\n");
    free(ptr);
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.03.2018, 22:37
Помогаю со студенческими работами здесь

Выполнить сортировку элементов в каждой строке матрицы по возрастанию
Задана матрица целых чисел . выполнить сортировку элементов в каждой строке матрицы по возрастанию помогите:cry:

Выполнить сортировку элементов заданной строки матрицы по возрастанию
Добрый вечер, помогите пожалуйста с решением задачи. Дана квадратная матрица. Выполнить сортировку элементов k-ой строки по...

Выполнить сортировку элементов главной диагонали массива по возрастанию и убыванию
Доброго времени суток. Уважаемые знатоки , помогите пожалуйста решить задачу : во вложении программа создающая массив из случайных чисел в...

Выполнить сортировку элементов массива по возрастанию. Вывести новый массив на печать
Дан массив А. Выполнить сортировку элементов массива по возрастанию. Вывести новый массив на печать. Определить номер элемента а в новом...

Задана матрица целых чисел. Выполнить сортировку элементов в каждом столбце матрицы по возрастанию
Плиз)))) Задана матрица целых чисел. Выполнить сортировку элементов в каждом столбце матрицы по возрастанию!!!)))) Зарание респект!)


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru