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

Сортировка букв английского алфавита - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 13:24     Сортировка букв английского алфавита #1
Здравствуйте, помогите решить проблему не пойму в чём дело необходимо отсортировать слова:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void SetsManipulation::sortA()
{
    int count=0;
    for(int k=0;setOne[k]!='\0';k++)
    {
        count++;
    }
    for (int i=0;i<count-1;i++)
    for (int j=i+1;j<count;j++)
    if(setOne[i]>setOne[j])
    {
    swap(setOne[i],setOne[j]);
    }
    cout<<setOne<<endl;
}
Unhandled exception at 0x003b4ef0 in test.exe: 0xC0000005: Access violation writing location 0x003ba996.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 14:17  [ТС]     Сортировка букв английского алфавита #21
может можно во временный массив переписать статические строки а потом работать с ними?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 14:19     Сортировка букв английского алфавита #22
Ну, по-идее, setOne и setTwo и должны быть такими временными массивами (если они предназначены для изменения). А вариантов как обойти проблему много. Но лучше не обходить, а решать.
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 15:19  [ТС]     Сортировка букв английского алфавита #23
Спасибо вам большое буду менять.

Добавлено через 42 минуты
C++
1
2
3
4
5
6
7
8
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    for(int i=0;s1[i]!='\0';i++)
    {
        setOne[i]=s1[i];
    setTwo[i]=s2[i];
    }
}
так должно быть в констракторе?

Добавлено через 15 минут
Мне не понятно как если у меня char setOne[52]; равняется 52 и если я правильно написал констрактор, то получается как мне им пользоваться в других функциях каждый раз заново его инициализировать в отдельной функции?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 15:22     Сортировка букв английского алфавита #24
Да, только setOne и setTwo должны быть тогда массивами с достаточным размером, а если s1 и s2 строки разной длины, то копирование s2 должно быть в отдельном цикле

Добавлено через 1 минуту
Цитата Сообщение от Diesel101 Посмотреть сообщение
Мне не понятно как если у меня char setOne[52]; равняется 52 и если я правильно написал констрактор, то получается как мне им пользоваться в других функция каждый раз заново его инициализировать в отдельной функции?
Э... Кем пользоваться? Кого инициализировать?
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 15:31  [ТС]     Сортировка букв английского алфавита #25
Например функция называется
C++
1
void SetsManipulation::DTOR()
{
необходимо здесь написать так чтобы было группа A={dsfsf} группа B={gfdh} и количество обеих групп.
}

Выходит мне надо писать опять то что написано в констракторе и заново s1 и s2 переписывать в setOne, setTwo?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 15:39     Сортировка букв английского алфавита #26
Цитата Сообщение от Diesel101 Посмотреть сообщение
Выходит мне надо писать опять то что написано в констракторе и заново s1 и s2 переписывать в setOne, setTwo?
setOne и setTwo инициализируются в конструкторе и доступны во всех функциях. Зачем их ещё раз инициализировать? Или я не понял вопроса.

Добавлено через 34 секунды
С указателями и динамическим выделением памяти это могло выглядеть как-нибудь так:
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
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    int size = 1;
    for(int i = 0; s1[i] != '\0'; ++i)
        ++size;
 
    setOne = new char[size];
    
    for(int i = 0; i < size; ++i)
        setOne[i] = s1[i];
 
    size = 1;
    for(int i = 0; s2[i] != '\0'; ++i)
        ++size;
 
    setTwo = new char[size];
 
    for(int i = 0; i < size; ++i)
        setTwo[i] = s2[i];
}
 
SetsManipulation::~SetsManipulation()
{
    delete [] setOne;
    delete [] setTwo;
}
Правда повторяющуюся часть можно было тоже вынести в отдельную функцию.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.08.2011, 15:44     Сортировка букв английского алфавита #27
Цитата Сообщение от diagon Посмотреть сообщение
А если std::string, то терминальный нуль вы в нем не встретите
А куда он делся?
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 15:44  [ТС]     Сортировка букв английского алфавита #28
Вы поняли всё правильно но:
C++
1
2
3
4
5
6
7
void SetsManipulation::DTOR()
{
    for(int i=0;setOne[i]!='\0';i++)
    {
        cout<<setOne[i];
    }
}
при вывода группы А на экран, получается сама группа и каракули а количество символов 61.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 15:49     Сортировка букв английского алфавита #29
Цитата Сообщение от Diesel101 Посмотреть сообщение
при вывода группы А на экран, получается сама группа и каракули а количество символов 61.
А, ну да, в том конструкторе сам завершающий ноль не копируется. Я вроде смотрел, но так и не заметил

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    while ( (*setOne++ = *s1++) != '\0')
        ;
    while ( (*setTwo++ = *s2++) != '\0')
        ;
}
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 15:50  [ТС]     Сортировка букв английского алфавита #30
ок но тогда как он должен выгледеть?
C++
1
2
3
4
5
6
7
8
9
10
11
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    for(int i=0;s1[i]!='\0';i++)
    {
    setOne[i]=s1[i];
    }
    for(int j=0;s1[j]!='\0';j++)
    {
    setTwo[j]=s2[j];
    }
}


C++
1
2
3
4
5
6
7
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    while ( (*setOne++ = *s1++) != '\0')
        ;
    while ( (*setTwo++ = *s2++) != '\0')
        ;
}
Error 1 error C2105: '++' needs l-value
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 15:52     Сортировка букв английского алфавита #31
Цитата Сообщение от Deviaphan Посмотреть сообщение
А куда он делся?
И действительно, есть.
А я о нем даже не подозревал =\
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 15:55     Сортировка букв английского алфавита #32
В варианте с for исправить немного сложнее.
C++
1
2
3
4
5
6
7
8
9
10
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    int i;
    for (i = 0; s1[i] != '\0'; ++i)
        setOne[i] = s1[i];
    setOne[i] = '\0';
    for (i = 0; s2[i] != '\0'; ++i)
        setTwo[i] = s2[i];
    setTwo[i] = '\0';
}
Добавлено через 1 минуту
Цитата Сообщение от Diesel101 Посмотреть сообщение
Error 1 error C2105: '++' needs l-value
А, ну да setOne это же не указатель, а массив.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 15:57     Сортировка букв английского алфавита #33
Может, как-то так
C++
1
2
3
4
5
6
7
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    for (char *a = setOne, *b = s1; *a++ = *b++;)
        ;
    for (char *a = setTwo, *b = s2; *a++ = *b++;)
        ;
}
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 15:59     Сортировка букв английского алфавита #34
Цитата Сообщение от diagon Посмотреть сообщение
И действительно, есть.
А я о нем даже не подозревал =\
Как есть? Ну а даже если и есть, то его там никто не обещал.
str.c_str() добавляет '\0' сам, str.data() не добавляет, а str[str.length()] это и вовсе выход за пределы массива.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 16:01     Сортировка букв английского алфавита #35
Цитата Сообщение от grizlik78 Посмотреть сообщение
Как есть? Ну а даже если и есть, то его там никто не обещал.
str.c_str() добавляет '\0' сам, str.data() не добавляет, а str[str.length()] это и вовсе выход за пределы массива.
Хотя да, где-то на билдере давно тестил, не было.
А сейчас на gcc скомпилил этот код
C++
1
2
3
4
5
#include <iostream>
int main(){
    std::string str("123");
    std::cout << static_cast<int> (str[str.size()]);
}
Выдает нулик.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 16:02     Сортировка букв английского алфавита #36
Тогда уж так:
C++
1
2
3
4
5
6
7
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    for (char *p = setOne; (*p = *s1); ++p, ++s1)
        ;
    for (char *p = setTwo; (*p = *s2); ++p, ++s2)
        ;
}
Добавлено через 1 минуту
diagon, а что выдаёт
C++
1
2
3
4
5
#include <iostream>
int main(){
    std::string str("123");
    std::cout << static_cast<int> (str.at(str.size()));
}
?
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 16:23  [ТС]     Сортировка букв английского алфавита #37
C++
1
2
3
4
5
6
7
8
9
10
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    int i;
    for (i = 0; s1[i] != '\0'; ++i)
        setOne[i] = s1[i];
    setOne[i] = '\0';
    for (i = 0; s2[i] != '\0'; ++i)
        setTwo[i] = s2[i];
    setTwo[i] = '\0';
}
Warning 1 warning C4700: uninitialized local variable 'i' used
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 16:25     Сортировка букв английского алфавита #38
Цитата Сообщение от Diesel101 Посмотреть сообщение
Warning 1 warning C4700: uninitialized local variable 'i' used
Бред какой
Ну напиши int i = 0; первой строчкой.
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 16:36  [ТС]     Сортировка букв английского алфавита #39
Хоть и по тупому но решил сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    int count1=0, count2=0;
    for (int i=0;s1[i]!='\0';i++)
    {
        setOne[i] = s1[i];
        count1++;
    }
        setOne[count1] = '\0';
    for (int j=0;s2[j]!='\0';j++)
    {
        setTwo[j] = s2[j];
        count2++;
    }
        setTwo[count2] = '\0';
}
Добавлено через 3 минуты
просто после for i читается а в следующей строчке i уже не инициализирован.

Добавлено через 3 минуты
все функции остались рабочими, спасибо что помогли решить проблему всем по плюсу от души.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 17:15     Сортировка букв английского алфавита
Еще ссылки по теме:

В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются. C++
Заполнить матрицу случайными символами английского алфавита; вывести, сколько раз встречается каждый символ C++
Проверить вхождение всех букв алфавита в заданное множество C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.08.2011, 17:15     Сортировка букв английского алфавита #40
Цитата Сообщение от Diesel101 Посмотреть сообщение
просто после for i читается а в следующей строчке i уже не инициализирован.
i там везде инициализировано, просто компилятор туповат.
Yandex
Объявления
01.08.2011, 17:15     Сортировка букв английского алфавита
Ответ Создать тему
Опции темы

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