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

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

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

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

01.08.2011, 13:24. Просмотров 2637. Ответов 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++
В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.08.2011, 15:52 #31
Цитата Сообщение от Deviaphan Посмотреть сообщение
А куда он делся?
И действительно, есть.
А я о нем даже не подозревал =\
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
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 это же не указатель, а массив.
0
diagon
Higher
1929 / 1195 / 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++;)
        ;
}
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
01.08.2011, 15:59 #34
Цитата Сообщение от diagon Посмотреть сообщение
И действительно, есть.
А я о нем даже не подозревал =\
Как есть? Ну а даже если и есть, то его там никто не обещал.
str.c_str() добавляет '\0' сам, str.data() не добавляет, а str[str.length()] это и вовсе выход за пределы массива.
0
diagon
Higher
1929 / 1195 / 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()]);
}
Выдает нулик.
1
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
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()));
}
?
1
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
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
01.08.2011, 16:25 #38
Цитата Сообщение от Diesel101 Посмотреть сообщение
Warning 1 warning C4700: uninitialized local variable 'i' used
Бред какой
Ну напиши int i = 0; первой строчкой.
1
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 минуты
все функции остались рабочими, спасибо что помогли решить проблему всем по плюсу от души.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
01.08.2011, 17:15 #40
Цитата Сообщение от Diesel101 Посмотреть сообщение
просто после for i читается а в следующей строчке i уже не инициализирован.
i там везде инициализировано, просто компилятор туповат.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.08.2011, 18:35 #41
Цитата Сообщение от grizlik78 Посмотреть сообщение
просто компилятор туповат.
Компилятор не туповат, а приучает к правильному стилю программирования. RAII и всё такое.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
01.08.2011, 19:37 #42
Цитата Сообщение от Deviaphan Посмотреть сообщение
Компилятор не туповат, а приучает к правильному стилю программирования. RAII и всё такое.
Спасибо ему, конечно, но не хватало ещё чтобы железки меня стилю учили. Первая же инструкция после объявления переменной (объявления, кстати, в обычном C стиле) является инициализацией этой переменной. Да и в предупреждении ничего о стиле не сказано. Сказано о использовании неинициализированной переменной, что обычно указывает на ошибку, а не на плохой стиль. Так что либо компилировался не приведённый код, либо никто меня не переубедит в туповатости компилятора.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.08.2011, 19:52 #43
Цитата Сообщение от grizlik78 Посмотреть сообщение
не хватало ещё чтобы железки меня стилю учил
Если не компилятор, то кто? Раз хватает опыта/наглости/желания/глупости объявлять переменную не инициализируя её, значит с хорошим тоном проблемы.
В данном случае компилятор, разумеется, ошибся. Но это повод для программиста задуматься, что же он такое пишет, что даже компилятор удивился.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
01.08.2011, 19:56 #44
Цитата Сообщение от Deviaphan Посмотреть сообщение
В данном случае компилятор, разумеется, ошибся.
Я не вижу достаточных оснований для того, чтобы компилятор смог ошибиться в данном случае. Раз уж он имеет наглость вообще выдавать такую диагностику, то уж простейший случай, где инициализация происходит до ветвления он определять должен.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 19:56
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2011, 19:56
Ответ Создать тему
Опции темы

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