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

упорядочить по алфавиту - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Калина93
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 13
08.11.2011, 21:15     упорядочить по алфавиту #1
здравствуйте всем!помогуте пожалуйста решить задачу:
дана фраза на английском языке из слов,разделённых хотя бы одним пробелом. расположить слова по одному в строке и упорядочить по алфавиту.
я только начинаю изучать язык,поэтому если можно с пояснениями!заранее благодарю!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DenCHS200
 Аватар для DenCHS200
32 / 32 / 1
Регистрация: 07.10.2011
Сообщений: 117
09.11.2011, 00:16     упорядочить по алфавиту #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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include<conio.h>
#include <string>
using namespace std;
 
void main()
{
 
    char massiv[]={"aaaaaaaaadddddddd1 hhhhhhhhhhhh2 bbbbbbbbbbbbbb3 dddddddddddd4"};//создаём строку с текстом
    
        unsigned long z,stet_probelov=0,j,i,size;
    size=strlen(massiv);// вычисляем длину строки
    // сначала посмотрим, сколько пробелов в тексте, чтобы узнать, сколько слов создавать
    for(i=0;i<size;i++){
    if(massiv[i]==' ')// если элемент равен пробелу, то добавляем количество слов
        stet_probelov++;
    }
//затем создаём динамический массив , его размер зависит от того, сколько пробелов встретилось 
    //и добавляем к кол-ву пробелов +1 т.к. 2 пробела, это 3 слова, 4 пробела, это 5 слов и так далее
    // массив размером size Х stet_probelov+1; (сколько символов в первом массиве на сколько пробелов+1) 
    char **massiv2;
    massiv2= new char*[size];
    for (int i = 0; i !=stet_probelov+1 ; ++i)
        massiv2[i]=new char[stet_probelov+1];
    char *temp_slovo= new char [size];// временный массив для копирования слова (Потом понадобится)
    
    unsigned long *razmer_slov,*massiv_nachal,*massiv_koncov;
    massiv_nachal=new unsigned long [stet_probelov+1];// содержит координаты начал слов, чтобы знать, откуда и докуда выводить слово
    massiv_koncov=new unsigned long [stet_probelov+1];// содержит координаты концов слов, чтобы знать, откуда и докуда выводить слово
    razmer_slov=new unsigned long[stet_probelov+1];//здесь хранить будем рамрер слов, нужно для сравнения слов будет
    
    // теперь заносим символы в массив
    i=0;j=0;
    for(j=0;j<stet_probelov+1;j++)
    {
        massiv_nachal[j]=i;// циклично заносим в этот массив координаты начал слов
        z=0;
        while((i<size)&&(massiv[i]!=' '))
    {
    massiv2[j][z]=massiv[i];// заносим из основного массива jое слово
    z++;i++;
    }
i++;
 
massiv_koncov[j]=i-1;// минус один, так как у нас в цикле while i стал равным номеру символа с пробелом, значит слово
//закончится на предыдущем элементе
    razmer_slov[j]=massiv_koncov[j]-massiv_nachal[j];//вычисляем размер слова
    }//Итак, слова получили, теперь стоит задача упорядочить слова по алфавиту
    bool obmen=false;// переменная для проверки менять слова или нет
    unsigned long i1,i2,j1,j2;
    unsigned long temp2,temp;//Временная переменная для обмена значениями
    for(i=0;i<stet_probelov+1;i++)
    {
        for(j=0;j<stet_probelov;j++)
        {i1=0;
        if(razmer_slov[j]<razmer_slov[j+1])//выбираем, какое из слов короче, чтобы при посимвольном сравнении программа
            // не зависла!
            temp=razmer_slov[j];
        else
            temp=razmer_slov[j+1];
        // сверять слова по алфавиту будем до тех пор,
            // пока не кончится длина сверяемых слов
        
            for(i2=0;i2<temp;i2++){
if(massiv2[j][i2]>massiv2[j+1][i2])// если у 2ого слова буква младше(в смысле А младшн , чем B), то решаем, что 1е слово нужно
    //обменять со вторым
    {obmen=true;
goto m1;//выяснили, что нужно обменять, и выходим   
}
else if(massiv2[j][i2]<massiv2[j+1][i2])// если у 2ого слова буква старше(в смысле B старше , чем А), то решаем, что 1е слова
    //НЕ нужно обменять, и выходим
    {obmen=false;
goto m1;//выяснили, что НЕ нужно обменять, и выходим    
}
// если не выяснили нужно менять или нет, то повторяем цикл     
            }
 
            m1:;
    
            //теперь мы выяснили, стоит ли менять места словами, или нет
            if(obmen==true)
            {// если надо менять, то меняем все параметры!!!
            // Во временный массив копируем слово
            for(j2=0;j2<razmer_slov[j];j2++)
                temp_slovo[j2]=massiv2[j][j2];// посимвольно копируем слово во временный массив
            for(j2=0;j2<razmer_slov[j+1];j2++)
            massiv2[j][j2]=massiv2[j+1][j2];// копируем J+1ое слово в Jое слово, так как Jое уже скопировали
            for(j2=0;j2<razmer_slov[j];j2++)
            massiv2[j+1][j2]=temp_slovo[j2];// копируем из временного массива слово в J+1ое слово
        // И обмениваем параметры слов массивов
            //сначала размеры
            temp2=razmer_slov[j];
            razmer_slov[j]=razmer_slov[j+1];
            razmer_slov[j+1]=temp2;
            // Затем координаты начал слов 
            temp2=massiv_nachal[j];
            massiv_nachal[j]=massiv_nachal[j+1];
            massiv_nachal[j+1]=temp2;
            // И , аналогично, координаты концов слов
            temp2=massiv_koncov[j];
            massiv_koncov[j]=massiv_koncov[j+1];
            massiv_koncov[j+1]=temp2;
 
            }
        
        
        
        }
    
    }
    //выводим получившийся массив
    for(j=0;j<stet_probelov+1;j++){
        for(i=0;i<razmer_slov[j];i++){
            cout<<massiv2[j][i];}
    cout<<endl;// чтобы разделить на строки
    }
 
    getch();//Для задержки на экране
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.11.2011, 00:30     упорядочить по алфавиту #3
Цитата Сообщение от Калина93 Посмотреть сообщение
я только начинаю изучать язык
Какой?
На С++ вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <set>
 
int main(){
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::istringstream ist(str);
        std::set<std::string> set;
        std::copy(std::istream_iterator<std::string>(ist), std::istream_iterator<std::string>(), std::inserter(set, set.begin()));
        std::cout << "Alpha sorted words:" << std::endl;
        std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
        std::cout << std::endl;
    }
    
    return 0;
}
Калина93
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 13
09.11.2011, 10:52  [ТС]     упорядочить по алфавиту #4
нет,это немного не так...DenCHS200,действительно сложно,а easybudda-у меня библиотеки не такие...все библиотеки заканчиваются ".h".
Цитата Сообщение от easybudda Посмотреть сообщение
#include <sstream>
#include <algorithm>
#include <iterator>
а таких библиотек я совсем никогда не видел...
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.11.2011, 11:15     упорядочить по алфавиту #5
Цитата Сообщение от Калина93 Посмотреть сообщение
нет,это немного не так...DenCHS200,действительно сложно,а easybudda-у меня библиотеки не такие...все библиотеки заканчиваются ".h".
В c++ стандартные хедеры не заканчиваются на .h
Видимо, вы на С пишите.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
09.11.2011, 12:10     упорядочить по алфавиту #6
На C :
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 <stdlib.h>
 
#define MAXWORDS  100
#define MAXLINE  1000
#define DELIM " .,:;(){}?!\n\t"
 
void qsort_lines(char *v[], int left, int right);
 
int main()
{
    char *words[MAXWORDS], *p, **w;
    char line[MAXLINE];
    int cnt;
 
    while (printf("enter a line:\n") > 0
        && fgets(line, MAXLINE, stdin) && *line != '\n') {
        for (p = strtok(line, DELIM), cnt = 0;
            p != NULL && cnt < MAXWORDS - 1;
            p = strtok(NULL, DELIM), cnt++)
            if ((words[cnt] = strdup(p)) == NULL) {
                printf("error: cannot allocate memory\n");
                return 1;
            }
        words[cnt] = NULL;
        qsort_lines(words, 0, cnt - 1);
        printf("\nsorted words:\n");
        for (w = words; *w != NULL; w++) {
            printf("%s\n", *w);
            free(p);
        }
    }
    return 0;
}
 
void qsort_lines(char *v[], int left, int right)
{
    int i, last;
    void swap(char *v[], int i, int j);
 
    if (left >= right)
        return;       
    swap(v, left, (left + right)/2);
    last = left;
    for (i = left+1; i <= right; i++)
        if (strcmp(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    qsort_lines(v, left, last-1);
    qsort_lines(v, last+1, right);
}
 
void swap(char *v[], int i, int j)
{
    char *temp;
 
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.11.2011, 14:31     упорядочить по алфавиту #7
Net_Wanderer, а чем стандартная qsort не угодила?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int cmp(const void * a, const void * b){
    return strcmp(*(char**)a, *(char**)b);
}
 
int main(void){
    char * n[3] = { "Sidorov", "Petrov", "Ivanov" };
    int i;
    
    qsort(n, 3, sizeof(char*), cmp);
    for( i = 0; i < 3; ++i )
        printf("%s\n", n[i]);
    
    return 0;
}
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
09.11.2011, 20:13     упорядочить по алфавиту #8
Цитата Сообщение от easybudda Посмотреть сообщение
Net_Wanderer, а чем стандартная qsort не угодила?
Тем, что не я ее писал хотя эту тоже... но здесь все видно, и я прекрасно понимаю как это работает.

Переборщил, можно и без динамического выделения:
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
#include <stdio.h>
#include <string.h>
 
#define MAXWORDS  100
#define MAXLINE  1000
#define DELIM " .,:;(){}?!\n\t"
 
void qsort_lines(char *v[], int left, int right);
 
int main()
{
    char *words[MAXWORDS], *p, **w;
    char line[MAXLINE];
    int cnt;
 
    while (printf("enter a line:\n") > 0
        && fgets(line, MAXLINE, stdin) && *line != '\n') {
        for (p = strtok(line, DELIM), cnt = 0;
            p != NULL && cnt < MAXWORDS - 1;
            p = strtok(NULL, DELIM), cnt++)
                words[cnt] = p;
        words[cnt] = NULL;
        qsort_lines(words, 0, cnt - 1);
        printf("\nsorted words:\n");
        for (w = words; *w != NULL; w++)
            printf("%s\n", *w);
    }
    return 0;
}
 
void qsort_lines(char *v[], int left, int right)
{
    int i, last;
    void swap(char *v[], int i, int j);
 
    if (left >= right)
        return;       
    swap(v, left, (left + right)/2);
    last = left;
    for (i = left+1; i <= right; i++)
        if (strcmp(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    qsort_lines(v, left, last-1);
    qsort_lines(v, last+1, right);
}
 
void swap(char *v[], int i, int j)
{
    char *temp;
 
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 23:21     упорядочить по алфавиту
Еще ссылки по теме:

C++ Строки. [Ввести список фамилий,упорядочить по алфавиту]
Строки данного файла упорядочить по алфавиту C++
Записи упорядочить по алфавиту C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.11.2011, 23:21     упорядочить по алфавиту #9
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Тем, что не я ее писал хотя эту тоже... но здесь все видно, и я прекрасно понимаю как это работает.
Честно говоря, очень смутно представляю себе, как работает функция qsort() из стандартной библиотеки, что ни капли не мешает сортировать ей всё, что сортируется. В прочем по началу, конечно, полезно переписывать по своему функции из стандартной библиотеки (ту же qsort переписал когда-то, ну получилось, и славненько, а дальше лучше всё-таки стандартной пользоваться). Но раз всё равно не ваша, лучше в сорсах gcc посмотрите, как стандартная сделана...
Yandex
Объявления
09.11.2011, 23:21     упорядочить по алфавиту
Ответ Создать тему
Опции темы

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