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

Помощ за курсов проект по С++

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


Здравейте! Имам да направя следната задача:

Да се състави програма, която да съдържа следните функции:

·        - Съставяне на динамично представен дек с целочислени данни,съдържащи се във външен файл;

·         -Сортиране на елементите в структурата по метода чрез сливане;

·         -Търсене на най-големия елемент,кратен на 5 и по-малък от максималното кратно число на 7;

·         -Запис на изходните резултати във външен файл.

 

 

Главна функция main() – с меню за избор на функции и проверка на състоянието на данните.

Не ми работи само сортирането,ако може някой да ми помогне ще му бъда адски благодарен.Ето какво съм направил досега:

 

#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

int temp;
int br = 1;
void push_l(int n);
void push_r(int n);
int pop_l(int &n);
int pop_r(int &n);

struct elem                             //структура на дек
{
        int key;                         //съдържа стойността на елемента
        elem *next;          //сочи към следващия елемент                       
} *_left = NULL, *_right = NULL;        //left сочи към краиния ляв елемент,а right сочи към крайния десен
void push_l(int n)              //добавяне на елемент със стойност n
{
        elem *p;                //създаване на указател p от тип elem
        p = _left;                      //p приема стойността на крайния ляв елемент
        _left = new elem;       //създава нов елемент сочен от left
        _left->key = n; //установяване на  n заа стойност на крайния ляв елемент 
        _left->next = p;                //следващия елемент left приема стойността на p
        if (right == NULL)           //ако няма краен десен елемент, то left  става такъв
        {
                _right = _left;
        }
}
void push_r(int n)              //добавяне отдясно на елемент със стойност  n
{
        elem *p;                //създаване на указател  p от тип elem
        p = _right;             //p приема стойността на краиния десен елемент
        _right = new elem;      //създаване на нов елемент сочен от right
        _right->key = n;                //установяване на n за стойнот на крайния десен елемент
        _right->next = NULL;    //следващия елемент right приема NULL
        if (_left == NULL)              //ако няма краен ляв елемент 
        {
                _left = _right;         //крайният ляв приема стйността на крайния
        }
        else                            //десен, в противен случей                      
                p->next = _right;       // следващият елемент райт приема стойността на крайния десен елемент
}
int pop_l(int &n)                       //извличане на елемент отляво
{
        elem *p;                        //създаване на указател p от тип elem
        if (_left)                              //проверка за наличие на краен ляв елемент 
        {
                n = _left->key;             //n приема стойността на крайния ляв елемент
                p = _left;                      //p  сочи крайния елемент
                _left = _left->next;    //left сочи следващият негов елемент
                if (left == NULL)               //ако няма краен ляв елемент
                        _right = NULL;          //указателят right се занулява
                delete p;               //изтриване на указателя  p
                return 1;
        }
        else
                return 0;
}
int pop_r(int &n)                       //извличане на елемент отдясно
{
        elem *p;                        //създаване на указател p от тип elem
        if (right)                      //проверка за наличие на краен десен елемент
        {
                n = _right->key;                 //n приема стойността на крайния десен елемент
                if (_left == _right)            //ако крайния десен елемент=крайния ляв
                {
                        delete _right;          //изтриване на крайния десен
                        _left = _right = NULL;  //нулиране на указателите
                }
                else
                {
                        p = _left;                      //p приема стойността на крайния ляв елемент
                        while (p->next != _right)       //докато следващия p елемент 
                                //е различен от крайния десен
                                p = p->next;                    //p преминава на следващия елемент
                        n = _right->key;                        //n приема стойността на крайния десен
                        p->next = NULL;         //указателят за следващият на  p се нулира
                        delete _right;                  //изтриване на крайния десен елемент
                        _right = p;                     //крайният десен приема стойността на p
                }
                return 1;
        }
        else
                return 0;
}

void output(ofstream& ostr, int n)              //за запис във файл
{
        ostr << n << endl;
}
void get(int n)                 //достъп до n-тия елемент
{
        int i, t;
        for (i = 1; i<br; i++)  //цикъл за обхождане на дека
        {
                pop_l(t);       //извличане на крайния ляв елемент 
                if (i == n)             //проверка за достигнат n-ти  елемент
                {
                        temp = t;       //запомня стойността му
                }
                push_r(t);      //добавяне на извлечения елемент от дясно
        }

}
void set(int n, int d)          //установяване на стойност d на n-тия елемент
{
        int t;
        for (int i = 1; i<br; i++)      //цикъл за обхождане на дека    
        {
                pop_l(t);       //извличане на крайния ляв елемент
                if (i == n)             //проверка за достигане  n-тия елемент
                {
                        t = d;  //установяване на новата стойност
                }
                push_r(t);      //добавяне на извлечения елемент отдясно
        }
}
void list()                     //извеждане на елементите на дека
{
        cout << "\n Dek:";
        for (int i = 1; i<br; i++)              //цикъл за обхождане
        {
                get(i);                         //извличане на стойността на съответният елемент
                cout << "\t" << temp;           //извеждане на екран

        }
}

void mergesort (struct elem)//функцията разделя масива рекурсивно на две части//след което функцията merge ги обединява
{   
        if(n<2) return;      
int _left=n/2, _right=n-_left;     
mergesort(a, _left);     
mergesort(a+_left, _right);      
int *p=new int [n];    
    
for (int i=0; i<n; i++)       
        a=p;    
delete []p;
}

void search()   //търсене  на най-големия елемент
        //кратен на 5 и по-малък от макс кратно число на 7
{
        mergesort();    //сортиране на дека ако не е бил сортиран
        int t=0;
        
        for (int i = 1; i<br; i++)      //цикъл за обхождане
        {
                get(i);                 //извличане на ития елемент
                if (temp % 5 == 0)      //проверка за точно делене на 5
                        t = temp;               //запомняне на стойността му
        }
        cout << "\n Maksimalen kraten na 5 " << t << endl;
        cout << "\n Elementi kratni na 7 i po malak ot maksimalnoto kratno chislo na 7: " << endl;
        for (int i = 1; i<br; i++)              //цикъл за обхождане
        {
                get(i);                 //извличане на ития елемент
                if (temp % 7 == 0 && temp<t)    //проверка за точно делене на 7 и по-малк от
                {                               //макс кратен на 5
                        cout << "\t" << temp;   //извеждане
                }
        }
}
int main()

        int ch, m;
        do
        {
                cout << "\n\n\t\t MENU" << endl;
                cout << "\n\t1-Zarejdane na dek ot fail" << endl;
                cout << "\t2-Sortirane po metoda chrez slivane" << endl;
                cout << "\t3-Elementi kratni na 7 i po-malki ot maksimalniq kraten na 5" << endl;
                cout << "\t4-Zapis na dek vav fail" << endl;
                cout << "\t5-Izhod!" << endl;
                cout << "\n\tIzbrahte:";
                cin >> m;
                cout << endl;


                switch (m)
                {
                case 1:
                {
                        ifstream ff;
                        ff.open("deck.txt");
                        while (ff)
                        {
                                ff >> ch;
                                if (ch == 0) break;
                                else
                                {
                                        push_r(ch);
                                        br++;
                                }
                        }
                        list();
                        break;
                }

                case 2:
                {
                        mergesort();
                        list();
                        break;
                }
                case 3:
                {
                        search();
                        break;
                }
                case 4:
                {
                        ofstream ff("sorted deck.txt");
                        while (pop_l(ch))
                        {
                                output(ff, ch);
                        }
                        cout << "\n\t *** File saved! ***" << endl;
                }
                }
        } while (m != 5);
}
 

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


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

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

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

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

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

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

Вход

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

Вход

×

Информация

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