С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
12 / 11 / 0
Регистрация: 29.11.2009
Сообщений: 186

Нужно сделать переменную статической

25.03.2010, 19:16. Показов 843. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. У меня вот какая проблема: создан класс множество. Перегружен оператор + чтоб добавлять элементы. Но вот при добавлении элемента оно добавляет элемент не в конец множества,а вместо последнего добавленного, т е получается множество является не статической переменной,а обновляется каждый раз при добавлении. со счётчиком ,который есть для того чтоб указывать в какое место вставлять новый элемент всё нормально - он растёт.
Помогите разобраться в чем сдесь дело. Заранее благодарю.
Вот текст проги(это из Шилдта):
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream> 
#include<conio.h>
using namespace std;
 
const int MaxSize = 100;
int g=1;
 
class Set {
    
    char members[100];
 
    int Set::find(char ch);
 
public:
    int len;
    Set(){len=0;}
 
    int getLength(){return len;}
 
    void showset();
    
    Set operator +(char ch);
    
};
 
 
int Set::find(char ch){
    int i;
 
    for(i=0;i<len;i++)
        if(members[i]==ch)return i;
 
    return -1;
}
 
void Set::showset(){
    cout<<"{";
    for(int i=0;i<len; i++)
    cout<<members[i]<< " ";
 
    cout<<"}\n";
}
 
 
 
 
Set Set::operator +(char ch){
    Set newset;
 
    if(len==MaxSize){
        cout<<"Множество полно\n";
        return *this;
    }
 
        if(find(ch)==-1){
            newset.members[newset.len]=ch;
            newset.len=newset.len+g;
            g++;
        }
        return newset;
    
}
 
    
 
    
 
 
    int main(){
        setlocale( LC_ALL,"Russian" );
    Set s1;
 
    s1=s1+ 'A';
    cout<<"s1 после добавления А  ";
    s1.showset();
    
 
    s1=s1+ 'B';
    cout<<"s1 после добавления А и В  ";
    s1.showset();
    
 
    s1=s1+ 'C';
    cout<<"s1 после добавления А и В и С ";
    s1.showset();
    
    s1=s1+'D';
    cout<<"s1 после добавления А и В ,C и D ";
    s1.showset();
 
    cout<<s1.len;
    
 
    cout<<"\n";
 
    getch();
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2010, 19:16
Ответы с готовыми решениями:

Объявление статической переменной и статической функции в классе
Добрый вечер, столкнулся с проблемой и не могу решить. Есть класс SavingsAccount и в нем объявлена статическая переменная для процентной...

Нужно сделать ссылку на переменную
Имеется код, позволяющий в 1С битрикс отправлять смс на телефоны. Код правильный, но нужно изменить текст в зависимости от выбранных...

Нужно сделать переменную с текстом и потом её изменить
Вот опять вопросик. Нужно сделать переменную с текстом и потом её изменить. Пишу: wchat_t str = &quot;Привет&quot;; str =...

4
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
26.03.2010, 03:18
итак код отвратителен!!! просто ужасен!
поехали: рассмотрим Set Set::operator +(char ch)
первой строкой мы видим Set newset; что эквивалентно Set newset(); или конструктору по умолчанию Set(){len=0;} следовательно вопрос чему равен newset.len ?
ответ
правильно 0

опустившись ниже видим строку newset.members[newset.len]=ch;
вопрос в какую позицию мы пишем символ
ответ
в первую

newset.len=newset.len+g; что даёт эта строка?
ответ
она записывает новое значение длинны в newset.len и оно становится равно глобальной переменной и длинне которой якобы должно быть равно множество

g++; эта строка инкримирует глобальную переменную

делай выводы..
Выводы

1. программа не работает потому что каждый раз происходит запись в 1-ю позицию.
2. программа не может правильно работать потому что не происходит копирования из this в newset.
3. программа выводит мусор потому что существует только первый элемент а длинна увеличивается
4. код ужасен потому что не соблюдены правила ООП (сокрытие данных), используются глобальные переменные (это очень плохо), и вообще он не аккуратен и не несет смысловой нагрузки.

совет: читай
Роберт Седжвик фундаментальные алгоритмы 1-4 часть или
Структуры данных в C++. Уильям Форд, Уильям Топп
1
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
26.03.2010, 09:08
статическая переменная:
C++
1
static int x=0;
0
12 / 11 / 0
Регистрация: 29.11.2009
Сообщений: 186
26.03.2010, 10:39  [ТС]
Благодарю за ответы - теперь понятно в каком направлении двигаться :-)
0
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
26.03.2010, 11:58
Цитата Сообщение от breate Посмотреть сообщение
что эквивалентно Set newset(); или конструктору по умолчанию Set(){len=0;
наверно я не совсем корректно выразился - тут происходит создание нововй локальной переменной, а в момент создания новой переменной происходит вызов конструктора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2010, 11:58
Помогаю со студенческими работами здесь

Как сделать, чтобы макрос передавал значения (нужно вывести максимум через переменную)?
#include &lt;stdio.h&gt; #include &lt;malloc.h&gt; #define MAX_ELEM(count, array) int max=array; for(int j = 0; j &lt; n; ++j){if (array &gt; max){max =...

Проблема с взаимодействием динамической и статической памяти - обращение к статической переменной
Здравствуйте! Помогите решить проблему! Задача такая: написать сортировку бинарным деревом, так что бы данные читались из текстового...

Как сделать MFC статической, а не динамической?
это всё тоже из серии &quot;Не работает exe файл на других компах&quot; я предлагаю засунуть в эту тему все решения этой проблемы и закрипить...

Как заставить сделать фигуры статической
Доброго времени суток , очень нужна ваша помощь с api функциями есть задание . Создать графической приложение при помощи API-функций...

Сделать увеличение статической переменной приложения, не зависимо от страниц
здравствуйте=) подскажите как можно сделать увеличение статической переменной приложения, не зависимо от страниц. т.е. при запуске...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru