Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
1

Ещё раз про использование указателей

01.11.2014, 23:19. Показов 1359. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Проблема многих новичков, не перестроился мог на ссылки и указатели в С++.
Много прочитал, просмотрел, чужие примеры понял, своё сам сделать не могу…
Время жизни переменной в С++ ограничена блоком в моём случае интересует переменная цикла j во втором цикле.
Делать все переменные глобальными, объяснили, плохой стиль и всё такое не обсуждается…
Как получить доступ к переменной j в третьем цикле, чтоб печаталась какая-то другая фигура? Покажите, кто-нибудь как в таких случаях поступают?
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
36
37
38
39
40
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); 
    
    int n=0;
    int k=0;
 
 
    cout << "Введите размер"  << endl;
    cin >> n;
    
    
    
    cout << "Число" <<  n << endl;
 
        for (int i=0; i<n; i++)//строка
        {
            cout << endl;
 
            for (int j=0; j<i; j++) int* pj = &j; cout << ' ' ;//столбец(отступ) до первой звёздочки
            {
                
            cout << '*' ;
            
            for (int s=2*n; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            //for (int s=2*n - *pj; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            {
                cout << '*';
            }
            
            }   
            
 
        }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2014, 23:19
Ответы с готовыми решениями:

Ещё раз про поток stringstream!
Всем привет! Вобщем понадобился мне этот поток... Поискал я как его очищать... Нашёл несколько...

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

Еще раз про setw: не определяется, хотя все файлы импортированы
скрины как решилась проблема.

Еще раз про геолокацию
Здравствуйте. Нужно сделать так, чтобы в форме, пользователь мог отметить свое местонахождение на...

17
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
01.11.2014, 23:25 2
Третий цикл находится внутри того же блока, где объявлена переменная j.
Так что к ней оттуда можно обращаться.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
01.11.2014, 23:31 3
Цитата Сообщение от russian_pepper Посмотреть сообщение
Проблема многих новичков
Вот еще твои проблемы.
1. Ставь тэги кода. Приятнее смотреть. И некоторые ошибки видны сразу.
2. Избегай неоправданных пустот. Твой код смотрят на экране. А он, увы! пока не резиновый. Идеально, чтобы весь код помещался в одно окошко.
3.
C++
1
 for (int j=0; j<i; j++) int* pj = &j; cout << ' ' ;//столбец(отступ) до первой звёздочки
Эта строка является полным бредом. Синтаксис учи.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Третий цикл находится внутри того же блока, где объявлена переменная j.
Так что к ней оттуда можно обращаться.
Я в восхищении! Как вы в этом нашли еще какой-то смысл?

Добавлено через 2 минуты
Хорошо. Перекроим строку иначе
C++
1
2
3
4
for (int j=0; j<i; j++) {
   int* pj = &j; 
}
cout << ' ' ;
Смысл?
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
02.11.2014, 00:27  [ТС] 4
Хорошо, почему тогда в таком виде
Появляется ошибка Error 1 error C2065: 'j' : undeclared identifier 23 1 Project9. в третьем цикле.
Я попытался через адрес эту переменную получить, тоже не получается…
Если -j убрать в третьем цикле, то всё работает…
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
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); 
    int n=0;
    int k=0;
    cout << "Введите размер"  << endl;
    cin >> n;
    cout << "Число" <<  n << endl;
 
    for (int i=0; i<n; i++)
    {
        cout << endl;
 
        for (int j=0; j<i; j++) cout << ' ' ;//столбец(отступ) до первой звёздочки
        //int* pj = &j;
        {
            cout << '*' ;
 
            for (int s=2*n-j; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            //for (int s=2*n - *pj; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            {
                cout << '*';
            }
        }   
    }
}
Добавлено через 3 минуты
Я скопировал из Visual Studio текст и форматирование сбилось... Извиняюсь...
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
02.11.2014, 00:28 5
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

Цитата Сообщение от Байт Посмотреть сообщение
1. Ставь тэги кода.

Не по теме:

Хоть кол чеши на голове! Ну не уважаешь ты меня! Чего ж хочешь?

1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
02.11.2014, 00:48  [ТС] 6
Видит Бог уважаю! Уже ищу где прочитать как их ставить.... Дай ссылку если есть, ещё больше уважать буду...

Добавлено через 2 минуты
Его же уже и не исправить там уже ушло...

Добавлено через 12 минут
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
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); 
    int n=0;
    int k=0;
    cout << "Введите размер"  << endl;
    cin >> n;
    cout << "Число" <<  n << endl;
 
    for (int i=0; i<n; i++)
    {
        cout << endl;
 
        for (int j=0; j<i; j++) cout << ' ' ;//столбец(отступ) до первой звёздочки
        //int* pj = &j;
        {
            cout << '*' ;
 
            for (int s=2*n; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            //for (int s=2*n - *pj; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            {
                cout << '*';
            }
        }   
    }
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
02.11.2014, 00:48 7
Цитата Сообщение от russian_pepper Посмотреть сообщение
Дай ссылку если есть, ещё больше уважать буду...
Пишешь ответ. Мышкой выделяешь свой код. Над ответов есть всякие картинки. Слева во втором ряду "С++". Щелкни.
Второй вариант. Перед кодом ставишь <CPP>. После кода </CPP>. Скобки не угловые, а квадратные. Если б я написал квадратные, ты б увидел код-СРР между ними.
Удачи!
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
02.11.2014, 00:55  [ТС] 8
Так переделал же уже....

Добавлено через 3 минуты
Программа выше работает но если в третьем цикле -j добавляю, ошибка появляется, почему?
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
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); 
    int n=0;
    int k=0;
    cout << "Введите размер"  << endl;
    cin >> n;
    cout << "Число" <<  n << endl;
 
    for (int i=0; i<n; i++)
    {
        cout << endl;
 
        for (int j=0; j<i; j++) cout << ' ' ;//столбец(отступ) до первой звёздочки
        //int* pj = &j;
        {
            cout << '*' ;
 
            for (int s=2*n-j; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            //for (int s=2*n - *pj; s>n; s--) cout << ' ' ;//пробелы после первой '*'
            {
                cout << '*';
            }
        }   
    }
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
02.11.2014, 00:56 9
Цитата Сообщение от russian_pepper Посмотреть сообщение
Так переделал же уже....

Не по теме:

Ну и ладушки! Я пока писал тебе инструкцию, твоей переделки не знал. Помощи от меня сегодня не жди. Спать пора...

0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
02.11.2014, 02:42  [ТС] 10
Добавлено через 1 час 44 минуты
Мне нужно V напечатать звёздочками. Ниже последний вариант. Как мне переменную j из 2-го цикла в третий передать?
И почему, во втором цикле, если написать int* pj = &j; после этого переменная j если к ней обратиться появляется ошибка?
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
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian"); 
    int n=0;
    int k=0;
    //cout << "Введите размер"  << endl;
    cin >> n;
 
    for (int i=0; i<=n; i++)//строка
    {
        for (int j=0; j<i; j++)  
            //int* pj = &j;//после такой записи ниже появится ошибка если обратиться к переменной J
        {
            cout << ' ';    //столбец(отступ) до первой звёздочки
            //cout << j;//Error 1   error C2065: 'j' : undeclared identifier    e:\users\p\documents\школа программирования с++\c++_temp\project9\project9\цикл в цикле.cpp 21  1   Project9
        }   
        cout << '*';
 
        for (int s=2*n; s>=n; s--)
            //for (int s=2*n-*pj; s>=n; s--) // Не получается сюда передать значение переменной j
        {   
            cout << ' ' ;//пробелы после первой '*'
        }   
        cout << '*';
        cout << endl;
    }
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
02.11.2014, 08:01 11
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); 
    int n=0;
    //int k=0;
    cout << "Введите размер"  << endl;
    cin >> n;
 
    for (int i=0; i<=n; i++)//строка
    {
        for (int j=0; j<i; j++)  
        {
            cout << ' ';    //столбец(отступ) до первой звёздочки
            cout << j;
        }   
        cout << '*';
 
        for (int s=2*n; s>=n; s--)
        {   
            cout << ' ' ;//пробелы после первой '*'
        }   
        cout << '*';
        cout << endl;
    }
}
Так всё работает, но в третьем цикле j использовать нельзя пока он не будет вложен во второй.
Да и какой смысл использовать j в третьем цикле?
Почему у тебя в разных кодах третий цикл то вложен во второй, то нет?

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    setlocale( LC_ALL, "Russian" );
    int n = 0;
    cout << "Введите размер" << endl;
    cin >> n;
    for ( int i = 0; i < n; i++ ) //строка
    {
        for ( int j = 0; j < i; j++ ) cout << ' '; // отступ до первой звёздочки
        cout << '*';
        for ( int j = n*2-i*2-1; j > 0; --j ) cout << ' ' ; // пробелы после первой '*'
        cout << '*';
        cout << endl;
    }
    for ( int j = 0; j < n; j++ ) cout << ' '; // отступ до первой звёздочки
    cout << '*';
}
1
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
02.11.2014, 10:00 12
russian_pepper, время жизни переменной в С++ зависит от спецификатора (класса) памяти. Глобальные (внешние) переменные, как известно, существуют на протяжении всего времени выполнения программы. Но кроме них аналогичное время жизни имеют и локальные (внутренние) переменные, объявленные со спецификатором памяти static. В Вашем случае проблема связана с областью видимости переменных, которая является результатом невнимательного изучения языка С++. Переменная j не видна, потому что её область видимости распространяется от точки объявления до конца оператора цикла, либо до конца блока, контролируемого циклом. У вас:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int j=0; j<i; j++) int* pj = &j; cout << ' ' ;
{
    ....
}
 
// есть ни что иное, как
 
for (int j = 0; j < i; j++)
    int * pg = &j;                // конец тела цикла, конец области видимости j
 
cout << ' ';
 
{
    ....
}
Мой Вам совет: всегда заключайте операторы, принадлежащие циклу/условию (даже если он (оператор) один), в фигурные скобки (блок). Это позволит избежать ошибок, подобных Вашей, в будущем.
Использование глобальных переменных не есть ошибка или плохой стиль, если Вы уверены в том, что делаете. А вот размещение нескольких операторов друг за другом в одной строке - плохая привычка, от которой я советую Вам избавиться как можно скорее.
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
02.11.2014, 13:09  [ТС] 13
Хорошо, в этом конкретном случае всё понятно, работает, но мне ещё ромбы и кресты всякие нарисовать надо. Как правильно поступать например в такой конструкции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < k; i++) 
{
    ....
}
 
 
for (int j = n; j > 0; j--)
 
{
    ....
    //Что делать если здесь нужен доступ к переменной i?
 
}
Наверное, не разумно делать переменные всех циклов , которые будут нужны глобальными в программе...
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
02.11.2014, 13:30 14
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

Цитата Сообщение от russian_pepper Посмотреть сообщение
не разумно делать переменные всех циклов , которые будут нужны глобальными в программе...
Если они нужны вне цикла, то вполне разумно и даже необходимо. Только не глобальными в программе, а описанными в функции вне цикла. Правда, в вашем примере совершенно непонятно, зачем во втором цикле нужен доступ к i. При выходе из первого цикла она стала равна k. Вот ее и используйте.
Другое дело, если первый цикл оборвался по break. Тогда надо
C++
1
2
3
4
5
6
7
8
int i;
for(i=0; i<k;i++) {
 ....
 break;
}
for(int j=n; j>0; j--) {
 // используй i в свое удовольствие
}
Добавлено через 6 минут
Цитата Сообщение от StackOverflow Посмотреть сообщение
время жизни переменной в С++ зависит от спецификатора (класса) памяти.
Не только. Еще от того места, где она объявлена
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(int i=..) {
}
// Тут уже i не видна
int i;
for(i=...) {
}
// Тут  i видна
int i=10;
for(int i=0 i<5;i++)
  // Внешняя i=10 не видна
}
cout << i; // напечатает 10
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
02.11.2014, 13:36  [ТС] 15
Отлично, в моём случае этого вполне достаточно. Значит, для решения таки задач указатели и ссылки совсем и не нужны получается…
Всё просто, мозги после старого basica ещё не перестроились...
0
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
02.11.2014, 13:43 16
Спасибо, что заметили ошибку. Там должна быть 'и' после слова 'зависит'.
Вот только Ваш пример отражает характер видимости переменных. Если i в теле цикла не видна снаружи, то это не значит, что i больше не существует, согласитесь.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
02.11.2014, 13:52 17
Цитата Сообщение от StackOverflow Посмотреть сообщение
то это не значит, что i больше не существует, согласитесь.
Не соглашусь.
И что вы имеете в виду под словом "существует" И о каком примере речь? Их там 3. И еще. Когда в теме больше 2-х собеседников, при ответе хорошо бы указать, к кому вы обращаетесь. Это просто. Надо щелкнуть по нику, и он попадет в поле быстрого ответа
0
All rights reserved.
93 / 83 / 24
Регистрация: 03.08.2013
Сообщений: 258
02.11.2014, 14:18 18
Байт, что во-вашему есть время жизни переменной?
Простой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int a;
 
int main() {
    int a = 10;
 
    for (int a = 0; i < n; i++)
    {
        static int b = 10;
        //a заместит обе внешние переменные с таким же именем
    }
 
    cout << a << endl;      // напечатает 10
}
Здесь глобальная переменная a существует на протяжении всего времени выполнения программы (т.е. с ней ассоциированы ячейка в памяти и какое-то значение).
Переменная a в main перестанет существовать, как-только функция main завершит работу. При этом глобальная a всё ещё существует. Она видна в main, но не видна за её пределами.
Переменная a в инициализирующей части цикла for существует ровно до тех пор, пока цикл не завершит свою работу. Она видна в теле цикла, но не видна вне этого тела.
Переменная b не видна вне тела цикла, но она продолжит существовать (память для неё выделена, значение сохранено) и тогда, когда цикл завершит свою работу. Не видна != не существует. Вот это я имел в виду. Собственно, я лишь обратил Ваше внимание, что Ваши комментарии к приведённому примеру также не точны.
0
02.11.2014, 14:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2014, 14:18
Помогаю со студенческими работами здесь

Ещё раз про удаление
Есть компонент JFusion, хотелось бы его удалить(т.к. в нём код 64), но в управление расширениями...

Еще раз про классы
Вот модуль,реализующий класс и его потомки: unit MyClass; interface uses...

Еще раз про бан
сайт globalmp3.ru трафик с yandex резко упал http://www.liveinternet.ru/stat/globalmp3.ru/ ...

Ещё раз про сокеты
Вернулся к вопросу о создании сокет сервера Вот взял примерчик из сети // set some variables...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru