43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
1

Области видимости

14.02.2015, 13:57. Показов 1643. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если я запихиваю любые операции (в данном случае задание и заполнение массива);
То далее не видит, не то что не заполненный массив, а даже то что я его объявлял...
Подскажите как правильно описать все это ?
C++ (Qt)
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <math.h>
#include <locale>
using namespace std;
 
class mas
{
private:
    int k1,k2,vremennai,per,predel,rez,ryz,*a;
    int b[];
 
public :
    mas( int n1); //êîíñòðóêòîð mas:mas
    void vvod(int n1);
    ~mas();
};
 
mas::mas(int n1){int *a=new int[n1];}
 
void mas::vvod(int n1){for(int j=0;j<n1;j++){a[j]=k1;k1++;} 
                        }
mas::~mas(){ delete a; delete b;}
 
int main(){
    setlocale(LC_ALL,"russian");
    int k1,k2;
    cout<<"(ó÷òèòå, åñëè ïðàâîå çíà÷åíèå ìåíüøå ëåâîãî , îíè ïîìåíÿþòñÿ ìåñòàìè)"<<endl;
    cout<< "Ââåäèòå äèàïîçîí ìèí. çíà÷åíèå, ìàêñ. çíà÷åíèå: "<< endl;
    cin >> k1 >> k2;
    int n=k2-k1+1;
    if(k2<k1){ int vremennai=k1; k1=k2;k2=vremennai; n=k2-k1+1;}
//int *a=new int[n]; // ЕСЛИ ТАК ТО ВСЕ НОРМ
    mas O(n);
    O.vvod(n);
    
    //ÂÎÒ ÅÑËÈ ÄÅËÀÒÜ ÝÒÎ ÂÑÅ ÒÓÒ , ÒÎ ÂÑÅ ÕÎÐÎØÎ
//  for(int j=0;j<n;j++){a[j]=k1;k1++;}  // çàïîëíåíèå ìàññèâà  // k1-çàìåíèòü êàêèì íèòü ïðåîáðàçîâàíèåì
        
    cout<<"Âñå  ÷èñëà â óêàçàííîì ìàññèâå : ";
    for(int t=0;t<n;t++){cout<<a[t]<<" ";}
    cout<<endl;
    
    
 
 
//  
 
    int per=0;
    for(int h=0;h<n;h++){ 
    int predel=a[h]-1;
    
 
//  cout<<predel<<"+"<<endl;
 
    // ïðîâåðêà íà ïðîñòîå ÷èñëî
        for(int g=2;g<predel;g++){
            if(a[h]%g==0){goto bu;
            }   
        }   
        a[per]=a[h]; per++;     
        bu:
        ;
    }
    cout<<"Âñå ïðîñòûå ÷èñëà â óêàçàííîì ìàññèâå : ";
    for(int h=0;h<per;h++){cout<<a[h]<<" ";}
    cout<<endl;
    
    int b[n];
    int rez=0;int ryz=0;
    //ïðîâåðêà íà áëèçíåöîâ
    for (int i=1;i<per;i++){
        if(a[i]-a[i-1]==2){b[rez]=a[i],a[ryz]=a[i-1];rez++;ryz++;
        }
    }
                                
    for(int h=0;h<ryz;h++){cout<<a[h]<<" áëèçíåö "<<b[h]<<endl;}
    cin.get();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2015, 13:57
Ответы с готовыми решениями:

Области видимости функций
Добрый день. Написал класс, помогите найти ошибки #include &lt;iostream&gt; #include &lt;string&gt;...

Классы, наследование, области видимости
A.h: #ifndef A_H #define A_H #include &quot;C.h&quot; class C; class A { private:

Вопрос об области видимости переменной
У меня в проге один главный цикл и в этом цикле еще 4 цикла. Так вот, в начале главного цикла я...

Изменение области видимости функции
Здравствуйте, имеется вопрос по наследованию: Пусть имеется некоторый класс A c функцией func ...

8
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
14.02.2015, 14:45 2
C++
1
2
3
4
5
6
7
8
mas::mas(int n1)
{
    a = new int[n1];
}
mas::~mas()
{
    delete[] a;
}
Что в десятой строке и где устанавливаются k1, k2?
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.02.2015, 14:48 3
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <math.h>
#include <locale>
using namespace std;
 
class mas
{
private:
    //int k1,k2,vremennai,per,predel,rez,ryz; // временные переменные не храним
    int n; // размер массива a
    int *a;
 
public :
    mas( int n1);
    void vvod();
    void print();
    void CheckSimple(); 
    ~mas();
};
 
mas::mas(int n1)
{
    a=new int[n1];
    n=n1;
    for(int i=0;i<n;i++)
        a[i]=0;
}
 
void mas::vvod()
{
    for(int j=0;j<n;j++)
       a[j]=j;
}
void mas::print()
{
    for(int j=0;j<n;j++)
       cout<<a[j]<<' ';
    cout<<endl;
}
mas::~mas(){ delete[] a;}
 
bool IsSimple(int n)
{
    int i=2;
    for(;i*i<=n;i++)
        if(n%i==0)
            break;
    return (i*i>n);
}
 
void mas::CheckSimple()    // проверка на простые числа
{
    cout<<"Все простые числа в указанном массиве : ";
    for(int i=0;i<n;i++)
      if( IsSimple(a[i]) )
        cout<<a[i]<<' ';
    cout<<endl;
}
 
 
int main()
{
    setlocale(LC_ALL,"russian");
    int k1,k2;
    cout<< "Введите диапозон мин. значение, макс. значение: "<< endl;
    cin >> k1 >> k2;
    int n=abs(k2-k1)+1;
   
    mas O(n);
    O.vvod();
    cout<<"Все  числа в указанном массиве : ";
    O.print();
    O.CheckSimple();
    // остальное аналогично делаем в функциях - членах класса mas    
    system("pause");
    return 0;
}
0
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
14.02.2015, 14:59  [ТС] 4
Я просто не вижу разницы почему у вас работает в конструкторе , у меня нет....
//////
В 10-ой строке объявление второго массива, а задаются к1 и к2 в 29 строке
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.02.2015, 15:05 5
Вы задаете переменные, которые не являются членами класса.
Переносите код в метод класса и повторно их не объявляйте.
1
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
14.02.2015, 16:08  [ТС] 6
Разрешите еще поинтересоваться какие именно это переменные, не циклов же?

Добавлено через 49 минут
Вот написал ,работает но у разрешите задать не сколько вопросов:
1) В конструкторе в различных функциях у каждой своя область видимости?
2) Почему пока не написать в 51 строке переобозначение одной и той же переменной он её не видит?
3) То что в main ни каких массивов , переменных используемых в конструкторе не видно , это нормально?
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <math.h>
#include <locale>
using namespace std;
 
class mas
{
private:
//  int k1,k2,vremennai,per,predel,rez,ryz,*a;
   int n;
    int *b;
    int *a;
 
public :
    mas( int n1,int k11); //конструктор mas:mas
    void proverka(int n1);
    void masivb(int n1);
    ~mas();
};
 
mas::mas(int n1,int k11){a=new int[n1];n=n1;
  for(int j=0;j<n1;j++){a[j]=k11;k11++;} 
    cout<<"Все  числа в указанном массиве : ";
        for(int t=0;t<n;t++){cout<<a[t]<<" ";}
                    cout<<endl;
                        }
 
void mas::proverka(int n1){
    int per=0;
    n=n1;
    for(int h=0;h<n;h++){ 
    int predel=a[h]-1;
    // проверка на простое число
        for(int g=2;g<predel;g++){
            if(a[h]%g==0){goto bu;
            }   
        }   
        a[per]=a[h];
        cout<<"число простое :"<<a[per]<<endl; // если сдесь убратть то перестаает работать проверка на близнецов
        per++; 
        bu:
        ;
                        }
        cout<<"Все простые числа в указанном массиве : ";
                for(int h=0;h<per;h++){cout<<a[h]<<" ";}
                                cout<<endl;                         
    }
                        
void mas::masivb(int n1){
    n=n1;
    int per=per;
    b=new int[n];
    int rez=0;int ryz=0;
    //проверка на близнецов
    for (int i=1;i<per;i++){
        if(a[i]-a[i-1]==2){b[rez]=a[i],a[ryz]=a[i-1];rez++;ryz++;
        }
    }                               
    for(int h=0;h<ryz;h++){cout<<a[h]<<" близнец "<<b[h]<<endl;}
}                   
                        
mas::~mas(){ delete a; delete b;}
 
int main(){
    setlocale(LC_ALL,"russian");
    int k1,k2;
    cout<<"(учтите, если правое значение меньше левого , они поменяются местами)"<<endl;
    cout<< "Введите диапозон мин. значение, макс. значение: "<< endl;
    cin >> k1 >> k2;
    int n=k2-k1+1; 
    if(k2<k1){ int vremennai=k1; k1=k2;k2=vremennai; n=k2-k1+1;}
    mas O(n,k1);
    O.proverka(n);
    O.masivb(n);
    cin.get();
    return 0;
}
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.02.2015, 16:43 7
Лучший ответ Сообщение было отмечено Ника)) как решение

Решение

1. Конструктор срабатывает при создании КАЖДОЙ переменной типа mas.
Он должен инициализировать ВСЕ данные класса. В том числе и массив b
(а Вы этого не сделали).
2. Переменная per не является членом класса.
Поэтому ее надо объявлять и присваивать значение.
Надо
C++
1
int per=n;
Если ее надо передать из метода proverka, то сделайте так
C++
1
2
3
4
5
int mas::proverka(int n1)
{
...
   return per;
}
А в main будет так
C++
1
2
int per=O.proverka(n);
    O.masivb(n,per);
3. Это не только нормально, но и является целью создания класса -
скрыть его внутренние данные.
1
43 / 43 / 20
Регистрация: 08.12.2010
Сообщений: 342
14.02.2015, 17:03  [ТС] 8
Вот на return у меня ругается:In member function 'void mas:roverka(int)': На сколько я понял ранее, return не используется с void-ом


Благодарю за помощь !!
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
14.02.2015, 20:31 9
А кому я написал ЭТО:
Цитата Сообщение от zss Посмотреть сообщение
int mas:roverka(int n1)
1
14.02.2015, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 20:31
Помогаю со студенческими работами здесь

Какие есть области видимости в C++?
Добрый день. Что влияет на видимость идентификаторов в коде? Пока мне удалось найти...

Оператор разрешения области видимости
Только начинаю изучать ООП. Объясните где и как применяется оператор разрешения области видимости.

Инициализация вне области видимости
Здравствуйте! Работаю над деревом, в котором есть две структуры: struct file { public: string...

Возможно ли спрятать класс из области видимости?
Здравствуйте! У меня есть технический класс, который используется только в одном другом классе,...


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

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

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