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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
#1

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

29.04.2014, 18:35. Просмотров 1661. Ответов 69
Метки нет (Все метки)

Уважаемые модераторы прошу удалит предыдущую тему.

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

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

И так вопрос 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 << "-";
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2014, 18:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как использовать данные из цикла вне его (C++):

В каком месте использовать конструктор - вне цикла или в цикле? - C++
Добрый день! Как писать правильнее? Ниже два примера: QStringList data; foreach(const QString &amp;category, categories) { data...

printf не выводи данные вне цикла. - C++
Здравствуйте! Проблема состоит в том,что если printf стоит внутри какого-нибудь цикла,то данные выводятся нормально,но если этот printf...

О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? - C++
Вот есть такой оператор всеми программистами нелюбимый. Goto называется. Говорят, что его использование всегда можно обойти и...

Как можно еще использовать std::placeholders вне в связки с std::bind? - C++
Добрый день! Как можно еще использовать std::placeholders вне в связки с std::bind?

Вывод результата вне цикла - C++
Написать программу, вычисляющую НОД (наибольший общий делитель) двух целых чисел Все работает,только вывод надо сделать вне цикла....

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. - C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
TenGen
Будущее рядом
97 / 95 / 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
Сообщений: 338
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
Будущее рядом
97 / 95 / 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
Сообщений: 338
03.05.2014, 13:24  [ТС] #50
А если объявить итератор глобальным? Это может сработать? Ну типа
for(string::size_type (public i).....

Добавлено через 1 минуту
TenGen, друг мой проблема в том что мне нужно чтоб первый и видел вторую. То есть мне надо чтоб они пересекались.
TenGen
Будущее рядом
97 / 95 / 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
Сообщений: 338
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
Сообщений: 338
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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
07.05.2014, 18:29 #55
Altair42, а что не так? Выводит адрес первого и второго массива. А ты ожидал что-то другое? Что, если не секрет?
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
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
Сообщений: 338
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
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
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
Сообщений: 338
07.05.2014, 20:39  [ТС] #59
Цитата Сообщение от DrOffset Посмотреть сообщение
Да - это индекс элемента. Их там семь. На седьмом элементе будет ix == 6, 6 + 1 = это 7. Элемента с индексом 7 не существует, это выход за пределы массива.
Это понял.
Цитата Сообщение от DrOffset Посмотреть сообщение
Это и есть полный код, нужно только #include <iostream> добавить в начало.
Все добавлено ошибки я указал.
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
07.05.2014, 20:44 #60
Цитата Сообщение от Altair42 Посмотреть сообщение
Все добавлено ошибки я указал.
Текст ошибок компилятора сюда добавь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 20:44
Привет! Вот еще темы с ответами:

как объявить правильно tr и как его использовать при вызове функции? - C++
main.cpp case 8: cout &lt;&lt; &quot;Firs trapec # is: &quot;; cin &gt;&gt; k; k = k - 1; cout &lt;&lt; &quot;Second trapec # is: &quot;; cin &gt;&gt; j;...

Как использовать данные из файла заранее созданного? - C++
Начал изучать файлы, и здесь не знаю, например занес массив чисел в файл закрыл файл и теперь я хочу икористаты эти числа для Других...

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

Указатель this - как и когда его использовать - C++
Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.


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

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

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