Премини към съдържанието
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 потребители

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

  • Горещи теми в момента

  • Подобни теми

    • от Alexandar Jelev
      Здравейте, искам  да попитам някой може ли да ми помогне за курсовата задача, ще му бъда изключително благодарен? :)
      Задачата е следната:
      Съставете програма с функции за:
      а) Въвеждане от клавиатура във файл и в масив ( чрез добавяне) данни за автобусни превози ( до 35 ) - Автогара Варна: маршрут, дата (1 до 31), номер на автобуса, фамилия на водача, брой пътници, цена на съответните билети, обща сума на билетите - през месец юли. Извеждане текущото съдържание на масива (файла) на екран;
      б) Извеждане на екран справка за всички превози през избран ден от месеца ( със запитване за нова справка);
      в) Извеждане на екран номерата на автобусите и общата сума на билетите от превозите, извършени с тях, подредени в низходящ ред по сумата.
                   Главна функция main() -с меню  за избор на функции и проврка за състоянието на данните.  Използване на функции с предаване на параметри.
       
    • от Plamy Gerova
      Здравейте, може ли помощ за курсовата ми задача?
      съставете програма с функции за:
      а) въвеждане от клавиатурата във файл и в масив( чрез добавяне) данни за морски пътувания (до 25)- Морска гара Варна: маршрут, кораб-име, име на капитан, цени на билетите- I,II класа, брой пасажери в съответната класа, обща сума на продадените билети- през избран месец от годината.Извеждане текущото съдържание на масива(файла) на екрана.
      б) извеждане на екран данните за превозите на кораб по въведено от клавиатурата име на кораб(със запитване за справка)
      в) извеждане на екран данните за морско пътуване с най- голяма обща сума на продадени билети.
      Главна функция main()- с меня за избор на функции и проверка за състоянието та данните.Използване на локални променливи и функции с предаване на параметри. 
       
    • от Десислава Нешева
      Здравейте на всички. Имам въпрос, свързан с програмата си++. Имам матрица, на която търся сума от отрицателните елементи. Въпроса ми е как ще стане това нещо да се запише във файл, искам резултата да се показва само във файла, а не цялата матрица. Ето моя код:

      #include <iostream>

      #include<fstream>

      int main()

      {

      int a[10][10],m,n;

      int sum=0;

      std::cout<<"rows= ";

      std::cin>>m;

      std::cout<<"cols= ";

      std::cin>>n;

      for (int i=0; i<m; i++)

      for (int j=0; j<n; j++)

      {

      std::cout<<"a["<<i<<"]["<<j<<"]= ";

      std::cin>>a[j];

          if(a[j]<0) sum=sum+a[j];

      std::cout<<"sum= "<<sum;}

      return 0;

      }

      Благодаря, предварително !!!
    • от Boqn Tzonev
      #include <iostream> #include <iomanip> #include <string> #include <fstream> using namespace std; const int N = 5; struct player { string ime; string familia; string otbor; int nomer; int vk_golove; } igrachi[N], podredba; // Prototypes. int add_player(player a[]); void search_by_number(player a[], int &nomer_na_igracha); void search_by_team(player a[], string & ime_na_otbora); void klasirane(player a[]); void actual(player a[], int &nomer_na_igracha, string & ime_na_otbora); //********************************************** fstream igrachi_file; //********************************************** int add_player(player a[]) { int br; igrachi_file.open("igrachi.txt", ios::out | ios::app); // <--- As an "fstream" this needs to know if it is input or output. do { //cout << "\n Broi igrachi:"; cout << "\n Number of players:"; cin >> br; } while (br <= 0 || br > N); if (igrachi_file.fail()) { cout << "Error. The file is missing."; exit(1); } for (int i = 0; i < br; i++) { //cout << "Vuvedi ime na igrach:"; cout << " Enter player's first name: "; cin >> a[i].ime; igrachi_file << a[i].ime << endl; //cout << "Vuvedi familia na igrach:"; cout << " Enter a player's last name :"; cin >> a[i].familia; igrachi_file << a[i].familia << endl; //cout << "Vuvedi otbor na igracha:"; cout << " Enter a player's team: "; cin >> a[i].otbor; igrachi_file << a[i].otbor << endl; //cout << "Vuvedi nomer na igracha:"; cout << " Enter the player number: "; cin >> a[i].nomer; if (a[i].nomer > 99 || a[i].nomer < 1) { do { //cout << "Vuvedete nomer ot 1 do 99. \n"; cout << "Enter number 1 to 99. \n"; cin >> a[i].nomer; } while (a[i].nomer > 99 || a[i].nomer < 1); } igrachi_file << a[i].nomer << endl; //cout << "Vuvedi vkarani golove na igracha:"; cout << " Enter player goals scored: "; cin >> a[i].vk_golove; if (a[i].vk_golove < 0) { do { //cout << "Vuvedete golove >= 0 \n"; cout << "Enter goals >= 0 \n"; cin >> a[i].vk_golove; } while (a[i].vk_golove < 0); } igrachi_file << a[i].vk_golove << endl; } igrachi_file.close(); } void search_by_number(player a[], int &nomer_na_igracha) { int flag = 0; igrachi_file.open("igrachi.txt", ios::in); igrachi_file.seekg(0); if (igrachi_file.fail()) { cout << "Fail to open the file"; exit(1); } for (int i = 0; i < N; i++) { igrachi_file >> a[i].ime; igrachi_file >> a[i].familia; igrachi_file >> a[i].otbor; igrachi_file >> a[i].nomer; igrachi_file >> a[i].vk_golove; if (nomer_na_igracha == a[i].nomer) { cout << "Igrach: " << a[i].ime << " " << a[i].familia << "\nOtbor: " << a[i].otbor << "\nNomer: " << a[i]. nomer << "\nVkarani golove: " << a[i].vk_golove << endl; flag++; } } if (!flag) cout << endl << "Nqma takuv igrach!" << endl; igrachi_file.close(); } void search_by_team(player a[], string & ime_na_otbora) { int flag = 0; igrachi_file.open("igrachi.txt", ios::in); igrachi_file.seekg(0); if (igrachi_file.fail()) { cout << "Fail to open the file"; exit(1); } for (int i = 0; i < N; i++) { igrachi_file >> a[i].ime; igrachi_file >> a[i].familia; igrachi_file >> a[i].otbor; igrachi_file >> a[i].nomer; igrachi_file >> a[i].vk_golove; if (ime_na_otbora == a[i].otbor) { cout << "Igrach: " << a[i].ime << " " << a[i].familia << "\nOtbor: " << a[i].otbor << "\nNomer: " << a[i]. nomer << "\nVkarani golove: " << a[i].vk_golove << endl << endl; flag++; } } if (!flag) cout << endl << "Nqma takuv otbor!" << endl; igrachi_file.close(); } void klasirane(player a[]) { igrachi_file.open("igrachi.txt", ios::in); igrachi_file.seekg(0); // <--- Not needed as the file pointer is already at the beginning from the open statement. for (int i = 0; i < N; i++) { igrachi_file >> a[i].ime; igrachi_file >> a[i].familia; igrachi_file >> a[i].otbor; igrachi_file >> a[i].nomer; igrachi_file >> a[i].vk_golove; } cout << "ime" << setw(15) << "familia" << setw(15) << "otbor" << setw(15) << "nomer" << setw(15) << "vkarani golove" << endl; for (int i = 0; i < N; i++) { cout << a[i].ime << right << setw(15) << a[i]. familia << right << setw(15) << a[i]. otbor << right << setw(15) << a[i]. nomer << right << setw(15) << a[i].vk_golove << endl; } igrachi_file.close(); } int main() { int choice; int nomer_na_igracha; string ime_na_otbora, familia_na_igracha; player a[N]; do { cout << "\n================================================================================" << endl; cout << "\t\tMenu\n\n"; //cout << "= Izberete:\n"; cout << " Choose:\n"; //cout << "= 1. Dobavqne na igrachi\n"; cout << " 1. Add players\n"; //cout << "= 2. Spisuk s igrachite\n"; cout << " 2. List of players\n"; //cout << "= 3. Spravka za igrach po nomer\n"; cout << " 3. Reference for player by number\n"; //cout << "= 4. Spravka za igrach po otbor\n"; cout << " 4. Player report by team\n"; //cout << "= 5. Aktualizirane\n"; cout << " 5. Update\n"; //cout << "= 6. Krai\n"; cout << " 6. End\n"; cout << "\n================================================================================" << endl; cin >> choice; switch (choice) { case 1: { add_player(a); break; } case 2: { klasirane(a); break; } case 3: { cout << "Tursene po nomer: "; cin >> nomer_na_igracha; search_by_number(a, nomer_na_igracha); break; } case 4: { cout << "Tursene po otbor: "; cin >> ime_na_otbora; search_by_team(a, ime_na_otbora); break; } case 5: { cout<< "Update:"; cin>> nomer_na_igracha, ime_na_otbora; } break; } } while (choice != 6); } Здравейте имам нужда от малко помощ с моята курсова задача.Остана ми да направя единствено актуализацията ,но не мога да се справя. Ето и какво съм направил по актуализацията.Ще го постна като отговор долу.

      void actual(player a[], int nomer_na_igracha, string ime_na_otbora) { int i{}; fstream igrachi_file; igrachi_file.open("igrachi.txt", ios::in); while (getline(igrachi_file, a[i].familia)) // <--- Changed. { igrachi_file >> a[i].vk_golove; igrachi_file.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // <--- Requires header file <limits>. getline(igrachi_file, a[i].otbor); i++; } igrachi_file.close(); //cout << "Vuvedete igrachite chiqto informaciq iskate da redaktirate: "; cout << "Enter the players whose information you want to edit: "; //cin >> num; // <--- Not defined or used. //cout << "\n Ime: "; cout << "\n Name: "; std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // <--- Requires header file <limits>. getline(cin, a[i].familia); //cout << "\n Golove: "; cout << "\n Goals: "; cin >> a[i].vk_golove; // <--- goals. cin.get(); cout << endl << endl; } Кодът не е правилен.Да се види до къде съм стигнал.
    • от kirilov_philip
      Моля за помощ!!!
      Задача: Даден е двумерен масив A с m реда и n стълба. Да се напише програма на C++, която създава нов масив B, като стойността на елемента Bi(i e долен индекс) е равна на индекса на най-малката стойност в i-ия ред на A.
      Стигнах дотук.
      #include <iostream>
      #include <stdlib.h>
      using namespace std;
      int main()
      {
          int m, n;
          cout << "m="; cin >> m;
          cout << "n="; cin >> n;
          int A[100][100];
          int i, j;
          for(i=0;i<m;i++)
              for (j = 0; j < n; j++)
              {
                  cout << "A[" << i << "][" << j << "]="; cin >> A[j];
              }
      }
  • Дарение

×

Информация

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