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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.67
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
#1

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

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

Как это дело реализовать?
Задать числовое значение каждой букве в алфавите или же использовать аски ?
Посоветуйте)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2009, 18:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка слов по алфавиту методом выбора. (C++):

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

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

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

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

Сортировка слов по алфавиту - C++
MFC GUI. Собственно в чем задача:Нужно прочитать слова из файла, отсортировать их по алфавиту методом выбора и записать в новый файл. ...

Сортировка слов по алфавиту - C++
Всем привет, помогите мне пожалуйста с сортировкой слов по алфавиту, словом считают группу символов между двумя пробелами. Упорядочить...

25
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
14.12.2009, 01:06  [ТС] #16
Огого.Все хорошо, да мне выбором сортировка нужна, а не быстрая.
0
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
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
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
15.12.2009, 19:53  [ТС] #18
Спасибо, попробую разобраться.)

Добавлено через 21 час 24 минуты
А на Си++ можно?
И почему стандартная сортировка выбором проходит через циклы while, а не for?
0
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
15.12.2009, 23:50 #19
Цитата Сообщение от atomlex Посмотреть сообщение
А на Си++ можно?
Не, это не ко мне. Не нравится мне этот язык.
Цитата Сообщение от atomlex Посмотреть сообщение
И почему стандартная сортировка выбором проходит через циклы while, а не for?
А какая в принципе разница? Главное - обработать нужное количество элементов, а как цикл организовать - полностью на выбор программиста. При желании написать действительно сложную и запутанную программу можно даже через switch + goto извернуться
1
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 *[]'
1
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
16.12.2009, 01:14 #21
Цитата Сообщение от atomlex Посмотреть сообщение
void main(char sourse, int n, char *mas, int size, int i)
Минут 5 искал, где этот mas объявлен! Да и остальное мрачно...

Цитата Сообщение от atomlex Посмотреть сообщение
// Получение дескриптора файла int handle=_fileno(src);
а чё с ним делать-то? Да и вообще в С++ нужно ifstream/ofstream использовать...
Цитата Сообщение от atomlex Посмотреть сообщение
void Sort(char *a[], long size)
Sort принимает массив указателей на char, то есть char** по сути
Цитата Сообщение от atomlex Посмотреть сообщение
Sort(*mas,n);
а Вы ей символ скормить пытаетесь...
0
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
16.12.2009, 22:06  [ТС] #22
Охххх.Вот у меня как раз-таки трудности с функцией main() возникают.А именно с вызовом функции sort и чтением массива строк из файла, и вывод сортировки на экран..
0
easybudda
Модератор
Эксперт CЭксперт С++
9681 / 5631 / 954
Регистрация: 25.07.2009
Сообщений: 10,808
17.12.2009, 00:22 #23
Цитата Сообщение от atomlex Посмотреть сообщение
Вот у меня как раз-таки трудности с функцией main()
Параметры функции main() - это то, что в коммандной строке после имени программы передаётся при её (программы) запуске.
Чтобы принять аргументы командной строки, используются два специальных встроенных аргумента: argc и argv. Параметр argc содержит количество аргументов в командной строке и является целым числом, причем он всегда не меньше 1, потому что первым аргументом считается имя программы. А параметр argv является указателем на массив указателей на строки. В этом массиве каждый элемент указывает на какой-либо аргумент командной строки. Все аргументы командной строки являются строковыми, поэтому преобразование каких бы то ни было чисел в нужный двоичный формат должно быть предусмотрено в программе при ее разработке.

Вот простой пример использования аргумента командной строки. На экран выводятся слово Привет и ваше имя, которое надо указать в виде аргумента командной строки.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  if(argc!=2) {
    printf("Вы забыли ввести свое имя.\n");
    exit(1);
  }
  printf("Привет %s", argv[1]);
 
  return 0;
}
(с) "Полный справочник по C" Герберт Шилдт.
0
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
17.12.2009, 20:15  [ТС] #24
Решил не мучится и сразу писать cортировку в коде основной программы.Вообще программа - это оконное приложение, которое должно читать текст из файла, сортировать слова текста по алфавиту методом выбора, записывать результат в новый файл.

Реализовано пока что только чтение слов из файла из вывод их в бокс.
Получается второй кнопкой нужно считать эти слова из бокса и отсортировать.
Пишется на Microsoft Visual C++ 6.0.

Первая кнопка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void CKursrabDlg::OnButton1() 
 
//Чтение файла и вывод на первый бокс
{
    char str[100];
    char Filter []="TextFile(*.txt),(*.doc) | *.txt; *.doc all(*.*) | *.*||";
    CFileDialog fd(TRUE, ".txt", "ReadMe", OFN_HIDEREADONLY, Filter);
//  fd. DoModal();
    if(fd.DoModal()==IDOK)  
    {
    CFile f;
    f.Open(fd.GetPathName(), CFile:: modeRead);
    f.SeekToBegin();
 
    //m_str - первый бокс, куда выводится данные из читаемого файла
int z = f.Read(str, sizeof(str));
str [z] = '\0';
    m_str.Format(str); 
    UpdateData(0);
    f.Close();          
 
    }
}
Добавлено через 4 часа 2 минуты
Собственно возникли затруднения с функциями main() и Sort(), их нужно прописать в код основной программы, а я не представляю как.Основная программа строится на классе CFileDialog.
0
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
20.12.2009, 00:35  [ТС] #25
Изменю вопрос.Как реализовать сортировку выбоором слов по алфавиту при помощи ООП?
0
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
28.12.2009, 21:55  [ТС] #26
Проблему с определением функция я решил.
Но все не могу придумать как ызвать функцию Sort() и чтобы она сортировала массив строк, который читается из файла по нажатию первой кнопки Button1.
Есть какие-нибудь предложения?
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
void CKursa4Dlg::OnButton1() 
//Чтение файла и вывод на первый бокс
{
    char str[100];
    char Filter []="TextFile(*.txt),(*.doc) | *.txt; *.doc all(*.*) | *.*||";
    CFileDialog fd(TRUE, ".txt", "ReadMe", OFN_HIDEREADONLY, Filter);
//  fd. DoModal();
    if(fd.DoModal()==IDOK)  
    {
    CFile f;
    f.Open(fd.GetPathName(), CFile:: modeRead);
    f.SeekToBegin();
 
    //m_str - первый бокс, куда выводится данные из читаемого файла
int z = f.Read(str, sizeof(str));
str [z] = '\0';
    m_str.Format(str); 
    UpdateData(0);
    f.Close();          
 
 
 
 
    }
}
 
void CKursa4Dlg::OnButton2() 
{
 
    // Кнопка сортировка текста по алфавиту выбором
 
}
void CKursa4Dlg::Sort(char *a[], int size )
{
 
int i,j,min;
 
char *k;
k = new char[1024];
 
 
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 CKursa4Dlg::main(int argc, char* argv[])
{
 
 int sizem;
char* m;
 
Sort(char *m[], int sizem);
 
}
0
28.12.2009, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2009, 21:55
Привет! Вот еще темы с ответами:

Сортировка слов из массива по алфавиту - C++
Помогите пожалуйста найти ошибку. Неправильно сортирует слова. #include&lt;iostream&gt; using namespace std; const int n=4; ...

Сортировка слов в предложении по алфавиту - C++
доброго времени суток! у меня такая проблема - нужно распечатать в алфавитном порядке слова из предложения. так вот, когда на английском...

Сортировка слов в строке по алфавиту - C++
Собственно вот задание:Определить класс-строку. В класс включить два конструктора: для опре-деления класса строки строкой символов и путем...

Сортировка слов в строке по алфавиту - C++
Дана строка из слов через пробел.Надо рассортировать слова по алфавиту и распечатать новую строку. Использовать библиотеки iostream и...


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

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

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