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

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

06.03.2018, 19:54. Показов 2587. Ответов 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
8217 / 5048 / 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
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru