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

respec7_m3

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

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

Код:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <ctime>

using namespace std;


typedef struct elem { int key; elem *next; } *pelem;
typedef struct stack { pelem start; } *pstack;

void push(pstack s, int n) {
	pelem p = s->start;
	s->start = (pelem)malloc(sizeof elem);
	s->start->key = n;
	s->start->next = p;
}

int pop(pstack s) {
	int n = -1;
	pelem p = s->start;
	if (p != NULL) {
		n = p->key;
		s->start = p->next;
		free(p);
	}
	return n;
}

int is_empty(pstack s) {
	return s->start == NULL;
}

pstack create_stack() {
	pstack t = (pstack)malloc(sizeof stack);
	memset(t, 0, sizeof stack);
	return t;
}

void selection_sort(pstack s) {
	pstack ret = create_stack();
	pstack temp = create_stack();
	while (!(s)) {
		int current = pop(s);
		while (!(s)) {
			int n = pop(s);
			if (n < current) {
				int swap = current;
				current = n;
				n = swap;
			}
			push(temp, n);
		}
		push(ret, current);
		s->start = temp->start;
		temp->start = NULL;
	}
	s->start = ret->start;
}

/* Funkcii za rabota s failove */

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

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

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

}

int main(){
	pstack s1 = create_stack();

	/* Osnovno menu na programata */
	cout << "MENU" << endl;
	cout << "[1] - Vavedi danni ot file ( inputf.txt )." << endl;
	cout << "[2] - Sortirane na steka." << endl;
	cout << "[3] - Zapishi deka v file ( outputf.txt )." << endl;
	cout << "[4] - Izvejdane na sadyrjanieto na vhodqshtia file." << endl;
	cout << "[5] - Izvejdane na sadyrjanieto na izhodnia file." << endl;
	cout << "[0] - Izhod ot programata." << endl;
	char chc;
	while (true){
		cout << "Vavedi operacia -> ";
		cin >> chc;
		switch (chc)
		{
		case '0':
		{
			exit(0);
			break;
		}
		case '1':
		{
			file_input();
			break;
		}

		case '2':
		{
			pstack s1 = create_stack();
			selection_sort(s1);

			break;
		}
		case '3':
		{
			file_output();
			break;
		}
		case '4':
		{
			display_file(1);
			break;
		}
		case '5':
		{
			display_file(2);
			break;
		}

		default: cout << "Greshen izbor" << endl;
		}
		cout << endl;
	}
	return 1;
}
 

Back
Горе