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

Програма свързана със сортиране на два стека

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


Здравейте имам следната задача: 

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

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

   - Сортиране на елементите в стековете по метода прост избор/селекция (забранява се използването на масив!)

   - формиране на структура списък, съдържаща елементите на двата стека и намиране на най малкия елемент

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

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

 

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

В коментар съм написала структурата списък. За намирането на най малък елемен - става чрез сортиране/селекция??? Как става това??? Как да вкарам структурата в меню?

Как се съставят динамичните стекове т.е как се съдържат във файл? :/

Примерно сортиране чрез селекция (без масив!)?

Съставяне на меню? 

Моля ви помощ! 

#include <iostream>
using namespace std;

//инициализиране на функции
struct elem
{
	int key;
	elem *next;
}*start,*pst, *qst;

//прототипи на функцията
elem *push(elem *st, int n);
elem *pop(elem *st, int &n);
void init(elem *st);
int empty(elem *st);

elem *push(elem *st, int n)//добавяне на елемент
{
	elem *p;
	p=new elem;
	p->key=n;
	p->next=st;
	st=p;
	return p;
}

elem *pop(elem *st, int &n)//извличане на елемент
{
	elem *p;
	n=st->key;
	p=st;
	st=st->next;
	delete p;
	return st;
}

void init(elem *st)//инициализация на стек
{ st=NULL; }
int empty(elem *st)
{
	if (st==NULL)
		return 1;
	else
		return 0;
}
/* 
void list()
{
elem *p=start;

if (start)
 {
cout<<"Elementite v spisuka sa ";
while(p)
  { cout<<p->key<<"\t"; p=p->next; }
 }
}
*/
void main() 
{
	init(start);
	int num;
	cout<<"Vuvedete stoinost: \n";
	while (cin>>num)
		start=push(start, num);
	init(pst);
	init(qst);
	while(!empty(start))
	{
		start=pop(start, num);
		if(num>0)
			qst=push(qst, num);
		else
			pst=push(pst, num);
	}
	cout<<"\n Novite stekove sa: ";
	cout<<"\n Otricatelni stoinosti: ";
	while (!empty(qst))
	{
		qst=pop(qst,num);
		cout<<num<<' ';
	}
	cout<<"\n Polojitelni stoinosti: ";
	while (!empty(pst))
	{
		pst=pop(pst,num);
		cout<<num<<' ';
	}
	cout<<"\n";
	
	system("pause");
} 

 

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

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


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

преди 4 часа, Maria11 написа:

 

Здравейте имам следната задача: 

 

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

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

   - Сортиране на елементите в стековете по метода прост избор/селекция (забранява се използването на масив!)

   - формиране на структура списък, съдържаща елементите на двата стека и намиране на най малкия елемент

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

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

 

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

В коментар съм написала структурата списък. За намирането на най малък елемен - става чрез сортиране/селекция??? Как става това??? Как да вкарам структурата в меню?

Как се съставят динамичните стекове т.е как се съдържат във файл? :/

Примерно сортиране чрез селекция (без масив!)?

Съставяне на меню? 

Моля ви помощ! 


#include <iostream>
using namespace std;

//инициализиране на функции
struct elem
{
	int key;
	elem *next;
}*start,*pst, *qst;

//прототипи на функцията
elem *push(elem *st, int n);
elem *pop(elem *st, int &n);
void init(elem *st);
int empty(elem *st);

elem *push(elem *st, int n)//добавяне на елемент
{
	elem *p;
	p=new elem;
	p->key=n;
	p->next=st;
	st=p;
	return p;
}

elem *pop(elem *st, int &n)//извличане на елемент
{
	elem *p;
	n=st->key;
	p=st;
	st=st->next;
	delete p;
	return st;
}

void init(elem *st)//инициализация на стек
{ st=NULL; }
int empty(elem *st)
{
	if (st==NULL)
		return 1;
	else
		return 0;
}
/* 
void list()
{
elem *p=start;

if (start)
 {
cout<<"Elementite v spisuka sa ";
while(p)
  { cout<<p->key<<"\t"; p=p->next; }
 }
}
*/
void main() 
{
	init(start);
	int num;
	cout<<"Vuvedete stoinost: \n";
	while (cin>>num)
		start=push(start, num);
	init(pst);
	init(qst);
	while(!empty(start))
	{
		start=pop(start, num);
		if(num>0)
			qst=push(qst, num);
		else
			pst=push(pst, num);
	}
	cout<<"\n Novite stekove sa: ";
	cout<<"\n Otricatelni stoinosti: ";
	while (!empty(qst))
	{
		qst=pop(qst,num);
		cout<<num<<' ';
	}
	cout<<"\n Polojitelni stoinosti: ";
	while (!empty(pst))
	{
		pst=pop(pst,num);
		cout<<num<<' ';
	}
	cout<<"\n";
	
	system("pause");
} 

 

От първа точка в условието ти пише че трябва да е във външен файл плюс това да са динамични тоест ще ти трябва клас Стек заедно със структура и той да е в хедър и .cpp. По принцип структурите от данни за да работят нормално и лесно се нуждаят винаги от клас и структура. За намирането на най-малък елемнт аз си го представям че имаш финкция в нея попваш стек и зареждаш в масив всеки попнат елемент и правиш нещо от типа на

int min = stack_Arr[0];
for(int i=1;i<stack_Arr.length();i++)

{

     if(min > stack_Arr){ min = stack_Arr;}

}

 

Има доста неща за мислене по задачата. За кога ти е? Аз мога да ти помогна поне донякъде, но ще ми трябва един ден някъде.

 

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


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

От първа точка в условието ти пише че трябва да е във външен файл плюс това да са динамични тоест ще ти трябва клас Стек заедно със структура и той да е в хедър и .cpp. По принцип структурите от данни за да работят нормално и лесно се нуждаят винаги от клас и структура. За намирането на най-малък елемнт аз си го представям че имаш финкция в нея попваш стек и зареждаш в масив всеки попнат елемент и правиш нещо от типа на

int min = stack_Arr[0];
for(int i=1;i<stack_Arr.length();i++)

{

     if(min > stack_Arr){ min = stack_Arr;}

}

 

Има доста неща за мислене по задачата. За кога ти е? Аз мога да ти помогна поне донякъде, но ще ми трябва един ден някъде.

 

До 15 декември е.

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


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

От първа точка в условието ти пише че трябва да е във външен файл плюс това да са динамични тоест ще ти трябва клас Стек заедно със структура и той да е в хедър и .cpp. По принцип структурите от данни за да работят нормално и лесно се нуждаят винаги от клас и структура. За намирането на най-малък елемнт аз си го представям че имаш финкция в нея попваш стек и зареждаш в масив всеки попнат елемент и правиш нещо от типа на

int min = stack_Arr[0];
for(int i=1;i<stack_Arr.length();i++)

{

     if(min > stack_Arr){ min = stack_Arr;}

}

 

Има доста неща за мислене по задачата. За кога ти е? Аз мога да ти помогна поне донякъде, но ще ми трябва един ден някъде.

 

Поне да бяхте прочели условието преди да ги напишете тея безсмислици, 

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


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

Поне да бяхте прочели условието преди да ги напишете тея безсмислици, 

???


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


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

???

 

на 11/30/2016 в 0:01, frozener написа:

 в нея попваш стек и зареждаш в масив всеки попнат елемент

на 11/29/2016 в 19:38, Maria11 написа:

  - Сортиране на елементите в стековете по метода прост избор/селекция (забранява се използването на масив!)

 

  • Харесва ми 1

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


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

Няма никакъв проблем да се сортира стек и без да се ползва допълнителен масив. Може и само с push() и pop() да го направиш, За сортиране с проста селекция ще ти трябват още два допълнителни стека - единия за временно съхраняване на числата докато прехвърляш числата от единия в другия докато намериш максималната стойност, а другия - за да записваш в него намерените максимуми - резултата е подреден стек като на върха е най-малкото число, а на дъното най-голямото.

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


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

 

 

Еми не се сещам как ще стане без масив. За "формиране на структура списък, съдържаща елементите на двата стека и намиране на най малкия елемент" се сещам как да се намери най-малкия елемент в стек:

 

node *t; // temporary pointer

t = top; // top of the stack

minElem = t->data;

while(t!=NULL){ if(minElem > t->next->data){ minElem = t->next->data; t=t->next;}}

??

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


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

Горния код е сбъркан, ще те оставя сам да си намериш грешката. Сортирането без масив не е чак толкова сложно

void selectsort(elem* &start)
{
    elem* p=start;
    start=NULL;
    while (p)
    {
        elem* s=NULL;
        int max=pop(p);
        while (p)
        {
            if (p->key > max) 
            {    
                push(s,max); 
                max=pop(p);
            }
            else push(s,pop(p));
        }
        push(start,max);
        p=s;
    }
}

 

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

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


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

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

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

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

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

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

Вход

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

Вход

  • Разглеждащи това в момента   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 функции за определяне на общата сума от продажби за година (цена * брой продадени за година). Всички класове да имат конструктори по подразбиране.
       
      Благодаря предварително !
  • Дарение

×

Информация

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