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

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


Здравейте! Имам нужда от помощ за сортиравката на една програма. Тя е следната: 

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

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

2.Сортиране на елементите в структурата по метода :чрез просто вмъкване ( полуобмен);

3. Търсене на минималния елемент в интервала между максималния и минималния елемент по стойност кратен на 3 и последващото му изтриване от структурата.

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

Главна функция 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(int a[] = 0, int n = 0)//функцията разделя масива рекурсивно на две части//след което функцията 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
{
    void mergesort(int a[] = 0, int n = 0);    //сортиране на дека ако не е бил сортиран
    int t = 0;

    for (int i = 1; i<br; i++)      //цикъл за обхождане
    {
        get(i);                 //извличане на ития елемент
        if (temp % 5 == 0)      //проверка за точно делене на 5
            t = temp;               //запомняне на стойността му
    }
    cout << "\n Maksimalen element kraten na 5: " << t << endl;
    cout << "\n Elementi kratni na 7 i po-malkiq ot maksimalniq kraten na 5: " << endl;
    for (int i = 1; i<br; i++)              //цикъл за обхождане
    {
        get(i);                 //извличане на ития елемент
        if (temp % 7 == 0 && temp<t)    //проверка за точно делене на 7 и по-малк от
        {                               //макс кратен на 5
            cout << "\t" << temp;   //извеждане
        }
    }
}
int main()
{
    system("chcp 1251");
    int ch, m;
    do
    {
        cout << "\n\n\t\t MENU" << endl;
        cout << "\n\t1-Zarejdane na DEK ot file" << endl;
        cout << "\t2-Sortirane po metod chrez slivane" << endl;
        cout << "\t3-Elementi kratni na 7 i po-malkiq ot maksimalniq kraten na 5" << endl;
        cout << "\t4-Zapis na DEK vuv file" << endl;
        cout << "\t5-IZHOD!" << endl;
        cout << "\n\t IZBERETE:";
        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(int a[] = 0, int n = 0);
                  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);
}

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


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

Цитат

Това е програмата в непълен вид. Ако някой има малко свободно време, моля да я погледне. Благодаря! 

Почвате да ставате нагли, нямам предвид конкретно автора на темата, защото има и доста други такива като него

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

http://forums.data.bg/index.php?showtopic=2178982

  • Харесва ми 2

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


Линк към този отговор
Сподели в други сайтове
на 11/28/2016 в 21:50, ined написа:

Почвате да ставате нагли, нямам предвид конкретно автора на темата, защото има и доста други такива като него

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

http://forums.data.bg/index.php?showtopic=2178982

Благодаря ти за помоща, оценявам го! :)

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


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

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

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

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

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

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

Вход

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

Вход

  • Разглеждащи това в момента   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 функции за определяне на общата сума от продажби за година (цена * брой продадени за година). Всички класове да имат конструктори по подразбиране.
       
      Благодаря предварително !
    • от Магдаленаг
      If smb has time to spare please I'd would be very greatful :))
      Дадена е следната класификация:
                                      __________             
                            _______|__________|
      Медицина-|   
                           |          __________             
                           |________|__________|                
      Класификацията да се продължи поне на още две нива. Да се състави йерархия от класове, отразяваща класификацията. Да се декларират съответните класове.
      Да се дефинира виртуална функция, която извежда характеристиките на обект от всеки клас на йерархията. Във функцията main да се изгради масив от обекти от произволни класове в йерархията. Да се разработи функция, която обхожда масива и извежда информация за признаците на включените в него обекти.
      Декларациите на всеки клас от йерархията да бъдат оформени в отделни заглавни (.h) файлове. Дефинициите на всеки клас и функцията “main” да бъдат оформени в отделни модули (.cpp файлове).  Във всички файлове, съдържащи дефинициите на класовете и функцията “main”, чрез директивата #include да се включат съответните заглавни файлове, съдържащи декларациите на класовете. Да се създаде проект, състоящ се от създадените модули.
      Обяснителната записка съдържа заданието, пълно описание на декларираните класове, алгоритми и листинги на модулите.
       
  • Дарение

×

Информация

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