Консультация № 185418
11.02.2012, 01:13
1000.47 руб.
0 28 1
Здравствуйте, уважаемые эксперты!
Прошу вас помочь написать программу на С++. Операционная система - WinXP. Среда - Microsoft Visual Studio 2005. Код, пожалуйста, прокомментируйте.

Разработать приложение, позволяющее организовать работу по учету студентов некоторого подразделения института. Информация об учащемся, хранится в некотором описателе учащегося.
Описатель младшекурсника содержит следующую информацию:фамилия и инициалы студента, “индекс группы”; номер профилирующей кафедры; оценки за прошедшую сессию (максимум 5 чисел).
Описатель старшекурсника содержит следующую информацию: фамилия и инициалы студента, “индекс группы”; номер профилирующей кафедры; оценки за прошедшую сессию (максимум 4 числа); направление темы УИР (учебно-исследовательской работы); место выполнения; оценки руководителя и комиссии.
Описатель выпускника содержит следующую информацию: фамилия и инициалы студента, “индекс группы”; номер профилирующей кафедры; направление темы ДП (дипломного проекта); место выполнения; оценки руководителя, рецензента и ГЭК (государственной экзаменационной комиссии).
Каждый студент имеет уникальную характеристику - шифр студента (число). Информация обо всех студентах сведена в таблицу, каждый элемент которой содержит шифр и указатель на его описатель. Элементы таблицы упорядочены по возрастанию значений шифра.
Обеспечить выполнение следующих операций.
❖ Для таблицы:
> включить новый элемент, не нарушая упорядоченности;
> найти элемент по заданному шифру;
> удалить элемент, заданный шифром;
> показать содержимое таблицы.
❖ Для любого студента:
> вывести информацию о студенте;
> получить (вернуть в качестве результата) категорию студента;
> получить (вернуть в качестве результата) информацию об оценках в соответствии с категорией студента; записать оценки соответствующего семестра;
> изменить индекс учебной группы;
> перевести студента в другую категорию учащихся.
❖ Для старшекурсников и выпускников:
> получить (вернуть в качестве результата) информацию о теме индивидуальной работы (УИР или ДП) студента; изменить информацию о теме индивидуальной работы;
> получить информацию о месте выполнения работы; изменить информацию о месте выполнения работы (УИР или ДП).
❖ Для приложения:
> оформить поступление студента в институт;
> оформить перевод студента на новый семестр (добавление новой записи с возможным изменением статуса);
> отчислить студента из института (исключение записи из таблицы);
Порядок выполнения работы
1. На основе описания задачи определить состав классов.
2. Разработать иерархию классов и схему их взаимодействия.
3. Для каждого класса определить его состояние и необходимые методы.
4. Разработать и отладить все классы. Приложение реализовать в виде простой диалоговой программы.

Обсуждение

Неизвестный
11.02.2012, 02:37
общий
Таблица будет представлена в каком виде? или просто будет храниться в памяти.
давно
Посетитель
7438
7205
11.02.2012, 02:57
общий
Я занимаюсь Вашей программой.
Думаю, завтра будет готова ...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
11.02.2012, 02:58
общий
11.02.2012, 02:59
Таблица - это способ организации данных в виде связанного списка...
Соответственно, "просто будет храниться в памяти".
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
11.02.2012, 09:09
общий
Адресаты:
я думал, заказчику было бы интересно сохранять данные в своей рода базе:) и получать потом эти сведения обратно. А то вводить данные каждый раз, особенно если студентов много - довольно тяжело...
Неизвестный
12.02.2012, 08:47
общий
Очень критично, чтобы VS была 2005? Сможете собрать проект из файлов? Если напишу, то в студии не ниже 2008.
Неизвестный
12.02.2012, 16:23
общий
Вы пишите, если у посетителя будут проблемы со сборкой, я ему соберу на 2005 проект.
Неизвестный
12.02.2012, 17:03
общий
Можно тогда попросить продлить консультацию, а то боюсь, что не успею...до конца всё отладить...
Неизвестный
12.02.2012, 17:07
общий
Можно, продлили.
Неизвестный
16.02.2012, 14:13
общий
16.02.2012, 20:18
это ответ
Создадим базовый класс студента(Student).
Этот класс описывает младшекурсника.
Содержит вектор класса оценокь Score
Производные от этого класса - старшекурсник(StudentBig) и выпускник(StudentOut).
Элемент таблицы - это класс MyTab
из элементов таблицы создаём список - MyList

класс Student:
заголовочный файл:
[code h=207]
#pragma once
#include<string>
#include <vector>
#include "Score.h"
using namespace std;

//Базовый класс студента
class Student
{
public:
Student(void);
Student(string fioIn,string indeksGroup,int kafedra,int inRange = mladshekursnik);
~Student(void);

//Инкапсуляция статуса
int GetRange() const { return currRange; }
virtual void AddRange(int val);

//Инкапсуляция индекса группы
std::string IndeksGroup() const { return indeksGroup; }
void IndeksGroup(std::string val) { indeksGroup = val; }

//Инкапсуляция кода кафедры
int Kafedra() const { return kafedra; }
void Kafedra(int val) { kafedra = val; }

//Инкапсуляция ФИО
std::string Fio() const { return fio; }
void Fio(std::string val) { fio = val; }

//Инкапсуляция Оценок студента
vector<Score> ScoreSt() const { return scoreSt; }
void ScoreSt(vector<Score> val) { scoreSt = val; }

enum range{mladshekursnik = 1,starshekursnik,vipusknik};
// Получение значения оценок в зависимости от категории
int ScoreRange(int rangeIn, int numberScore);
// Установка значений оценки в зависимости от категории
void ScoreRange(int rangeIn, int numberScore, int valueScore);

protected:
// фамилия и инициалы студента
string fio;

// индекс группы
string indeksGroup;
// номер кафедры
int kafedra;

// оценки студента на каждом уровне
vector<Score> scoreSt;

// текущая категория студента
int currRange;

//Для конструктора
virtual void Costruct(void);
};

[/code]

исполнительный файл:
[code h=207]
#include "StdAfx.h"
#include "Student.h"

Student::Student(void)
: fio("")
, indeksGroup("")
, kafedra(0)
, currRange(mladshekursnik)
{
Costruct();
}

Student::Student(string fioIn,string indeksGroupIn,int kafedraIn,int inRange)
: fio(fioIn)
, indeksGroup(indeksGroupIn)
, kafedra(kafedraIn)
, currRange(inRange)
{
Costruct();
}

Student::~Student(void)
{
}


// получение значения оценок в зависимости от категории
int Student::ScoreRange(int rangeIn, int numberScore)
{
Score tempscore = scoreSt.at(rangeIn-1);

return tempscore.GetScore(numberScore);
}


// Установка значений оценки в зависимости от категории
void Student::ScoreRange(int rangeIn, int numberScore, int valueScore)
{
Score tempscore = scoreSt.at(rangeIn-1);

tempscore.SetScore(numberScore,valueScore);

scoreSt.at(rangeIn-1) = tempscore;
}

//Добавление оценок в зависимости от категории
//1 - младшекурсник
//2- старшекурсник
void Student::AddRange( int val )
{
Score tempScore(val);

scoreSt.push_back(tempScore);
currRange = val;
}

//Для конструктора
void Student::Costruct(void)
{
Score tempScore(currRange);

scoreSt.push_back(tempScore);
}

[/code]

класс StudentBig:
заголовочный файл:
[code h=207]
#pragma once
#include "student.h"

//Класс студента старшекурсника
class StudentBig :
public Student
{
public:
StudentBig(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto);
~StudentBig(void);
void Construct(void);
private:
public:
// Добавление категории
void AddRange(int rangeIn);
//Инкапсуляция переменной наименования работы
std::string Name() const { return nameUIR; }
void Name(std::string val) { nameUIR = val; }

//Инкапсуляция переменной места выполнения работы
std::string Mesto() const { return mestoUIR; }
void Mesto(std::string val) { mestoUIR = val; }

//Инкапсуляция переменной оценки руководителя
int ScoreRuc() const { return scoreRucUIR; }
void ScoreRuc(int val) { scoreRucUIR = val; }

//инкапсуляция переменной оценки комиссии
int ScoreKom() const { return scoreKomUIR; }
void ScoreKom(int val) { scoreKomUIR = val; }
private:
// Наименование работы
string nameUIR;

// Место выполнения
string mestoUIR;

// Оценки руководителя
int scoreRucUIR;

// оценки комиссии
int scoreKomUIR;

};


[/code]

исполнительный файл:
[code h=207]
#include "StdAfx.h"
#include "StudentBig.h"


StudentBig::StudentBig(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto)
: scoreRucUIR(0)
, scoreKomUIR(0)
, nameUIR(inName)
, mestoUIR(inMesto)
{
currRange = inRange;

Construct();

fio = fioIn;

indeksGroup = indeksGroupIn;

kafedra = kafedraIn;
}

StudentBig::~StudentBig(void)
{
}

//Для конструктора
void StudentBig::Construct(void)
{
if (currRange == 2)
{
Score tempScore(currRange);

scoreSt.push_back(tempScore);
}
}


// Добавление категории
void StudentBig::AddRange(int rangeIn)
{
Score tempScore(rangeIn);

scoreSt.push_back(tempScore);

currRange = rangeIn;
}


[/code]

класс StudentOut:
заголовочный файл:
[code h=207]
#pragma once
#include "Student.h"

//класс студента выпускника
class StudentOut :
public Student
{
public:
//Конструктор
StudentOut(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto);
//Декструктор
~StudentOut(void);

//Инкапсуляция переменной наименования проекта
std::string Name() const { return nameDP; }
void Name(std::string val) { nameDP = val; }

//Инкапсуляция переменной место выполнения проекта
std::string Mesto() const { return mestoDP; }
void Mesto(std::string val) { mestoDP = val; }

//Инкапсуляция переменной оценки руководителя ДП
int ScoreRuc() const { return scoreRucDP; }
void ScoreRuc(int val) { scoreRucDP = val; }

//Инкапсуляция переменной оценки комисси ДП
int ScoreKom() const { return scoreKomDP; }
void ScoreKom(int val) { scoreKomDP = val; }

//Инкапсуляция переменной оценки рецензента ДР
int ScoreRezDP() const { return scoreRezDP; }
void ScoreRezDP(int val) { scoreRezDP = val; }
private:
// наименование дипломного проекта
string nameDP;

// Место выполнения дипломного проекта
string mestoDP;

// оценка руководителя ВП
int scoreRucDP;

// Оценка комисси ДП
int scoreKomDP;

// Оценка рецензента ДП
int scoreRezDP;
};

[/code]

исполнительный файл:
[code h=207]
#include "StdAfx.h"
#include "StudentOut.h"

StudentOut::StudentOut(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto)
: scoreRucDP(0)
, scoreKomDP(0)
, scoreRezDP(0)
, nameDP(inName)
, mestoDP(inMesto)
{
currRange = inRange;

fio = fioIn;

indeksGroup = indeksGroupIn;

kafedra = kafedraIn;
}

StudentOut::~StudentOut(void)
{
}

[/code]

класс Score:
заголовочный файл:
[code h=207]
#pragma once
#include <string>
#include <vector>
using namespace std;

//Класс оценок
class Score
{
public:
Score(int inRange = 1);
~Score(void);
// установка значения оценки в хависимости от номера экзамена
bool SetScore(int numberScore, int score);
// Получение оценки за экзамен в зависимости от номера экзамена
int GetScore(int numberScore);
//Инкапсуляция вектора оценок студентов
vector<int> ScoreSt() const { return scoreSt; }
void ScoreSt(int val[]) { vector<int> scoreSt (val,val+sizeof(val) / sizeof(int) ); }

protected:
// вектор оценок студентов
vector<int> scoreSt;

// категория студентов
int range;

// устанавливаем количество оценок для этого уровня(размер scoreSt)
virtual void SetSize(int rangeIn);

private:

// Проверка размерности
bool CheckSize(int numberScore);

};

[/code]

исполнительный файл:
[code h=207]
#include "StdAfx.h"
#include "Score.h"

Score::Score(int inRange):
range(inRange)
{
SetSize(range);
}

Score::~Score(void)
{
}

// установка значения оценки в зависимости от номера экзамена
bool Score::SetScore(int numberScore, int score)
{
bool outData = CheckSize(numberScore);

if (outData)
{
scoreSt.at(numberScore-1)= score;
}

return outData;
}

// Получение оценки за экзамен в зависимости от номера экзамена
int Score::GetScore(int numberScore)
{
if (CheckSize(numberScore))
{
return scoreSt.at(numberScore);
}
else
{
return -1;
}
}

// Проверка размерности
bool Score::CheckSize(int numberScore)
{
bool outData = false;

if (scoreSt.size() > numberScore)
{
outData= true;
}

return outData;
}


// устанавливаем количество оценок для этого уровня(размер scoreSt)
void Score::SetSize(int rangeIn)
{
switch (range)
{
case 1:
scoreSt.resize(5,0);
break;
case 2:
scoreSt.resize(4,0);
break;
default:
break;
}
}

[/code]


класс MyTab:
заголовочный файл:
[code h=207]
#pragma once
#include "StudentOut.h"
#include "StudentBig.h"

//Класс одного элемента таблицы
class MyTab
{
public:
MyTab(void);
~MyTab(void);
MyTab(Student* stud);

//Инкапсуляция значения шифра
int Shifr() const { return shifr; }
void Shifr(int val) { shifr = val; }

// Указатель на описатель студента
Student* studentTab;
private:


// шифр студента
int shifr;
};
[/code]

исполнительный файл:
[code h=207]
#include "StdAfx.h"
#include "MyTab.h"

MyTab::MyTab(void)
{
studentTab = new Student();
}

MyTab::MyTab(Student* stud)
{
studentTab = stud;
}

MyTab::~MyTab(void)
{
delete studentTab;
}
[/code]


класс MyList:
заголовочный файл:
[code h=207]
#pragma once
#include "MyTab.h"
#include <list>
#include <sstream>

//Класс списка
class MyList
{
public:
MyList(Student* stIn);
MyList();
virtual ~MyList(void);

// Поиск студента по шифру
MyTab* Find(int shifrIn);
// Удаление элемента по шифру
void Delete(int shriftIn);
// Показать всю таблицу
//Показывается список шифров и фамилия
string Show(void);

//Структура, элемент листа.
struct MainStr
{
//указатель на фигуру
MyTab* stIn;

//Предыдущий елемент
struct MainStr* prev;
//Следующий елемент
struct MainStr* next;
};
//Текущий элемент
struct MainStr* curr;
//Первый элемент
struct MainStr* first;
//Последний элемент
struct MainStr* last;

// Добавление студента
void Add(MyTab* stIn);
// Очистка листа от данных
void Clear(void);

private:
void Sort(void);
int Size(void);
};
[/code]

исполнительный файл:
[code h=207]
#include "StdAfx.h"
#include "MyList.h"


MyList::MyList(Student* stIn)
{
first=NULL;

MyTab* mt = new MyTab(stIn);

Add(mt);
}

MyList::MyList()
{
first = NULL;
}


MyList::~MyList(void)
{
}

// Поиск студента по шифру
MyTab* MyList::Find(int shifrIn)
{
for (curr = first;curr<=last;curr = curr->next)
{
if (curr->stIn->Shifr() == shifrIn)
{
break;
}
}

return curr->stIn;
}


// Удаление элемента по шифру
void MyList::Delete(int shifrIn)
{
if (first!=NULL)
{
for (curr = first;curr<=last;curr = curr->next)
{
if (curr->stIn->Shifr() == shifrIn)
{
if (curr == first)
{
delete first;
first = NULL;
}
else
{
curr->prev->next = curr->next;

curr->next->prev = curr->prev;

delete curr->stIn;

delete curr;

curr = first;
}

break;
}
}

}
}


// Показать всю таблицу
string MyList::Show(void)
{
std::ostringstream ost;

if (first == NULL)
{
return "";
}

int sizeMy = Size();

curr = first;

for (int i = 0; i < sizeMy;i++)
{
string status="";

switch (curr->stIn->studentTab->GetRange())
{
case 1:
status="Младшекурсник";
break;
case 2:
status="Старшекурсник";
break;
case 3:
status="Выпускник";
break;
}

ost << curr->stIn->Shifr() << " "<< curr->stIn->studentTab->Fio()<<" " <<status<<"\n";

curr = curr->next;
}

std::string buf( ost.str() );

return buf;
}

// добавление элемента списка к концу списка
void MyList::Add(MyTab* _stIn)
{
if(first==NULL)
{
first=new struct MainStr;

curr=first;
last=first;

curr->prev=first;
curr->next=last;

curr->stIn = _stIn;
}
else
{
last=new struct MainStr;
curr->next=last;
curr->next->prev=curr;
curr->next->next=last;
curr=last;

curr->stIn = _stIn;
}

Sort();
}

// Очистка листа от данных
void MyList::Clear(void)
{
if (first!=NULL)
{
for(curr=first;curr!=last;)
{
delete curr->stIn;

curr=curr->next;
delete first;
first=curr;
}
first=NULL;
}
}

//Сортировка таблицы по шифру
void MyList::Sort(void)
{
if (curr == first)
{
return;
}

MyTab *mt;

int sizeMy = Size();

// пока не равно количеству елементов
for (int i=0; i<sizeMy; i++)
{
curr=first;
// пока не равно col-i
for (int j=0 ; j < sizeMy-i; j++)
{
if (curr->stIn->Shifr()> curr->next->stIn->Shifr())
{
// правого, то меняем их местами
mt = curr->stIn;

curr->stIn = curr->next->stIn;

curr->next->stIn=mt;
}

curr = curr->next;
}
}

}

//Получение размера листа
int MyList::Size(void)
{
if (curr == first)
{
return 1 ;
}
int outData=0;
for (curr = first;curr!=last;curr = curr->next)
outData++;

return outData;
}
[/code]



Иллюстрирует работу классов набор дилогов:
StudentsDlg - основной диалог, содержит три кнопки и поле вывода таблицы
Таблица выводится поэлементно. И каждая строчка содержит : шифр, фалимилию, категорию студента.
DialogAdd - добавление студента (приём)
DialogPerevod - перевод студента с возможностью изменения категорий
DialogRemove - удаление студента (отчисление)

класс StudentsDlg:
заголовочный файл:
[code h=207]

// StudentsDlg.h : header file
//

#pragma once
#include "DialogAdd.h"
#include "DialogPerevod.h"
#include "DialogRemove.h"
#include "MyList.h"

// CStudentsDlg dialog
class CStudentsDlg : public CDialog
{
// Construction
public:
CStudentsDlg(CWnd* pParent = NULL); // standard constructor

CStudentsDlg::~CStudentsDlg();

// Dialog Data
enum { IDD = IDD_STUDENTS_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonAdd();
afx_msg void OnBnClickedButtonRemove();
afx_msg void OnBnClickedButtonPerevod();
private:
// список сдентов
MyList *myList;
CString m_sShow;
public:
// отображение таблицы
void ShowTable(void);
};

[/code]

исполнительный файл:
[code h=207]

// StudentsDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "StudentsDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CStudentsDlg dialog




CStudentsDlg::CStudentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStudentsDlg::IDD, pParent)
, m_sShow(_T(""))
{
myList = new MyList();

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CStudentsDlg::~CStudentsDlg()
{
delete myList;
}

void CStudentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STATIC_SHOW, m_sShow);
}

BEGIN_MESSAGE_MAP(CStudentsDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_ADD, &CStudentsDlg::OnBnClickedButtonAdd)
ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CStudentsDlg::OnBnClickedButtonRemove)
ON_BN_CLICKED(IDC_BUTTON_PEREVOD, &CStudentsDlg::OnBnClickedButtonPerevod)
END_MESSAGE_MAP()


// CStudentsDlg message handlers

BOOL CStudentsDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

void CStudentsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CStudentsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CStudentsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


void CStudentsDlg::OnBnClickedButtonAdd()
{
CDialogAdd dialogAdd;
Student *st;

if (dialogAdd.DoModal() == IDOK)
{
st = new Student(string((LPCTSTR)dialogAdd.sFio),string((LPCTSTR)dialogAdd.sIndex),dialogAdd.dNumberKafedry,1);
MyTab *mt = new MyTab(st);

mt->Shifr(dialogAdd.dShifr);

myList->Add(mt);

ShowTable();

st = NULL;

mt = NULL;
}
}

void CStudentsDlg::OnBnClickedButtonRemove()
{
CDialogRemove dialogRemove;
if (dialogRemove.DoModal() == IDOK)
{
myList->Delete(dialogRemove.m_dShifr);

ShowTable();
}
}

void CStudentsDlg::OnBnClickedButtonPerevod()
{
CDialogPerevod dialogPerevod;

Student * st;

MyTab *mtt;

if (dialogPerevod.DoModal() == IDOK)
{
MyTab *mt = new MyTab();

//Находим студента для перевода
mt = myList->Find(dialogPerevod.m_dShifr);

//Сохраняем необходимые данные
string fio = mt->studentTab->Fio();

string index = mt->studentTab->IndeksGroup();

int numberKafedry = mt->studentTab->Kafedra();

int range = mt->studentTab->GetRange();

//Добавляем Категорию
//Если не меняется, то для младшекурсника и старшекурсника
//Увеличивается количество сессий
mt->studentTab->AddRange(dialogPerevod.m_dRange);

//Создаём данные для новой записи
switch(dialogPerevod.m_dRange)
{
case 1:
st = new Student(*mt->studentTab);
break;
case 2:
st = new StudentBig(fio,index,numberKafedry,dialogPerevod.m_dRange,string((LPCTSTR)dialogPerevod.sName),string((LPCTSTR)dialogPerevod.sMesto));
break;
case 3:
st = new StudentOut(fio,index,numberKafedry,dialogPerevod.m_dRange,string((LPCTSTR)dialogPerevod.sName),string((LPCTSTR)dialogPerevod.sMesto));
break;
}

mtt = new MyTab(st);

//Получаем текущий шифр записи
mtt->Shifr(dialogPerevod.m_dShifr);

//Удаляем текущую запись
myList->Delete(dialogPerevod.m_dShifr);

//Добавляем новую запись
myList->Add(mtt);

ShowTable();

mt = NULL;

mtt = NULL;

st=NULL;
}
}

// отображение таблицы
void CStudentsDlg::ShowTable(void)
{
string tt = myList->Show();

CString temp(tt.c_str());

m_sShow = temp;

UpdateData(FALSE);
}

[/code]

класс DialogAdd:
заголовочный файл:
[code h=207]
#pragma once


// CDialogAdd dialog
class CDialogAdd : public CDialog
{
DECLARE_DYNAMIC(CDialogAdd)

public:
CDialogAdd(CWnd* pParent = NULL); // standard constructor
virtual ~CDialogAdd();

// Dialog Data
enum { IDD = IDD_DIALOG_ADD };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
// Ввод фамилии студента
CString sFio;
// Индекс группы
CString sIndex;
// номер кафедры
int dNumberKafedry;
// шифр
int dShifr;
};

[/code]

исполнительный файл:
[code h=207]
// DialogAdd.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "DialogAdd.h"


// CDialogAdd dialog

IMPLEMENT_DYNAMIC(CDialogAdd, CDialog)

CDialogAdd::CDialogAdd(CWnd* pParent /*=NULL*/)
: CDialog(CDialogAdd::IDD, pParent)
, sFio(_T(""))
, sIndex(_T(""))
, dNumberKafedry(0)
, dShifr(0)
{

}

CDialogAdd::~CDialogAdd()
{
}

void CDialogAdd::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_FIO, sFio);
DDX_Text(pDX, IDC_EDIT_INDEX_GROUP, sIndex);
DDX_Text(pDX, IDC_EDIT_NUMBER_KAFEDRY, dNumberKafedry);
DDX_Text(pDX, IDC_EDIT_SHIFR, dShifr);
}


BEGIN_MESSAGE_MAP(CDialogAdd, CDialog)
END_MESSAGE_MAP()


// CDialogAdd message handlers

[/code]

класс DialogPerevod:
заголовочный файл:
[code h=207]
#pragma once
#include "afxwin.h"


// CDialogPerevod dialog

class CDialogPerevod : public CDialog
{
DECLARE_DYNAMIC(CDialogPerevod)

public:
CDialogPerevod(CWnd* pParent = NULL); // standard constructor
virtual ~CDialogPerevod();

// Dialog Data
enum { IDD = IDD_DIALOG_PEREVOD };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
// шифр
int m_dShifr;
// категория
int m_dRange;
afx_msg void OnEnChangeEditRange();
CEdit ceditName;
CEdit ceditMesto;
CString sName;
CString sMesto;
afx_msg void OnBnClickedOk();
afx_msg void OnEnKillfocusEditRange();
};

[/code]

исполнительный файл:
[code h=207]
// DialogPerevod.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "DialogPerevod.h"


// CDialogPerevod dialog

IMPLEMENT_DYNAMIC(CDialogPerevod, CDialog)

CDialogPerevod::CDialogPerevod(CWnd* pParent /*=NULL*/)
: CDialog(CDialogPerevod::IDD, pParent)
, m_dShifr(0)
, m_dRange(0)
, sName(_T(""))
, sMesto(_T(""))
{

}

CDialogPerevod::~CDialogPerevod()
{
}

void CDialogPerevod::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_SHIFR, m_dShifr);
DDX_Text(pDX, IDC_EDIT_RANGE, m_dRange);
DDX_Control(pDX, IDC_EDIT_NAME, ceditName);
DDX_Control(pDX, IDC_EDIT_MESTO, ceditMesto);
}


BEGIN_MESSAGE_MAP(CDialogPerevod, CDialog)
ON_EN_CHANGE(IDC_EDIT_RANGE, &CDialogPerevod::OnEnChangeEditRange)
ON_BN_CLICKED(IDOK, &CDialogPerevod::OnBnClickedOk)
ON_EN_KILLFOCUS(IDC_EDIT_RANGE, &CDialogPerevod::OnEnKillfocusEditRange)
END_MESSAGE_MAP()


// CDialogPerevod message handlers

void CDialogPerevod::OnEnChangeEditRange()
{

UpdateData(TRUE);

if ((m_dRange == 2)||(m_dRange == 3))
{
ceditName.EnableWindow(TRUE);
ceditMesto.EnableWindow(TRUE);

}
}

void CDialogPerevod::OnBnClickedOk()
{
ceditName.GetWindowText(sName);
ceditMesto.GetWindowText(sMesto);

OnOK();
}

void CDialogPerevod::OnEnKillfocusEditRange()
{

}
[/code]

класс DialogRemove:
заголовочный файл:
[code h=207]
#pragma once


// CDialogRemove dialog

class CDialogRemove : public CDialog
{
DECLARE_DYNAMIC(CDialogRemove)

public:
CDialogRemove(CWnd* pParent = NULL); // standard constructor
virtual ~CDialogRemove();

// Dialog Data
enum { IDD = IDD_DIALOG_REMOVE };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
// шифр
int m_dShifr;
};

[/code]

исполнительный файл:
[code h=207]
// DialogRemove.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "DialogRemove.h"


// CDialogRemove dialog

IMPLEMENT_DYNAMIC(CDialogRemove, CDialog)

CDialogRemove::CDialogRemove(CWnd* pParent /*=NULL*/)
: CDialog(CDialogRemove::IDD, pParent)
, m_dShifr(0)
{

}

CDialogRemove::~CDialogRemove()
{
}

void CDialogRemove::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_SHIFR, m_dShifr);
}


BEGIN_MESSAGE_MAP(CDialogRemove, CDialog)
END_MESSAGE_MAP()


// CDialogRemove message handlers

[/code]

Проект целиком - students.zip (84.8 кб)
Неизвестный
16.02.2012, 14:14
общий
случайно отправил пустой ответ. Можно не зачитывать?:) вечером оформлю полный, и можно ли будет его добавить???
давно
Посетитель
7438
7205
16.02.2012, 14:26
общий
Хорошо. Давайте ответ в мини-форуме. Подправим.
Будьте внимательны...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.02.2012, 19:59
общий
Создадим базовый класс студента(Student).
Этот класс описывает младшекурсника.
Содержит вектор класса оценокь Score
Производные от этого класса - старшекурсник(StudentBig) и выпускник(StudentOut).
Элемент таблицы - это класс MyTab
из элементов таблицы создаём список - MyList

класс Student:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include<string>
#include <vector>
#include "Score.h"
using namespace std;

//Базовый класс студента
class Student
{
public:
Student(void);
Student(string fioIn,string indeksGroup,int kafedra,int inRange = mladshekursnik);
~Student(void);

//Инкапсуляция статуса
int GetRange() const { return currRange; }
virtual void AddRange(int val);

//Инкапсуляция индекса группы
std::string IndeksGroup() const { return indeksGroup; }
void IndeksGroup(std::string val) { indeksGroup = val; }

//Инкапсуляция кода кафедры
int Kafedra() const { return kafedra; }
void Kafedra(int val) { kafedra = val; }

//Инкапсуляция ФИО
std::string Fio() const { return fio; }
void Fio(std::string val) { fio = val; }

//Инкапсуляция Оценок студента
vector<Score> ScoreSt() const { return scoreSt; }
void ScoreSt(vector<Score> val) { scoreSt = val; }

enum range{mladshekursnik = 1,starshekursnik,vipusknik};
// Получение значения оценок в зависимости от категории
int ScoreRange(int rangeIn, int numberScore);
// Установка значений оценки в зависимости от категории
void ScoreRange(int rangeIn, int numberScore, int valueScore);

protected:
// фамилия и инициалы студента
string fio;

// индекс группы
string indeksGroup;
// номер кафедры
int kafedra;

// оценки студента на каждом уровне
vector<Score> scoreSt;

// текущая категория студента
int currRange;

//Для конструктора
virtual void Costruct(void);
};

[/code]

исполнительный файл:
[code lang=php h=200]
#include "StdAfx.h"
#include "Student.h"

Student::Student(void)
: fio("")
, indeksGroup("")
, kafedra(0)
, currRange(mladshekursnik)
{
Costruct();
}

Student::Student(string fioIn,string indeksGroupIn,int kafedraIn,int inRange)
: fio(fioIn)
, indeksGroup(indeksGroupIn)
, kafedra(kafedraIn)
, currRange(inRange)
{
Costruct();
}

Student::~Student(void)
{
}


// получение значения оценок в зависимости от категории
int Student::ScoreRange(int rangeIn, int numberScore)
{
Score tempscore = scoreSt.at(rangeIn-1);

return tempscore.GetScore(numberScore);
}


// Установка значений оценки в зависимости от категории
void Student::ScoreRange(int rangeIn, int numberScore, int valueScore)
{
Score tempscore = scoreSt.at(rangeIn-1);

tempscore.SetScore(numberScore,valueScore);

scoreSt.at(rangeIn-1) = tempscore;
}

//Добавление оценок в зависимости от категории
//1 - младшекурсник
//2- старшекурсник
void Student::AddRange( int val )
{
Score tempScore(val);

scoreSt.push_back(tempScore);
currRange = val;
}

//Для конструктора
void Student::Costruct(void)
{
Score tempScore(currRange);

scoreSt.push_back(tempScore);
}

[/code]

класс StudentBig:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include "student.h"

//Класс студента старшекурсника
class StudentBig :
public Student
{
public:
StudentBig(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto);
~StudentBig(void);
void Construct(void);
private:
public:
// Добавление категории
void AddRange(int rangeIn);
//Инкапсуляция переменной наименования работы
std::string Name() const { return nameUIR; }
void Name(std::string val) { nameUIR = val; }

//Инкапсуляция переменной места выполнения работы
std::string Mesto() const { return mestoUIR; }
void Mesto(std::string val) { mestoUIR = val; }

//Инкапсуляция переменной оценки руководителя
int ScoreRuc() const { return scoreRucUIR; }
void ScoreRuc(int val) { scoreRucUIR = val; }

//инкапсуляция переменной оценки комиссии
int ScoreKom() const { return scoreKomUIR; }
void ScoreKom(int val) { scoreKomUIR = val; }
private:
// Наименование работы
string nameUIR;

// Место выполнения
string mestoUIR;

// Оценки руководителя
int scoreRucUIR;

// оценки комиссии
int scoreKomUIR;

};


[/code]

исполнительный файл:
[code lang=php h=200]
#include "StdAfx.h"
#include "StudentBig.h"


StudentBig::StudentBig(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto)
: scoreRucUIR(0)
, scoreKomUIR(0)
, nameUIR(inName)
, mestoUIR(inMesto)
{
currRange = inRange;

Construct();

fio = fioIn;

indeksGroup = indeksGroupIn;

kafedra = kafedraIn;
}

StudentBig::~StudentBig(void)
{
}

//Для конструктора
void StudentBig::Construct(void)
{
if (currRange == 2)
{
Score tempScore(currRange);

scoreSt.push_back(tempScore);
}
}


// Добавление категории
void StudentBig::AddRange(int rangeIn)
{
Score tempScore(rangeIn);

scoreSt.push_back(tempScore);

currRange = rangeIn;
}


[/code]

класс StudentOut:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include "Student.h"

//класс студента выпускника
class StudentOut :
public Student
{
public:
//Конструктор
StudentOut(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto);
//Декструктор
~StudentOut(void);

//Инкапсуляция переменной наименования проекта
std::string Name() const { return nameDP; }
void Name(std::string val) { nameDP = val; }

//Инкапсуляция переменной место выполнения проекта
std::string Mesto() const { return mestoDP; }
void Mesto(std::string val) { mestoDP = val; }

//Инкапсуляция переменной оценки руководителя ДП
int ScoreRuc() const { return scoreRucDP; }
void ScoreRuc(int val) { scoreRucDP = val; }

//Инкапсуляция переменной оценки комисси ДП
int ScoreKom() const { return scoreKomDP; }
void ScoreKom(int val) { scoreKomDP = val; }

//Инкапсуляция переменной оценки рецензента ДР
int ScoreRezDP() const { return scoreRezDP; }
void ScoreRezDP(int val) { scoreRezDP = val; }
private:
// наименование дипломного проекта
string nameDP;

// Место выполнения дипломного проекта
string mestoDP;

// оценка руководителя ВП
int scoreRucDP;

// Оценка комисси ДП
int scoreKomDP;

// Оценка рецензента ДП
int scoreRezDP;
};

[/code]

исполнительный файл:
[code lang=php h=200]
#include "StdAfx.h"
#include "StudentOut.h"

StudentOut::StudentOut(string fioIn,string indeksGroupIn,int kafedraIn,int inRange,string inName,string inMesto)
: scoreRucDP(0)
, scoreKomDP(0)
, scoreRezDP(0)
, nameDP(inName)
, mestoDP(inMesto)
{
currRange = inRange;

fio = fioIn;

indeksGroup = indeksGroupIn;

kafedra = kafedraIn;
}

StudentOut::~StudentOut(void)
{
}

[/code]

класс Score:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include <string>
#include <vector>
using namespace std;

//Класс оценок
class Score
{
public:
Score(int inRange = 1);
~Score(void);
// установка значения оценки в хависимости от номера экзамена
bool SetScore(int numberScore, int score);
// Получение оценки за экзамен в зависимости от номера экзамена
int GetScore(int numberScore);
//Инкапсуляция вектора оценок студентов
vector<int> ScoreSt() const { return scoreSt; }
void ScoreSt(int val[]) { vector<int> scoreSt (val,val+sizeof(val) / sizeof(int) ); }

protected:
// вектор оценок студентов
vector<int> scoreSt;

// категория студентов
int range;

// устанавливаем количество оценок для этого уровня(размер scoreSt)
virtual void SetSize(int rangeIn);

private:

// Проверка размерности
bool CheckSize(int numberScore);

};

[/code]

исполнительный файл:
[code lang=php h=200]
#include "StdAfx.h"
#include "Score.h"

Score::Score(int inRange):
range(inRange)
{
SetSize(range);
}

Score::~Score(void)
{
}

// установка значения оценки в зависимости от номера экзамена
bool Score::SetScore(int numberScore, int score)
{
bool outData = CheckSize(numberScore);

if (outData)
{
scoreSt.at(numberScore-1)= score;
}

return outData;
}

// Получение оценки за экзамен в зависимости от номера экзамена
int Score::GetScore(int numberScore)
{
if (CheckSize(numberScore))
{
return scoreSt.at(numberScore);
}
else
{
return -1;
}
}

// Проверка размерности
bool Score::CheckSize(int numberScore)
{
bool outData = false;

if (scoreSt.size() > numberScore)
{
outData= true;
}

return outData;
}


// устанавливаем количество оценок для этого уровня(размер scoreSt)
void Score::SetSize(int rangeIn)
{
switch (range)
{
case 1:
scoreSt.resize(5,0);
break;
case 2:
scoreSt.resize(4,0);
break;
default:
break;
}
}

[/code]


класс MyTab:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include "StudentOut.h"
#include "StudentBig.h"

//Класс одного элемента таблицы
class MyTab
{
public:
MyTab(void);
~MyTab(void);
MyTab(Student* stud);

//Инкапсуляция значения шифра
int Shifr() const { return shifr; }
void Shifr(int val) { shifr = val; }

// Указатель на описатель студента
Student* studentTab;
private:


// шифр студента
int shifr;
};
[/code]

исполнительный файл:
[code lang=php h=200]
#include "StdAfx.h"
#include "MyTab.h"

MyTab::MyTab(void)
{
studentTab = new Student();
}

MyTab::MyTab(Student* stud)
{
studentTab = stud;
}

MyTab::~MyTab(void)
{
delete studentTab;
}
[/code]


класс MyList:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include "MyTab.h"
#include <list>
#include <sstream>

//Класс списка
class MyList
{
public:
MyList(Student* stIn);
MyList();
virtual ~MyList(void);

// Поиск студента по шифру
MyTab* Find(int shifrIn);
// Удаление элемента по шифру
void Delete(int shriftIn);
// Показать всю таблицу
//Показывается список шифров и фамилия
string Show(void);

//Структура, элемент листа.
struct MainStr
{
//указатель на фигуру
MyTab* stIn;

//Предыдущий елемент
struct MainStr* prev;
//Следующий елемент
struct MainStr* next;
};
//Текущий элемент
struct MainStr* curr;
//Первый элемент
struct MainStr* first;
//Последний элемент
struct MainStr* last;

// Добавление студента
void Add(MyTab* stIn);
// Очистка листа от данных
void Clear(void);

private:
void Sort(void);
int Size(void);
};
[/code]

исполнительный файл:
[code lang=php h=200]
#include "StdAfx.h"
#include "MyList.h"


MyList::MyList(Student* stIn)
{
first=NULL;

MyTab* mt = new MyTab(stIn);

Add(mt);
}

MyList::MyList()
{
first = NULL;
}


MyList::~MyList(void)
{
}

// Поиск студента по шифру
MyTab* MyList::Find(int shifrIn)
{
for (curr = first;curr<=last;curr = curr->next)
{
if (curr->stIn->Shifr() == shifrIn)
{
break;
}
}

return curr->stIn;
}


// Удаление элемента по шифру
void MyList::Delete(int shifrIn)
{
if (first!=NULL)
{
for (curr = first;curr<=last;curr = curr->next)
{
if (curr->stIn->Shifr() == shifrIn)
{
if (curr == first)
{
delete first;
first = NULL;
}
else
{
curr->prev->next = curr->next;

curr->next->prev = curr->prev;

delete curr->stIn;

delete curr;

curr = first;
}

break;
}
}

}
}


// Показать всю таблицу
string MyList::Show(void)
{
std::ostringstream ost;

if (first == NULL)
{
return "";
}

int sizeMy = Size();

curr = first;

for (int i = 0; i < sizeMy;i++)
{
string status="";

switch (curr->stIn->studentTab->GetRange())
{
case 1:
status="Младшекурсник";
break;
case 2:
status="Старшекурсник";
break;
case 3:
status="Выпускник";
break;
}

ost << curr->stIn->Shifr() << " "<< curr->stIn->studentTab->Fio()<<" " <<status<<"\n";

curr = curr->next;
}

std::string buf( ost.str() );

return buf;
}

// добавление элемента списка к концу списка
void MyList::Add(MyTab* _stIn)
{
if(first==NULL)
{
first=new struct MainStr;

curr=first;
last=first;

curr->prev=first;
curr->next=last;

curr->stIn = _stIn;
}
else
{
last=new struct MainStr;
curr->next=last;
curr->next->prev=curr;
curr->next->next=last;
curr=last;

curr->stIn = _stIn;
}

Sort();
}

// Очистка листа от данных
void MyList::Clear(void)
{
if (first!=NULL)
{
for(curr=first;curr!=last;)
{
delete curr->stIn;

curr=curr->next;
delete first;
first=curr;
}
first=NULL;
}
}

//Сортировка таблицы по шифру
void MyList::Sort(void)
{
if (curr == first)
{
return;
}

MyTab *mt;

int sizeMy = Size();

// пока не равно количеству елементов
for (int i=0; i<sizeMy; i++)
{
curr=first;
// пока не равно col-i
for (int j=0 ; j < sizeMy-i; j++)
{
if (curr->stIn->Shifr()> curr->next->stIn->Shifr())
{
// правого, то меняем их местами
mt = curr->stIn;

curr->stIn = curr->next->stIn;

curr->next->stIn=mt;
}

curr = curr->next;
}
}

}

//Получение размера листа
int MyList::Size(void)
{
if (curr == first)
{
return 1 ;
}
int outData=0;
for (curr = first;curr!=last;curr = curr->next)
outData++;

return outData;
}
[/code]



Иллюстрирует работу классов набор дилогов:
StudentsDlg - основной диалог, содержит три кнопки и поле вывода таблицы
Таблица выводится поэлементно. И каждая строчка содержит : шифр, фалимилию, категорию студента.
DialogAdd - добавление студента (приём)
DialogPerevod - перевод студента с возможностью изменения категорий
DialogRemove - удаление студента (отчисление)

класс StudentsDlg:
заголовочный файл:
[code lang=php h=200]

// StudentsDlg.h : header file
//

#pragma once
#include "DialogAdd.h"
#include "DialogPerevod.h"
#include "DialogRemove.h"
#include "MyList.h"

// CStudentsDlg dialog
class CStudentsDlg : public CDialog
{
// Construction
public:
CStudentsDlg(CWnd* pParent = NULL); // standard constructor

CStudentsDlg::~CStudentsDlg();

// Dialog Data
enum { IDD = IDD_STUDENTS_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonAdd();
afx_msg void OnBnClickedButtonRemove();
afx_msg void OnBnClickedButtonPerevod();
private:
// список сдентов
MyList *myList;
CString m_sShow;
public:
// отображение таблицы
void ShowTable(void);
};

[/code]

исполнительный файл:
[code lang=php h=200]

// StudentsDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "StudentsDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CStudentsDlg dialog




CStudentsDlg::CStudentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStudentsDlg::IDD, pParent)
, m_sShow(_T(""))
{
myList = new MyList();

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CStudentsDlg::~CStudentsDlg()
{
delete myList;
}

void CStudentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STATIC_SHOW, m_sShow);
}

BEGIN_MESSAGE_MAP(CStudentsDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_ADD, &CStudentsDlg::OnBnClickedButtonAdd)
ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CStudentsDlg::OnBnClickedButtonRemove)
ON_BN_CLICKED(IDC_BUTTON_PEREVOD, &CStudentsDlg::OnBnClickedButtonPerevod)
END_MESSAGE_MAP()


// CStudentsDlg message handlers

BOOL CStudentsDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

void CStudentsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CStudentsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CStudentsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


void CStudentsDlg::OnBnClickedButtonAdd()
{
CDialogAdd dialogAdd;
Student *st;

if (dialogAdd.DoModal() == IDOK)
{
st = new Student(string((LPCTSTR)dialogAdd.sFio),string((LPCTSTR)dialogAdd.sIndex),dialogAdd.dNumberKafedry,1);
MyTab *mt = new MyTab(st);

mt->Shifr(dialogAdd.dShifr);

myList->Add(mt);

ShowTable();

st = NULL;

mt = NULL;
}
}

void CStudentsDlg::OnBnClickedButtonRemove()
{
CDialogRemove dialogRemove;
if (dialogRemove.DoModal() == IDOK)
{
myList->Delete(dialogRemove.m_dShifr);

ShowTable();
}
}

void CStudentsDlg::OnBnClickedButtonPerevod()
{
CDialogPerevod dialogPerevod;

Student * st;

MyTab *mtt;

if (dialogPerevod.DoModal() == IDOK)
{
MyTab *mt = new MyTab();

//Находим студента для перевода
mt = myList->Find(dialogPerevod.m_dShifr);

//Сохраняем необходимые данные
string fio = mt->studentTab->Fio();

string index = mt->studentTab->IndeksGroup();

int numberKafedry = mt->studentTab->Kafedra();

int range = mt->studentTab->GetRange();

//Добавляем Категорию
//Если не меняется, то для младшекурсника и старшекурсника
//Увеличивается количество сессий
mt->studentTab->AddRange(dialogPerevod.m_dRange);

//Создаём данные для новой записи
switch(dialogPerevod.m_dRange)
{
case 1:
st = new Student(*mt->studentTab);
break;
case 2:
st = new StudentBig(fio,index,numberKafedry,dialogPerevod.m_dRange,string((LPCTSTR)dialogPerevod.sName),string((LPCTSTR)dialogPerevod.sMesto));
break;
case 3:
st = new StudentOut(fio,index,numberKafedry,dialogPerevod.m_dRange,string((LPCTSTR)dialogPerevod.sName),string((LPCTSTR)dialogPerevod.sMesto));
break;
}

mtt = new MyTab(st);

//Получаем текущий шифр записи
mtt->Shifr(dialogPerevod.m_dShifr);

//Удаляем текущую запись
myList->Delete(dialogPerevod.m_dShifr);

//Добавляем новую запись
myList->Add(mtt);

ShowTable();

mt = NULL;

mtt = NULL;

st=NULL;
}
}

// отображение таблицы
void CStudentsDlg::ShowTable(void)
{
string tt = myList->Show();

CString temp(tt.c_str());

m_sShow = temp;

UpdateData(FALSE);
}

[/code]

класс DialogAdd:
заголовочный файл:
[code lang=php h=200]
#pragma once


// CDialogAdd dialog
class CDialogAdd : public CDialog
{
DECLARE_DYNAMIC(CDialogAdd)

public:
CDialogAdd(CWnd* pParent = NULL); // standard constructor
virtual ~CDialogAdd();

// Dialog Data
enum { IDD = IDD_DIALOG_ADD };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
// Ввод фамилии студента
CString sFio;
// Индекс группы
CString sIndex;
// номер кафедры
int dNumberKafedry;
// шифр
int dShifr;
};

[/code]

исполнительный файл:
[code lang=php h=200]
// DialogAdd.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "DialogAdd.h"


// CDialogAdd dialog

IMPLEMENT_DYNAMIC(CDialogAdd, CDialog)

CDialogAdd::CDialogAdd(CWnd* pParent /*=NULL*/)
: CDialog(CDialogAdd::IDD, pParent)
, sFio(_T(""))
, sIndex(_T(""))
, dNumberKafedry(0)
, dShifr(0)
{

}

CDialogAdd::~CDialogAdd()
{
}

void CDialogAdd::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_FIO, sFio);
DDX_Text(pDX, IDC_EDIT_INDEX_GROUP, sIndex);
DDX_Text(pDX, IDC_EDIT_NUMBER_KAFEDRY, dNumberKafedry);
DDX_Text(pDX, IDC_EDIT_SHIFR, dShifr);
}


BEGIN_MESSAGE_MAP(CDialogAdd, CDialog)
END_MESSAGE_MAP()


// CDialogAdd message handlers

[/code]

класс DialogPerevod:
заголовочный файл:
[code lang=php h=200]
#pragma once
#include "afxwin.h"


// CDialogPerevod dialog

class CDialogPerevod : public CDialog
{
DECLARE_DYNAMIC(CDialogPerevod)

public:
CDialogPerevod(CWnd* pParent = NULL); // standard constructor
virtual ~CDialogPerevod();

// Dialog Data
enum { IDD = IDD_DIALOG_PEREVOD };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
// шифр
int m_dShifr;
// категория
int m_dRange;
afx_msg void OnEnChangeEditRange();
CEdit ceditName;
CEdit ceditMesto;
CString sName;
CString sMesto;
afx_msg void OnBnClickedOk();
afx_msg void OnEnKillfocusEditRange();
};

[/code]

исполнительный файл:
[code lang=php h=200]
// DialogPerevod.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "DialogPerevod.h"


// CDialogPerevod dialog

IMPLEMENT_DYNAMIC(CDialogPerevod, CDialog)

CDialogPerevod::CDialogPerevod(CWnd* pParent /*=NULL*/)
: CDialog(CDialogPerevod::IDD, pParent)
, m_dShifr(0)
, m_dRange(0)
, sName(_T(""))
, sMesto(_T(""))
{

}

CDialogPerevod::~CDialogPerevod()
{
}

