Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/49: Рейтинг темы: голосов - 49, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
1

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

27.11.2009, 18:30. Просмотров 9075. Ответов 25
Метки нет (Все метки)

Как это дело реализовать?
Задать числовое значение каждой букве в алфавите или же использовать аски ?
Посоветуйте)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2009, 18:30
Ответы с готовыми решениями:

Сортировка по алфавиту методом выбора
Дана база данных которая записана в текстовый файл,нужно отсортировать определенное поле по...

Сортировка массива слов методом прямого выбора
Помогите пожалуйста сделать сортировку массива слов методом прямого выбора. То есть у меня есть...

Упорядочить заданную последовательность символов по алфавиту методом выбора
нужно составить сортировку символов по алфавиту методом выбора.Можно полный код.

Упорядочить слова по алфавиту методом простого выбора
Дана последовательность слов. Упорядочить слова по алфавиту методом простого выбора. Я написала...

25
Псевдо программист
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
28.11.2009, 10:31 2
Цитата Сообщение от atomlex Посмотреть сообщение
Задать числовое значение каждой букве в алфавите или же использовать аски ?
без разницы.
0
158 / 157 / 47
Регистрация: 29.04.2009
Сообщений: 637
28.11.2009, 11:15 3
числовое значение быстрее и легче.Imho
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
28.11.2009, 21:56  [ТС] 4
Вычитал, что есть еще кроме этого функция сортировки строк..никто не знает?
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
01.12.2009, 23:26  [ТС] 5
Народ, помогите.
0
423 / 227 / 87
Регистрация: 25.03.2009
Сообщений: 744
01.12.2009, 23:28 6
atomlex, С++ std::sort(...) в С вроде qsort
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
06.12.2009, 18:10  [ТС] 7
На примере как-нибудь можно?
0
576 / 570 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
06.12.2009, 19:50 8
Сортировка слов где? В строке? В файле? На луне?
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
06.12.2009, 19:53  [ТС] 9
Читается текст из файла, сортируются слова из файла, отсортированные слова записываются в новый файл.
0
Эксперт С++
7170 / 3228 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
07.12.2009, 08:10 10
Записать слова в массив.
Элементы массива - строки.
Сравнивать строки можно с помощью функции strcmp().
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
07.12.2009, 16:46  [ТС] 11
Про функцию strcmp() я знаю, только не представляю как ее пропипысать валгоритм сортировки выбором, т.е. как будет выглядеть при этом код.
0
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;
   }
}
0
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;
   }
 
}
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
13.12.2009, 20:08  [ТС] 14
Товарищи программисты!Мне нужна ваша помощь.
0
Модератор
Эксперт JavaЭксперт CЭксперт С++
10809 / 6563 / 1611
Регистрация: 25.07.2009
Сообщений: 12,339
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);
}
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
14.12.2009, 01:06  [ТС] 16
Огого.Все хорошо, да мне выбором сортировка нужна, а не быстрая.
0
Модератор
Эксперт JavaЭксперт CЭксперт С++
10809 / 6563 / 1611
Регистрация: 25.07.2009
Сообщений: 12,339
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);
}
1
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
15.12.2009, 19:53  [ТС] 18
Спасибо, попробую разобраться.)

Добавлено через 21 час 24 минуты
А на Си++ можно?
И почему стандартная сортировка выбором проходит через циклы while, а не for?
0
Модератор
Эксперт JavaЭксперт CЭксперт С++
10809 / 6563 / 1611
Регистрация: 25.07.2009
Сообщений: 12,339
15.12.2009, 23:50 19
Цитата Сообщение от atomlex Посмотреть сообщение
А на Си++ можно?
Не, это не ко мне. Не нравится мне этот язык.
Цитата Сообщение от atomlex Посмотреть сообщение
И почему стандартная сортировка выбором проходит через циклы while, а не for?
А какая в принципе разница? Главное - обработать нужное количество элементов, а как цикл организовать - полностью на выбор программиста. При желании написать действительно сложную и запутанную программу можно даже через switch + goto извернуться
1
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 *[]'
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2009, 00:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Масивы и сортировка методом обмена, методом вставки, методом выбора
Сортировку осуществить тремя способами: методом обмена. методом вставки, методом выбора.Решение...

Сортировка массива методом выбора. Найти элемент методом двоичного поиска
Напишите программу, работающую с одним массивом из 10 элементов целочисленного типа. Программа...

Сортировка массивов (Сортировка слов по алфавиту)
Объясните мне сортировку слов по алфавиту .Сравнивать целиком слова нельзя ?Есть ли какой нибудь...

Сортировка слов по алфавиту
есть столбец слов нужно их отсортировать по алфавиту подскажите алгоритм До этого сортировал...

Сортировка слов по алфавиту
Здравствуйте уважаемы программисты. Необходимо отсортировать слова по алфавиту. #include...

Сортировка слов по алфавиту
Помогите написать программу: 1)Программа запрашивает ввести слово (10 раз) 2)Пользователь вводит...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.