С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
demanxxx
0 / 0 / 0
Регистрация: 22.11.2008
Сообщений: 36
#1

C++ Списки и наследование.Зарание спасибо! - C++

29.06.2009, 21:54. Просмотров 888. Ответов 8
Метки нет (Все метки)

Привет всем!
Используя наследование нужно создать класс студент,класс асперант и класс группа.
Группу реализовать с помощю списка.
Студента с асперантом я сделал,а добавлять новых студентов и асперантов в группу(список) не получается.
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#include<iostream>
#include<string.h>
using namespace std;
class Student
{
    char Cto[20];
    char Fam[20];
    char Name[15];
    char Och[15];
public:
    Student();
    ~Student();
    Student(char*,char*,char*,char*);
    void Print();
};
class Aspirant:public Student
{
    char CtoA[20];
    char FamA[20];
    char NameA[15];
    char OchA[15];
public:
    Aspirant();
    Aspirant(char*,char*,char*,char*);
    ~Aspirant();
};
 
struct Elem
{
    char* CtoG;
    char* NameG;
    char* OchG;
    char* FamG;
    Elem *next,*prev;
public:
 
};
class Gruppa:public Student//,public Aspirant
{
    Elem *Head,*Tail;
    int n;
public:
    Gruppa();
    Gruppa(const Gruppa&);
    ~Gruppa();
    void AddTail(char*,char*,char*,char*);
    void PrintG();
    void DelAll();
    void Del(int);
};
Student::Student()
{
    char Cto[20]={0};
    char Fam[20]={0};
    char Name[15]={0};
    char Och[15]={0};
}
Student::~Student()
{
}
Aspirant::Aspirant()
{
    Student::Student();
}
Aspirant::~Aspirant()
{
}
Student::Student(char*C,char*F,char*N,char*O)
{
    strcpy(Cto,C);
    strcpy(Fam,F);
    strcpy(Name,N);
    strcpy(Och,O);
}
Aspirant::Aspirant(char*C,char*F,char*N,char*O):Student(C,F,N,O)
{
}
void Student::Print()
{
    cout<<Cto<<" "<<Fam<<" "<<Name<<" "<<Och<<endl;
}
Gruppa::Gruppa()
{
   Head = Tail = NULL;
   n = 0;
}
Gruppa::~Gruppa()
{
   DelAll();
}
 
void Gruppa::DelAll()
{
   while(n!= 0)
      Del(1);
}
 
 
void Gruppa::Del(int pos)
{
   if(pos < 1 || pos >n)
   {
      cout << "Incorrect position !!!\n";
      return;
   }
   int i = 1;
 
   Elem * Del = Head;
 
   while(i < pos)
   {
      Del = Del->next;
      i++;
   }
   Elem * PrevDel = Del->prev;
   Elem * AfterDel = Del->next;
   if(PrevDel != 0 && n != 1)
      PrevDel->next = AfterDel;
    if(AfterDel != 0 && n != 1)
      AfterDel->prev = PrevDel;
   if(pos == 1)
       Head = AfterDel;
   if(pos == n)
       Tail = PrevDel;
   delete Del;
 
  n--;
}
 
void Student::Input(char*C,char*F,char*N,char*O)
{
    strcpy(Cto,C);
    strcpy(Fam,F);
    strcpy(Name,N);
    strcpy(Och,O);
}
void Aspirant::Input(char*C,char*F,char*N,char*O)
{
    strcpy(CtoA,C);
    strcpy(FamA,F);
    strcpy(NameA,N);
    strcpy(OchA,O);
}
/*void Student::Print()
{
cout<<Fam<<" "<<Name<<" "<<Och<<endl;
}
void Aspirant::Print()
{
cout<<FamA<<" "<<NameA<<" "<<OchA<<endl;
}*/
void Gruppa::AddTail(char*C,char*F,char*N,char*O)
{
    Elem * temp = new Elem;
    strcpy(temp->CtoG,C);
    strcpy(temp->FamG,F);
    strcpy(temp->NameG,N);
    strcpy(temp->OchG,O);
    temp->prev = Tail;
    if(Tail != 0)
        Tail->next = temp;
    if(n == 0)
        Head = Tail = temp;
    else
        Tail = temp;            
 
    n++;
 
}
void Gruppa::PrintG()
{
 
    Elem * temp = Head;
 
    while(temp->next != 0)
    {
        /*if(S==temp->CtoG)*/
            cout << temp->CtoG<< " "<<temp->FamG<<" "<<temp->NameG<<" "<<temp->OchG;
        temp = temp->next;
    }
cout << temp->CtoG<< " "<<temp->FamG<<" "<<temp->NameG<<" "<<temp->OchG;
}
void main()
{
    Student S1,S3;
    Aspirant S2;
    S1.Input("Stud","Karamishev","Dmitriy","Vitalevich");
    S3.Input("Stud","Rudakov","Aleksandr","Vladimerovich");
    S2.Input("Asp","Balbeskin","Balbes","Balbesovich");
    /*S1.Print();    
    const int n=3;
    Student *m[n];
    m[0]=new Student(S1);
    m[1]=new Aspirant(S2);
    m[2]=new Student(S3);
    for (int i=0;i<n;i++)m[i]->Print();    */
    Gruppa A;
    A.AddTail("Stud","Karamishev","Dmitriy","Vitalevich");
    //A.AddTail("Stud","Rudakov","Aleksandr","Vladimerovich");
    //A.AddTail("Asp","Balbeskin","Balbes","Balbesovich");
    A.PrintG();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2009, 21:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос C++ Списки и наследование.Зарание спасибо! (C++):

Списки и наследование - C++
добрый день. Есть класс связанного списка class A{ A* prev; A* next; int id; //прочие члены класса

Создание графиков,по зарание написанной функции - C++
Привет друзья!Изучаю C++ пару месяцев,и вот недавно решил попробовать написать программу своими ручками,дабы облегчить себе создание...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Дан целочисленный массив размера N. Найти произведение элементов массива, расположенных между первым и вторым нулевыми элементами. зарание благодарен - C++
Помогите пожалуйста написать код Дан целочисленный массив размера N. Найти произведение элементов массива, расположенных между первым и...

Списки, как склеить списки между собой? - C++
Ребят, привет всем, есть код, в классе которого описаны несколько методов: добавление элемента в список, удаление и просмотр списка, дак...

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

8
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
29.06.2009, 22:19 #2
На всякий случай:
Списки инкапсулируют и студентов, и аспирантов.
Вот как бы вы сделали массив студентов? (или аспирантов).

И списки - также, инкапсулируют (по аналогии с массивом).
0
demanxxx
0 / 0 / 0
Регистрация: 22.11.2008
Сообщений: 36
29.06.2009, 22:32  [ТС] #3
Цитата Сообщение от Ultrator Посмотреть сообщение
На всякий случай:
Списки инкапсулируют и студентов, и аспирантов.
Вот как бы вы сделали массив студентов? (или аспирантов).

И списки - также, инкапсулируют (по аналогии с массивом).
----------------------------------------------------------------------------------------
Да,но как?Есть ли у Вас какойто пример кода инкапсуляции списка?Если есть сбросте пожалуйста так я быстрей розберусь.
0
Ultrator
11 / 7 / 1
Регистрация: 28.04.2009
Сообщений: 219
29.06.2009, 23:42 #4
Класс "список charов" можете сами написать? С нужными Вам операциями.
(Есть, но это... другие списки. Там операции спвсем другие. Это класс "полином" - список "мономов".)
0
demanxxx
0 / 0 / 0
Регистрация: 22.11.2008
Сообщений: 36
29.06.2009, 23:56  [ТС] #5
Цитата Сообщение от Ultrator Посмотреть сообщение
Класс "список charов" можете сами написать? С нужными Вам операциями.
(Есть, но это... другие списки. Там операции спвсем другие. Это класс "полином" - список "мономов".)
Ладно,и на этом спасибо!Я кое-что в Википедии нарыл.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.06.2009, 08:08 #6
Студент ни как не может быть базовым классом для класса группа. Это, извини, идиотизм. Потому что Группа не есть Студент. Студенты являются частью Группы, т.е. Группа включает в себя Студентов, а это уже отношения агрегирования.
Если тебе уж очень нужно использовать наследования при разработке класса Группа, то ее можно наследовать от класса Список, потому что Группа является списком студентов.

Добавлено через 22 минуты 5 секунд
И еще
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Gruppa:public Student
{
   ...
public:
    Gruppa();
    Gruppa(const Gruppa&);
    ~Gruppa();
    void AddTail(char*,char*,char*,char*);
    void PrintG();
    void DelAll();
    void Del(int);
};
По интерфейсу класса Gruppa (то что в public части) никак нельзя подумать, что она является группой студентов (что будут означать слова "Добавить в хвост" для группы студентов? Картина маслом, сидят две тетки в деканате и одна другой говорит "К нам студент Иванов перевелся, добавь его в хвост, пожалуйста").
Логичнее было бы:
C++
1
2
3
4
5
6
7
8
9
10
11
class Gruppa:public Student
{
public:
  ...
 
  void Add(const Student& student);
  Student& StudentAt(int pos);
  int NumberOfStudents();
  void RemoveStudent(int pos);
  ...
};
Когда ты разрабатываешь класс для реально существующего объекта, ты должен думать об операция, присущих реальному объекту, а не конкретному его представлению в твоей программе.
1
demanxxx
0 / 0 / 0
Регистрация: 22.11.2008
Сообщений: 36
30.06.2009, 19:19  [ТС] #7
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Студент ни как не может быть базовым классом для класса группа. Это, извини, идиотизм. Потому что Группа не есть Студент. Студенты являются частью Группы, т.е. Группа включает в себя Студентов, а это уже отношения агрегирования.
Если тебе уж очень нужно использовать наследования при разработке класса Группа, то ее можно наследовать от класса Список, потому что Группа является списком студентов.

Добавлено через 22 минуты 5 секунд
И еще
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Gruppa:public Student
{
   ...
public:
    Gruppa();
    Gruppa(const Gruppa&);
    ~Gruppa();
    void AddTail(char*,char*,char*,char*);
    void PrintG();
    void DelAll();
    void Del(int);
};
По интерфейсу класса Gruppa (то что в public части) никак нельзя подумать, что она является группой студентов (что будут означать слова "Добавить в хвост" для группы студентов? Картина маслом, сидят две тетки в деканате и одна другой говорит "К нам студент Иванов перевелся, добавь его в хвост, пожалуйста").
Логичнее было бы:
C++
1
2
3
4
5
6
7
8
9
10
11
class Gruppa:public Student
{
public:
  ...
 
  void Add(const Student& student);
  Student& StudentAt(int pos);
  int NumberOfStudents();
  void RemoveStudent(int pos);
  ...
};
Когда ты разрабатываешь класс для реально существующего объекта, ты должен думать об операция, присущих реальному объекту, а не конкретному его представлению в твоей программе.
----------------------------------------------------------------------------------------
Подскажите пожалуйста,как обьявить список студентов?Я знаю только как обьявить массив студентов.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.06.2009, 20:19 #8
Хорошо, давай с самого начала.
То что ты написал - бред.
Давай разбираться.
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
// Базовый класс
class Base
{
public:
  int Foo();
};
 
// Класс производный от Base
// Он уже содержит функцию Foo, т.к. копирует ее из базового класса Base
class Derived : public Base
{
public:
  int Bar();
};
 
int main()
{
  Base base;
  Derived derived;
 
  base.foo();    // OK
  derived.foo(); // OK (foo копируется из базового класса)
  derived.bar(); // OK
  
  base.bar();    // Ошибка, т.к. операции bar нет в описании класса Base 
}
С учетом вышесказанного, исправляем ошибки в классах студента и аспиранта (а заодно забываем про существование транслита и открываем английский словарь, дабы твой код мог понять программист даже из Китая):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Student
{
public:
  Student();
  ~Student();
 
  Student(char*, char*, char*, char*);
  void Print();
};
 
class PostGraduateStudent : public Student
{
public:
    PostGraduateStudent();
    PostGraduateStudent(char*,char*,char*,char*);
    ~PostGraduateStudent();
};
Мы специально пока не описываем закрытую и защищенную части, потому что мы должны разработать в первую очередь интерфейс (поведение) класса, а уж потом при необходимости добавить все что нужно для поддержки поведения класса.
2. Идем далее...
Что означает операция Print? Распечатать студента? Это не присущая студентам операция, убираем...
3. Если у меня есть объект класса Student, как я получу информацию о нем (имя, фамилию)? В твоей версии - никак!
Добавляем операции, которые позволяют получить интересующую нас информацию. Кто он аспирант или студент, пока не рассматриваем.
4. Студент может сменить имя, фамилию (например при регистрации брака). Т.е. необходимо внести в класс Student операции позволяющие производить такие действия.

С учетом п. 2, 3 и 4, получаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Student
{
public:
  Student();
  Student(char*, char*, char*); 
  
  ~Student();
 
  const char* Surname () const;  // возвращает фамилию студента
  const char* Name    () const;  // возвращает имя студента
  const char* Lastname() const;  // возвращает отчество студента
 
  void SetSurname (const char*); // Установка новой фамилии
  void SetName    (const char*); // Установка нового имени
  void SetLastname(const char*); // Установка нового отчества
private:
  ... 
};

Не по теме:

Блин, что то я расписался...
Позже продолжу, если тебе интересно...


А вообще книга Г. Буч - Объектно-ориентированный анализ и проектирование - то, что нужно, если тебе интересна тема ООП.
1
demanxxx
0 / 0 / 0
Регистрация: 22.11.2008
Сообщений: 36
30.06.2009, 20:49  [ТС] #9
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Хорошо, давай с самого начала.
То что ты написал - бред.
Давай разбираться.
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
// Базовый класс
class Base
{
public:
  int Foo();
};
 
// Класс производный от Base
// Он уже содержит функцию Foo, т.к. копирует ее из базового класса Base
class Derived : public Base
{
public:
  int Bar();
};
 
int main()
{
  Base base;
  Derived derived;
 
  base.foo();    // OK
  derived.foo(); // OK (foo копируется из базового класса)
  derived.bar(); // OK
  
  base.bar();    // Ошибка, т.к. операции bar нет в описании класса Base 
}
С учетом вышесказанного, исправляем ошибки в классах студента и аспиранта (а заодно забываем про существование транслита и открываем английский словарь, дабы твой код мог понять программист даже из Китая):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Student
{
public:
  Student();
  ~Student();
 
  Student(char*, char*, char*, char*);
  void Print();
};
 
class PostGraduateStudent : public Student
{
public:
    PostGraduateStudent();
    PostGraduateStudent(char*,char*,char*,char*);
    ~PostGraduateStudent();
};
Мы специально пока не описываем закрытую и защищенную части, потому что мы должны разработать в первую очередь интерфейс (поведение) класса, а уж потом при необходимости добавить все что нужно для поддержки поведения класса.
2. Идем далее...
Что означает операция Print? Распечатать студента? Это не присущая студентам операция, убираем...
3. Если у меня есть объект класса Student, как я получу информацию о нем (имя, фамилию)? В твоей версии - никак!
Добавляем операции, которые позволяют получить интересующую нас информацию. Кто он аспирант или студент, пока не рассматриваем.
4. Студент может сменить имя, фамилию (например при регистрации брака). Т.е. необходимо внести в класс Student операции позволяющие производить такие действия.

С учетом п. 2, 3 и 4, получаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Student
{
public:
  Student();
  Student(char*, char*, char*); 
  
  ~Student();
 
  const char* Surname () const;  // возвращает фамилию студента
  const char* Name    () const;  // возвращает имя студента
  const char* Lastname() const;  // возвращает отчество студента
 
  void SetSurname (const char*); // Установка новой фамилии
  void SetName    (const char*); // Установка нового имени
  void SetLastname(const char*); // Установка нового отчества
private:
  ... 
};

Не по теме:

Блин, что то я расписался...
Позже продолжу, если тебе интересно...


А вообще Г. Буч - Объектно-ориентированный анализ и проектирование - то, что нужно, если тебе интересна тема ООП.
----------------------------------------------------------------------------------------
За это конечно спасибо,но меня интересует другой вопрос-как создать клас Группа?
Мне нужна просто подсказка,а код я сам соображу.Мы изучаем сейчас наследование,вот нам и задали используя наследование создать студента,асперанта и группу.Со студентом и аспирантом все понятно,а группу я не доганяю.
Нужно создать два списка(осперант и студент)и класс группа производный от них обоих и вызывать их функцыи через класс группа?Я правильно понял ,если нет- подскажите пожалуйста.
0
30.06.2009, 20:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2009, 20:49
Привет! Вот еще темы с ответами:

Спасибо за помощь в Embedded C++ - C++
Спасибо за помощь! Будем надеяться, что это проканает в Embedded C++. А какой хедер файл нужно прицепить?

Ребята пожалуйста , переписать с С++ на Си ! ! Спасибо! - C++
#include &lt;fstream&gt; #include &lt;bitset&gt; #include &lt;sstream&gt; #include &lt;sys/time.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include...

Исправить задачу,если получится. Спасибо! - C++
само задание звучит так: напишите программу которая вычисляет значение по формуле f(a)+2f(a+h)+2f(a+2h)...+2f(a+(n-1)h)+f(a+nh) где...

Как из CString получить int ... заранее спасибо!! - C++
Проблемка ... Как из CString получить int.... только плиз не советуйте куда заглядывать в MSDN у меня его нету.... СПАСИБО....


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

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

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