Ir ao conteúdo

Posts recomendados

Postado
#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?

  • Obrigado 1
Postado

@Lucca Dias Bertolucci     você que ordenar todos dados da estrutura pelo identificador  ?  ,   e precisa ser com o MergeSort  ?  ,    e se puder ser outro você poderia fazer com o bubbleSort que é bem mais fácil de fazer , e outro ,mais fácil ainda seria esse ,  bem parecido  ,  que chamo de AnchorSort .  ,  

void anchorSort( empresas *vet )
{
  empresas *vet2,*aux;
  int p1, p2, tamanho, fim1=0, fim2=0;
  int tamanho = sizeof(vet),j,i;
  vet2 = new empresas[tamanho];
  if (vet2 != NULL)
  {
    for(int i=0; i < tamanho; i++)
    {
      for(int j=i+1; j < tamanho; j++)
      {
        if(vet[i].identificador > vet[j].identificador)  /// organiza em Ordem crescente
        {         
          aux    = vet[i];
          vet[i] = vet[j];
          vet[j] =    aux; 
        }
      } 
    }
  }
  delete[] vet2;
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!