Buscar

Encontrar elemento pelo usuário por divisão e conquista a partir de arquivo txt.

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 999
//função cujo sua tarefa é abrir o arquivo
//prototicos das funções
int percorre(int v[], int tam, int valor);
int buscaord(int v[], int tam, int valor);
int divconq(int v[], int esquerda, int direita); 
 
int arquivo(int v[]){
	FILE *arq;
	int t, i;
	arq = fopen("arquivo.txt","r");
	
	if (arq == NULL) { // Sempre, sempre sempre teste se abriu mesmo
		fprintf(stderr, "Arquivo nao localizado\n");
		system ("pause");
	}
	else{
		for (i=0 ; i < MAX ; i++){
			fscanf(arq,"%d",&v[i]);
			if (feof(arq)) { /* Ops. Chegou ao final do arquivo antes do MAX! */
				break; // sai do laco sem incrementar o i
			}
		}
	t = i;
	fclose(arq);
	printf ("----- ** Encontrando valor inteiro no vetor ** -----\n\n");
	printf("\t\tArquivo com %d valores inteiros\n", t+1);
	return t;
	}
}
//corpo do programa
int main(){
	int v[MAX], tam, valor, pos,poso,a;
	tam = arquivo(v);
	
	printf("\n\n\tDigite o valor que deseja pesquisar: ");
	scanf("%d", &valor);
	
	poso = percorre (v,tam,valor);
	divconq(v,0,tam);
	pos = buscaord (v, tam, valor);
	
	if(pos == -1)
		printf("\n\t\t\t\tValor nao encontrado");
	else{
		printf("\t\t\t\tO valor %d esta na posicao %d ordenado\n", valor, pos + 1);
		printf("\t\t\t\tO valor %d esta na posicao %d desordenado", valor, poso);
	}
	printf ("\n\n");
	
	printf ("\nDeseja imprimir o vetor ordenado? [1 - para sim / 2 - para nao] ");
	scanf ("%d", &a);
	if (a == 1){
		for (int i = 0; i < tam; i++){
		printf("\tPosicao [%d] = %d\n", i+1, v[i]); // --------------- só ta imprimindo o ultimo dado do arquivo
		}
	}
		printf ("\n\n");
	printf ("\t\t\t				Trabalho de APA - Quest6\n\n");
}
//--------------------------funções
//Função de divisão e conquista (Ordenando Vetor)
int divconq(int v[], int esquerda, int direita){ 
 
 int i, j, x, y;
 i = esquerda;
 j = direita;
 x = v[(esquerda + direita) / 2];
	int cont;
	
 while(i <= j){
 while(v[i] < x && i < direita){
			i++;
 }
 while(v[j] > x && j > esquerda){
 j--;
 }
 if(i <= j){
 y = v[i];
 v[i] = v[j];
 v[j] = y;
 i++;
 j--;
 }
 }
 if(j > esquerda)
 {
 divconq(v, esquerda, j);
 }
 if(i < direita)
 {
 divconq(v, i, direita);
 }
}
int buscaord(int v[], int tam, int valor){
	
 int esq, meio, dir;
 esq = -1;
 dir = tam;
 
	while(esq < dir - 1){
 meio = (esq + dir) / 2;
 
	 if(v[meio] == valor)
	 	return meio;
 	 else if(v[meio] < valor)
 esq = meio;
 else
 dir = meio;
 }
 return -1;
};
//Função onde mostra a posição original do valor solicitado
int percorre(int v[], int tam, int valor){
	
 int cont=0, resultado = 0;
 while (valor != v[cont-1]){
		cont++;
		}
	resultado = cont;
	return resultado;
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais