Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик
Статус: Академик
Рейтинг: 9620
∙ повысить рейтинг »
lamed
Статус: Академик
Рейтинг: 5794
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3859
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1725
Дата выхода:19.02.2012, 01:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:191 / 117
Вопросов / ответов:1 / 1

Консультация # 185418: Здравствуйте, уважаемые эксперты! Прошу вас помочь написать программу на С++. Операционная система - WinXP. Среда - Microsoft Visual Studio 2005. Код, пожалуйста, прокомментируйте. Разработать приложение, позволяющее организовать работу по учету студентов некоторого подразделения института. Информация об учащемся, хранится в некотором опи...


Консультация # 185418:

Здравствуйте, уважаемые эксперты!
Прошу вас помочь написать программу на С++. Операционная система - WinXP. Среда - Microsoft Visual Studio 2005. Код, пожалуйста, прокомментируйте.

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

Дата отправки: 11.02.2012, 01:13
Вопрос задал: Посетитель - 391934 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Алексей К. (3-й класс):

Создадим базовый класс студента(Student).
Этот класс описывает младшекурсника.
Содержит вектор класса оценокь Score
Производные от этого класса - старшекурсник(StudentBig) и выпускник(StudentOut).
Элемент таблицы - это класс MyTab
из элементов таблицы создаём список - MyList

класс Student:
заголовочный файл:

Код :
#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);
};



исполнительный файл:
Код :
#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);
}



класс StudentBig:
заголовочный файл:
Код :
#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;

};




исполнительный файл:
Код :
#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;
}




класс StudentOut:
заголовочный файл:
Код :
#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;
};



исполнительный файл:
Код :
#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)
{
}



класс Score:
заголовочный файл:
Код :
#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);

};



исполнительный файл:
Код :
#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;
	}
}




класс MyTab:
заголовочный файл:
Код :
#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;
};


исполнительный файл:
Код :
#include "StdAfx.h"
#include "MyTab.h"

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

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

MyTab::~MyTab(void)
{
	delete studentTab;
}



класс MyList:
заголовочный файл:
Код :
#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);
};


исполнительный файл:
Код :
#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;
}




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

класс StudentsDlg:
заголовочный файл:
Код :

// 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);
};



исполнительный файл:
Код :

// 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);
}



класс DialogAdd:
заголовочный файл:
Код :
#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;
};



исполнительный файл:
Код :
// 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



класс DialogPerevod:
заголовочный файл:
Код :
#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();
};



исполнительный файл:
Код :
// 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()
{

}


класс DialogRemove:
заголовочный файл:
Код :
#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;
};



исполнительный файл:
Код :
// 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



Проект целиком - students.zip (84.8 кб)

Консультировал: Алексей К. (3-й класс)
Дата отправки: 16.02.2012, 14:13
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное