Динамично представен стек

C++ JAVA
Post Reply
respec7_m3
Нов
Нов
Posts: 170
Joined: Wed Jun 30, 2010 4:42 pm

Динамично представен стек

Post by respec7_m3 » Tue Dec 01, 2015 9:40 am

Да се състави програма, която да съдържа следните функции:
- Съставяне на динамично представен стек с целочислени данни, съдържащи се във външен файл.
- Сортиране на елементите в структурата по метод чрез сливане
- Намиране на минималният елемент, кратен на число въведено от клавиатурата с последващото му изтриване
- Запис на изходните резултати във външен файл
- Главна функция main() - с меню за избор на функции и проверка за състоянието на данните

Въпросите ми са следните:
- Защо файловете ми не работят не мога да ги създам изобщо?
- Как ще стане сортирането, чрез метод на сливане?
- До тук има ли нещо друго, което не е точно по условието и/или не работи?

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <ctime>

using namespace std;


typedef struct elem &#123; int key; elem *next; &#125; *pelem;
typedef struct stack &#123; pelem start; &#125; *pstack;

void push&#40;pstack s, int n&#41; &#123;
	pelem p = s->start;
	s->start = &#40;pelem&#41;malloc&#40;sizeof elem&#41;;
	s->start->key = n;
	s->start->next = p;
&#125;

int pop&#40;pstack s&#41; &#123;
	int n = -1;
	pelem p = s->start;
	if &#40;p != NULL&#41; &#123;
		n = p->key;
		s->start = p->next;
		free&#40;p&#41;;
	&#125;
	return n;
&#125;

int is_empty&#40;pstack s&#41; &#123;
	return s->start == NULL;
&#125;

pstack create_stack&#40;&#41; &#123;
	pstack t = &#40;pstack&#41;malloc&#40;sizeof stack&#41;;
	memset&#40;t, 0, sizeof stack&#41;;
	return t;
&#125;

void selection_sort&#40;pstack s&#41; &#123;
	pstack ret = create_stack&#40;&#41;;
	pstack temp = create_stack&#40;&#41;;
	while &#40;!&#40;s&#41;&#41; &#123;
		int current = pop&#40;s&#41;;
		while &#40;!&#40;s&#41;&#41; &#123;
			int n = pop&#40;s&#41;;
			if &#40;n < current&#41; &#123;
				int swap = current;
				current = n;
				n = swap;
			&#125;
			push&#40;temp, n&#41;;
		&#125;
		push&#40;ret, current&#41;;
		s->start = temp->start;
		temp->start = NULL;
	&#125;
	s->start = ret->start;
&#125;

/* Funkcii za rabota s failove */

void file_output&#40;&#41; // Syzdava fail s random chisla ako nqma gotov fail
&#123;
	int chislo; //променлива за числата
	srand&#40;time&#40;NULL&#41;&#41;; //генерира случайни числа
	ofstream file; //променлива от тип ofstream - за запис
	file.open&#40;"file.txt"&#41;; //отваря файла за запис
	if &#40;file.is_open&#40;&#41;&#41; //проверява дали файлът е отворен
	&#123;
		for &#40;int i = 0; i<50; i++&#41;    //казва колко числа да генерира
		&#123;
			chislo = rand&#40;&#41; % 1000; //random chislata sa v interval 1–1000
			file << chislo << endl; //записва 20 случайни числата във файла
		&#125;
		file.close&#40;&#41;; //затваря файла
	&#125;
	else cout << "Faila ne moje da bude otvoren";
&#125;

void file_input&#40;&#41;                    //chete i popylva spisaka ot fail, за да можем да използваме числата в програмата
&#123;
	int a;
	pstack s1 = create_stack&#40;&#41;;
	ifstream file_1;              //променлива от тип ifstream - само за четене
	file_1.open&#40;"file.txt", ios&#58;&#58;in&#41;;  //otvarq faila za chetene
	if &#40;file_1&#41;               //proverka za prazen fail - ако не е празен файлът
	&#123;
		while &#40;!file_1.eof&#40;&#41;&#41;          // chete dokato stigne kraiq mu
		&#123;
			file_1 >> a; //чете числата
			push&#40;s1, a&#41;;           //prochetenata stoinost se predawa na a
			//слага ги в стека
		&#125;
		file_1.close&#40;&#41;; //затваря файла
		cout << endl << " Faila e vaveden." << endl << endl;
	&#125;
	else                          //pri prazen fail ili greshka pri otvarqne
		cout << "Greshka pri otvarqne na fila!" << endl;
&#125;

/* Funkcia za pokazvane sadarjanieto na vhodiashtia &#40;inputf.txt&#41; i izhodiashtia&#40;outputf.txt&#41; fail */
void display_file&#40;int type&#41;&#123;
	int value;
	string name;
	switch &#40;type&#41;&#123;
	case 1&#58;
		name = "inputf.txt";
		break;
	case 2&#58;
		name = "outputf.txt";
	&#125;
	ifstream file;
	file.open&#40;name.c_str&#40;&#41;, ios&#58;&#58;in&#41;;
	if &#40;file&#41;&#123;
		int i&#40;1&#41;;
		cout << name.c_str&#40;&#41; << endl;
		cout << setw&#40;8&#41; << "Element";
		cout << setw&#40;14&#41; << "Stoinost";
		while &#40;!file.eof&#40;&#41;&#41;&#123;
			file >> value;
			cout << endl << setw&#40;5&#41; << i;
			cout << setw&#40;14&#41; << value;
			i++;
		&#125;
		file.close&#40;&#41;;
	&#125;
	else cout << "Greshka pri otvarianeto na faila!";

&#125;

int main&#40;&#41;&#123;
	pstack s1 = create_stack&#40;&#41;;

	/* Osnovno menu na programata */
	cout << "MENU" << endl;
	cout << "&#91;1&#93; - Vavedi danni ot file &#40; inputf.txt &#41;." << endl;
	cout << "&#91;2&#93; - Sortirane na steka." << endl;
	cout << "&#91;3&#93; - Zapishi deka v file &#40; outputf.txt &#41;." << endl;
	cout << "&#91;4&#93; - Izvejdane na sadyrjanieto na vhodqshtia file." << endl;
	cout << "&#91;5&#93; - Izvejdane na sadyrjanieto na izhodnia file." << endl;
	cout << "&#91;0&#93; - Izhod ot programata." << endl;
	char chc;
	while &#40;true&#41;&#123;
		cout << "Vavedi operacia -> ";
		cin >> chc;
		switch &#40;chc&#41;
		&#123;
		case '0'&#58;
		&#123;
			exit&#40;0&#41;;
			break;
		&#125;
		case '1'&#58;
		&#123;
			file_input&#40;&#41;;
			break;
		&#125;

		case '2'&#58;
		&#123;
			pstack s1 = create_stack&#40;&#41;;
			selection_sort&#40;s1&#41;;

			break;
		&#125;
		case '3'&#58;
		&#123;
			file_output&#40;&#41;;
			break;
		&#125;
		case '4'&#58;
		&#123;
			display_file&#40;1&#41;;
			break;
		&#125;
		case '5'&#58;
		&#123;
			display_file&#40;2&#41;;
			break;
		&#125;

		default&#58; cout << "Greshen izbor" << endl;
		&#125;
		cout << endl;
	&#125;
	return 1;
&#125;

Post Reply