Премини към съдържанието

Препоръчан отговор


Здравейте,

Нужна ми е помощ за курсов проект по ООП на С++

Не съм сигурен за кода, който до момента реализирах, тъй като не прави всичко по условието. Имам затруднения с main() функцията, както и с някой мембър на втория клас. Ще се радвам ако ми помогнете :)

Ето и заданието:

Цитат

Да се състави клас студент (CStudent) с член променливи:
name; име
scores; списък от оценки
fn; факултетен номер
// експлицитен конструктор fn,nаmе
// accessor за name
// accessor за получаване на средна оценка
getGrade ()
// добавяне на оценка
addScore
Да се състави клас (CCourse)
student_list; списък от студенти
name име на курса
// експлицитен конструктор по име на курса
// accessor за име на курса name
// функция за нанасяне на оценка: addScore (fn, grade)
// добавяне на група оценки на даден студент
addScores (fn, grade list)
// извеждане на резултатите на групата
displayScores () извежда име, списък от оценки и средна оценка
// добавяне на студент с име и ф.н. към курса
makeStudent (fn, name)
Главна функция за създаване на клас II и проверка на функциите му

До момента съм стигнал дотук:

#include <iostream>
#include <string>
#include <list>
#include <iterator>

using namespace std;


class CStudent			//1st class
{
protected:
	string m_strName;
	list<int> m_iScores;
	string m_strFn;
public:
	CStudent()		//default
	{
		m_strName = "unknown";
		m_strFn = "unknown";
	}
	CStudent(string Name, string Fn)		//exp
	{
		m_strName = Name;
		m_strFn = Fn;
	}

	const string GetName() { return m_strName; }	//accessor name
	const int GetGrade()							//accessor grade
	{ 
		int iSum = 0;
		double dAverage = 0.0;
		for (int i = 0; i < (signed)m_iScores.size(); i++)
			iSum++;
		dAverage = iSum / double(m_iScores.size());
		return dAverage;
	}		

	void AddScore()		//add score
	{
		int iMark, iNum;
		cout << "Number of grades: ";
		cin >> iNum;
		for (int i = 0; i < iNum; i++)
		{
			cout << "Insert grade: ";
			cin >> iMark;
			m_iScores.push_back(iMark);
		}
	}


	friend ostream& operator <<(ostream& toStream, CStudent& obj)		//output
	{
		toStream << "Student's name is " << obj.m_strName << ", with Faculty № " << obj.m_strFn << endl;
		return toStream;
	}
	//friend istream& operator >>(istream& fromStream, CStudent& obj)		//input
	//{
	//	fromStream >> obj.m_strName >> obj.m_strFn << endl;
	//	return fromStream;
	//}
};


class CCourse : CStudent			//2nd class
{
private:
	list<string> m_strStudent_list;
	string m_strCourseName;
public:
	CCourse() { m_strCourseName = "unknown"; }		//default
	CCourse(string CourseName) { m_strCourseName = CourseName; }		//exp

	const string GetCourseName() { return m_strCourseName; }		//accessor course name


	void AddScore(const string Fn, int Grade)
	{
		cout << "Faculty № " << Fn;
		cout << "\n Grade: ";
		cin >> Grade;
	}

	void AddScores(const string Fn, list<int> Grade_list, int Grade)		//add a group of marks to a student
	{
		cout << "Faculty № " << Fn;
		int iNum;
		cout << "Number of grades: ";
		cin >> iNum;
		cout << "\n Grade: ";
		for (int i = 0;i < iNum;i++)
		{
			cin >> Grade;
			Grade_list.push_back(Grade);
		}
	}

	void DisplayScores()
	{
		cout << "Student's name is ";
		cin >> m_strName;
		ostream_iterator<int> out(cout, "");
		cout << "Grades: ";

		copy(m_iScores.begin(), m_iScores.end(), out);
	}

	void MakeStudent(string Fn, list<int> Grade_list, string Name, int Grade)			//add student
	{
		cout << "Student's name is: ";
		cin >> Name;
		/*cout << "Faculty № ";
		cin >> Fn;*/
		AddScores(Fn, Grade_list, Grade);

	}
};

int main()
{
	CStudent student("Ivan", "61460114");
	cout << student;
	student.GetName();
	student.AddScore();
	cout << "Grades: " << student.GetGrade();

	return 0;
}

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

const int GetGrade()							//accessor grade
	{ 
		int iSum = 0;
		double dAverage = 0.0;
		for (int i = 0; i < (signed)m_iScores.size(); i++)
			iSum++;
		dAverage = iSum / double(m_iScores.size());
		return dAverage;
	}

Нещо не ми е ясен тоя код, така както е написан би трявало да връща или 1.0 или NaN

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да, с тази цел е, да връща средна оценка, но както казах не съм на 100% сигурен, затова помолих за помощ

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Т.е. операторът ми трябва да е такъв?

for (list<int>::iterator iter = m_iScores.begin(); iter != m_iScores.end(); ++iter)
			iSum++;

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
for (list<int>::iterator iter = m_iScores.begin(); iter != m_iScores.end(); ++iter)
	iSum += *iter;

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Смених оператора, сложих я double и функцията си върви чудесно, благодаря :)

Сега ми останаха DisplayScores(), MakeStudent() и main(), също така имам съмнения за тази AddScores(), отново с този for

 

Edit:

Стигнах донякъде, но отново имам нужда от помощ при условието. Все още не съм сигурен за този мейн, защото по условие имам създаване на обект от втори клас.

 

 

#include <iostream>
#include <string>
#include <list>
#include <iterator>
#include <map>

using namespace std;


class CStudent			//1st class
{
protected:
	string m_strName;
	list<int> m_iScores;
	string m_strFn;
public:
	CStudent()		//default
	{
		m_strName = "unknown";
		m_strFn = "unknown";
	}
	CStudent(string Name, string Fn)		//exp
	{
		m_strName = Name;
		m_strFn = Fn;
	}

	const string GetName() { return m_strName; }	//accessor name
	const double GetGrade()							//accessor grade
	{ 
		int iSum = 0;
		double dAverage = 0.0;
		for (list<int>::iterator iter = m_iScores.begin(); iter != m_iScores.end(); ++iter)
			iSum += *iter;
		dAverage = iSum / double(m_iScores.size());
		return dAverage;
	}		

	void AddScore()		//add score
	{
		int iMark;
			cout << "Insert grade: ";
				cin >> iMark;
			m_iScores.push_back(iMark);
	}


	friend ostream& operator <<(ostream& toStream, CStudent& obj)		//output
	{
		toStream << "Student's name is " << obj.GetName() << ", with Faculty " << obj.m_strFn << endl;
		return toStream;
	}
	//friend istream& operator >>(istream& fromStream, CStudent& obj)		//input
	//{
	//	fromStream >> obj.m_strName >> obj.m_strFn << endl;
	//	return fromStream;
	//}
};


class CCourse : public CStudent			//2nd class
{
private:
	list<CStudent> m_strStudent_list;
	string m_strCourseName;
public:
	CCourse() { m_strCourseName = "unknown"; }		//default
	CCourse(string CourseName) { m_strCourseName = CourseName; }		//exp

	const string GetCourseName() { return m_strCourseName; }		//accessor course name


	friend ostream& operator <<(ostream& toStream, CCourse& obj)		//output
	{
		toStream << "Course is "<<obj.GetCourseName() << ", Student's name is " << obj.GetName() << 
			", with Faculty " << obj.m_strFn << endl;
		return toStream;
	}

	void AddScore(const string Fn, int Grade)		//100%
	{
		cout << "Faculty № " << Fn;
		cout << "\n Grade: ";
		cin >> Grade;
	}

	void AddScores(const string Fn, list<int> Grade_list, int Grade)		//add a group of marks to a student 100%
	{
		int iMark;
		unsigned short has_2 = 0;
		cout << "Faculty: " << Fn << endl;
		//cout << "Insert "<<Grade<<" grades: ";
		//cin >> iNum;
		if (Grade_list.empty())
			Grade_list.clear();
		for (int i = 0; i < Grade; i++)
		{
			do
			{
				cout << "Insert grade: ";
				cin >> iMark;
			} while ((iMark < 2) || (iMark > 6));
			if (iMark == 2)
				++has_2;
			m_iScores.push_back(iMark);
		}
	}

	void DisplayScores()		//90%
	{
		cout << "Student's name is ";
		cin >> m_strName;
		cout << GetName();
		//ostream_iterator<int> out(cout, "");

		cout << ", Grades: ";

		copy(m_iScores.begin(), m_iScores.end(),/* out);*/
		ostream_iterator<int>(cout, " "));
		cout << endl;
		double Average = GetGrade();
		cout << "Average Grade: " << Average << endl;
	}

	void MakeStudent(string &Name, string &Fn)			//add student
	{
		cout << "Insert course's name: ";
		cin >> m_strCourseName;

			cout << "Student's name is: ";
			cin >> Name;
			cout << "Faculty: ";
			cin >> Fn;
			cout << "Add grade: ";
	}
};

int main(int argc, char ** argv)
{
	list<CStudent> student_list;
	list<int> grade_list;
	string Fn = "61460114", Fn_new;
	string Name = "Ivan", Name_new;
	int iMark = 0;
	CStudent student(Name, Fn);
	CCourse asd("KST");

	int iChoice;
	do
	{
		cout << "1. Test student from 1st class;\n";
		cout << "2. Insert grade for the first student;\n";
		cout << "3. Insert a group of grades for the first student;\n";
		cout << "4. Display student;\n";
		cout << "5. Create new student;\n";
		cout << "6. EXIT.\n";
		do
		{
			cout << "Your choice: ";
			cin >> iChoice;
		} while (iChoice < 1 || iChoice > 6);

		switch (iChoice)
		{
		case 1:
		{
			cout << "Creating a list of students...\n";
			if (!student_list.empty())
				student_list.clear();
			cout << "The first one...\n";
			cout << student;
			student_list.push_back(student);
		} break;
		case 2:
		{
			cout << "Insert one grade for student with ";
			asd.AddScore(Fn, iMark);
		} break;
		case 3:
		{
			unsigned short sGrade = 0;
			cout << "Number of grades: ";
			cin >> sGrade;

			cout << "Insert a group of " << sGrade << " grades for student with ";
			asd.AddScores(Fn, grade_list, sGrade);
		} break;
		case 4:
			asd.DisplayScores();
			break;
		case 5:
		{
			cout << "Create new student...\n";
			unsigned short sStud = 0;
			cout << "Number of students: ";
			cin >> sStud;
			for (int i = 0; i < sStud;i++)
			{
				asd.MakeStudent(Name_new, Fn_new);
				asd.AddScore(Fn_new, iMark);
				cout << asd;
				student_list.push_back(asd);
			}
		} break;
		default: cout << "End of tests.\n";
			break;
		}
	} while (iChoice != 6);
	

	
	
	
	/*student_list.push_back(asd);
	
	asd.AddScores(Fn_new, grade_list, sGrade);
	asd.DisplayScores();
	cout << asd;*/

	cout << "\nStudents: ";

	for (list<CStudent>::iterator iter = student_list.begin(); iter != student_list.end(); ++iter)
		cout << *iter;
	cout << endl;


	return 0;
}

 

Редактирано от Иван Милкович (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Горещи теми в момента

  • Подобни теми

    • от Chris Panov
      Здравейте, 
      В момента пиша една програма, в която в една от функциите ми се налага да излезна по-рано при определено условие. Функцията връща string впрочем.
      Ето кодът:
       
      #include "stdafx.h" #include <iostream> #include <string> #include <sstream> #include <vector> #define CONSOLE_LOG(x) std::cout << x #define COMMAND_END command[0] #define COMMAND_SUM command[1] #define COMMAND_SUBTRACT command[2] #define COMMAND_CONCAT command[3] #define COMMAND_DISCARD command[4] #define COMMAND_DISPSEQ command[5] template <typename T> void top_back(std::vector<T>& v) {     v.erase(v.end() - 1); } std::string sum(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt + yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string subtract(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt - yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } } void dispseq(std::vector<std::string>& vec) {     std::vector<std::string>::const_iterator iter;     for (iter = vec.begin(); iter != vec.end(); iter++)     {         std::cout << *iter << std::endl;     } } void enterSequence() {     std::vector<std::string> command =     {         "end",         "sum",         "subtract",         "concat",         "discard",         "dispseq"     };     std::vector<std::string> sequence;     std::string input;     std::string a;     std::string b;     do     {         std::cin >> input;         sequence.emplace_back(input);         if (input == COMMAND_END)         {              top_back(sequence);         }         if (input == COMMAND_SUM)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(sum(a, b, sequence));         }         if (input == COMMAND_SUBTRACT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(subtract(a, b, sequence));         }         if (input == COMMAND_CONCAT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(concat(a, b, sequence));         }         if (input == COMMAND_DISCARD)         {             top_back(sequence);             top_back(sequence);         }         if (input == COMMAND_DISPSEQ)         {             top_back(sequence);             dispseq(sequence);         }     } while (input != COMMAND_END); } int main() {     enterSequence();     std::cin.get();     std::cin.get();     return 0; } И ето проблемната функция:
       
      std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } }  
      Както виждате ако стрингът x(който естествено го превръщам в интиджър) е по-малък от 0, теоритично трябва да излезна от функцията, и това е единственият начин за който се сетих, с return;, обаче пък компилаторът иска функцията да връща стойност, понеже е от тип стринг.
      Как да съчетая двете? - да връща стринг ако всичко е по план, и да излиза ако е по-малко от 0.
    • от Chris Panov
      Здравейте,
      В момента имам сериозен проблем със взимането на броят на елементи в даден вектор.
      vec.size(); и  
      sizeof(vec) / sizeof(vec[0]); не работят. Програмата те пита за брой ключове за даден тест, въвеждаш ключовете, после въвеждаш и отговорите, които са били дадени, и програмата ги сравнява и в зависимост от това колко верни отговори имаш ти дава точки. Ключовете и дадените отговори са тип char. ("A", "B", "C" etc.)
      Ето го и кода, като повечето съм го направил на коментар за да си тествам само функцията която извежда броя на елементите.
      #include "stdafx.h" #include <iostream> #include <vector> #define CONSOLE_LOG(x) std::cout << x; std::vector<char> keys = {'A', 'B', 'C', 'D', 'E'}; std::vector<char> studentAnswers; int n, points = 0; char key, answer; template <typename T> T vecSize(std::vector<T>& vec) { T size = vec.size(); return size; } /* template <typename T1> void enterKeys(std::vector<T1>& k) { CONSOLE_LOG("Please enter the number of keys: "); std::cin >> n; for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Key " << counter << ": "); std::cin >> key; k.emplace_back(key); } } template <typename T2> void enterAnswers(std::vector<T2>& stAns) { for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Answer " << counter << ": "); std::cin >> answer; stAns.emplace_back(answer); } } template <typename T3> void getGrade(std::vector<T3>& x, std::vector<T3>& y) { for (int i = 0; i < n; i++) { if (x[i] == y[i]) { points++; } } CONSOLE_LOG("Points: " << points); } */ int main() { /* enterKeys(keys); enterAnswers(studentAnswers); getGrade(studentAnswers, keys); */ std::cout << keys.size() << std::endl; std::cout << vecSize(keys) << std::endl; std::cin.get(); std::cin.get(); std::cin.get(); return 0; } Опитах всевъзможни начини, и пак не става. Идеята е да заместя n променливата със броя на елементите от вектора. Програмата върви по един и същи начин, защото все пак в n променливата запазваме големината на вектора, но бих искал да си го направя с функция.
      Както виждате на края на програмата си извеждам тестове. Първият, който си е по конвенционалният метод си работи сам по себе си, но пък във for цикъл не бачка.
      А вторият е функцията която съм направил. Проблемът е че ми извежда непознат символ - "�"
      Проблемът е че типът на елементите във вектора е char, защото като го направих с int тип си работеше както трябва.
      Бих бил изключително благодарен ако някой може да ме насочи и да ми бутне едно рамо :)
    • от Goshko
      Да се напише програма, която създава структура "Book" като имате следните полета - Title(заглавието на книгата), Автор(Author), Цена(Price) и уникален номер на книгата(ISBN-num). Да се ваведе цяло число n и след него n на брой данни за ученика. Да се изведе на монитора данните за книгата с цена по-висока от предварително зададена.
    • от Нели Николова
      Здравейте, имам две готови задачи, но не мога да ги компилирам. Дали може да ги проверите?
      зад.1 Да се състави програма, която да сортира едномерен масив от цели числа тип short  с име X състоящ се от 19 елемента. Сортирането да се извърши във възходящ ред чрез метода пряка селекция.
      #include <iostream>
      using namespace std;
      void sortAsc(short[]);
      int main() {
          short x[] = {123,13,23,31,1,55,36,17,8,9,10,11,6,12,14,15,16,35,184,19};
           
          sortAsc(x);
          
          return 0;
      }
      void sortAsc(short x[]){
          for(short i = 0; i < 19 ; i++) {
              for(short j = i; j < 19; j++) {
                  if(x[j] < x) {
                      swap(x[j], x);
                  }
              }    
          }
          
          for(int i=0; i<19; i++)
          {
              cout << x << endl;
          }
      }
      зад. 2 Да се състави програма,която реализира динамичен стек от реални числа тип float. Стекът да се преобразува в два нови стека, един стек P за четните и един стек O за нечетните числа от стек едно. Стековете да се извеждат на екрана.
      int main() {
          stack<float>numbers;
          stack<float>p;
          stack<float>o;
          
          for(short i = 1; i <= 200; i++) {
              numbers.push(i);
          }  
          
          numbers.push(200.64);
          numbers.push(203.34);
          
          while(!numbers.empty()) {
              int number = numbers.top();
              
              if (number % 2 == 0) {
                  p.push(number);
              } else {
                  o.push(number);
              }
              numbers.pop();
          }
          
          cout << "EVEN NUMBERS:" << endl;
          
          while(!p.empty()) {
              cout << p.top() << endl;
              p.pop();
          }
          
          cout << "ODD NUMBERS:" << endl;
          
          while(!o.empty()) {
              cout << o.top() << endl;
              o.pop();
          }
          
      }
      Много Ви благодаря :)
       
    • от Georgi Kirchev
      Здравейте имам да предам курсова работа утре ,но не мога да я реша , ще бъда изключително благодарен ако може някой да ми помогне.

      Дефинирайте клас Телевизор, който да е родител на клас Самсунг и клас Сони. Клас Телевизор да има цена и брой продадени за година в сектор private. Класовете Самсунг и Сони да имат в сектор public функции за определяне на общата сума от продажби за година (цена * брой продадени за година). Всички класове да имат конструктори по подразбиране.
       
      Благодаря предварително !
  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.