Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/12: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Калина93
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 13
1

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

08.11.2011, 21:15. Просмотров 2287. Ответов 8
Метки нет (Все метки)

здравствуйте всем!помогуте пожалуйста решить задачу:
дана фраза на английском языке из слов,разделённых хотя бы одним пробелом. расположить слова по одному в строке и упорядочить по алфавиту.
я только начинаю изучать язык,поэтому если можно с пояснениями!заранее благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 21:15
Ответы с готовыми решениями:

Записи упорядочить по алфавиту
//#include "stdafx.h" #include <iostream> #include <conio.h> #include...

Упорядочить строку по алфавиту
В общем дана строка,состоящая из слов,разделенных через пробел. Надо...

Упорядочить список фамилий по алфавиту
Заданный список фамилий. Упорядочить их по алфавиту. Проверить написания первой...

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

Из списка фамилий упорядочить их по алфавиту
Из списка фамилий упорядочить их по алфавиту проверить написание большой...

8
DenCHS200
32 / 32 / 8
Регистрация: 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();//Для задержки на экране
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
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;
}
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>
а таких библиотек я совсем никогда не видел...
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.11.2011, 11:15 5
Цитата Сообщение от Калина93 Посмотреть сообщение
нет,это немного не так...DenCHS200,действительно сложно,а easybudda-у меня библиотеки не такие...все библиотеки заканчиваются ".h".
В c++ стандартные хедеры не заканчиваются на .h
Видимо, вы на С пишите.
0
Net_Wanderer
235 / 208 / 29
Регистрация: 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;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
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;
}
0
Net_Wanderer
235 / 208 / 29
Регистрация: 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;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
09.11.2011, 23:21 9
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Тем, что не я ее писал хотя эту тоже... но здесь все видно, и я прекрасно понимаю как это работает.
Честно говоря, очень смутно представляю себе, как работает функция qsort() из стандартной библиотеки, что ни капли не мешает сортировать ей всё, что сортируется. В прочем по началу, конечно, полезно переписывать по своему функции из стандартной библиотеки (ту же qsort переписал когда-то, ну получилось, и славненько, а дальше лучше всё-таки стандартной пользоваться). Но раз всё равно не ваша, лучше в сорсах gcc посмотрите, как стандартная сделана...
1
09.11.2011, 23:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 23:21

Упорядочить слова строки по алфавиту
Здравствуйте! Уважаемые форумчане, выручите, пролежал в больничке на этой теме,...

Упорядочить символы строки по алфавиту
Здравствуйте! Я пытаюсь написать программу для сортировки символов в строке в...

Упорядочить слова по алфавиту (строки)
Здравствуйте! Не могу пока осилить :wall:. Может у кого-то есть идеи по...


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

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

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