0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 13
1

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

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

здравствуйте всем!помогуте пожалуйста решить задачу:
дана фраза на английском языке из слов,разделённых хотя бы одним пробелом. расположить слова по одному в строке и упорядочить по алфавиту.
я только начинаю изучать язык,поэтому если можно с пояснениями!заранее благодарю!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2011, 21:15
Ответы с готовыми решениями:

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

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

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

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

8
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
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
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 13
09.11.2011, 10:52  [ТС] 4
нет,это немного не так...DenCHS200,действительно сложно,а easybudda-у меня библиотеки не такие...все библиотеки заканчиваются ".h".
Цитата Сообщение от easybudda Посмотреть сообщение
#include <sstream>
#include <algorithm>
#include <iterator>
а таких библиотек я совсем никогда не видел...
0
Higher
1949 / 1215 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.11.2011, 11:15 5
Цитата Сообщение от Калина93 Посмотреть сообщение
нет,это немного не так...DenCHS200,действительно сложно,а easybudda-у меня библиотеки не такие...все библиотеки заканчиваются ".h".
В c++ стандартные хедеры не заканчиваются на .h
Видимо, вы на С пишите.
0
236 / 209 / 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
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
236 / 209 / 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11047 / 6994 / 1656
Регистрация: 25.07.2009
Сообщений: 12,764
09.11.2011, 23:21 9
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Тем, что не я ее писал хотя эту тоже... но здесь все видно, и я прекрасно понимаю как это работает.
Честно говоря, очень смутно представляю себе, как работает функция qsort() из стандартной библиотеки, что ни капли не мешает сортировать ей всё, что сортируется. В прочем по началу, конечно, полезно переписывать по своему функции из стандартной библиотеки (ту же qsort переписал когда-то, ну получилось, и славненько, а дальше лучше всё-таки стандартной пользоваться). Но раз всё равно не ваша, лучше в сорсах gcc посмотрите, как стандартная сделана...
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2011, 23:21

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

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

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

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


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

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

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