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

Как использовать данные из цикла вне его - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
29.04.2014, 18:35     Как использовать данные из цикла вне его #1
Уважаемые модераторы прошу удалит предыдущую тему.

Так как я изучаю программирование самостоятельно часто появляются вопросы на которых неоткуда получит ответ кроме как спросит на форуме. По этому решил создать тему и поставит все свои вопросы которые есть сейчас и появятся в будущем в этой теме.

Буду очень благодарен если кто та из опытных программистов будет следит за темой.

И так вопрос 1. Как использовать данные из первого цикла вне цикла. Пришлось обработать все на одном цикле при выводе получается полный хаос.

код С++
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
int main()
{ setlocale (LC_ALL , "Russian");
    string text;
    string f;
    vector<string> vtext;
    
    std::cout << " Введите текст " << std::endl;
    if(std::getline(std::cin, text))
     
    int s = 5;
        for(string::size_type i = 0; i != text.size(); i++)
        { f = text[i];
        
        std::cout << text[i] << " ";
        
        vtext.push_back(f);
        std::cout << f << " ";
        text[i] = toupper(text[i]);
        std::cout << text[i] << " ";
        
    }
    int r = 2;
    char c = 'a';
        for(vector<string>::iterator it = vtext.begin(); it != vtext.end(); it++)
        {
    *it = r;
    r++;
    *it = c;
    c++;
    std::cout << *it << "-";
    }
        _getch ();
        
        return 0;
    }


Вопрос 2. Почему иногда переменное инициализированная перед циклом (for) не принимается в цикле. Пишет то переменная не инициализирована или не известна.

Вопрос 3. Сегодня учил библиотечный тип bitset. Привлекло внимание следующее:
Цитирую из книги:
" На машине с 32 - битовым типом unsigned long, шестнадцатеричное значение 0xffff представляется последовательностью из 16 битов, заполненных единицами , с последующими нулями до конца размера. Набор битов можно инициализировать с значением 0xffff следующим образом.
//набор bitvec1 меньше инициализирующего значения.
bitset<16> bitvec1(0xffff);
// размер набора bitvec2 и инициализирующая значение совпадают
bitset<32> bitvec2(0xffff);
Вот не понятно. Если 0xffff шестнадцатеричное то почему "// размер набора bitvec2 и инициализирующая значение совпадают
bitset<32> bitvec2(0xffff);"

Вопрос 4. Сегодня изучал итераторы. Написал программу которую показал на 1 вопросе. При использование вектора такой код не верен из за того что инициализированная значение r относится типу int а сам вектор типу string. Но при использование итератора не выдало не каких ошибок. И выводит некие символы. Не тарабарщина а определенные символы: Если написать Hello! получится смайлик, карточные знаки, символ ноты ( со звуком ). Если написать текст по больше получится эти символы и еще множество символов. Это ошибка программы или так и должно быт?
код C++
C++
1
2
3
4
5
6
7
8
9
10
int r = 2;
    char c = 'a';
        for(vector<string>::iterator it = vtext.begin(); it != vtext.end(); it++)
        {
    *it = r;
    r++;
    *it = c;
    c++;
    std::cout << *it << "-";
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
03.05.2014, 11:26  [ТС]     Как использовать данные из цикла вне его #41
TenGen, а как же взаимодействие? Vector уже сохранен, индексирован. Если ввести еще одну переменную не будет ли проблем? В данный момент программа не такая уж сложная и работает с несколькими буквами ( может текст но это мало имеет значение) Что если делать это в большой программе?

Я к тому что если в vector -e сохранены некие габаритные данные то, чтоб использовать другую переменную i надо будет переписать огромный участок кода чтоб программа видел все как есть. Или этого не потребуется?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
03.05.2014, 11:31     Как использовать данные из цикла вне его #42
Altair42, vtext.push_back(f); не означает, что туда засунули переменную f. Это означает, что было использовано значение из переменной f. Вектору (да и другим вещам) без разницы, как называются передаваемые переменные и сколько у вас их объявлено.
И в вашем случае дополнительные циклы нужны. Вы ведь хотите вначале вывести все элементы строки, затем все элементы вектора.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
03.05.2014, 11:47  [ТС]     Как использовать данные из цикла вне его #43
Я не хочу вывести элементы из строки.
Я хочу.
- сохранит элементы используя стринг для далнейшей работы с той библиотекой при необходимости.
- сохранит элементы стринга в векторе ( Возможно измененные. А значит ввести в вектор элементы которых вводил с консоли ошибка)
- сохранит элементы вектора переобразововая их.
- вывести элементы стринга.
- вывести элементы вектора.
- вывести переобразованные элементы вектора.

И на счет vtext.push_back(f); Я не засунул туда отделную переменную. Я просто присвоил элемент переменной text[i] к f. Ибо в векторе не мог сохранит элемент стиринга в изначальном виде (vtext.push_back(text[i]) выдавал ошибку).

Наверно я не так выразился. Переменная i отслеживает и индексирует элементы string если ввести другую переменную i то программа не сможет видеть те элементы которые индексированы с помощью другой переменной i. Это как бы есть вы с ником TenGen в этом форуме, но и есть другой человек с таким же ником но совсем в другом форуме. Ваши данные не как не могут совпадать потому что у вас одинаковые ники.
В польне вероятно что именно эта программа будет работать с новой переменной i ибо тут нет сложных операций. Это будет как сохранит вводимые с консоли данные отдельно в стринг и в вектор. А не так чтоб сохранит данные стринг, которые были сохранены с ввода с консоли, в вектор. То есть если добавит какую то операцию из библиотеки стринг то ваш вариант не сработает. ибо элементы стринга будут изменены, в векторе сохранится не измененные элементы стринга а изначально сохраненные в нем.
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
03.05.2014, 12:24     Как использовать данные из цикла вне его #44
Altair42, какова цель задачи? Вывести слово со всеми комбинациями букв в нижнем и верхнем регистре? Например, на входе получаем qwe, тогда выводим qwe, Qwe, qWe, QWe, qwE,QwE, qWE, QWE, так?
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
03.05.2014, 12:59  [ТС]     Как использовать данные из цикла вне его #45
Denis123456789, я написал цел задачи
Цитата Сообщение от Altair42 Посмотреть сообщение
Я не хочу вывести элементы из строки.
Я хочу.
- сохранит элементы используя стринг для далнейшей работы с той библиотекой при необходимости.
- сохранит элементы стринга в векторе ( Возможно измененные. А значит ввести в вектор элементы которых вводил с консоли ошибка)
- сохранит элементы вектора переобразововая их.
- вывести элементы стринга.
- вывести элементы вектора.
- вывести переобразованные элементы вектора.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
03.05.2014, 13:08     Как использовать данные из цикла вне его #46
Altair42, i ничего не индексирует. Это лишь удобный итератор для цикла. text[i] возвращает значение элемента с индексом i. Если вы напишете int t = 5; cout << text[t] << text[i] << endl; для программы text[t] будет таким же вызовом, как и text[i]
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
03.05.2014, 13:14     Как использовать данные из цикла вне его #47
Altair42, т.е. основная задача заключается в сохранении в векторе всех стрингов, с различными комбинациями регистров букв в них?
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
03.05.2014, 13:17  [ТС]     Как использовать данные из цикла вне его #48
TenGen, да я в курсе. Именно в той программе именно i отвечает за индекс элемента. если добавит другую переменную i тот и не сможет отвечать за индекс i который был введен в цикле.

text[i] и text[i] в этом случае разные вещи. Первый i отвечает за индекс элемента текста. Второй i который был введен вне диапазона видимости цикла. Не за что не отвечает, а значит text[i] ( i введено вне цикла) не ровно text[i] (i введен в цикле).

Добавлено через 1 минуту
Denis123456789, задач там 3.
- Сохранит данные, которых ввели через консол в стринге.
- сохранит стринг в векторе.
- изменит вектор.

вывести стринг, вектор, измененный вектор по отделности.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
03.05.2014, 13:18     Как использовать данные из цикла вне его #49
Altair42, у вас переменная i, объявленная в цикле, будет существовать только на время работы цикла. То есть переменные i в коде
C++
1
2
for (int i = 0; i < 2; i++) cout << text[i];
for (int i = 4; i < 6; i++) cout << text[i];
никак не будут пересекаться. Так что проблем не вижу
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
03.05.2014, 13:24  [ТС]     Как использовать данные из цикла вне его #50
А если объявить итератор глобальным? Это может сработать? Ну типа
for(string::size_type (public i).....

Добавлено через 1 минуту
TenGen, друг мой проблема в том что мне нужно чтоб первый и видел вторую. То есть мне надо чтоб они пересекались.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
03.05.2014, 13:26     Как использовать данные из цикла вне его #51
Altair42, тогда конечно, объявите int i; вне цикла. В таком случае цикл у вас будет for (i = 0; i < 10; i++).
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
03.05.2014, 13:31  [ТС]     Как использовать данные из цикла вне его #52
Объясню по другому.
Я ввел слово "Hello"
Сохранил это слово в string.
Изменил это слово добавив туда TenGen.
Теперь надо сохранит "Hello Tengen" в vector.
Далее надо изменит вектор чтоб все элементы вектора были в верхнем регистре. При этом сохранит копию.
Вывести стринг, вектор, измененный вектор по отдельности.

Добавлено через 33 секунды
TenGen, а так точно будет работать?
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
03.05.2014, 17:02     Как использовать данные из цикла вне его #53
Altair42, так:
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
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    string a;
    vector<char> t1,t2;
    getline(cin,a);
    a+="abc";
    for (int i=0;i<a.size();i++)
    {
        t1.push_back(a[i]);
        t2.push_back(a[i]);
    }
    vector<char>:: iterator it=t1.begin();
    while (it!=t1.end())
    {
        *it=toupper(*it);
        it++;
    }
    cout<<"string::"<<a<<'\n';
    it=t2.begin();
    cout<<"vector1:";
    while(it!=t2.end())
        cout<<*it++;
    cout<<'\n';
 
    cout<<"vector2:";
    it=t1.begin();
    while(it!=t1.end())
        cout<<*it++;
    return 0;
}
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
07.05.2014, 18:09  [ТС]     Как использовать данные из цикла вне его #54
Вопрос. Почему данная программа
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    const size_t array_size = 7;
    int ia1[] = {1, 33, 4, 5, 7, 8, 12};
    int ia2[array_size];
    for (size_t ix = 0; ix != array_size; ix++)
        ia2[ix] = ia1[ix+1];
    std::cout << "array 1 = " << ia1 << "\n" << "array 2 = " << ia2 << std::endl;
    _getch ();
    return 0;
    }
Показывает вот такую фигню?

Как использовать данные из цикла вне его
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.05.2014, 18:29     Как использовать данные из цикла вне его #55
Altair42, а что не так? Выводит адрес первого и второго массива. А ты ожидал что-то другое? Что, если не секрет?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 18:31     Как использовать данные из цикла вне его #56
Цитата Сообщение от Altair42 Посмотреть сообщение
Показывает вот такую фигню?
Показывает адрес первого элемента. Срабатывает operator<<(std::ostream &, void *);
Чтобы научить std::cout выводить массив нужно добавить свой оператор <<, например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <size_t N>
std::ostream & operator <<(std::ostream & out, int const (& arr)[N])
{
    for(size_t i = 0 ; i < N; ++i)
    {
        out << ' ' << arr[i];
    }
    return out;
}
int main()
{
    const size_t array_size = 7;
    int ia1[] = {1, 33, 4, 5, 7, 8, 12};
    int ia2[array_size];
    for (size_t ix = 0; ix != array_size; ix++)
        ia2[ix] = ia1[ix+1]; // кстати тут ошибка. чтобы это верно работало в ia1 
                             // должно быть на 1 больше элементов чем в ia2
    std::cout << "array 1 = " << ia1 << "\n" << "array 2 = " << ia2 << std::endl;
    _getch ();
    return 0;
}
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
07.05.2014, 19:38  [ТС]     Как использовать данные из цикла вне его #57
DrOffset, я думал в фигурных скобках показывается элементы массива.
int ia1[] = {1, 33, 4, 5, 7, 8, 12};
И при выводе должен показать эти элементы.

Добавлено через 5 минут
На счет ai[ix+1]. Я думал [ix] это элемент массива. Как в векторе.

DrOffset, вы можете дат полный код? Я хотел бы посмотреть что оно делает. Этот код не компилируеться. Наверно чего та не хватает ошибка в
template <size_t N>
std::ostream & operator <<(std::ostream & out, int const (& arr)[N])

Добавлено через 1 минуту
Kuzia domovenok, я хотел вывести массив а не его адрес.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 19:56     Как использовать данные из цикла вне его #58
Цитата Сообщение от Altair42 Посмотреть сообщение
На счет ai[ix+1]. Я думал [ix] это элемент массива. Как в векторе.
Да - это индекс элемента. Их там семь. На седьмом элементе будет ix == 6, 6 + 1 = это 7. Элемента с индексом 7 не существует, это выход за пределы массива.
Цитата Сообщение от Altair42 Посмотреть сообщение
вы можете дат полный код?
Это и есть полный код, нужно только #include <iostream> добавить в начало.
Цитата Сообщение от Altair42 Посмотреть сообщение
я думал в фигурных скобках показывается элементы массива.
Все правильно. Но вывод в общем случае не знает ничего про массив. Здесь куча причин почему так, но я честно говоря даже не представляю как сейчас это все изложить, чтоб бы не запутать тебя еще больше.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
07.05.2014, 20:39  [ТС]     Как использовать данные из цикла вне его #59
Цитата Сообщение от DrOffset Посмотреть сообщение
Да - это индекс элемента. Их там семь. На седьмом элементе будет ix == 6, 6 + 1 = это 7. Элемента с индексом 7 не существует, это выход за пределы массива.
Это понял.
Цитата Сообщение от DrOffset Посмотреть сообщение
Это и есть полный код, нужно только #include <iostream> добавить в начало.
Все добавлено ошибки я указал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 20:44     Как использовать данные из цикла вне его
Еще ссылки по теме:

C++ Как использовать данные из файла заранее созданного?
В каком месте использовать конструктор - вне цикла или в цикле? C++
Что из себя представляет код в стеке, и как его использовать C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 20:44     Как использовать данные из цикла вне его #60
Цитата Сообщение от Altair42 Посмотреть сообщение
Все добавлено ошибки я указал.
Текст ошибок компилятора сюда добавь
Yandex
Объявления
07.05.2014, 20:44     Как использовать данные из цикла вне его
Закрытая тема Создать тему
Опции темы

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