- Съставяне на динамично представен стек с целочислени данни, съдържащи се във външен файл.
- Сортиране на елементите в структурата по метод чрез сливане
- Намиране на минималният елемент, кратен на число въведено от клавиатурата с последващото му изтриване
- Запис на изходните резултати във външен файл
- Главна функция 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 { 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;
}