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

Spydoc

Потребител
  • Публикации

    32
  • Регистрация

  • Последно онлайн

Харесвания

0 Неутрална репутация

Всичко за Spydoc

  • Титла
    Потребител

Последни посетители

1091 прегледа на профила
  1. 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
  2. Здравейте, накратко, програмата се състои в създаването на студенти с техните имена, ЕГН, факултетен номер и карта, състояща се от код на теста и съответната оценка. След това се създава още един клас, съдържащ групите (специалност, курс и група), заедно с вектор от студентите. Веднъж формирани студентите и групите, следва създаването на разновидни функции, използващи тези член-променливи. Както ще видите от кода, все още разработвам програмата, но още от сега съм се натъкнал на проблеми, касаещи функциите в третия клас. За момента, най-големия, но не и единствен, проблем е, че не умея да достъпвам функциите и член-променливите от първите два класа във функциите от третия клас. Това се случва така, понеже студентите се съдържат в контейнер. Също така е добре да спомена, че вектора от студенти се запълва от файл, т.е. целта е потребителя да може да въвежда всичката информация за студентите във файл и да борави с функциите на базата на тази информация. Още нещо, което не ми е ясно, е как ще разгранича студентите по техните групи, когато изчитам файла. Ще напиша цялото условие, за да няма недоразумения и губене на време в разногласия. Всякаква помощ и напътствия са добре дошли. 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); }
  3. Spydoc

    Обработка на опашки записани във файл

    Благодаря ви много за помощта.
  4. Spydoc

    Обработка на опашки записани във файл

    Направих малко корекции, но има още един проблем. При изчитането на файла, последния елемент се дупликира в края на опашката. Примерно при файл с числа 1,5,2 ще запише в опашката 1,5,2,2. При проверка на останалите функции, нагледно всички работят както трябва. #include <iostream> #include <stdlib.h> #include <fstream> #include <time.h> #define END -999999 using namespace std; struct elem { int key; elem *next; }; struct queue { elem *front; elem *back; }; void push(queue& q, int n) { elem *p=new elem; if (q.back==NULL) q.front=p; else q.back->next=p; q.back=p; p->key=n; p->next=NULL; } int pop(queue& q) { int n; elem *p=q.front; if (p==NULL) return END; n=p->key; q.front=p->next; delete p; if (q.front==NULL) q.back=NULL; return n; } void print(queue& q) { int t; push(q,END); do { t=pop(q); if (t!=END) { cout<<t<<" "; push(q, t); } } while(t!=END); cout<<endl; } void Create_file() //syzdavane na fail s generirani chisla { int n, t; srand(time(NULL)); cout<<"Ot kolko elementa da se systoi opashkata?"<<endl; cin>>n; cout<<endl; ofstream file; file.open("file.txt"); if (file.is_open()) { for(int i=0;i<n;i++) { t = rand()%1000; file << t << endl; } file.close(); } else cout << "Ne moje da se otvori faila"; } void Read_file(queue& q) //chetene na faila i zapisvane na elementite v opashkata q { int t; ifstream file; file.open("file.txt",ios::in); if(file.is_open()) { while(!file.eof()) { file>>t; push(q, t); } file.close(); cout<<endl<<" Uspeshno e procheten faila."<<endl<<endl; } else cout<<"Ne moje da se otvori faila"<<endl; } void Write_file(queue& q1) { elem *t=q1.front; ofstream file2; if(q1.front) { file2.open("rezultat.txt",ios::out); if(file2) { while(t->next) { file2<<t->key<<"\n"; t=t->next; } file2<<t->key; file2.close(); cout<<endl<<"Rezultatite sa zapisani vyv rezultat.txt"<<endl<<endl; } else cout<<endl<<endl<<"Ne moje da byde otvoren faila razultat.txt"<<endl<<endl; } else cout<<endl<<endl<<"Nqma sydyrjanie za zapisvane!"<<endl; } int bubble(queue& q1, queue& q2) { int t, flag=0; t=pop(q1); while(q1.front) if (t>q1.front->key) { push(q2,pop(q1)); flag=1; } else { push(q2,t); t=pop(q1); } push(q2,t); return flag; } void sort(queue& q1) { queue q2={NULL,NULL}; do { bubble(q1, q2); } while (bubble(q2,q1)); } void remove(queue& q1) { queue q2={NULL,NULL}; int t, m, l; cout<<"L = "; cin>>l; m=pop(q1); while((m%l!=0)&&(q1.front)) { push(q2, m); m=pop(q1); } if (!q1.front) { push(q2, m); m=END; } // remove nothing while (q1.front) { t=pop(q1); if (t%l==0) m=t; push(q2, t); } do { t=pop(q2); if (t==m) m--; else push(q1, t); } while(q2.front); cout<<endl; } int main () { int ch=0; queue q={NULL,NULL}; do { cout<<"1. Syzdavane na fail sys sluchaini chisla"<<endl; cout<<"2. Izchitane na faila"<<endl; cout<<"3. Sortirane na opashkata"<<endl; cout<<"4. Iztrivane na nai-malkiq i nai-golemiq element, kratni na chisloto L"<<endl; cout<<"5. Proverka na dannite"<<endl; cout<<"6. Zapis na rezultatite vyv fail"<<endl; cout<<"7. Izhod."<<endl; cin>>ch; switch(ch) { case 1: Create_file();break; case 2: Read_file(q);break; case 3: sort(q);break; case 4: remove(q);break; case 5: print(q);break; case 6: Write_file(q);break; } }while(ch!=7); return 0; }
  5. Spydoc

    Обработка на опашки записани във файл

    Продължих по вашите стъпки, но имам проблем с четенето от файла. Записа във файл успешно се осъществява, но данните от него не могат да бъдат записани в опашката, което става във функцията Read_file(). Също така не съм напълно сигурен дали функцията ми за записване на опашката във файла rezultat.txt, която е под името Write_file(), е коректно написана. В тази функция би трябвало да се запише вече обработената опашка, т.е. сортирана и съответните два елемента да са изтрити. Много ви благодаря за всичката помощ, която ми оказахте до сега. #include <iostream> #include <stdlib.h> #include <fstream> #include <time.h> #define END -999999 using namespace std; struct elem { int key; elem *next; }; struct queue { elem *front; elem *back; }; void push(queue& q, int n) { elem *p=new elem; if (q.back==NULL) q.front=p; else q.back->next=p; q.back=p; p->key=n; p->next=NULL; } int pop(queue& q) { int n; elem *p=q.front; if (p==NULL) return END; n=p->key; q.front=p->next; delete p; if (q.front==NULL) q.back=NULL; return n; } void print(queue& q) { int t; push(q,END); do { t=pop(q); if (t!=END) { cout<<t<<" "; push(q, t); } } while(t!=END); cout<<endl; } void Create_file() //syzdavane na fail s generirani chisla { int n, t; srand(time(NULL)); cout<<"Ot kolko elementa da se systoi opashkata?"<<endl; cin>>n; cout<<endl; ofstream file; file.open("file.txt"); if (file.is_open()) { for(int i=0;i<n;i++) { t = rand()%1000; file << t << endl; } file.close(); } else cout << "Ne moje da se otvori faila"; } void Read_file() //chetene na faila i zapisvane na elementite v opashkata q { queue q={NULL,NULL}; int t; ifstream file; file.open("file.txt",ios::in); if(file.is_open()) { while(!file.eof()) { file>>t; push(q, t); } file.close(); cout<<endl<<" Uspeshno e procheten faila."<<endl<<endl; } else cout<<"Ne moje da se otvori faila"<<endl; } void Write_file() { elem *t=q.front; ofstream file2; if(q.front) { file2.open("rezultat.txt",ios::out); if(file2) { while(t->next) { file2<<t->key<<"\n"; t=t->next; } file2<<t->key; file2.close(); cout<<endl<<"Rezultatite sa zapisani vyv rezultat.txt"<<endl<<endl; } else cout<<endl<<endl<<"Ne moje da byde otvoren faila razultat.txt"<<endl<<endl; } else cout<<endl<<endl<<"Nqma sydyrjanie za zapisvane!"<<endl; } int bubble(queue& q1, queue& q2) { int t, flag=0; t=pop(q1); while(q1.front) if (t>q1.front->key) { push(q2,pop(q1)); flag=1; } else { push(q2,t); t=pop(q1); } push(q2,t); return flag; } void sort(queue& q1) { queue q2={NULL,NULL}; do { bubble(q1, q2); } while (bubble(q2,q1)); } void remove(queue& q1) { queue q2={NULL,NULL}; int t, m, l; cout<<"L = "; cin>>l; m=pop(q1); while((m%l!=0)&&(q1.front)) { push(q2, m); m=pop(q1); } if (!q1.front) { push(q2, m); m=END; } // remove nothing while (q1.front) { t=pop(q1); if (t%l==0) m=t; push(q2, t); } do { t=pop(q2); if (t==m) m--; else push(q1, t); } while(q2.front); cout<<endl; while (q.front) cout<<pop(q)<<" "; cout<<endl<<endl; } int main () { int ch=0; queue q={NULL,NULL}; do { cout<<"1. Syzdavane na fail sys sluchaini chisla"<<endl; cout<<"2. Izchitane na faila"<<endl; cout<<"3. Sortirane na opashkata"<<endl; cout<<"4. Iztrivane na nai-malkiq i nai-golemiq element, kratni na chisloto L"<<endl; cout<<"5. Proverka na dannite"<<endl; cout<<"6. Zapis na rezultatite vyv fail"<<endl; cout<<"7. Izhod."<<endl; cin>>ch; switch(ch) { case 1: Create_file();break; case 2: Read_file();break; case 3: sort(q);break; case 4: remove(q);break; case 5: print(q);break; case 6: Write_file(q);break; } }while(ch!=7); return 0; }
  6. Spydoc

    Обработка на опашки записани във файл

    Съгласен съм, че е по-смислено в една опашка да се изчитат данните от файла, но изрично е написано, че трябва да се съставят две динамично представени опашки, които да се съдържат във външен файл. Именно поради тази причина създавам две опашки, които да извличат данните от файла, но не знам как да дефинирам двете опашки по този начин. Дори бях тръгнал по нагледно по-лесния начин, чрез създаване на два файла, всеки съдържащ по една опашка, и записването на изходните резултати да се осъществява в трети файл, тъй като повече няма да обработвам опашките, освен за изпечатване данните на екрана. На практика, използването на функциите за сортирване и изтриване на елементите, трябва да се извършва индивидуално за всяка опашка, напълно независими една от друга.
  7. Spydoc

    Обработка на опашки записани във файл

    Би трябвало двете опашки да са напълно независими една от друга. Това означава, че се търси минималния и максималния елемент, който също така е кратен на число въведено от клавиатурата, на всяка опашка, след което се изтрива от файла. Относно записа във файл, според мен трябва да се запишат двете опашки поотделно, но след това се чудя как ще дефинирам коя ще е първата опашка и коя втора при изчитането на файла. Поради тази причина първоначално подходих към запис на опашките в два отделни файла, защото всички операции не включват използването на двете опашки заедно.
  8. Spydoc

    Обработка на опашки записани във файл

    Благодаря ви за помощта, но прекалено много го оплесках кода, най-вече заради употребата на имената като параметри. Сигурно ще прозвучи глупаво, но не е ли възможно част от името да се използва като променлива, с цел използване на цикъл? Примерно при first1 и first2 да се използва цикъл, който променя само цифрите им? #include<iostream> #include<fstream> #include<string> #include<cstdlib> #include<ctime> using namespace std; struct opashka{ int key; opashka *next; } *first1 = NULL, *last1 = NULL, *first2 = NULL, *last2 = NULL; void push_opashka(int n, opashka *&first, opashka *&last) { opashka *p=last; last=new opashka; last->key=n; last->next=NULL; if (p) { p->next=last; } else { first=last; } } int pop_opashka(int &n, opashka *&first, opashka *&last) { if (first) { n=first->key; opashka *p=first; first=first->next; delete p; if (first==NULL) last=first; return 1; } else return 0; } void Input_file() //Izvlichane na stoinostite ot fail i vmukvane v opashka { int a; for (int n=1;n<3;n++) { ifstream file[n]; file[n].open("n.txt",ios::in); if(file[n].is_open()) { while(!file[n].eof()) { file[n]>>a; push_opashka(a,first[n],last[n]); } file[n].close(); cout<<endl<<" Opashka "<<n<<" e vavedena."<<endl<<endl; } else cout<<"Greshka pri otvarqne na fila!Molq vavedete otnovo ili syzdaite avtomatichno fail"<<endl; } } void Display() //Printirane na ekrana sydyrjanieto na opashkata { for (int n=1;n<3;n++) { for (opashka *p = first(n); p; p = p->next) { cout << p->key << " "; } } } void Create_file() //Syzdavane na fail sys sluchaini chisla { for (int n=1;n<3;n++) int chislo = 0; srand(time(NULL)); { ofstream file[n]; file_n.open("n.txt"); if (file[n].is_open()) { for(int i=0;i<20;i++) //N=20 { chislo = rand()%200+1; file[n] << chislo << endl; } file[n].close(); } else cout << "Faila ne moje da byde otvoren"; } } void Sort_opashka() //sortirane po metoda na mehurcheto { for (int n=1;n<3;n++) { opashka *temp=first[n]; opashka *tmp=first[n]; ifstream file[n]("n.txt"); if(file[n].is_open()) { while(!file[n].eof()) { if(temp->key > temp->next) { tmp->key = temp->key; temp->key = temp->next; temp->next = tmp->key; temp = temp->next; } } file[n].close(); } else cout<<"Ne sushtestvuva fail "<<n<<".txt"<<endl; } } void Find_file() { for (int n=1;n<3;n++) { int number=0; opashka *min1=first; opashka *max1=first; opashka *temp=first; cout<<"Vyvedete chislo: "; cin>>number; ifstream file[n]("n.txt"); if(file[n].is_open()) { while(!file[n].eof()) { if(*temp->key % number == 0 && *temp->key < *min[n]->key) min[n]->key = temp->key; else if (*temp->key % number == 0 && *temp->key > *max[n]->key) max1->key = temp->key; temp = temp->next; } cout<<"Minimalniq element v opashka 1, koito e kraten na "<<number<<" e "<<min[n]->key<<endl; cout<<"Maksimalniq element v opashka 2, koito e kraten na "<<number<<" e "<<max[n]->key<<endl; while(!file_1.eof()) { if(temp->key == min->key) } } } } void Write_file() //Zapisvane na opashkata vyv fail { for (int n=1;n<3;n++) { opashka *temp=first; ofstream file[n]; if(first) { file[n].open("n.txt",ios::out); if(file[n]) { while(temp->next) { file[n]<<temp->key<<"\n"; temp=temp->next; } file[n]<<temp->key; file[n].close(); cout<<endl<<"Opashka "<<n<<" e suhranena"<<endl<<endl; } else cout<<endl<<endl<<"Ne moje da se otvori opashka "<<n<<".txt"<<endl<<endl; } else //ako e prazen spisaka vadi saobshtenie { cout<<endl<<endl<<"Nqma danni za zapisvane"<<endl; } } } int main() { int izbor=0; do { cout<<"1. Syzdavane na 2 opashki i zapisvane vyv fail"<<endl; cout<<"2. Izvlichane na stoinostite na dvete opashki ot fail"<<endl; cout<<"3. Sortirane na dvete opashki"<<endl; cout<<"4. Namirane na nai-golemiq i nai-malkiq element v opashkite i iztrivaneto im"<<endl; cout<<"5. Zapis na rezultatite vyv vyneshen fail"<<endl; cout<<"6. Proverka za systoqnieto na dannite"<<endl; cout<<"7. Izhod"<<endl; cout<<endl<<"Izbor: "; cin>>izbor; }while(izbor<1 || izbor>7); izbor=0; opashka *temp=first; switch (izbor) { case 1: Create_file(); main(); break; case 2: Input_file(); main(); break; case 3: Sort_file(); main(); break; case 4: Find_file(); main(); break; case 5: Write_file(); main(); break; case 6: Display(); cout<<endl; main(); break; case 7: exit(0); break; } }
  9. Здравейте, имам малки затруднения върху една програма, свързана с обработката на две опашки, които биват записани във файл. Необходимо е да се съставят следните функции: Съставяне на две динамично представени опашки с целочислени данни, съдържащи се във външен файл Сортиране на елементите в двете опашки чрез метода на мехурчето (размяна) Намиране на най-големият и най-малкият елемент в опашките, които също така са кратни на число въведено от клавиатурата, след което тези два елемента биват изтривани. Запис на изходните резултати във външен файл. Проверка за състоянието на данните Затруднението ми е в третата подточка с изтриването на въпросните елементи. Също така имам нередности в пойнтърите при сортировката. Всякаква помощ е добре дошла. #include<iostream> #include<fstream> #include<string> #include<cstdlib> #include<ctime> using namespace std; const int N=20; struct opashka{ int key; opashka *first; opashka *next; opashka *last; } *start, *first = NULL, *last = NULL; void push_opashka(int a) { opashka *p=last; last=new opashka; last->key=a; last->next=NULL; if (p!=NULL) { p->next=last;} if (first==NULL) {first=last;} } int pop_opashka(int n) { if (first) { n=first->key; opashka *p=first; first=first->next; delete p; return 1; } else return 0; } void Input_file1() //Izvlichane na stoinostite ot fail i vmukvane v opashka { int a; ifstream file_1; file_1.open("opashka1.txt",ios::in); if(file_1!=NULL) { while(!file_1.eof()) { file_1>>a; push_opashka(a); } file_1.close(); cout<<endl<<" Opashka 1 e vavedena."<<endl<<endl; } else cout<<"Greshka pri otvarqne na fila!Molq vavedete otnovo ili syzdaite avtomatichno fail"<<endl; } void Input_file2() //Izvlichane na stoinostite ot fail i vmukvane v opashka { int a; ifstream file_2; file_2.open("opashka2.txt",ios::in); if(file_2!=NULL) { while(!file_2.eof()) { file_2>>a; push_opashka(a); } file_2.close(); cout<<endl<<" Opashka 2 e vavedena."<<endl<<endl; } else cout<<"Greshka pri otvarqne na fila!Molq vavedete otnovo ili syzdaite avtomatichno fail"<<endl; } void Display() //Printirane na ekrana sydyrjanieto na opashkata { for (opashka *p = first; p; p = p->next) { cout << p->key << " "; } } void Create_file1() //Syzdavane na fail sys sluchaini chisla { int chislo = 0; srand(time(NULL)); ofstream file_1; file_1.open("opashka1.txt"); if (file_1.is_open()) { for(int i=0;i<N;i++) //N=20 { chislo = rand()%200+1; file_1 << chislo << endl; } file_1.close(); } else cout << "Faila ne moje da byde otvoren"; } void Create_file2() //Syzdavane na fail sys sluchaini chisla { int chislo = 0; srand(time(NULL)); ofstream file_2; file_2.open("opashka2.txt"); if (file_2.is_open()) { for(int i=0;i<N;i++) { chislo = rand()%200+201; file_2 << chislo << endl; } file_2.close(); } else cout << "Faila ne moje da byde otvoren"; } void Sort_file1() //sortirane po metoda na mehurcheto { opashka *temp=first; opashka *tmp=first;; ifstream file_1("opashka1.txt"); if(file_1!=NULL) { while(!file_1.eof()) { if(temp->key > temp->next) { tmp->key = temp->key; temp->key = temp->next; temp->next = tmp->key; temp = temp->next; } } file_1.close(); } else cout<<"Ne sushtestvuva fail opashka1.txt"<<endl; } void Sort_file2() //sortirane po metoda na mehurcheto { opashka *temp=first; opashka *tmp=first; ifstream file_2("opashka2.txt"); if(file_2!=NULL) { while(!file_2.eof()) { if(temp->key > temp->next) { tmp->key = temp->key; temp->key = temp->next; temp->next = tmp->key; temp = temp->next; } } file_2.close(); } else cout<<"Ne syshtestvuva fail opashka2.txt"<<endl; } void Find_file1() { int number=0; opashka *min1=first; opashka *max1=first; opashka *temp=first; cout<<"Vyvedete chislo: "; cin>>number; ifstream file_1("opashka1.txt"); if(file_1!=NULL) { while(!file_1.eof()) { if(temp->key % number == 0 && temp->key < min1) min1->key = temp->key; else if (temp->key % number == 0 && temp->key > max1) max1->key = temp->key; temp = temp->next; } cout<<"Minimalniq element v opashka 1, koito e kraten na "<<number<<" e "<<min1->key<<endl; cout<<"Maksimalniq element v opashka 2, koito e kraten na "<<number<<" e "<<max1->key<<endl; while(!file_1.eof()) { if(temp->key == min->key) } } } void Write_file_1() //Zapisvane na opashkata vyv fail { opashka *temp=first; ofstream file_1; if(first) { file_1.open("opashka1.txt",ios::out); if(file_1) { while(temp->next) { file_1<<temp->key<<"\n"; temp=temp->next; } file_1<<temp->key; file_1.close(); cout<<endl<<"Opashka 1 e suhranena"<<endl<<endl; } else cout<<endl<<endl<<"Ne moje da se otvori opashka1.txt"<<endl<<endl; } else //ako e prazen spisaka vadi saobshtenie { cout<<endl<<endl<<"Nqma danni za zapisvane"<<endl; } } void Write_file_2() //Zapisvane na opashkata vyv fail { opashka *temp=first; ofstream file_2; if(first) { file_2.open("opashka2.txt",ios::out); if(file_2) { while(temp->next) { file_2<<temp->key<<"\n"; temp=temp->next; } file_2<<temp->key; file_2.close(); cout<<endl<<"Opashka 2 e suhranena"<<endl<<endl; } else cout<<endl<<endl<<"Ne moje da se otvori opashka2.txt"<<endl<<endl; } else { cout<<endl<<endl<<"Nqma danni za zapisvane"<<endl; } } int main() { int izbor=0; do { cout<<"1. Syzdavane na 2 opashki i zapisvane vyv fail"<<endl; cout<<"2. Izvlichane na stoinostite na dvete opashki ot fail"<<endl; cout<<"3. Sortirane na dvete opashki"<<endl; cout<<"4. Namirane na nai-golemiq i nai-malkiq element v opashkite i iztrivaneto im"<<endl; cout<<"5. Zapis na rezultatite vyv vyneshen fail"<<endl; cout<<"6. Proverka za systoqnieto na dannite"<<endl; cout<<"7. Izhod"<<endl; cout<<endl<<"Izbor: "; cin>>izbor; }while(izbor<1 || izbor>7); izbor=0; opashka *temp=start; switch (izbor) { case 1: Create_file1(); Create_file2(); main(); break; case 2: Input_file1(); Input_file2(); main(); break; case 3: Sort_file1(); Sort_file2(); main(); break; case 4: Find_file1(); Find_file2(); main(); break; case 5: Write_file_1(); Write_file_2(); main(); break; case 6: Display(); cout<<endl; main(); break; case 7: exit(0); break; } }
  10. Здравейте, създал съм програма, която проверява дали съдържанието на едно двоично дърво (TR1) се съдържа в друго двоично дърво (TR2). Единствената особеност е, че съм вкарал стойностите на дърветата в два масива и с тях правя проверката. Как може чрез обхождане на елементите на дърветата да се направи тази проверка, без употреба на масиви? Ето го текущия вид на програмата ми. #include <iostream>using namespace std;struct elem{ int key; elem *left, *right;}*root1=NULL, *root2=NULL;void add(int n, elem *&t);void check();int i=0, y=0;int *a1= new int[i];int *a2= new int[y];int main(){ int c; cout<<endl<<"Vavedete simvoli za dobavqne v TR1: "<<endl; do { cin>>c; if(c!=0) add(c,root1); }while(c!=0); cout<<endl<<"Vavedete simvoli za dobavqne v TR2: "<<endl; do { cin>>c; if(c!=0) add(c,root2); } while(c!=0); check();}void add(int n, elem *&t){ if(t==NULL) { t=new elem; t->key=n; t->left=NULL; t->right=NULL; } else if(t->key<n) add(n,t->right); else add(n,t->left);}void inorder1(elem *t){ if(t) { inorder1(t->left); a1[i++]=t->key; inorder1(t->right); }}void inorder2(elem *t){ if(t) { inorder2(t->left); a2[y++]=t->key; inorder2(t->right); }}void check(){ inorder1(root1); inorder2(root2); int flag=0; for(int x=0; x<i; x++) { for(int q=0; q<y; q++) { if(a1[x]!=a2[q]) { flag=0; } else { flag=1; break; } } if (flag==0) break; } if(flag==1) cout<<endl<<"TR1 se sudurja v TR2"; else cout<<endl<<"TR1 ne se sudurja v TR2";}
  11. Spydoc

    Изключване на отрицателни числа в списък

    Благодаря Ви много! Сега забелязах, че съм пропуснал да вмъкна няколко проверки.
  12. Нужна ми е помощ със създаването на функция за изключване на отрицателни елементи в списък. EDIT: Почти е готова функцията, но не обхожда последния елемент. #include <iostream>using namespace std;struct elem{ int key; elem *next; elem *prev;}*start=NULL;void list(){ elem *p=start; if (start) { cout<<"n List is: "; while (p) { cout<<p->key<<" "; p=p->next; } } else cout<<"n Empty list";}void add(int n){ cout<<"n Vyvedete n: "; cin>>n; elem *p=start, *q; q=new elem; q->key=n; q->next=NULL; if (start) { while (p->next) p=p->next; p->next=q; } else start=q; q->prev=p;}int del(int &n, int k){ elem *q; elem *p=start; if (start) { while (p->next) { if (p->key>k) p=p->next; else { q=p->next; n=q->key; *p=*q; delete q; } } } else return 0;}int main(){ int n, choice, k=0; do { cout<<"n 1. Dobavqne"; cout<<"n 2. Iztrivane na otricatelnite elementi"; cout<<"n 3. Izhod"<<endl; cin>>choice; switch(choice) { case 1: add(n); break; case 2: del(n, k); list(); } }while (choice!=3);}
  13. Spydoc

    Създаване на дек

    Edit: Оправих си грешката. Ето го финалния вид на задачата, направена с дек. #include <iostream>using namespace std;struct elem{ char key; elem *next;}*l=NULL,*r=NULL;void push_r(char n){ elem *p=r; r=new elem; r->key=n; r->next=NULL; if (p) p->next=r; else l=r;}int pop_l(int &n){ if (l) { n=l->key; elem *p=l; l=l->next; delete p; return 1; } else return 0;}int pop_r(int &n){ if (r) { n=r->key; if (l==r) { delete r; l=r=NULL; } else { elem *p=l; while (p->next!=r) p=p->next; p->next=NULL; delete r; r=p; } return 1; } else return 0;}int main(){ char n; int a,b; int f=0; cout<<"Vyvedete duma simvol po simvol."<<endl; do { cin>>n; if (n!='/') push_r(n); }while (n!='/'); while (l!=r) { pop_l(a); pop_r(b); if (a!=b) f=1; break; } if (f==1) cout<<"Dumata ne e palindrom"<<endl; else cout<<"Dumata e palindrom"<<endl;}
  14. Spydoc

    Създаване на дек

    Трябва да създам собствен дек, с използване на функции за push и pop.
  15. Spydoc

    Създаване на дек

    Здравейте, имам малки затруднения със създаването на дек. Условието ми е да се състави програма, която създава дек, съдържащ символи и след това проверява, дали записаната в него дума е палиндром. Написал съм я програмата, но без да използвам дек. #include<iostream>using namespace std;#include<stdio.h>#include<string.h>int main(){ char sim[20]; int a,b,dyl,sred; cout<<" Vyvedete niz:"; gets (sim); dyl=strlen(sim); sred=dyl; b=0; for (a=0;a<sred;a++) { if (sim[a]!=sim[dyl-a-1]) b++; } cout<<"Nizyt "<<sim; { if(b>0) cout<<" ne e palindrom"; else cout<<" e palindrom"; }}
  • Разглеждащи това в момента   0 потребители

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

×

Информация

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