void CDialogPerevod::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_SHIFR, m_dShifr);
DDX_Text(pDX, IDC_EDIT_RANGE, m_dRange);
DDX_Control(pDX, IDC_EDIT_NAME, ceditName);
DDX_Control(pDX, IDC_EDIT_MESTO, ceditMesto);
}


BEGIN_MESSAGE_MAP(CDialogPerevod, CDialog)
ON_EN_CHANGE(IDC_EDIT_RANGE, &CDialogPerevod::OnEnChangeEditRange)
ON_BN_CLICKED(IDOK, &CDialogPerevod::OnBnClickedOk)
ON_EN_KILLFOCUS(IDC_EDIT_RANGE, &CDialogPerevod::OnEnKillfocusEditRange)
END_MESSAGE_MAP()


// CDialogPerevod message handlers

void CDialogPerevod::OnEnChangeEditRange()
{

UpdateData(TRUE);

if ((m_dRange == 2)||(m_dRange == 3))
{
ceditName.EnableWindow(TRUE);
ceditMesto.EnableWindow(TRUE);

}
}

void CDialogPerevod::OnBnClickedOk()
{
ceditName.GetWindowText(sName);
ceditMesto.GetWindowText(sMesto);

OnOK();
}

void CDialogPerevod::OnEnKillfocusEditRange()
{

}
[/code]

класс DialogRemove:
заголовочный файл:
[code lang=php h=200]
#pragma once


// CDialogRemove dialog

class CDialogRemove : public CDialog
{
DECLARE_DYNAMIC(CDialogRemove)

public:
CDialogRemove(CWnd* pParent = NULL); // standard constructor
virtual ~CDialogRemove();

// Dialog Data
enum { IDD = IDD_DIALOG_REMOVE };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()
public:
// шифр
int m_dShifr;
};

[/code]

исполнительный файл:
[code lang=php h=200]
// DialogRemove.cpp : implementation file
//

#include "stdafx.h"
#include "Students.h"
#include "DialogRemove.h"


// CDialogRemove dialog

IMPLEMENT_DYNAMIC(CDialogRemove, CDialog)

CDialogRemove::CDialogRemove(CWnd* pParent /*=NULL*/)
: CDialog(CDialogRemove::IDD, pParent)
, m_dShifr(0)
{

}

CDialogRemove::~CDialogRemove()
{
}

void CDialogRemove::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_SHIFR, m_dShifr);
}


BEGIN_MESSAGE_MAP(CDialogRemove, CDialog)
END_MESSAGE_MAP()


// CDialogRemove message handlers

[/code]

прикладываю файлы, из которых надо будет собрать проект
Прикрепленные файлы:
d01f6bd4eada5a3e918239e12391bbd6.zip
Неизвестный
16.02.2012, 19:59
общий
прошу мой ответ в минифоруме вставить в ответ. Большое спасибо.
Неизвестный
17.02.2012, 02:11
общий
Доброй ночи!
При попытке открыть проект, выдаёт ошибку:
"Conversion Issues - Students.vcproj:
The following error has occurred during XML parsing: File: D:\7549\Students.vcproj Line: 10 Column: 2 Error Message: '9,00' violates enumeration constraint of '7.00 7,00 7.10 7,10 8.00 8,00'. The attribute 'Version' with value '9,00' failed to parse. The file 'D:\7549\Students.vcproj' has failed to load.
Project upgrade failed."


Пробовал сам собрать новый проект, но при компиляции выдаёт ошибку:
"fatal error C1083: Cannot open include file: 'afxwin.h': No such file or directory stdafx.h"


И ещё, если можно, обьедините, пожалуйста, файлы с кодом до 2-4 файлов?
Неизвестный
17.02.2012, 08:41
общий
Наличие файла stdafx.h определяется настройками проекта. Если ругается на этот хидер, просто закоментите его.
А первая ошибка связана с другой версией студии (у отвечавшего 2008). Если Вам не удастся собрать проект под 2005, я вечером соберу и выложу, сейчас не дома просто.
Неизвестный
17.02.2012, 12:55
общий
Я выложил файлы из которых надо собрать проект, весь проект не влезает в 10 мб длину. Могу разбить на архивы(получится 3 шт.). И вам бы хотелось, чтобы все классы программы жили в 2-4 физических файлах?
Неизвестный
19.02.2012, 01:55
общий
Пробовал комментировать stdafx.h, это в итоге привело к ещё большему количеству ошибок. Пожалуйста, соберите проект.

Неизвестный
19.02.2012, 01:56
общий
Да, хотелось бы чтобы файлов с заголовками и файлов с классами было минимально возможное количество.
Неизвестный
19.02.2012, 10:05
общий
Это и есть минимальное количество: 3 класса студентов. 1 Класс - элемент таблицы. 1 класс - обработка таблицы . остальные классы- диалоговые окна. На каждый класс идёт один заголовочный файл и один исполнительный.
Неизвестный
19.02.2012, 21:20
общий
Скажите, пожалуйста, что у Вас написано в caption контролов главного окна? У меня почему-то для него кодировка сбилась, крокозябры какие-то.
Неизвестный
19.02.2012, 21:30
общий
Вроде сама кодировку исправила. Вот проект, попробуйте.
Прикрепленные файлы:
13c858b3b1eb1b7873365f5893ee090d.rar
Неизвестный
19.02.2012, 23:41
общий
Проект теперь открывается, но при компиляции всё равно выдаёт
"fatal error C1083: Cannot open include file: 'afxwin.h': No such file or directory"
Неизвестный
20.02.2012, 00:06
общий
Странно, это встроенный mfc-хидер. Попробуйте создать проект mfc (новый - проект - MFC - Приложение MFC), выбрать вариант dialog based. И попробуйте его скомпилировать. Если не пройдёт, возможно, Вам необходимо установить обновление студии.
А Вы открываете файл проекта или файл решения (*.sln)? Если первое, попробуйте второе.
Неизвестный
20.02.2012, 00:37
общий
При попытке создать приложение MFC(dialog based) выдаёт "fatal error RC1015: Cannot open include file: 'afxres.h'"

Разницы что открывать файл проекта или файл решения нет.
Неизвестный
20.02.2012, 01:02
общий
В таком случае у Вас какая-то проблема со студией. У Вас не express edition, случаем? В этой версии MFC вообще не работает. Если нет, попробуйте переустановить студию, возможно, Вы делали частичную установку.
Неизвестный
20.02.2012, 01:50
общий
Программа заработала, теперь проблема с кодировкой в главном окне.
Неизвестный
20.02.2012, 06:34
общий
Кнопки в главном окне: IDC_BUTTON_ADD - поступление, IDC_BUTTON_REMOVE - исключение, IDC_BUTTON_PEREVOD - перевод, могу и в других окнах сказать.
Неизвестный
21.02.2012, 02:33
общий
Всё, поняла, в чём проблема, там просто язык для главного окна был выставлен как английский. Вы можете либо в своём проекте открыть вкладку ресурсов, и там в свойствах главного диалога поменять язык, либо вот Вам исправленный проект.
Прикрепленные файлы:
7f81dd0a48530640e7a0b5229c084e4b.rar
Форма ответа