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

Сортировка символов в строке

23.02.2013, 00:39. Показов 15490. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста составить понятную для начинающего программиста программу.

Выполнить сортировку символов в строке. Порядок возрастания "весов" символов задать таблицей вида char ORD[] = "АаБбВвГгДдЕе1234567890"; Символы, не попавшие в таблицу, размещаются в конце отсортированной строки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2013, 00:39
Ответы с готовыми решениями:

Сортировка символов в строке по алфавиту
Добрейшего времени суток всем. Задача следующая: "Вывести буквы, имеющиеся в тексте, в алфавитном...

Сортировка символов в строке, виртуальные функции
Всем привет! Помогите пожалуйста, нужно написать лабу на С++: базовый класс "строки" с виртуальной...

Сортировка символов в каждой строке по алфавиту
Программа не работает Код: #include <iostream> #include <fstream> using namespace std; int...

В строке символов найти максимальную подпоследовательность символов, являющуюся палиндромом
Народ, помогите пожалуйста. Нужно написать программу, используя динамический массив. Вот условие...

30
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 05:44 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
#include <iostream>
#include <cstring>
#include <string>
 
int main()
{
    std::string line;
 
    std::cout << "Put line: ";
    std::getline(std::cin, line);
 
    for (int i = 1; size_t(i) < line.size(); ++i)
        for (int j = line.size()-1; j >= i; --j)
            if (strchr("AaBbCcDdEe1234567890", line[j]))
            {
                char temp = line[j];
                line[j] = line[j-1];
                line[j-1] = temp;
            }
 
    std::cout << line << '\n';
 
    return 0;
}
Добавлено через 2 часа 57 минут
Пытался отсортировать при помощи алгоритма std::sort, но не получилось написать предикат. Если у кого-то получится, не плохо бы было взглянуть на код.
0
30 / 30 / 13
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 08:23 3
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
#include <string>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char** argv) {
    string str;
    cin >> str;
    
    string alph = "AaBbCcDdEe1234567890";
    sort(str.begin(), str.end(), [alph](const char a, const char b)->bool { 
        int first = alph.find(a);
        int second = alph.find(b);
 
        if (first == string::npos)
            return false;
        if (second == string::npos)
            return true;
        
        return first < second;
    });
    
    cout << str << endl;
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 16:41  [ТС] 4
Спасибо но не могли бы составить прогу без string ов и size! (мы их просто не проходили и соответственно я не понимаю их)
желательно используя using namespace std; вместо того чтобы каждый раз писать std:так привычнее)
буду благодарен если сможете помощь !

Добавлено через 3 часа 8 минут

unit7, не поможете доделать код?

Код
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	setlocale(0,"");
int n=8;
int i,t;
char *ss1=new char[n];
strcpy(ss1,"");
ss1="Привет мир";
cout<<"Исходная строка: "<<ss1<<endl;
cout<<"Конечный вариант: ";
char ord[]="АаБбВвГгДдЕе1234567890";
for (i=0,t=0; ord[i]!='\0', t<strlen(ss1); i++,t++)
{
for(int i=0; i<=23; i++)
{
if (ss1[t]==ord[i])
cout<<ss1[t];
}


}
cout<<endl;
return 0;
}
Тут выводит только те символы которые заданы в ord[]..а другие не выводит...

Добавлено через 1 час 4 минуты
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 16:44 5
Цитата Сообщение от Azazu Посмотреть сообщение
Помогите лучше доделать вот эту прогу :
Не советую вам работать с русскими символами, может быть такая ситуация, что на одной машине программа будет работать, а на другой нет(.
Вот версия со всем подключённым пространстом имён std (что не есть корректно), и с массивом символов:
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    char line[80];
 
    cout << "Put line: ";
    cin.getline(line, 79);
 
    for (int i = 1; (size_t)i < strlen(line); ++i)
        for (int j = strlen(line)-1; j >= i; --j)
            if (strchr("AaBbCcDdEe1234567890", line[j]))
            {
                char temp = line[j];
                line[j] = line[j-1];
                line[j-1] = temp;
            }
 
    cout << line << '\n';
 
    return 0;
}
unit7, что-то ваш код не компилируется...
0
30 / 30 / 13
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 16:50 6
Конечно, тут же ясно написано выводить только те, которые есть в ord:
C++
1
2
if (ss1[t]==ord[i])
    cout<<ss1[t];
И вообще непонятно зачем весь этот цикл нужен. Ни сортировки, ничего, бред какой-то.
Вот вам баблом Должно работать )
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
#include<iostream>
#include<iomanip>
#include <algorithm>
 
using namespace std;
 
int main()
{
    setlocale(0,"");
 
    int n=8;
    int i,t;
    char *ss1=new char[n];
    strcpy(ss1,"");
    ss1="Привет мир";
    cout<<"Исходная строка: "<<ss1<<endl;
    cout<<"Конечный вариант: ";
    char ord[]="АаБбВвГгДдЕе1234567890";
    
    int len = strlen(ss1), lenOrd = strlen(ord);
    
    for (int i = 0; i < len - 1; ++i) {
        for (int j = i + 1; j < len; ++j) {
            int first = -1, second = -1;
            for (int k = 0; k < lenOrd; ++k) {
                if (ss1[i] == ord[k])
                    first = k;
                if (ss1[j] == ord[k])
                    second = k;
            }
            
            if (first == -1 || (first > second && second != -1))
                swap(ss1[i], ss1[j]);
        }
    }
    
    cout << ss1 << endl;
    return 0;
}
Добавлено через 2 минуты
xtorne21st, все компилируется, что вы наговариваете
http://ideone.com/pWr9zw
0
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 16:54  [ТС] 7
[QUOTE=xtorne21st;4171038]
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    char line[80];
 
    cout << "Put line: ";
    cin.getline(line, 79);
 
    for (int i = 1; (size_t)i < strlen(line); ++i)
        for (int j = strlen(line)-1; j >= i; --j)
            if (strchr("AaBbCcDdEe1234567890", line[j]))
            {
                char temp = line[j];
                line[j] = line[j-1];
                line[j-1] = temp;
            }
 
    cout << line << '\n';
 
    return 0;
}
а что здесь значит size_t?
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 16:57 8
Вот вариант с "широкими" символами (только не удивляйтесь если увас работало, а где-то в другом месте нет)
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
    setlocale(0, "");
 
    wchar_t line[80];
    wchar_t comp[] = L"АаБбВвГгДдЕе1234567890";
 
    wcout << L"Введите строку: ";
    wcin.getline(line, 79);
 
    for (int i = 1; (size_t)i < wcslen(line); ++i)
        for (int j = wcslen(line)-1; j >= i; --j)
            if (wcschr(comp, line[j]))
            {
                wchar_t temp = line[j];
                line[j] = line[j-1];
                line[j-1] = temp;
            }
 
    wcout << line << '\n';
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 17:00  [ТС] 9
То есть вы хотите сказать что мой код нельзя довести до логического завершения?
Если это действительно так будьте добры объясните пожалуйста свой код?!

Добавлено через 3 минуты
Цитата Сообщение от xtorne21st Посмотреть сообщение
Вот вариант с "широкими" символами (только не удивляйтесь если увас работало, а где-то в другом месте нет)
Простите я не понял что за широкие слова



Товарищи, вы мне скажите этот код можно доделать ?
Код
#include<iostream>
#include<iomanip>
using namespace std;
 
int main()
{
    setlocale(0,"");
int n=8;
int i,t;
char *ss1=new char[n];
strcpy(ss1,"");
ss1="Привет мир";
cout<<"Исходная строка: "<<ss1<<endl;
cout<<"Конечный вариант: ";
char ord[]="АаБбВвГгДдЕе1234567890";
for (i=0,t=0; ord[i]!='\0', t<strlen(ss1); i++,t++)
{
for(int i=0; i<=23; i++)
{
if (ss1[t]==ord[i])
cout<<ss1[t];
}
 
 
}
cout<<endl;
return 0;
}
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:00 10
Цитата Сообщение от unit7 Посмотреть сообщение
xtorne21st, все компилируется, что вы наговариваете
С какими вы ключами компилируете? у меня g++ 4.6 вот что выводит:
Bash
1
2
3
4
5
6
7
8
9
10
11
ilyuha21st@coldshoot:~/projects$ g++ main.cpp -o prog -Wall -pedantic
main.cpp: In lambda function:
main.cpp:16:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
main.cpp:18:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
main.cpp: In function ‘int main(int, char**)’:
main.cpp:22:5: warning: lambda expressions only available with -std=c++0x or -std=gnu++0x [enabled by default]
main.cpp:22:6: error: no matching function for call to ‘sort(std::basic_string<char>::iterator, std::basic_string<char>::iterator, main(int, char**)::<lambda(char, char)>)’
main.cpp:22:6: note: candidates are:
/usr/include/c++/4.6/bits/stl_algo.h:5394:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter)
/usr/include/c++/4.6/bits/stl_algo.h:5430:5: note: template<class _RAIter, class _Compare> void std::sort(_RAIter, _RAIter, _Compare)
ilyuha21st@coldshoot:~/projects$
0
30 / 30 / 13
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 17:01 11
Ну тот цикл мне не понять А мой код - обычный тупой BubbleSort, почитайте на вики.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:02 12
а уже нашёл с какими : -std=c++0x
0
30 / 30 / 13
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 17:03 13
xtorne21st, попробуйте -std=c++0x
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:06 14
Цитата Сообщение от Azazu Посмотреть сообщение
Простите я не понял что за широкие слова
Ни слова а символы wchar_t имеет размер 2-4 байта, в то время как char только один байт. В char можно поместить только ascii тобишь латынь и некоторые вспомогающие-управляющие символы(типа !"#$^&). А в широкий двубайтовый(или четырёх байтовый) можно запихнуть весь unicode: русский, китайский т.д.
0
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 17:08  [ТС] 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
#include<iostream>
#include<iomanip>
using namespace std;
 
int main()
{
    setlocale(0,"");
int n=8;
int i,t;
char *ss1=new char[n];
strcpy(ss1,"");
ss1="Привет мир";
cout<<"Исходная строка: "<<ss1<<endl;
cout<<"Конечный вариант: ";
char ord[]="АаБбВвГгДдЕе1234567890";
for (i=0,t=0; ord[i]!='\0', t<strlen(ss1); i++,t++)
{
for(int i=0; i<=23; i++)
{
if (ss1[t]==ord[i])
cout<<ss1[t];
}
 
 
}
cout<<endl;
return 0;
}
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:08 16
Цитата Сообщение от xtorne21st Посмотреть сообщение
Вот вариант с "широкими" символами (только не удивляйтесь если увас работало, а где-то в другом месте нет)
Хотя по идее должно работать на большенстве машин
0
30 / 30 / 13
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 17:10 17
А вы скажите что вот здесь происходит?
C++
1
2
3
4
5
6
7
for (i=0,t=0; ord[i]!='\0', t<strlen(ss1); i++,t++)
{
for(int i=0; i<=23; i++)
{
if (ss1[t]==ord[i])
cout<<ss1[t];
}
Я по сути только этот цикл и заменил в своей версии.
0
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 17:12  [ТС] 18
unit7, там выводит только те символы которые встречались в ord.Пробовал выводить все остальные символы в конце не получилось чужь какую-то выводит!
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:14 19
Цитата Сообщение от Azazu Посмотреть сообщение
Товарищи, вы мне скажите этот код можно доделать ?
Этот код доделать можно, переделав его полностью). Ещё раз прочитайте что я вам писал.
C++
1
char ord[]="АаБбВвГгДдЕе1234567890";
Здесь вы пытаетесь запихнуть двубайтовые символы в однобайтовый char...
Тут
C++
1
t<strlen(ss1)
Вы вычисляете размер при помощи "однобайтовой" функции.
Посмотрите мой код для широких символов - он рабочий.

Добавлено через 1 минуту
Сортировка символов в строке
0
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 20:09  [ТС] 20
unit7,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int len = strlen(ss1), lenOrd = strlen(ord);
    
    for (int i = 0; i < len - 1; ++i) {
        for (int j = i + 1; j < len; ++j) {
            int first = -1, second = -1;
            for (int k = 0; k < lenOrd; ++k) {
                if (ss1[i] == ord[k])
                    first = k;
                if (ss1[j] == ord[k])
                    second = k;
            }
            
            if (first == -1 || (first > second && second != -1))
                swap(ss1[i], ss1[j]);
        }
    }
теперь объясните мне пожалуйста что в этом коде происходит?

Здесь вы пытаетесь запихнуть двубайтовые символы в однобайтовый char...
Тут
C++
1
t<strlen(ss1)
Вы вычисляете размер при помощи "однобайтовой" функции.


А если использовать unsigned int?

Добавлено через 12 минут
unit7, кстати ваш код действительно не компилируется!

Добавлено через 2 часа 31 минуту
xtorne21st, я тут посмотрел ваш код и убедился что он работает не правильно!Вы его сами проверяли?
0
23.02.2013, 20:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2013, 20:09
Помогаю со студенческими работами здесь

Сортировка Шелла и пирамидальная сортировка для символов
Здраствуйте, можете пожалуйста привести пример сортировок шелла и пиромидальной сортировки...

В строке символов установить пробелы вместо символов,номера позиций которых при делении на 6 дают в остатке 3
и вот 2 задачка. В заданной строке символов установить пробелы вместо символов,номера позиций...

Дана строка символов, пользователь вводит комбинацию символов проверить сколько раз встечается эта комбинация в строке.
Дана строка символов, пользователь вводит комбинацию символов проверить сколько раз встечается эта...

Текст, состоящий не более чем из 255 символов, разбить на строки длиной не более 50 символов в строке
Текст, состоящий не более чем из 255 символов, разбейте на строки длиной не более 50 символов в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru