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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Azazu
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 00:39     Сортировка символов в строке #1
Помогите пожалуйста составить понятную для начинающего программиста программу.

Выполнить сортировку символов в строке. Порядок возрастания "весов" символов задать таблицей вида char ORD[] = "АаБбВвГгДдЕе1234567890"; Символы, не попавшие в таблицу, размещаются в конце отсортированной строки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 00:39     Сортировка символов в строке
Посмотрите здесь:

Сортировка символов в строке, виртуальные функции C++
C++ Дана строка символов, пользователь вводит комбинацию символов проверить сколько раз встечается эта комбинация в строке.
Есть двумерный массив символов, в каждой строке находится номер, мне надо к каждой строке добавить "8029" как это сделать? C++
C++ Сортировка символов в C++
Сортировка символов строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 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, но не получилось написать предикат. Если у кого-то получится, не плохо бы было взглянуть на код.
unit7
30 / 30 / 4
Регистрация: 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;
}
Azazu
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 минуты
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 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, что-то ваш код не компилируется...
unit7
30 / 30 / 4
Регистрация: 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
Azazu
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?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 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;
}
Azazu
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;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 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$
unit7
30 / 30 / 4
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 17:01     Сортировка символов в строке #11
Ну тот цикл мне не понять А мой код - обычный тупой BubbleSort, почитайте на вики.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:02     Сортировка символов в строке #12
а уже нашёл с какими : -std=c++0x
unit7
30 / 30 / 4
Регистрация: 07.08.2012
Сообщений: 86
23.02.2013, 17:03     Сортировка символов в строке #13
xtorne21st, попробуйте -std=c++0x
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:06     Сортировка символов в строке #14
Цитата Сообщение от Azazu Посмотреть сообщение
Простите я не понял что за широкие слова
Ни слова а символы wchar_t имеет размер 2-4 байта, в то время как char только один байт. В char можно поместить только ascii тобишь латынь и некоторые вспомогающие-управляющие символы(типа !"#$^&). А в широкий двубайтовый(или четырёх байтовый) можно запихнуть весь unicode: русский, китайский т.д.
Azazu
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;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:08     Сортировка символов в строке #16
Цитата Сообщение от xtorne21st Посмотреть сообщение
Вот вариант с "широкими" символами (только не удивляйтесь если увас работало, а где-то в другом месте нет)
Хотя по идее должно работать на большенстве машин
unit7
30 / 30 / 4
Регистрация: 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];
}
Я по сути только этот цикл и заменил в своей версии.
Azazu
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 22
23.02.2013, 17:12  [ТС]     Сортировка символов в строке #18
unit7, там выводит только те символы которые встречались в ord.Пробовал выводить все остальные символы в конце не получилось чужь какую-то выводит!
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
23.02.2013, 17:14     Сортировка символов в строке #19
Цитата Сообщение от Azazu Посмотреть сообщение
Товарищи, вы мне скажите этот код можно доделать ?
Этот код доделать можно, переделав его полностью). Ещё раз прочитайте что я вам писал.
C++
1
char ord[]="АаБбВвГгДдЕе1234567890";
Здесь вы пытаетесь запихнуть двубайтовые символы в однобайтовый char...
Тут
C++
1
t<strlen(ss1)
Вы вычисляете размер при помощи "однобайтовой" функции.
Посмотрите мой код для широких символов - он рабочий.

Добавлено через 1 минуту
Сортировка символов в строке
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 20:09     Сортировка символов в строке
Еще ссылки по теме:

C++ Найти количество символов всех строк файла и количество символов в определенной строке
В строке символов установить пробелы вместо символов,номера позиций которых при делении на 6 дают в остатке 3 C++
Текст, состоящий не более чем из 255 символов, разбить на строки длиной не более 50 символов в строке C++

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

Или воспользуйтесь поиском по форуму:
Azazu
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, я тут посмотрел ваш код и убедился что он работает не правильно!Вы его сами проверяли?
Yandex
Объявления
23.02.2013, 20:09     Сортировка символов в строке
Ответ Создать тему
Опции темы

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