Ir para conteúdo
Fórum Script Brasil
  • 0

mergesort não está funcionando.


lucca.bertolucci

Pergunta

#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>


using namespace std;

struct empresas;
int redimensiona();
void incluir();
void excluir();
int listar();
void alterar();
void mergesort();
void merge(empresas *vet, int inicio, int meio, int fim);

struct empresas{
	int identificador;
	string nome;
	int anocriacao;
	string porte;
	string areanegocio;
};

void mergesort(empresas *vet, int inicio, int fim){// codigo inspirado no v�deo https://www.youtube.com/watch?v=RZbg5oT5Fgw e em https://www.youtube.com/watch?v=5prE6Mz8Vh0
	int meio;
	if (inicio < fim){
		meio = floor((inicio + fim)/2);
		mergesort(vet, inicio, meio);
		mergesort(vet, meio+1, fim);
		merge(vet, inicio, meio, fim);
	}
	
}

void merge(empresas *vet, int inicio, int meio, int fim){
	empresas *vet2;
	int p1, p2, tamanho, fim1=0, fim2=0;
	tamanho = fim - inicio+1;
	p1 = inicio;
	p2 = meio + 1;
	vet2 = new empresas[tamanho];
	if (vet2 != NULL){
		for(int i=0; i < tamanho; i++){
			if(!fim1 && !fim2){
				if(vet[p1].identificador < vet[p2].identificador){
					vet2[i] = vet[p1];
					p1++;}
				else{
					vet2[i] = vet[p2];
					p2++;}
				if (p1 > meio)
					fim1=1;
				if (p2 > fim)
					fim2= 1;
			}
			else{
				if(!fim1){
					vet2[i] = vet[p1];
					p1++;}
				else{
					vet2[i] = vet[p2];
					p2++;}
			}				
				
		}
		
		for(int j= 0; j<tamanho; j++){
			vet[inicio] = vet2[j];
			inicio++;}
	}
	delete[] vet2;
	
	}

empresas* redimensiona(empresas *dados,int &tam){///////arrumar;
	int aux;
	aux = tam * 0.2;
	tam = tam + aux;
	empresas *novo = new empresas[tam];
	
	memcpy(novo, dados, (sizeof(empresas) * tam));
	delete [] dados;
	return novo;
}

void incluir(empresas *vet,int &tamanho, int &preenchido, int &i){
	int op=1;
	while (op != 2){
		cout << "Aperte (1) para incluir \n" << "Aperte (2) para voltar para o menu \n";
		cin >> op;
		system("clear||cls");
		
		if (op == 1){
			int j=0;
			
			if (preenchido+1 < tamanho){
					cout << "identificador da empresa (numero):  \n";
					cin >> vet[i].identificador;
					system("clear||cls");
					cout << "Nome da Empresa: \n";
					cin.ignore();
					getline(cin, vet[i].nome);
					system("clear||cls");
					cout << "Ano de Criacao: \n";
					cin >> vet[i].anocriacao;
					system("clear||cls");
					cout << "Porte da Empresa: \n";
					cin.ignore();
					getline(cin, vet[i].porte);
					system("clear||cls");
					cout << "Area do Negocio: \n";
					cin.ignore();
					getline(cin, vet[i].areanegocio);
					system("clear||cls");	
					preenchido++;
			}
			else{
				while((j < tamanho) and (vet[j].identificador != -1)){
					j++;}
				if(j < tamanho){
					cout << "identificador da empresa (numero):  \n";
					cin >> vet[j].identificador;
					system("clear||cls");
					cout << "Nome da Empresa: \n";
					cin.ignore();
					getline(cin, vet[j].nome);
					system("clear||cls");
					cout << "Ano de Criacao: \n";
					cin >> vet[j].anocriacao;
					system("clear||cls");
					cout << "Porte da Empresa: \n";
					cin.ignore();
					getline(cin, vet[j].porte);
					system("clear||cls");
					cout << "Area do Negocio: \n";
					cin.ignore();
					getline(cin, vet[j].areanegocio);
					system("clear||cls");
					}
				else{
					vet = redimensiona(vet, tamanho); //vetor recebe o valor redimensionado
					cout << "identificador da empresa (numero):  \n";
					cin >> vet[i].identificador;
					system("clear||cls");
					cout << "Nome da Empresa: \n";
					cin.ignore();
					getline(cin, vet[i].nome);
					system("clear||cls");
					cout << "Ano de Criacao: \n";
					cin >> vet[i].anocriacao;
					system("clear||cls");
					cout << "Porte da Empresa: \n";
					cin.ignore();
					getline(cin, vet[i].porte);
					system("clear||cls");
					cout << "Area do Negocio: \n";
					cin.ignore();
					getline(cin, vet[i].areanegocio);
					system("clear||cls");
					preenchido++;
				}
				}
			i++;
			} 
			}
		}
			
void excluir(empresas *vet, int tamanho, int preenchido){
	int identificador;
	int i=0, j=0, k=-1;
	cout << "Digite o identificador que voce deseja excluir: \n";
	while ((i < tamanho) and (k < preenchido)){
		if (vet[i].identificador != -1){
			cout << vet[i].identificador << " " << vet[i].nome << endl;
		}
		i++;
		k++;
		
	}
	cin >> identificador;
	while (j < tamanho){
		if (vet[j].identificador == identificador)
			vet[j].identificador = -1;
			j++;
	}
	
}

int listar(empresas *vet, int ocupado){
	int i=0, k=-1, j=0;
	while (k < ocupado){
		if(vet[i].identificador == -1){
			k++;
			i++;
	}
		else{
			cout << "Identificador: " << vet[i].identificador << endl << "Nome da Empresa: " << vet[i].nome << endl << "Ano de Criacao: " << vet[i].anocriacao << endl << "Area do Negocio: " << vet[i].areanegocio << endl << "Porte da Empresa: " << vet[i].porte << endl << "----------------------------------" << endl;
			k++;
			i++;
		}			
	}
	while (j != 2){
		cout << "Aperte 2 para voltar ao menu \n";
		cin >> j;
	}
	if (j == 2){
		return 7;
	}
}

void alterar(empresas *vet, int preenchido, int tamanho){
	int identificador, i=0, k=0, p=0, x=-1;// indices e identificador
	cout << "Digite o identificador que deseja alterar \n(Caso de identificadores iguais, sera alterado aquele que aparece mais ao topo): \n";
	while ((p < tamanho) and (x < preenchido)){
		if (vet[p].identificador != -1){
			cout << vet[p].identificador << " " << vet[p].nome << endl;
		}
		p++;
		x++;}
	cin >> identificador;
	while ((k < preenchido) and (vet[i].identificador != identificador)){
		i++;
		k++;
	}
	system("clear||cls");
	cout << "identificador da empresa (numero):  \n";
	cin >> vet[i].identificador;
	system("clear||cls");
	cout << "Nome da Empresa: \n";
	cin.ignore();
	getline(cin, vet[i].nome);
	system("clear||cls");
	cout << "Ano de Criacao: \n";
	cin >> vet[i].anocriacao;
	system("clear||cls");
	cout << "Porte da Empresa: \n";
	cin.ignore();
	getline(cin, vet[i].porte);
	system("clear||cls");
	cout << "Area do Negocio: \n";
	cin.ignore();
	getline(cin, vet[i].areanegocio);
	system("clear||cls");
}

int main(){
	int opcao = 7, tam = 5, aux, indice = 0, inicio;
	int preenchido = -1;
	empresas *vetor = new empresas[tam];
	while(opcao != 6){
		system("clear||cls"); // para limpar a tela em tanto em windows quanto em linux
		cout << "Digite uma opcao:" << endl << "incluir (1)" << endl << "excluir (2)" << endl << "listar (3)" << endl << "alterar (4)" << endl << "ordenar (5)" << endl << "sair (6)" << endl;
		cin >> opcao;
		system("clear||cls"); // para limpar a tela em tanto em windows quanto em linux
		
		if (opcao == 1){
			incluir(vetor, tam, preenchido, indice); 
			opcao = 7;
			}
		
		if (opcao == 2){
			excluir(vetor, tam, preenchido);
			opcao = 7;
		}	
		
		if (opcao == 3){
			opcao = listar(vetor, preenchido);
			
		}
		
		if (opcao == 4){
			alterar(vetor, preenchido, tam);
			opcao = 7;	
		}	
		
		if (opcao == 5){
			inicio = 0;
			mergesort(vetor, inicio, preenchido);	
		}
		
		}

	}

Meu grupo chegou até aqui, todas as funções funcionam, menos a ordenação.
Alguém pode nos dar uma luz?

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...