Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Програма за обработка на студенти

Featured Replies

Здравейте,

накратко, програмата се състои в създаването на студенти с техните имена, ЕГН, факултетен номер и карта, състояща се от код на теста и съответната оценка. След това се създава още един клас, съдържащ групите (специалност, курс и група), заедно с вектор от студентите. Веднъж формирани студентите и групите, следва създаването на разновидни функции, използващи тези член-променливи. Както ще видите от кода, все още разработвам програмата, но още от сега съм се натъкнал на проблеми, касаещи функциите в третия клас. За момента, най-големия, но не и единствен, проблем е, че не умея да достъпвам функциите и член-променливите от първите два класа във функциите от третия клас. Това се случва така, понеже студентите се съдържат в контейнер. Също така е добре да спомена, че вектора от студенти се запълва от файл, т.е. целта е потребителя да може да въвежда всичката информация за студентите във файл и да борави с функциите на базата на тази информация. Още нещо, което не ми е ясно, е как ще разгранича студентите по техните групи, когато изчитам файла. Ще напиша цялото условие, за да няма недоразумения и губене на време в разногласия. Всякаква помощ и напътствия са добре дошли.

 

1. Да се дефинира абстрактен клас CPerson, с член данни име и ЕГН, освен необходимите методи, да се напишат и следните:

  • абстрактен метод за печат
  •  
  • метод, който връща възрастта на човека на база на ЕГН-то
  •  

2. Да се дефинира клас CStudent наследник на CPerson, съхраняващ информацията за факултетен номер на студента и контейнер съхраняващ резултатите на студента от различни тестове (код на теста и получения брой точки, напр. (map<unsigned, unsigned> st_tests). Освен необходимите конструктори, методи и оператори (сред които е функцията за печат) да се добавят:

  •  
  • метод, който връща средния брой точки получени от студента
  •  
  • метод, който връща брой точки по код на тест, подаден като параметър
  •  

3. Да се дефинира клас група студенти CGroup, съхраняващ информацията за специалност, курс, група и контейнер от студентите в нея (напр. vector<CStudent>). Освен необходимите методи, да се реализират и следните член функции:

  •  
  • да се дефинира конструктор с параметър име на файл, съдържащ необходимата информация за запълване на контейнера
  •  
  • изчислява и връща средния брой точки за тест, подаден като параметър
  •  
  • връща списък от студенти (list<CStudent*>) със среден брой точки принадлежащи на интервал [a;b] (a,b - параметри)
  •  
  • изчислява и връща броя на студентите със среден брой точки, по-голям от числото подадено като параметър
  •  
  • изчислява и връща средния брой точки на студентите на възраст, подадена като параметър
  •  
  • намира студента с най-висока успеваемост на тестовете
  •  
  • сортира студентите по среден брой точки
  •  
  • сортира тестовете в низходящ ред по среден брой точки, получени от студентите в групата
  •  
  • изчислява средната възраст на студентите от групата

4. Да се създадат няколко обекта от класа CGroup и се демонстрира работоспособността на методите му като се направят различни справки и съпоставки между тях (напр. коя специалност има по-висока средна успеваемост на тестовете, коя по-висока средна възраст, коя повече студенти получили точки над зададена стойност). Да има обработка на изключения на необходимите места.

#include <iostream>
#include <fstream>
#include <map>
#include <ctime>
#include <string>
#include <stdlib.h>
#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <utility>
using namespace std;

class CPerson
{
private:
    string name;
    string EGN;

public:
    CPerson()
    {
        name=" ";
        EGN=" ";
    }

    CPerson(const string n, const string e)
    {
        name=n;
        EGN=e;
    }

    string getname()const
    {
        return name;
    }

    string getEGN()const
    {
        return EGN;
    }

    void setname(const string n)
    {
        name=n;
    }

    void setEGN(const string e)
    {
        EGN=e;
    }

    virtual void print() = 0; //1.1

    int getAge() const //1.2
    {
        int age;
        time_t now = time(0);
        tm *ltm = localtime(&now);
        int year = atoi(getEGN().substr(0, 2).c_str());
        int month = atoi(getEGN().substr(2, 2).c_str());
        int day = atoi(getEGN().substr(4, 2).c_str());
        int cyear = 1900 + ltm->tm_year;
        int cmonth = 1 + ltm->tm_mon;
        int cday = 1 + ltm->tm_mday;

        age = cyear - (year + 1900);
        if (cmonth < month)
            age--;
        if (cmonth == month && cday < day)
            age--;
        return age;
    }
};

class CStudent: public CPerson
{
private:
    string FN;
    map<int, int> st_tests;

public:
    CStudent()
    {
        FN=" ";
    }

    CStudent(const string n)
    {
        FN=n;
    }

    CStudent(const string o, const string p, const string n):CPerson(o,p)
    {
         FN=n;
    }

    void setFN(const string n)
    {
        FN=n;
    }

    void setst_tests(map<int, int> m)
    {
        st_tests=m;
    }

    string getFN() const
    {
        return FN;
    }

    map<int, int> getst_tests()
    {
        return st_tests;
    }

    void print()
    {
        cout<<"Ime: "<<getname()<<endl;
        cout<<"EGN: "<<getEGN()<<endl;
        cout<<"FN: "<<getFN()<<endl;
        map<int, int>::iterator it=st_tests.begin();
        while(it!=st_tests.end())
        {
            cout<<it->first<<" "<<it->second<<endl;
            it++;
        }
    }

    void add_st_tests(int a, int b)
    {
         st_tests.insert(pair<int,int>(a,b));
    }

    double average() //2.1
    {
        double sum=0;
        map<int, int>::iterator it=st_tests.begin();
        for (it=st_tests.begin();it!=st_tests.end();it++)
            sum+=it->second;
        if(st_tests.size()!=0)
            return sum/st_tests.size();
        return -1;
    }

    int search(const int a) //2.2
    {
        return st_tests.find(a)->second;
    }

    bool operator () (CStudent a, CStudent b) const
    {
            return a.average() > b.average();
    }
};

class CGroup
{
private:
    string spec;
    int kurs;
    int grupa;
    vector<CStudent> students;

public:
    string getspec() const
    {
        return spec;
    }

    int getkurs() const
    {
        return kurs;
    }

    int getgrupa() const
    {
        return grupa;
    }

    vector<CStudent> getstudents()
    {
        return students;
    }

    void setstudents(vector<CStudent> a)
    {
        students=a;
    }

    void setspec(const string n)
    {
        spec=n;
    }

    void setkurs(const int n)
    {
        kurs=n;
    }

    void setgrupa(const int n)
    {
        grupa=n;
    }

    CGroup(const string a, const int b, const int c)
    {
        spec=a;
        kurs=b;
        grupa=c;

    }

    void addstudent(CStudent &a)
    {
         students.push_back(a);
    }

    int ReadFile() //3.1
    {
        ifstream st;
        st.open("students.txt",ios::in);
        if(!st)
        {
            cout<<"Cannot open students.txt or file does not exist."<<endl;
            return 0;
        }
        string a, b, c;
        int d, e, i=0;
        if (st.is_open())
        {
            do
            {
                st >> a >> b >> c;
                students[i].setname(a);
                students[i].setEGN(b);
                students[i].setFN(c);
                do
                {
                    st >> d >> e;
                    students[i].add_st_tests(d,e);
                }while(st.peek() != '\n' || st.peek() != '\r');
                i++;
            }while(!st.eof());
        }
        st.close();
    }

    double averagetest(int a)  //3.2
    {
        double sum=0;
        int br=0;
        vector<CStudent>::iterator itt;
        for (itt=students.begin();itt!=students.end();itt++)
        {
            map<int, int>::iterator it=(*itt).getst_tests().find(a);
            sum+=it->second;
            br++;
        }
        cout<<sum/br;
        return sum/br;
    }

    list<CStudent> averageparam(const int a, const int b) //3.3
    {
        list<CStudent> l;
        int i=0;
        vector<CStudent>::iterator itt=students.begin();
        for (itt=students.begin();itt!=students.end();itt++)
        {
            if((*itt).average() >= a && (*itt).average() <= b)
                l.push_back(*itt);
            i++;
        }
        cout<<"List ot studenti sus sreden broi tochki mejdu "<<a<<" - "<<b<<endl;
        list<CStudent>::iterator it=l.begin();
        for (it=l.begin();it!=l.end();it++)
            (*it).print();
        return l;
    }

    int averageabove(const int a) //3.4
    {
        int br=0;
        vector<CStudent>::iterator itt=students.begin();
        for (itt=students.begin();itt!=students.end();itt++)
            if((*itt).average() > a)
                br++;
        cout<<"Broi studenti sus sreden broi tochki nad "<<a<<": "<<br<<endl;
        return br;
    }

    void averageage(const int a) //3.5
    {
        cout<<"Sreden uspeh na "<<a<<" godishni studenti."<<endl;
        vector<CStudent>::iterator itt=students.begin();
        for (itt=students.begin();itt!=students.end();itt++)
        {
            int b=(*itt).getAge();
            if(a == b)
                cout<<(*itt).getname()<<" "<<(*itt).average()<<endl;
        }
    }

    void beststudent() //3.6
    {
        cout<<"Student s nai-visoka uspevaemost."<<endl;
        CStudent temp;
        vector<CStudent>::iterator itt=students.begin();
        for (itt=students.begin();itt!=students.end();itt++)
            if ((*itt).average() > temp.average())
            temp = (*itt);
        temp.print();
    }

    void sortaverage() //3.7
    {
        sort(students.begin(),students.end(),CStudent());
        cout<<"Sortini studenti po sreden broi tochki."<<endl;
        vector<CStudent>::iterator itt=students.begin();
        for (itt=students.begin();itt!=students.end();itt++)
            (*itt).print();
    }

    void sortasc() //3.8
    {

    }

    void averageage() //3.9
    {

    }
};

int main()
{
    CStudent p1("Ivan","9411156070","61360140");
    CStudent p2("Kaloqn","9403041020","61360127");
    CStudent p3("Antoan","9408032540","61360134");
    p1.add_st_tests(1,55);
    p1.add_st_tests(2,80);
    p1.add_st_tests(3,69);
    p2.add_st_tests(1,98);
    p2.add_st_tests(2,25);
    p2.add_st_tests(3,56);
    p3.add_st_tests(1,32);
    p3.add_st_tests(2,87);
    p3.add_st_tests(3,57);
    CGroup g1 ("KST",1,1);
    g1.addstudent(p1);
    g1.addstudent(p2);
    g1.addstudent(p3);
    g1.averagetest(2);
}

Редактирано от Spydoc (преглед на промените)

  • Автор

Оправих малко итераторите, които използвам във функциите в третия клас. За момента имам само една грешка във функция 3.3, която включва създаването на списък.

error: no matching function for call to 'std::list<CStudent*>::push_back(CStudent&)'|

Също така, все още не съм стигнал до извода как да разгранича студентите по групи. Единственото нещо, което ми идва на ум е да добавям специалността, курса и групата на всеки студент във файла, но не мисля, че това се изисква в условието.

 

 

Update:

Като че ли оправих проблема с листът, но сега се затруднявам с функцията, която трябва да сортира студентите по среден брой точки. Обнових кода в първия пост с най-новия за сега.

bool compare(CStudent &a, CStudent &b)
    {
            return a.average() < b.average();
    }

void sortaverage() //3.7
    {
       sort(students.begin(),students.end(),compare);

    }

Update:

Функцията вече не ми дава грешки при компилация, но не съм тествал дали функционира както трябва. Това, което напраих, е преместване на булевата функция в класа CStudent.

class CStudent: public CPerson
{
public:
    bool operator () (CStudent a, CStudent b) const
    {
            return a.average() < b.average();
    }
};

class CGroup
{
public:
    void sortaverage() //3.7
    {
       sort(students.begin(),students.end(),CStudent());
    }
};

Update:

Всички функции без 3.1, 3.8 и 3.9 са тествани и работят, обнових кода в първия пост. Започнал съм да работя върху функция 3.1 за запис от файл и на пръв поглед не прави точно, което искам. Идеята ми е всичката информация за член променливите да се съдържа във файла, така че още при зареждането на програмата да е възможно да се създадат групите, заедно със студентите. С други думи казано, не искам никога да се съзадават ръчно обекти в програмата, с цел опростяване на работата на потребителя. За момента подобна структура на файла ми е хрумнала, само с две специалности, понеже няма изискване от условието, но не съм сигурен как да разгранича редовете с групите от редовете със студентите. Бих бил много благодарен ако някой може да ми помогне конкретно с тази функция.

KST 1 1
Ivan 9402184050 61360133 1 55 2 90 3 78
Kaloqn 9407132530 61360148 1 25 2 80 3 87
KST 1 2
Anton 9402195020 61360138 1 20 2 80 3 92
KST 1 3
KST 2 1
KST 2 2
KST 2 3
KST 3 1
KST 3 2
KST 3 3
KST 4 1
KST 4 2
KST 4 3
SIT 1 1
SIT 1 2
SIT 1 3
SIT 2 1
SIT 2 2
SIT 2 3
SIT 3 1
SIT 3 2
SIT 3 3
SIT 4 1
SIT 4 2
SIT 4 3

Редактирано от Spydoc (преглед на промените)

  • 3 години по-късно...
на 12.03.2015 г. в 12:29, Spydoc написа:

Оправих малко итераторите, които използвам във функциите в третия клас. За момента имам само една грешка във функция 3.3, която включва създаването на списък.


error: no matching function for call to 'std::list<CStudent*>::push_back(CStudent&)'|

Също така, все още не съм стигнал до извода как да разгранича студентите по групи. Единственото нещо, което ми идва на ум е да добавям специалността, курса и групата на всеки студент във файла, но не мисля, че това се изисква в условието.

 

 

Update:

Като че ли оправих проблема с листът, но сега се затруднявам с функцията, която трябва да сортира студентите по среден брой точки. Обнових кода в първия пост с най-новия за сега.


bool compare(CStudent &a, CStudent &b)
    {
            return a.average() < b.average();
    }

void sortaverage() //3.7
    {
       sort(students.begin(),students.end(),compare);

    }

Update:

Функцията вече не ми дава грешки при компилация, но не съм тествал дали функционира както трябва. Това, което напраих, е преместване на булевата функция в класа CStudent.


class CStudent: public CPerson
{
public:
    bool operator () (CStudent a, CStudent b) const
    {
            return a.average() < b.average();
    }
};

class CGroup
{
public:
    void sortaverage() //3.7
    {
       sort(students.begin(),students.end(),CStudent());
    }
};

Update:

Всички функции без 3.1, 3.8 и 3.9 са тествани и работят, обнових кода в първия пост. Започнал съм да работя върху функция 3.1 за запис от файл и на пръв поглед не прави точно, което искам. Идеята ми е всичката информация за член променливите да се съдържа във файла, така че още при зареждането на програмата да е възможно да се създадат групите, заедно със студентите. С други думи казано, не искам никога да се съзадават ръчно обекти в програмата, с цел опростяване на работата на потребителя. За момента подобна структура на файла ми е хрумнала, само с две специалности, понеже няма изискване от условието, но не съм сигурен как да разгранича редовете с групите от редовете със студентите. Бих бил много благодарен ако някой може да ми помогне конкретно с тази функция.


KST 1 1
Ivan 9402184050 61360133 1 55 2 90 3 78
Kaloqn 9407132530 61360148 1 25 2 80 3 87
KST 1 2
Anton 9402195020 61360138 1 20 2 80 3 92
KST 1 3
KST 2 1
KST 2 2
KST 2 3
KST 3 1
KST 3 2
KST 3 3
KST 4 1
KST 4 2
KST 4 3
SIT 1 1
SIT 1 2
SIT 1 3
SIT 2 1
SIT 2 2
SIT 2 3
SIT 3 1
SIT 3 2
SIT 3 3
SIT 4 1
SIT 4 2
SIT 4 3

Има ли възможност да се намери  целия код ?

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.