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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
#1

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

01.08.2011, 13:24. Просмотров 2679. Ответов 43
Метки нет (Все метки)

Здравствуйте, помогите решить проблему не пойму в чём дело необходимо отсортировать слова:
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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2011, 13:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка букв английского алфавита (C++):

Как заполнить массив буквами английского алфавита ? - C++
26 букв Добавлено через 48 секунд с помощью цикла for и по порядку ! Заранее спасибо!

Ввести строку символов и заменить большие буквы английского алфавита в диапазоне от ‘G’ до ‘V’ на маленькие - C++
Помогите выполнить задание: Ввести строку символов и заменить большие буквы английского алфавита в диапазоне от ‘G’ до ‘V’ на маленькие....

Из строки удалить все символы, кроме пробелов, не являющиеся буквами английского алфавита - C++
Разработать консольное приложение. 1. Во введенной строке после k-го символа вставить заданную подстроку. Подстроку ввести с клавиатуры....

Исправить код парсера так, чтобы он работал только с буквами английского алфавита - C++
Есть программа, определяющая, расположены ли буквы во введенной строке в порядке, обратном алфавитному. Рабочая, опирается на...

Заполнить матрицу случайными символами английского алфавита; вывести, сколько раз встречается каждый символ - C++
Ребята, помогите решить задачу: Двумерный массив MxN заполнить случайными символами английского алфавита (заглавные). Вывести на экран...

В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются. - C++
В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются.

43
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 14:10 #16
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну, в общем, нет
Ну я про такое определение
C++
1
char * str = "abc";
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.08.2011, 14:10 #17
Цитата Сообщение от Diesel101 Посмотреть сообщение
я просто не понимаю что необходимо показать, секретность здесь не причём.
Код конструктора, а не его прототип.
0
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 14:13  [ТС] #18
C++
1
2
3
public:
    SetsManipulation(); // default constructor "?"
        SetsManipulation(char* s1,char* s2);  // constructor

C++
1
2
3
4
5
SetsManipulation::SetsManipulation(char* s1,char* s2)
{
    setOne=s1;
    setTwo=s2;
}
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 14:14 #19
Цитата Сообщение от Diesel101 Посмотреть сообщение
diagon, у меня 18 функций проблема с двумя можно как-то решит проблему с тем что есть
Ну если те 16 функций не трогают строку - может быть.
Но так делать неправильно.
или надо изменит на char setOne[100]?
Надо.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.08.2011, 14:15 #20
Ну вот, точно. В результате setOne указывает на константу, которую нельзя изменять.
Так что как сказал diagon, надо выделять память под массив и копировать туда строку.
0
Diesel101
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 31
01.08.2011, 14:17  [ТС] #21
может можно во временный массив переписать статические строки а потом работать с ними?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.08.2011, 14:19 #22
Ну, по-идее, setOne и setTwo и должны быть такими временными массивами (если они предназначены для изменения). А вариантов как обойти проблему много. Но лучше не обходить, а решать.
0
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 и если я правильно написал констрактор, то получается как мне им пользоваться в других функциях каждый раз заново его инициализировать в отдельной функции?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.08.2011, 15:22 #24
Да, только setOne и setTwo должны быть тогда массивами с достаточным размером, а если s1 и s2 строки разной длины, то копирование s2 должно быть в отдельном цикле

Добавлено через 1 минуту
Цитата Сообщение от Diesel101 Посмотреть сообщение
Мне не понятно как если у меня char setOne[52]; равняется 52 и если я правильно написал констрактор, то получается как мне им пользоваться в других функция каждый раз заново его инициализировать в отдельной функции?
Э... Кем пользоваться? Кого инициализировать?
0
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?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
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;
}
Правда повторяющуюся часть можно было тоже вынести в отдельную функцию.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.08.2011, 15:44 #27
Цитата Сообщение от diagon Посмотреть сообщение
А если std::string, то терминальный нуль вы в нем не встретите
А куда он делся?
0
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.
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
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')
        ;
}
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
0
01.08.2011, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 15:50
Привет! Вот еще темы с ответами:

Определить номера букв русского алфавита - C++
Добрый день. Суть вопроса: нужно для заданной строки определить номера букв русского алфавита. Немного погуглив, узнал, что это можно...

Генератор паролей: 6 случайных букв русского алфавита - C++
Реализовать на языке программирования С программу, реализующую генератор паролей. необходимо чтобы программа выдавала 6 случайных букв...

Подсчитать количество букв русского алфавита из файла .txt - C++
Задача: Осуществить подсчет количества разных букв русского алфавита (&quot;а&quot;, &quot;б&quot;, ...) в текстовом файле .txt. Результаты вывести в...

Удаление из строк всего,кроме букв латинского алфавита - C++
Необходимо удалить из строк всё,кроме букв латинского алфавита и вывести указатели символов *,&amp;.Почему-то вылезает ошибка на неожиданном...


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

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

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