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

сортировка qsort - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.73
staaas1k
2 / 2 / 0
Регистрация: 19.02.2010
Сообщений: 96
10.05.2010, 22:29     сортировка qsort #1
Есть динамический массив, содержащий строки
в строках слова, формат такой
аа
бб
вв
гг
Как сделать сортировку по алфавиту этого динамического массива
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2010, 22:29     сортировка qsort
Посмотрите здесь:

C++ qsort
C++ qsort
Сортировка имен с помощью qsort; C++
qsort C++
C++ qsort
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.05.2010, 23:34     сортировка qsort #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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
 
int cmp_func(const void *a, const void *b){
    return strcmp(*(char**)a, *(char**)b);
}
 
#define MAX_LEN 128
int main(void){
    int num, i;
    char **arr, buf[MAX_LEN], *p;
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    printf("Количество строк: ");
    if ( scanf("%d%*c", &num) != 1 || num < 2 ){
        fprintf(stderr, "Неверное значение!\n");
        exit(1);
    }
    if ( ( arr = (char**)calloc(num, sizeof(char*)) ) == NULL ){
        fprintf(stderr, "Ошибка памяти!\n");
        exit(1);
    }
    for ( i = 0; i < num; ++i ){
        printf("Строка #%d: ", i + 1);
        if ( ! fgets(buf, MAX_LEN, stdin) ){
            fprintf(stderr, "Ошибка чтения!\n");
            exit(1);
        }
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( ! *buf ){
            fprintf(stderr, "Пустая строка!\n");
            exit(1);
        }
        if ( ( arr[i] = strdup(buf) ) == NULL ){
            fprintf(stderr, "Ошибка памяти!\n");
            exit(1);
        }
    }
    
    qsort(arr, num, sizeof(char*), cmp_func);
    
    printf("Строки, отсортированные по возрастанию:\n");
    for ( i = 0; i < num; ++i )
        printf("%s\n", arr[i]);
    
    for ( i = 0; i < num; ++i )
        free(arr[i]);
    free(arr);
    
    exit(0);
}
staaas1k
2 / 2 / 0
Регистрация: 19.02.2010
Сообщений: 96
10.05.2010, 23:37  [ТС]     сортировка qsort #3
спасибо большое, а если строки не вводятся с клавиатуры а считываются из файла как тогда?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.05.2010, 23:52     сортировка qsort #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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
 
int cmp_func(const void *a, const void *b){
    return strcmp(*(char**)a, *(char**)b);
}
 
int main(void){
    FILE *f;
    long num, i;
    char **arr, buf[BUFSIZ], *p;
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    printf("Имя файла: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        fprintf(stderr, "Ошибка чтения!\n");
        exit(1);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf ){
        fprintf(stderr, "Пустая строка!\n");
        exit(1);
    }
    if ( ( f = fopen(buf, "r") ) == NULL ){
        fprintf(stderr, "Ошибка открытия файла!\n");
        exit(1);
    }
    
    arr = NULL;
    num = 0;
    while ( fgets(buf, BUFSIZ, f) ){
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( ! *buf )
            continue;
        if ( ( arr = realloc(arr, sizeof(char*) * (num + 1)) ) == NULL ){
            fprintf(stderr, "Ошибка памяти!\n");
            fclose(f);
            exit(1);
        }
        if ( ( arr[num++] = strdup(buf) ) == NULL ){
            fprintf(stderr, "Ошибка памяти!\n");
            fclose(f);
            exit(1);
        }
    }
    fclose(f);
    
    printf("\nСтроки, прочитанные из файла:\n");
    for ( i = 0; i < num; ++i )
        printf("%s\n", arr[i]);
    
    qsort(arr, num, sizeof(char*), cmp_func);
    
    printf("\nСтроки, отсортированные по возрастанию:\n");
    for ( i = 0; i < num; ++i )
        printf("%s\n", arr[i]);
    
    for ( i = 0; i < num; ++i )
        free(arr[i]);
    free(arr);
    
    exit(0);
}
staaas1k
2 / 2 / 0
Регистрация: 19.02.2010
Сообщений: 96
11.05.2010, 00:01  [ТС]     сортировка qsort #5
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

это я так понимаю кодировку менять? а у меня работа в Borland 3.1 и файл досовский.. а как сделать проще чтобы файл не вводился с клавиатуры а допустим

define PATH "test.txt"
я сам поправил и у меня почему то пишет ошибка памяти
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.05.2010, 00:11     сортировка qsort #6
Цитата Сообщение от staaas1k Посмотреть сообщение
define PATH "test.txt"
C
1
#define PATH "test.txt"
Цитата Сообщение от staaas1k Посмотреть сообщение
я сам поправил и у меня почему то пишет ошибка памяти
Может что-то лишнее "исправили"? Ну или на самом деле беда с памятью... У меня вот работает...
сортировка qsort
staaas1k
2 / 2 / 0
Регистрация: 19.02.2010
Сообщений: 96
11.05.2010, 00:26  [ТС]     сортировка qsort #7
чтото я запутался))

а какой строкой вводится название файла?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.05.2010, 00:42     сортировка qsort #8
Цитата Сообщение от staaas1k Посмотреть сообщение
а какой строкой вводится название файла?
чтение имени
C
1
2
3
4
5
        printf("Имя файла: ");
        if ( ! fgets(buf, BUFSIZ, stdin) ){
                fprintf(stderr, "Ошибка чтения!\n");
                exit(1);
        }
удаление перевода строки и проверка, содержит ли строка какие-нибудь символы
C
1
2
3
4
5
6
        if ( p = strrchr(buf, '\n') )
                *p = '\0';
        if ( ! *buf ){
                fprintf(stderr, "Пустая строка!\n");
                exit(1);
        }
открытие файла и проверка результата
C
1
2
3
4
        if ( ( f = fopen(buf, "r") ) == NULL ){
                fprintf(stderr, "Ошибка открытия файла!\n");
                exit(1);
        }
после этого имя файла держать в буфере уже не обязательно и он же используется для построчного чтения файла
C
1
        while ( fgets(buf, BUFSIZ, f) ){
staaas1k
2 / 2 / 0
Регистрация: 19.02.2010
Сообщений: 96
11.05.2010, 01:13  [ТС]     сортировка qsort #9
У меня почему то твоя программа всё время ошибку открытия файла пишет.. Я уже штук 10 текстовых документов насоздовал)

А можешь пожалуйста сделать вариант при помощи #define PATH "blabla.txt" или scanf как нибудь вводить название файла или вообще его объявить как char и не вводить... прост я изначально подругому делал и мне не очень понятно

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
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
#define STRLEN 36              
 
char** GetData(char* name, int* size)
{
    FILE*  file;
    char** text = NULL;            
    int    last;
    char   buf[STRLEN];
 
    *size = 0;
 
    file  = fopen(name, "rt");
    while(fgets(buf, STRLEN, file) != NULL)
    {
        last = strlen(buf) - 1;
        if(buf[last] == '\n')
            buf[last] = '\0';
 
        text        = (char**)realloc(text, sizeof(char*) * (*size + 1));
        text[*size] = (char*)malloc(sizeof(char) * (strlen(buf) + 1));
        strcpy(text[(*size)++], buf);        
    }
 
    fclose(file);
 
    return text; 
}
 
int main()
{
    char** data;
    char*  filename;                               
    int    count;  
 
    filename = "test.txt";                        
    data     =  GetData(filename, &count);
 
    for(i=0;i<count;i++)//Сортировка пузырьковым методом
     {
      if(strcmp(data[i],data[i+1])>0)
     {
      strcpy(temp,data[i]);
      strcpy(data[i],data[i+1]);
      strcpy(data[i+1],temp);
      i=0;
     }
     } 
 
    for(int i = 0; i < count; i++)
        printf("%s\n", data[i]);
 
    for(i = 0; i < count; i++)
        free(data[i]);
    free(data);
 
    return 0;
}
но мой вариант как то странно работает.. а с qsort я так и не разобрался
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.05.2010, 01:42     сортировка qsort #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
А можешь пожалуйста сделать вариант при помощи #define PATH "blabla.txt"
ага
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
 
int cmp_func(const void *a, const void *b){
    return strcmp(*(char**)a, *(char**)b);
}
 
#define FILE_NAME "rustr.txt"
 
int main(void){
    FILE *f;
    long num, i;
    char **arr, buf[BUFSIZ], *p;
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    /*
    printf("Имя файла: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        fprintf(stderr, "Ошибка чтения!\n");
        exit(1);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf ){
        fprintf(stderr, "Пустая строка!\n");
        exit(1);
    }
    if ( ( f = fopen(buf, "r") ) == NULL ){
        fprintf(stderr, "Ошибка открытия файла!\n");
        exit(1);
    }
    */
    if ( ( f = fopen(FILE_NAME, "r") ) == NULL ){
        fprintf(stderr, "Ошибка открытия файла!\n");
        exit(1);
    }
    
    arr = NULL;
    num = 0;
    while ( fgets(buf, BUFSIZ, f) ){
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( ! *buf )
            continue;
        if ( ( arr = realloc(arr, sizeof(char*) * (num + 1)) ) == NULL ){
            fprintf(stderr, "Ошибка памяти!\n");
            fclose(f);
            exit(1);
        }
        if ( ( arr[num++] = strdup(buf) ) == NULL ){
            fprintf(stderr, "Ошибка памяти!\n");
            fclose(f);
            exit(1);
        }
    }
    fclose(f);
    
    printf("\nСтроки, прочитанные из файла:\n");
    for ( i = 0; i < num; ++i )
        printf("%s\n", arr[i]);
    
    qsort(arr, num, sizeof(char*), cmp_func);
    
    printf("\nСтроки, отсортированные по возрастанию:\n");
    for ( i = 0; i < num; ++i )
        printf("%s\n", arr[i]);
    
    for ( i = 0; i < num; ++i )
        free(arr[i]);
    free(arr);
    
    exit(0);
}


Цитата Сообщение от staaas1k Посмотреть сообщение
или scanf как нибудь вводить название файла
практически так же, как с fgets, только от символа \n избавляться не прийдётся

Цитата Сообщение от staaas1k Посмотреть сообщение
его объявить как char и не вводить
вместо #define FILE_NAME "rustr.txt"
C
1
2
3
4
...
int main(void){
  char *FILE_NAME = "rustr.txt";
...
ну и сам
файл
Код
бббб
ееее
аааа
вввв
дддд
гггг
на всякий случай...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2010, 09:22     сортировка qsort
Еще ссылки по теме:

сортировка qsort в классе C++
Сортировка qsort C++
C++ Сортировка записей класса через функцию qsort

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

Или воспользуйтесь поиском по форуму:
staaas1k
2 / 2 / 0
Регистрация: 19.02.2010
Сообщений: 96
11.05.2010, 09:22  [ТС]     сортировка qsort #11
а у меня последний вариант всегда выводит ошибку памяти(
правда я убрал библиотеку windows.h потому что нету в борланде 3.1 её
Yandex
Объявления
11.05.2010, 09:22     сортировка qsort
Ответ Создать тему
Опции темы

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