Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
1

Сортировка чисел в строке в порядке возрастания

27.12.2015, 22:40. Показов 6238. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код:
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main()
{
   int p = 0;
   int k=0;
char str[]="54 -6 23 -56 27 -15 17 -23 0 -5 6 0 24 -11 82 -90 43 -31";
printf("Iskhodnaya posl. chisel\n");
printf("%s", str);
int l=strlen(str);
   int i, j;
   for (i = 0; i < l; ++i) {
      for (j = l - 1; j > i; j--)
      {
         if (strchr("1234567890 -", str[j])) {
            int t = str[j - 1];
            str[j - 1] = str[j];
            str[j] = t;
         }
      }
   }
   
printf("\nKonechnaya posl. chisel\n");
printf("%s", str);
 
 printf("\n");
return 0;
}
Исправьте, пожалуйста, часть кода. Срочно!
Выдается вот какой результат:
Миниатюры
Сортировка чисел в строке в порядке возрастания  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2015, 22:40
Ответы с готовыми решениями:

Сортировка 3 чисел в порядке возрастания
Добрый день, я начинающий с++ программист. Есть у меня задание, необходимо отсортировать введенные...

Сортировка 3-х значных чисел в порядке возрастания
Надо написать программу на С++. Сортировка 3-х значных чисел в порядке возрастания))

Сортировка чисел массива в порядке возрастания
Доброго времени суток всем. Я новичок , написал код для сортировки чисел массива в порядке...

Сортировка чисел в порядке возрастания в массиве
помогите написать программу на C++. Которая сортирует числа в порядке возрастания в массиве.

13
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
28.12.2015, 10:23 2
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
#include <stdio.h>
#include <malloc.h>
static const char* parse_int(const char* s, int* i, int ig);
static int int_to_str(char* d, int n);
char* str_isort(char* s);
 
int main(void) {
    char s[] = "54 -6 23 -56 27 -15 17 -23 0 -5 6 0 24 -11 82 -90 43 -31";
    puts(s);
    puts( str_isort(s) );
    return 0;
}
 
//сортировка чисел в строке(алгоритмом вставками)
char* str_isort(char* s){
    int*  a, n, i, j, k;
    const char* p;
    char* t = s;
 
    for(p = s, n = 0; (p = parse_int(p, &k, 1)) != NULL; )
        ++n;
 
    if(!n)
        return t;
 
    a = (int*)malloc((size_t)n * sizeof(int));
    if(a == NULL)
        return t;
 
    for(p = s, k = 0; (p = parse_int(p, &a[k], 0)) != NULL; )
        ++k;
 
    //сортируем
    for(i = 1; i < n; ++i){
        k = a[i];
        j = i - 1;
        while((j >= 0) && (a[j] > k)){
            a[j + 1] = a[j];
            --j;
        }
        a[j + 1] = k;
    }
 
    //выводим в строку
    for(i = 0; i < n; ++i){
        j  = int_to_str(s, a[i]);
        s += j;
        if(i < (n - 1))
            *s++ = ' ';
    }
    *s = '\0';
    free(a);
    return t;
}
 
//парсирование целых чисел из строки
static const char* parse_int(const char* s, int* i, int ig){
    const char* p;
    int m, n = 0;
    if(! *s)
        return NULL;
 
    while(*s && (*s == ' ' || *s == '\t'))
        ++s;
    if(m = (*s == '-'))
        ++s;
    
    p = s;
    while(*s >= '0' && *s <= '9'){
        if(!ig)
            n = n*10 + (int)(*s - '0');
        else
            n = 1;
        ++s;
    }
    if(p == s)
        return NULL;
 
    if(!ig && m)
        n = -n;
    *i = n;
    return s;
}
 
//преобразование из числа в строку
static int int_to_str(char* d, int n){
    char* t, c, *i, *o = d;
    if(n < 0){
        n    = -n;
        *d++ = '-';
    }
 
    t = d;
    do {
        *d++ = (char)(n % 10) + '0';
    } while((n /= 10) != 0);
    *d = '\0';
 
    if(t != d){
        for(i = d - 1; t < i; ++t, --i)
            c = *t, *t = *i, *i = c;
    }
    return (int)(d - o);
}
0
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
28.12.2015, 13:59  [ТС] 3
А если нам потребуется ввести исходную строку, то как расписать код?

Добавлено через 6 минут
Вопрос снят.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
28.12.2015, 18:15 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Считая, что строка содержит только числа, и не заморачиваясь изобретением велосипеда, бахнем по воробьям из пушки
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
/* ANSI C 99 */
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <glib.h>
 
gint key_cmp(gconstpointer a, gconstpointer b) {
    return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b);
}
 
gboolean tree_to_string(gpointer key, gpointer value, gpointer data) {
    int nKey = GPOINTER_TO_INT(key);
    int nValue = GPOINTER_TO_INT(value);
    GString * sData = (GString*)data;
    
    for ( int i = 0; i < nValue; ++i )
        g_string_append_printf(sData, "%d ", nKey);
    
    return FALSE;
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        GTree * tree = g_tree_new(key_cmp);
        
        for ( char * tok = strtok(buf, DELIM); tok; tok = strtok(NULL, DELIM) ) {
            int n = atoi(tok);
            g_tree_insert(tree, GINT_TO_POINTER(n), GINT_TO_POINTER(GPOINTER_TO_INT(g_tree_lookup(tree, GINT_TO_POINTER(n))) + 1));
        }
        
        GString * str = g_string_new("");
        g_tree_foreach(tree, tree_to_string, str);
        printf("Result: %s\n", str->str);
        
        g_tree_destroy(tree);
        g_string_free(str, TRUE);
    }
    
    return 0;
}
Код
[andrew@andrew glib]$ gcc -std=c99 sort_in_string.c `pkg-config --cflags --libs glib-2.0`
[andrew@andrew glib]$ ./a.out 
String: 45 -8 3 14 9 97 83
Result: -8 3 9 14 45 83 97 
String: 32 23 32 23
Result: 23 23 32 32 
String: 
[andrew@andrew glib]$
1
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
28.12.2015, 18:31  [ТС] 5
C
1
#include <glib.h>
Что это за библиотека? За что она отвечает?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
28.12.2015, 18:39 6
Цитата Сообщение от Dionisius Посмотреть сообщение
Что это за библиотека?
https://ru.wikipedia.org/wiki/GLib
0
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
28.12.2015, 22:32  [ТС] 7
easybudda, если не трудно, то можно ли расписать комментарии к проге?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
28.12.2015, 23:55 8
Цитата Сообщение от Dionisius Посмотреть сообщение
если не трудно, то можно ли расписать комментарии к проге?
Не трудно, лень. В общих чертах: строим дерево, ключами в котором будут числа, прочитанные из строки, а значениями - счётчики (количество встреч числа в строке). А потом обходим получившееся дерево функцией tree_to_string, которая получает параметрами ключ, значение и строку и добавляет к строке ключ в цикле столько раз, сколько это число (ключ) в исходную строку входит. Да и всё собственно. Подробности в документации к glib.
0
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
28.12.2015, 23:57  [ТС] 9
А есть другой вариант: как можно отсортировать строку, если необходимо будет использовать файл(-ы)? (ваш последний код могут не зачесть)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
29.12.2015, 00:06 10
Цитата Сообщение от Dionisius Посмотреть сообщение
как можно отсортировать строку, если необходимо будет использовать файл(-ы)?
Это что значит? Прочитать числа из файла (текстового судя по топику) отсортировать и обратно в файл? Зачем тогда файл строками читать? Если там кроме чисел ничего нет, то числа и читайте
C
1
2
3
( while ( fscanf(filePointer, "%d", &intVariable) == 1 ) {
    /* остальное то же самое */
}
Цитата Сообщение от Dionisius Посмотреть сообщение
ваш последний код могут не зачесть
Могут, конечно, интересно было бы мотивировку услышать...
0
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
29.12.2015, 00:21  [ТС] 11
А что касается библиотеки glib.h, то мы не изучали в институте её ни разу

Хотелось бы, чтобы программа могла работать как на Linux, так и на Windows, что тоже неплохо. Что нужно заменить?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
29.12.2015, 00:30 12
Цитата Сообщение от Dionisius Посмотреть сообщение
А что касается библиотеки glib.h, то мы не изучали в институте её ни разу
Ну и зря...
Цитата Сообщение от Dionisius Посмотреть сообщение
Хотелось бы, чтобы программа могла работать как на Linux, так и на Windows, что тоже неплохо.
glib - кроссплатформенная библиотека. Просто в линухах она родная и как правило уже присутствует, в других системах её ставить нужно. У меня в Mac OS X её тоже не было, поставил - реально удобная штука.
0
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
29.12.2015, 00:57  [ТС] 13
Пытался скомпилировать на ideone.com - та же самая ошибка.
0
2 / 2 / 0
Регистрация: 19.10.2013
Сообщений: 159
28.01.2016, 17:56  [ТС] 14
Снова поднимаю тему: Что написано выше, это не совсем то для меня.

Более менее работающий код, но с ошибками:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void sort(char *str)
{
    int i;
    int m;
    int A[m];
    int n;
    int p;
    for (i=1; i=n-1; i++)
    {
        for (m=i+1; m<n; m++)
        {
            if(A[i]>A[m])
            {
                p=A[i];
                A[i]=A[m];
                A[m]=p;
            }
        }
    }
}
 
 
int main()
{
    char str[80];
    char str1[80];
    FILE *fp1;
    fp1=fopen("r", "test1.txt");
    FILE *fp2;
    fp2=fopen("r", "test2.txt");
    printf("Vvedite stroku chisel: \n");
    scanf("%s", str);
    int k,n;
    int i,j;
    while (!EOF)
    {
        fprintf(fp1, "%s", str);
        i=1;
        k=strlen(str);
        while (str[i]!='\n')
        {
            if (((str[i]>='0')&&(str[i]<='9'))&&(!(str[i-1]=='0')||!(str[i-1]=='1')||!(str[i-1]=='2')||!(str[i-1]=='3')||!(str[i-1]=='4')||!(str[i-1]=='5')||!(str[i-1]=='6')||!(str[i-1]=='7')||!(str[i-1]=='8')||!(str[i-1]=='9')))
            {
                n=n+1;
                j=i;
            while((str[i]!='\n')&&((str[i]>='0')&&(str[i]<='9')))
            {
                j=j+1;
            }
            
            i=i+k;
            }
            else
            i=i+1;
        }
        }
        printf("Konechnaya posledovatelnost: \n");
        sort(str);
        printf("%s", str);
    fclose(fp1);
    fclose(fp2);
    return 0;
    }
Можете, пожалуйста, исправить ошибки, если вы их сейчас видите?

Добавлено через 20 часов 35 минут
Уже разобрался: https://www.cyberforum.ru/post8555377.html
Только вместо puts надо поставить gets - вот и вся соль!

Добавлено через 20 часов 18 минут
Стоп, один вопрос: если хочу откомпилировать в Линуксе, есть ли какая нибудь альтернатива функции gets() - чтобы не работать с файлами?
0
28.01.2016, 17:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2016, 17:56
Помогаю со студенческими работами здесь

Сортировка чисел из файла в порядке возрастания (перевод с Паскаля)
Хотелось бы, чтобы вы преобразовали код отсюда: https://www.cyberforum.ru/post1994072.html из...

Дана последовательность чисел a1, a2 , ., an. Представить в порядке возрастания. Сортировка обменом
Дана последовательность чисел a1, a2 , ..., an. Требуется представить числа в порядке возрастания....

Найти максимально длинный порядок чисел, идущих в порядке возрастания в строке
4)найти максимально длинный порядок чисел идущих в порядке возрастания в строке

Сортировка массива в порядке возрастания и вывод элементов в обратном порядке
нашла на форуме пару примеров, но они не полные и не запускаются, выбрала из них более менее...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru