Ir ao conteúdo
  • Cadastre-se

C++ QuickSort - Ordenação dentro de arquivo


Posts recomendados

3 horas atrás, devair1010 disse:

eu não quis modificar o código   do    @Weverson Meireles   e apenas para ler do arquivo e inserir no vetor ,   e também a conversão de string para float  seria que se houver algum número decimal no arquivo vai converter ele também ,  e usando int  "%d"  , na  leitura  com fscanf está apresentando erro que não consegui descobrir o que é

 

Mas o código do autor sequer tinha essa função...

 

3 horas atrás, devair1010 disse:
float ler_do_arquivo(char nom[])
{

 

Sugiro rever essas coisas que eu listei. @devair1010

44 minutos atrás, Weverson Meireles disse:

Então realmente tem algum erro no código que não consegui identificar 

já pensou em postar o código e dizer qual o erro?

 

45 minutos atrás, Weverson Meireles disse:
10 horas atrás, arfneto disse:

seria ler o arquivo?

exato

 

Recomendo não usar essa função como está, pelas razões que eu expliquei. Procure algo no sentido de mostra() e gravar() como te mostrei e expliquei em detalhes. E se tem alguma dúvida faça o simples: pergunte.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int MAX = 10000;
int vetor[MAX];                          
int quickSort(int inicio, int final);
float ler_do_arquivo(char a[]);          /// prototipo das funcoes
int main(void)
{
	int i = 0, j, igual;
	char nom[30] = { "qq_coisa" };
	srand(time(NULL));
	printf("o nome do arquivo ");
	fgets(nom, sizeof(nom), stdin);
	nom[strlen(nom) - 1] = 0;
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (i = 0; i < 10000; i++)
	{
		printf("%d\n", vetor[i]);
	}
	puts("Pos ordenacao\n\n");
	quickSort(0, 10000);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
	}
}
int quickSort(int inicio, int final)
{
	int i, j, pivo, aux;
	i = inicio;
	j = final - 1;
	pivo = vetor[(inicio + final) / 2];
	while (i <= j) {
		while (vetor[i] < pivo && i < final)
		{
			i++;
		}
		while (vetor[j] > pivo && j > inicio)
		{
			j--;
		}
		if (i <= j)
		{
			aux = vetor[i];
			vetor[i] = vetor[j];
			vetor[j] = aux;
			i++;
			j--;
		}
	}
	if (j > inicio)
		quickSort(inicio, j + 1);
	if (i < final)
		quickSort(i, final);
	return 0;
}
float ler_do_arquivo(char nom[])
{
	FILE* arq;
	char num[20] = {};
	int i = -1;
	arq = fopen(nom, "r");
	if (!arq)return 4096.2048;
	while (fscanf(arq, "%s", num) != EOF)
	{
		vetor[++i] = atof(num);
		if (i > 10000) break; /// limite de qtd de numeros no vetor
		printf("%d ", vetor[i]);
	}
	printf("\n\n");
	fclose(arq);
	return 2048.65535;
}

 

Eu só alterei para 10000 aqui e no executar informei o arquivo com 10000 números a serem organizados

Já alterei o limite para maior do que se pede, para apresentar os números do arquivo e depois mostra-los ordenados, mas não aparecem todos os números. 

Não estou conseguindo identificar a causa de isso estar acontecendo no programa

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

25 minutos atrás, Weverson Meireles disse:

Eu só alterei para 10000 aqui e no executar informei o arquivo com 10000 números a serem organizados

Já alterei o limite para maior do que se pede, para apresentar os números do arquivo e depois mostra-los ordenados, mas não aparecem todos os números. 

Não estou conseguindo identificar a causa de isso estar acontecendo no programa

 

Imagino que tenha lido a parte em que eu expliquei uma série de problemas que essa função que agregou ao programa tem... Sugiro --- de novo --- não usar assim e escrever algo comum como as funções que te expliquei. E mostrei o resultado.

 

Como te expliquei outras vezes isso de ler o vetor é secundário para seu programa e está perdendo muito tempo com isso. Devia se concentrar em fazer algo mais positivo em direção à solução, como DE FATO escrever e chamar algo que faça a classificação, a busca no vetor ordenado ou não ordenado e definir de vez o algoritmo que vai usar para comparar os tempos de pesquisa nos 3 casos.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

como DE FATO escrever e chamar algo que faça a classificação, a busca no vetor ordenado ou não ordenado e definir de vez o algoritmo que vai usar para comparar os tempos de pesquisa nos 3 casos.

Não estou conseguindo dar uma diretriz para o programa, ainda não faço ideia de como fazer a comparação de tempo, não estou conseguindo sair do lugar, estou utilizando o pouco conhecimento que tenho para desenvolver esse programa que enviei e tenho até amanhã para entrega-lo. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 09/11/2021 às 10:23, arfneto disse:

As comparações não só fazem sentido como são o objetivo do enunciado, que pode não estar assim muito bem explicado...

 

A ideia é comparar os tempos de busca:

  • num vetor não ordenado, usando a busca sequencial. Note que são apenas 10.000 e os processadores hoje em dia com 3 níveis de cache são muito, mas muito rápidos mesmo ao fazer isso
  • num vetor ordenado usando a busca sequencial, que é diferente do caso do vetor não ordenado
  • num vetor ordenado usando busca binária, onde se tem um mínimo de comparações associado ao log2 do tamanho do vetor, mas tem o custo de ordenar o vetor. E, e se for um vetor que é alterado frequentemente, tem o custo dos deslocamentos para manter a ordem

 

6 minutos atrás, Weverson Meireles disse:

Não estou conseguindo dar uma diretriz para o programa, ainda não faço ideia de como fazer a comparação de tempo, não estou conseguindo sair do lugar, estou utilizando o pouco conhecimento que tenho para desenvolver esse programa que enviei e tenho até amanhã para entrega-lo

 

Acho que eu tinha razão no dia 9. 

 

A comparação de tempo devia ser a primeira "ideia", já que é o objetivo do programa

 

 

 

 

Em 08/11/2021 às 23:30, arfneto disse:

Não vai fazer isso no arquivo. Quicksort vai operar no vetor na memória. 

 

Apenas leia o arquivo e crie o vetor. Faça as buscas antes de ordenar e depois com a busca binária e marque os tempos. Como são poucos dados e isso é muito rápido cuidado com a unidade de tempo. Serão milissegundos apenas. 

 

Algo assim.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto    o compilador não mostra nenhuma msg de erro , mas mostra apenas essa janela de debug , e testando , vi que funciona até antes do while com fscanf  e aí encerra a execução ,  testei com arquivo sem extensão e com a extensão ".txt".  no visual studio também não descobri qual compilador está nesse IDE .

Link para o comentário
Compartilhar em outros sites

16 minutos atrás, arfneto disse:

A comparação de tempo devia ser a primeira "ideia", já que é o objetivo do programa

 

Como eu poderia fazer a comparação? 

 

int buscaSequencial(int elemento) {
	for (int i = 0; i < tamVetor; i++) {
		if (vetor[i] == elemento)
			return i;
	}
	return -1;
}
int buscaBinaria(int elemento, int limEsq, int limDir) {
	int meio = (limEsq + limDir)/2;
	if (vetor[meio] == elemento)
		return meio;
	
	if (limEsq >= limDir)
		return -1; // não encontrado
	
	else if (vetor[meio] < elemento)
		return buscaBinaria(elemento, meio+1, limDir);
	else
		return buscaBinaria(elemento, limEsq, meio-1);
}

 

Essa foi a busca que havia feito no programa

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

44 minutos atrás, devair1010 disse:

 o compilador não mostra nenhuma msg de erro , mas mostra apenas essa janela de debug , e testando , vi que funciona até antes do while com fscanf  e aí encerra a execução ,  testei com arquivo sem extensão e com a extensão ".txt".  no visual studio também não descobri qual compilador está nesse IDE

 

O compilar é sempre o MSVC no caso do Visual Studio

 

Qual o código?

36 minutos atrás, Weverson Meireles disse:

Como eu poderia fazer a comparação? 

 

Agora que explicou que tem uma permutação dos números de 1 até o tamanho do vetor o óbvio seria procurar por todos valores possíveis, na ordem, e marcar os tempos, certo?

 

Pensadndo em português, quando você procura algo procura por algo em algum lugar. Eu já expliquei isso um certo número de vezes nesse tópico e deixei exemplos, mas vou repetir:

 

o simples é: procurar algo em algum lugar: se acho devolve a posição se não achou devolve um valor negativo.

 

Parece complicado isso? É o mesmo caso de mostrar() gravar() ou ler_arquivo().

 

    int buscaSequencial(int elemento);

 

Devia ser, claro

 

    int busca_sequencial(int elemento, int* vetor, int n);

 

com a óbvia intenção de procurar 'elemento' em 'vetor' de 'n' elementos

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Weverson Meireles disse:
int buscaSequencial(int elemento) {
	for (int i = 0; i < tamVetor; i++) {
		if (vetor[i] == elemento)
			return i;
	}
	return -1;
}
int buscaBinaria(int elemento, int limEsq, int limDir) {
	int meio = (limEsq + limDir)/2;
	if (vetor[meio] == elemento)
		return meio;
	
	if (limEsq >= limDir)
		return -1; // não encontrado
	
	else if (vetor[meio] < elemento)
		return buscaBinaria(elemento, meio+1, limDir);
	else
		return buscaBinaria(elemento, limEsq, meio-1);
}

 

Este programa então faria a função da busca e comparação?

  • Amei 1
Link para o comentário
Compartilhar em outros sites

19 minutos atrás, Weverson Meireles disse:

Este programa então faria a função da busca e comparação?

Essa função que eu e disse para modificar? Não.

 

Apenas retorna a posição do item se está no vetor. No popular, busca sequencial quer dizer olha um por um até o fim. E no vetor ordenado no popular quer dizer: olha um por um até achar um maior que o que você procura

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Depois de alguns testes eu consegui perceber que o programa que criei anterior mente cria um arquivo com numeros em ordem aleatoria mas que se repetem. acredito que seja por isso que houve a confusão de achar que o programa não funcionou. 

 

Programa que cria um arquivo com 10000 aleatórios:

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int TAM = 10001;
int vet[TAM];

void preencher() {
	for (int i=1; i<TAM; i++) {
		vet[i] = rand() % 10001;
	}
}

void salvar() {
	FILE *arq = fopen("10000num.txt", "w");
	for (int i=1; i<TAM; i++) {
		fprintf(arq, "%i\n", vet[i]);
	}
	fclose(arq);
}


int main(void) {
	srand(time(NULL));
	
	preencher();
	
	for (int i=1; i<TAM; i++) {
		printf("%i\n", vet[i]);
	}
	
}

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

13 minutos atrás, Weverson Meireles disse:

Depois de alguns testes eu consegui perceber que o programa que criei anterior mente cria um arquivo com números em ordem aleatoria mas que se repetem. acredito que seja por isso que houve a confusão de achar que o programa não funcionou

Eu te disse. E também te disse como escrever. E te apontei um exemplo completo, coma descrição em português e o programa.

 

Para terminar o programa em dois dias mais você não pode perder tempo.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

8 minutos atrás, arfneto disse:

Eu te disse. E também te disse como escrever. E te apontei um exemplo completo, coma descrição em português e o programa.

 

Eu tentei usar no meu programa o que me passou, com gravar, mostrar, mas mesmo assim não deu certo

Poderia me mostrar no programa como ficaria?

pelo menos pra eu consegui enxergar e conseguir terminar, porque não estou conseguindo 

Olha o que fiz com o primeiro programa se puder por favor conferir se ainda existem muitos erros e apontar o que devo melhorar 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int TAM = 100;
int vet[TAM];


int main() {
	
	int j = 0;
    int i = 0;
    int igual = 0;
	
		srand(time(NULL));
		
	do{
		vet[i] = rand() % 10;
		igual = 0;
		for(j = 0; j < i; j++){
			if(vet[j] == vet[i])
			igual = 1;
		}
		
		if(igual == 0) 
		i++;
		
	}while(i < 10);
	
	for(i = 0; i < 10; i++){
		printf("\n%d", vet[i]);
	}
	
}

void salvar() {
	FILE *arq = fopen("vet100.txt", "w");
	for (int i=0; i<TAM; i++) {
		fprintf(arq, "%i\n", vet[i]);
	}
	fclose(arq);
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

37 minutos atrás, Weverson Meireles disse:

Eu tentei usar no meu programa o que me passou, com gravar, mostrar, mas mesmo assim não deu certo

Poderia me mostrar no programa como ficaria?

Foi exatamente o que eu fiz. Comas funções, o texto, os programas completos e a saída :( Não entendi

 

38 minutos atrás, Weverson Meireles disse:

Eu tentei usar no meu programa o que me passou, com gravar, mostrar, mas mesmo assim não deu certo

 

Onde está o programa que "não deu certo" apesar de você ter usado "o que eu te passei"?? Qual foi o problema? Qual a sua pergunta?

41 minutos atrás, Weverson Meireles disse:
void salvar() {
	FILE *arq = fopen("vet100.txt", "w");
	for (int i=0; i<TAM; i++) {
		fprintf(arq, "%i\n", vet[i]);
	}
	fclose(arq);
}

 

Você escreveu isso, uma função que retorna void e não tem um único argumento, sendo que no dia 10, uma semana atrás, eu te mostrei isso

 

int gravar(int vetor[], int n, int c, const char* arquivo) { 
    // grava n elementos do vetor no arquivo, c el. por linha
    FILE* arq = fopen(arquivo, "w");
    if (arq == NULL) return -1;
    int col = 0;
    for (int i = 0; i < n; i += 1) {
        fprintf(arq, "%6i ", vetor[i]);
        col += 1;
        if (col == c) {
            fprintf(arq, "\n");
            col = 0;
        }
    };
    fprintf(arq,"\n");
    return 0;
};

 

E te mostrei um programa e o resultado.

 

Porque está escrevendo uma semana depois uma função que sequer acessa o vetor ou o nome do arquivo?

 

46 minutos atrás, Weverson Meireles disse:
srand(time(NULL));
		

 

No mesmo dia 10 eu te disse isso, no tópico #8

 

Citação

O programa que você mostrou para criar o tal arquivo não está nada bom e sequer funciona. 

De todo modo, entenda que não precisa de um programa para gerar um arquivo com 10.000 números aleatórios entre 0 e 10.000, como o que mostrou.

 

Apenas NÃO use o ingênuo 
 

    srand(time(NULL));
 

Como parece ser automático nas escolas e livros. Use um valor conhecido e reproduzível. Assim pode sempre testar seu programa com os mesmos números e qualquer tamanho.

 

E está de volta no mesmo programa.

 

Não entendo a mecânica do seu trabalho. 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

16 minutos atrás, arfneto disse:

Onde está o programa que "não deu certo" apesar de você ter usado "o que eu te passei"?? Qual foi o problema? Qual a sua pergunta?

 

Eu consegui entender depois o que queria me passar. 

 

Agora o problema esta no programa que fez com que abrisse este tópico.  

Eu faço com que leia o arquivo com uma determinada quantidade de numero, por exemplo 10 números e ele lê e apresenta corretamente.

Apresenta o que contem no arquivo, o antes de modificar (mesma coisa que contem no arquivo) e depois a presenta os mesmos ordenados com quicksort. 

 

Não estou conseguindo encurtar o programa fazer com que so apresente eles ordenados.

É o mesmo programa que o colega mandou anteriormente. Acredito encurtando ele. se possa fazer o que quero e eu consiga termina-lo fazendo o que a questão me pede. 

 

este é o programa: 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int MAX = 10;
int vetor[MAX];                          
int quickSort(int inicio, int final);
float ler_do_arquivo(char a[]);          /// prototipo das funcoes
int main(void)
{
	int i = 0, j, igual;
	char nom[30] = { "qq_coisa" };
	srand(time(NULL));
	printf("o nome do arquivo ");
	fgets(nom, sizeof(nom), stdin);
	nom[strlen(nom) - 1] = 0;
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", vetor[i]);
	}
	puts("Pos ordenacao\n\n");
	quickSort(0, 10);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
	}
}
int quickSort(int inicio, int final)
{
	int i, j, pivo, aux;
	i = inicio;
	j = final - 1;
	pivo = vetor[(inicio + final) / 2];
	while (i <= j) {
		while (vetor[i] < pivo && i < final)
		{
			i++;
		}
		while (vetor[j] > pivo && j > inicio)
		{
			j--;
		}
		if (i <= j)
		{
			aux = vetor[i];
			vetor[i] = vetor[j];
			vetor[j] = aux;
			i++;
			j--;
		}
	}
	if (j > inicio)
		quickSort(inicio, j + 1);
	if (i < final)
		quickSort(i, final);
	return 0;
}
float ler_do_arquivo(char nom[])
{
	FILE* arq;
	char num[20] = {};
	int i = -1;
	arq = fopen(nom, "r");
	if (!arq)return 4096.2048;
	while (fscanf(arq, "%s", num) != EOF)
	{
		vetor[++i] = atof(num);
		if (i > 10) break; /// limite de qtd de numeros no vetor
		printf("%d ", vetor[i]);
	}
	printf("\n\n");
	fclose(arq);
	return 2048.65535;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

10 minutos atrás, Weverson Meireles disse:

Eu consegui entender depois o que queria me passar. 

 

Se conseguiu entender como pode uma semana depois voltar com uma função void sem argumentos para gravar os dados? E porque insiste em usar srand() do modo que eu já te disse 4 vezes que não se aplica aqui?

 

E porque está decidido a incorporar essa função com todos os problemas que eu disse que ela tem? 

 

12 minutos atrás, Weverson Meireles disse:
float ler_do_arquivo(char nom[])

 

qual o sentido, se eu te mostrei várias outras e expliquei o propósito? Onde está o endereço do vetor? Onde está o nome do arquivo? Qual o propósito de retornar float? pode retornar 0.25 para um quarto de certo? 0.5 para meio certo?

 

    return 2048.65535;

 

Ou retornar isso para quando der certo. Muito útil. Imagino seu instrutor tendo que dar uma nota para isso.

 

E leno os dados como texto, convertendo os dados para float para depois converter para int usando 3 conversões para cada elemento?  Vai ser muito boa sua nota imagino.

 

 

Não tenha ilusão de que vai conseguir montar um programa recortando e colando coisas que pegou de terceiros. Não vai. E mesmo que consiga vai descobrir que é mais fácil aprender. Ler o que te explicam e aprender. Nem sempre vai poder simplesmente enviar algo pronto para um endereço eletrônico. Pode ter que explicar e em 20 segundos seu professor --- ou pior, seu patrão --- vai saber que não escreveu aquilo...

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int MAX = 100;
int vetor[MAX];                          
int quickSort(int inicio, int final);
void ler_do_arquivo(char a[]);          /// prototipo das funcoes
int main(void)
{
	int i = 0, j, igual;
	char nom[30] = "vet100.txt";
		
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (i = 0; i < 10; i++) {
		printf("%d\n", vetor[i]);
	}
	puts("Pos ordenacao\n\n");
	quickSort(0, MAX);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
	}
}
int quickSort(int inicio, int final)
{
	int i, j, pivo, aux;
	i = inicio;
	j = final - 1;
	pivo = vetor[(inicio + final) / 2];
	while (i <= j) {
		while (vetor[i] < pivo && i < final)
		{
			i++;
		}
		while (vetor[j] > pivo && j > inicio)
		{
			j--;
		}
		if (i <= j)
		{
			aux = vetor[i];
			vetor[i] = vetor[j];
			vetor[j] = aux;
			i++;
			j--;
		}
	}
	if (j > inicio)
		quickSort(inicio, j + 1);
	if (i < final)
		quickSort(i, final);
	return 0;
}
void ler_do_arquivo(char nom[])
{
	FILE* arq;
	char num[20] = {};
	
	arq = fopen(nom, "r");
	if (arq == NULL) {
		printf("arquivo não encontrato");
		return;
	}
	
	int i=0; 
	while(!feof(arq)) {
		char linha[30];
		fgets(linha, 30, arq);
		vetor[i++]=atoi(linha);
	}
	printf("\n\n");
	fclose(arq);
}

 

Acredito que eu esteja no caminho

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int TAM = 100;
int vet[TAM];

// protótipos
int gerarNumero();
int existe(int num);
void salvar();
int random_number(int min_num, int max_num);

int main() {
	
	srand(time(NULL));
		
	for (int i=0;i<TAM; i++){
		vet[i] = -1;
	}
		
	for(int i=0;i<TAM;i++) {
		vet[i] = gerarNumero();
	}
	
	for(int i = 0; i < TAM; i++){
		printf("\n%d", vet[i]);
	}
	
	salvar();
}

int gerarNumero() {
	while(true) {
		int ranNum = random_number(1, TAM);
		if (existe(ranNum)==0)
		return ranNum;
	 }	
	
}

int random_number(int min_num, int max_num) {
    int result = 0, low_num = 0, hi_num = 0;
    if (min_num < max_num) {
        low_num = min_num;
        hi_num = max_num + 1; // include max_num in output
    } else {
        low_num = max_num + 1; // include max_num in output
        hi_num = min_num;
    }
    result = (rand() % (hi_num - low_num)) + low_num;
    return result;
}

int existe(int num) {
	for(int j = 0; j < TAM; j++){
		if(vet[j] == num)
		return 1;
	}
	return 0;
}

void salvar() {
	FILE *arq = fopen("vet100.txt", "w");
	for (int i=0; i<TAM; i++) {
		fprintf(arq, "%i\n", vet[i]);
	}
	fclose(arq);
}

 

E mexi no outro também de criar o arquivo

 

 

Só que agora quando mudo para 10000 números, não aparecem todos 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Weverson Meireles disse:
void ler_do_arquivo(char nom[])

 

Talvez eu deva desistir afinal

 

Onde está o vetor? Não sabe quanto vai ler do arquivo. Porque retornar void? Já te falei sobre isso várias vezes, Nesse tópico. :( 

 

Porque não faz o simples? Passa o endereço do vetor e o tamanho, e o nome do arquivo. Retorne o quanto conseguiu ler. 

 

Se lembra disso, de uma semana atrás:

image.thumb.png.9db5ac6784cddde1ae15caea077835ee.png

 

Acha que eu estava errado? Não estava. Acha que não era uma boa maneira de fazer? Era.

 

Eu te mostrei essas

 

int gravar(int vetor[], int n, int c, const char* arquivo){ 
    // grava n elementos do vetor no arquivo, c el. por linha

// ...

int gravar(int vetor[], int n, int c, const char* arquivo) { 
    // grava n elementos do vetor no arquivo, c el. por linha

// ...

 

Funcionando, com um programa de teste, o resultado e alguma discussão sobre as razões.

 

Não acha que o simples seria copiar isso e escrever

 

int ler( int vetor[], int n, const char* arquivo) { 
    // le do arquivo até n elementos e retorna quanto leu

 

Seria

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 minutos atrás, arfneto disse:

Não sabe quanto vai ler do arquivo.

 

Independente da quantidade coloquei o ''foef'' para identificar o final do arquivo. só que quando aumento a quantidade não apresenta tudo.  Acredito que com esse programa eu consiga realizar o que se pede

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Weverson Meireles disse:

Independente da quantidade coloquei o ''foef'' para identificar o final do arquivo. só que quando aumento a quantidade não apresenta tudo.  Acredito que com esse programa eu consiga realizar o que se pede

 

Você está perdendo oportunidades. Porque parece ignorar tudo o que te explico?

 

Leu o resto do post #68?

 

11 minutos atrás, arfneto disse:
int ler( int vetor[], int n, const char* arquivo) { 
    // le do arquivo até n elementos e retorna quanto leu

 

 

Consegue entender a razão disso????

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, arfneto disse:

Você está perdendo oportunidades. Porque parece ignorar tudo o que te explico?

 

Preciso entregar o trabalho, ainda vou querer aprender como se resolve e usar o que me apresentou. Mas pelo pouco tempo quero ao menos entregar algo

 

Por isso estou insistindo nesse programa.

 

Não estou ignorando, esta me ajudando muito

24 minutos atrás, arfneto disse:

Consegue entender a razão disso????

 

Consegue identificar o tamanho do vetor e ler até o ultimo!? 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

image.png.9c4ba53a5282e4ad965835ba5b29d916.png

 

Acho que não conseguiu...
 

image.png.093b664174eb15ffab1d09bb262ae318.png

 

 

A função recebe o endereço do vetor e o tamanho, e o nome do arquivo. São chamados argumentos, essas coisas entre os parenteses, e retorna o total que conseguiu ler, que se espera seja igual ao tamanho...

 

Compare com o que escreveu

 

void ler_do_arquivo(char nom[])

 

Ou o que tentou usar, que retorna um float :)

 

2 horas atrás, Weverson Meireles disse:
float ler_do_arquivo(char nom[])

 

 

16 minutos atrás, Weverson Meireles disse:

Preciso entregar o trabalho, ainda vou querer aprender como se resolve e usar o que me apresentou. Mas pelo pouco tempo quero ao menos entregar algo

 

Por isso estou insistindo nesse programa.

 

Trata-se de uma inversão de papéis: é o contrário do que você imagina. Se escrevesse o que te explico desde o dia 8 já teria terminado isso há muito tempo, ou ao menos teria aprendido algumas coisas mais. Coo insistiu nessa outra linha ainda não tem praticamente nada. Sequer classificou o vetor, leu o arquivo, testou a busca binária. concluiu as permutações no vetor...

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

41 minutos atrás, arfneto disse:

escrevesse o que te explico desde o dia 8 já teria terminado isso há muito tempo, ou ao menos teria aprendido algumas coisas mais.

 

Não consegui absorver o que tentou me passar

Achei que se continuasse com os programas que tenho, conseguiria

 

a minha ideia depois desse passo seria fazer a busca binaria.

 

int buscaSequencial(int elemento) {
	for (int i = 0; i < tamVetor; i++) {
		if (vetor[i] == elemento)
			return i;
	}
	return -1;
}
int buscaBinaria(int elemento, int limEsq, int limDir) {
	int meio = (limEsq + limDir)/2;
	if (vetor[meio] == elemento)
		return meio;
	
	if (limEsq >= limDir)
		return -1; // não encontrado
	
	else if (vetor[meio] < elemento)
		return buscaBinaria(elemento, meio+1, limDir);
	else
		return buscaBinaria(elemento, limEsq, meio-1);
}

 

17 minutos atrás, Weverson Meireles disse:

a minha ideia depois desse passo seria fazer a busca binaria.

Já que meu programa ainda não faz a busca sequencial e binaria 

Seria assim: 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

const int MAX = 10; //10000
int vetor[MAX];                          
int quickSort(int inicio, int final);
void ler_do_arquivo(char a[]);          /// prototipo das funcoes
int main(void)
{
	int i = 0, j, igual;
	char nom[30] = "vet100.txt";
		
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (i = 0; i < 10; i++) {
		printf("%d\n", vetor[i]);
	}
	puts("Pos ordenacao\n\n");
	quickSort(0, MAX);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
	}
}
int quickSort(int inicio, int final)
{
	int i, j, pivo, aux;
	i = inicio;
	j = final - 1;
	pivo = vetor[(inicio + final) / 2];
	while (i <= j) {
		while (vetor[i] < pivo && i < final)
		{
			i++;
		}
		while (vetor[j] > pivo && j > inicio)
		{
			j--;
		}
		if (i <= j)
		{
			aux = vetor[i];
			vetor[i] = vetor[j];
			vetor[j] = aux;
			i++;
			j--;
		}
	}
	if (j > inicio)
		quickSort(inicio, j + 1);
	if (i < final)
		quickSort(i, final);
	return 0;
}

int buscaSequencial(int elemento) {
	for (int i = 0; i < MAX; i++) {
		if (vetor[i] == elemento)
			return i;
	}
	return -1;
}

int buscaBinaria(int elemento, int limEsq, int limDir) {
	int meio = (limEsq + limDir)/2;
	if (vetor[meio] == elemento)
		return meio;
	
	if (limEsq >= limDir)
		return -1; // não encontrado
	
	else if (vetor[meio] < elemento)
		return buscaBinaria(elemento, meio+1, limDir);
	else
		return buscaBinaria(elemento, limEsq, meio-1);
}


void ler_do_arquivo(char nom[])
{
	FILE* arq;
	char num[20] = {};
	
	arq = fopen(nom, "r");
	if (arq == NULL) {
		printf("arquivo não encontrato");
		return;
	}
	
	int i=0; 
	while(!feof(arq)) {
		char linha[30];
		fgets(linha, 30, arq);
		vetor[i++]=atoi(linha);
	}
	printf("\n\n");
	fclose(arq);
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

35 minutos atrás, Weverson Meireles disse:

Não consegui absorver o que tentou me passar

Achei que se continuasse com os programas que tenho, conseguiria

 

a minha ideia depois desse passo seria fazer a busca binaria.

 

Não fez uma única pergunta objetiva. Apenas insistiu no seu caminho recortando trechos de código de outros. E continua dando voltas pelo problema. Já havia postado esse trecho de busca binária na semana passada. E o quicksort, que até onde eu vi nunca chamou. E nunca incorporou sequer as funções que mostram o vetor, lêem ou gravam o arquivo. 

 

E continua com

 

38 minutos atrás, Weverson Meireles disse:
void ler_do_arquivo(char nom[])

 

E com

 

43 minutos atrás, Weverson Meireles disse:
const int MAX = 10; //10000
int vetor[MAX];                          

 

Isso sequer compila. Use um #define

 

 

E nem isso

 

    FILE* arq;
    char  num[20] = {};

    arq = fopen(nom, "r");

 

Escreva o simples

 

    char  num[20] = {0};
    FILE* arq = fopen(nom, "r");

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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!