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

Сортировка слов по алфавиту методом выбора. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.67
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
27.11.2009, 18:30     Сортировка слов по алфавиту методом выбора. #1
Как это дело реализовать?
Задать числовое значение каждой букве в алфавите или же использовать аски ?
Посоветуйте)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2009, 18:30     Сортировка слов по алфавиту методом выбора.
Посмотрите здесь:

C++ [c++]Сортировка слов по алфавиту.
C++ Сортировка слов в строке по алфавиту
C++ Сортировка по алфавиту методом выбора
C++ Сортировка слов по алфавиту
сортировка слов в предложении по алфавиту C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
 Аватар для R0mm
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
28.11.2009, 10:31     Сортировка слов по алфавиту методом выбора. #2
Цитата Сообщение от atomlex Посмотреть сообщение
Задать числовое значение каждой букве в алфавите или же использовать аски ?
без разницы.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
28.11.2009, 11:15     Сортировка слов по алфавиту методом выбора. #3
числовое значение быстрее и легче.Imho
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
28.11.2009, 21:56  [ТС]     Сортировка слов по алфавиту методом выбора. #4
Вычитал, что есть еще кроме этого функция сортировки строк..никто не знает?
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
01.12.2009, 23:26  [ТС]     Сортировка слов по алфавиту методом выбора. #5
Народ, помогите.
Андрейка
410 / 214 / 24
Регистрация: 25.03.2009
Сообщений: 716
01.12.2009, 23:28     Сортировка слов по алфавиту методом выбора. #6
atomlex, С++ std::sort(...) в С вроде qsort
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
06.12.2009, 18:10  [ТС]     Сортировка слов по алфавиту методом выбора. #7
На примере как-нибудь можно?
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.12.2009, 19:50     Сортировка слов по алфавиту методом выбора. #8
Сортировка слов где? В строке? В файле? На луне?
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
06.12.2009, 19:53  [ТС]     Сортировка слов по алфавиту методом выбора. #9
Читается текст из файла, сортируются слова из файла, отсортированные слова записываются в новый файл.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
07.12.2009, 08:10     Сортировка слов по алфавиту методом выбора. #10
Записать слова в массив.
Элементы массива - строки.
Сравнивать строки можно с помощью функции strcmp().
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
07.12.2009, 16:46  [ТС]     Сортировка слов по алфавиту методом выбора. #11
Про функцию strcmp() я знаю, только не представляю как ее пропипысать валгоритм сортировки выбором, т.е. как будет выглядеть при этом код.
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
07.12.2009, 23:48  [ТС]     Сортировка слов по алфавиту методом выбора. #12
При линковке выходят следующие ошибки:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/alfavit.exe : fatal error LNK1120: 1 unresolved externals

Как их лечить?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream.h>
#include<stdio.h>
#include <string.h>
void selection(int* a, int m)
{ 
char b1[] = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
char b2[256];
int i,j,k,min;
   for(i=0;i<m-1;i++)
   {min=i;
   printf("vvedite");
   gets(b2);
for (j=i+1; j<m; j++)
    if(strcmp(b1, b2)>0) min=j;
        k=a[min];
        a[min]=a[i];
        a[i]=k;
   }
}
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
08.12.2009, 20:53  [ТС]     Сортировка слов по алфавиту методом выбора. #13
С той ошибкой разобрался.Программа компилируется.Правда после ввода строки, вылетает с ошибкой "инструкция по адресу "00х000" обратилась к памяти по адресу"000х00".Память не может быть Read.
Ошибка в использовании strcmp, видимо..

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
 #include <iostream.h>
#include<stdio.h>
#include <string.h>
 
 
 
void main(int* a, char m) 
{ 
 
 
char alf[] = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
char str[256];
 
char i,j,k,min;
 
   for(i=0;i<m-1;i++)
   {
       
       min=i;
   printf("vvedite:   ");
   gets(str);
 
 
for (j=i+1; j<m; j++)
    if(strcmp(alf, str)>0)
        puts("sortirovka   ");
        min=j;
        k=a[min];
        a[min]=a[i];
        a[i]=k;
   }
 
}
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
13.12.2009, 20:08  [ТС]     Сортировка слов по алфавиту методом выбора. #14
Товарищи программисты!Мне нужна ваша помощь.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.12.2009, 22:39     Сортировка слов по алфавиту методом выбора. #15
Пишет в выходной файл все слова в одну строку в алфавитном порядке
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
/* сортировка слов. */
 
int wrdcmp(const void *a, const void *b){
    return strcmp(*(char**)a, *(char**)b);
}
 
/* если вызывается без аргументов, входной файл - stdin, ввод заканчивается по Ctrl+D (UNIX) Ctrl+Z Enter (Win), 
*   иначе первый аргумент - имя файла. По аналогии второй аргумент - имя выходного файла, или stdout */
int main(int argc, char **argv){
    char **words, *pWord, wrd_buf[BUFSIZ];
    int c, inword;
    size_t count, i;
    FILE *fin, *fout;
    
    if ( argc > 1 ){
        if ( (fin = fopen(argv[1], "r")) == NULL ){
            perror("Can't open input file!\n");
            exit(1);
        }
    }
    else
        fin = stdin;
        
    words = NULL;
    inword = 0;
    count = 0;
    *wrd_buf = '\0';
    pWord = wrd_buf;
    while ( ( c = fgetc(fin) ) != EOF ){
        if ( isspace(c) || ispunct(c) ){
            if ( inword ){
                *pWord = '\0';
                if ( (words = (char**)realloc(words, sizeof(char*) * (count + 1))) == NULL ){
                    perror("Memory error!\n");
                    exit(1);
                }
                if ( (words[count] = strdup(wrd_buf)) == NULL ){
                    perror("Memory error!\n");
                    exit(1);
                }
                count++;
                inword = 0;
                pWord = wrd_buf;
                *pWord = '\0';
            }
        }
        else {
            *pWord++ = (unsigned char)c;
            inword = 1;
        }   
    }
    fclose(fin);
    
    if ( !words ){
        fprintf(stderr, "No words found!\n");
        exit(1);
    }
    
    if ( argc > 2 ){
        if ( (fout = fopen(argv[2], "w")) == NULL ){
            perror("Can't open output file!\n");
            exit(1);
        }
    }
    else
        fout = stdout;
    
    qsort((void*)words, count, sizeof(char*), wrdcmp);
    
    for ( i = 0; i < count; i++ )
        fprintf(fout, "%s ", words[i]);
    fprintf(fout, "\n");
    
    fclose(fout);
    for ( i = 0; i < count; i++ )
        free(words[i]);
    free(words);
    exit(0);
}
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
14.12.2009, 01:06  [ТС]     Сортировка слов по алфавиту методом выбора. #16
Огого.Все хорошо, да мне выбором сортировка нужна, а не быстрая.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.12.2009, 16:38     Сортировка слов по алфавиту методом выбора. #17
Ну выбором, так выбором...
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
105
106
107
108
109
110
111
112
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
/* выборочная сортировка слов. */
 
/* ищет адрес лексикографически наименьшей строки в массиве, возвращает указатель на него */
char **minStr(char **arr, size_t count){
    char **min;
    
    min = arr++;
    while ( --count ){
        if ( strcmp(*arr, *min) < 0 )
            min = arr;
        arr++;
    }
    return min;
}
 
/* собственно сортировка */
void selSort(char **arr, size_t count){
    char **min, *tmp;
 
    while ( count > 1 ) {
        min = minStr(arr, count);
        if ( *min != *arr ){    
            tmp = *arr;
            *arr = *min;
            *min = tmp;
        }
        count--;
        arr++;
    }
}
 
/* если вызывается без аргументов, входной файл - stdin, ввод заканчивается по Ctrl+D (UNIX) Ctrl+Z Enter (Win), 
*   иначе первый аргумент - имя файла. По аналогии второй аргумент - имя выходного файла, или stdout */
int main(int argc, char **argv){
    char **words, *pWord, wrd_buf[BUFSIZ];
    int c, inword;
    size_t count, i;
    FILE *fin, *fout;
    
    if ( argc > 1 ){
        if ( (fin = fopen(argv[1], "r")) == NULL ){
            perror("Can't open input file!\n");
            exit(1);
        }
    }
    else
        fin = stdin;
        
    words = NULL;
    inword = 0;
    count = 0;
    *wrd_buf = '\0';
    pWord = wrd_buf;
    while ( ( c = fgetc(fin) ) != EOF ){
        if ( isspace(c) || ispunct(c) ){
            if ( inword ){
                *pWord = '\0';
                if ( (words = (char**)realloc(words, sizeof(char*) * (count + 1))) == NULL ){
                    perror("Memory error!\n");
                    exit(1);
                }
                if ( (words[count] = strdup(wrd_buf)) == NULL ){
                    perror("Memory error!\n");
                    exit(1);
                }
                count++;
                inword = 0;
                pWord = wrd_buf;
                *pWord = '\0';
            }
        }
        else {
            *pWord++ = (unsigned char)c;
            inword = 1;
        }   
    }
    fclose(fin);
    
    if ( !words ){
        fprintf(stderr, "No words found!\n");
        exit(1);
    }
    
    if ( argc > 2 ){
        if ( (fout = fopen(argv[2], "w")) == NULL ){
            perror("Can't open output file!\n");
            exit(1);
        }
    }
    else
        fout = stdout;
    
/*  qsort((void*)words, count, sizeof(char*), wrdcmp); */
    selSort(words, count);
    
    for ( i = 0; i < count; i++ )
        fprintf(fout, "%s ", words[i]);
    fprintf(fout, "\n");
    
    fclose(fout);
    
    for ( i = 0; i < count; i++ )
        free(words[i]);
    free(words);
    
    exit(0);
}
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
15.12.2009, 19:53  [ТС]     Сортировка слов по алфавиту методом выбора. #18
Спасибо, попробую разобраться.)

Добавлено через 21 час 24 минуты
А на Си++ можно?
И почему стандартная сортировка выбором проходит через циклы while, а не for?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.12.2009, 23:50     Сортировка слов по алфавиту методом выбора. #19
Цитата Сообщение от atomlex Посмотреть сообщение
А на Си++ можно?
Не, это не ко мне. Не нравится мне этот язык.
Цитата Сообщение от atomlex Посмотреть сообщение
И почему стандартная сортировка выбором проходит через циклы while, а не for?
А какая в принципе разница? Главное - обработать нужное количество элементов, а как цикл организовать - полностью на выбор программиста. При желании написать действительно сложную и запутанную программу можно даже через switch + goto извернуться
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2009, 00:45     Сортировка слов по алфавиту методом выбора.
Еще ссылки по теме:

сортировка слов по алфавиту C++
C++ Сортировка слов из массива по алфавиту
C++ Сортировка массива слов методом прямого выбора

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

Или воспользуйтесь поиском по форуму:
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
16.12.2009, 00:45  [ТС]     Сортировка слов по алфавиту методом выбора. #20
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
#include <stdio.h>
#include <iostream>
#include <string.h>
void Sort(char *a[], long size) 
{ 
 
int i,j,min;
 
 char *p,*k; 
 
 p = new char[200];
 k = new char[1000];
 
 
 
   for(i=0;i<size-1;i++)
   { min=i; 
      for (j=i+1; j<size; j++)
        if(strcmp(a[j], a[min])>0)
 
    min=j;
   }
        k = a[min];
        a[min]=a[i];
        a[i]=k;
 
    
   }
   
void  main(char sourse, int n, char *mas, int size, int i)
 
  {
 
 
//объявление двумерного динамического массива [номер слова][количество букв в слове]
 
// чтение файла...
 
FILE *src=fopen("text.txt","r");;
    // Открытие Файла
 
    if(src == 0)
    {
            // Ошибка
            perror("Open");
            return;
    }
 
    // Получение дескриптора файла
    int handle=_fileno(src);
    
     //выделение памяти под буффер
    char *data=new char[size];
/*  if(!data){
        return false;
    }*/
 
    int realsize;
    while (!feof(src)){
        // Чтение данных из файла
        realsize=fread(data,sizeof(char),sizeof(char)*size,src);
 
        /* Запись данных в файл
        fwrite(data,sizeof(char),sizeof(char)*realsize,dest);*/
    }
 
    // Закрытие файлов
    fclose(src);
 
 
 
 
for (i=0; i<n; i++)
  printf("%5s", mas[i]);
   printf("/n");
Sort(*mas,n);
 
  for (i=0; i<n; i++)
    printf ("%5s", mas[i]);
 
  }
 
Ругается на вызов функции Sort().
 
 
cannot convert parameter 1 from 'char' to 'char *[]'
Yandex
Объявления
16.12.2009, 00:45     Сортировка слов по алфавиту методом выбора.
Ответ Создать тему
Опции темы

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