Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

2 horas atrás, Weverson Meireles disse:

Eu não entendo como no seu sequer compila, no meu programa, compila e executa normalmente

 

Já passamos por isso e já te expliquei. Acho que nunca respondeu qual compilador usa. Na outra vez que discutimos isso te mostrei a saída usando os 3 compiladores comuns.

 

Estou com menos tempo agora. Eis o que o gcc diria sobre seu programa

 

wev.c:8:5: error: variably modified ‘vetor’ at file scope
    8 | int vetor[MAX];
      |     ^~~~~
wev.c: In function ‘main’:
wev.c:13:16: warning: unused variable ‘igual’ [-Wunused-variable]
   13 |  int i = 0, j, igual;
      |                ^~~~~
wev.c:13:13: warning: unused variable ‘j’ [-Wunused-variable]
   13 |  int i = 0, j, igual;
      |             ^
wev.c: In function ‘ler_do_arquivo’:
wev.c:85:7: warning: unused variable ‘num’ [-Wunused-variable]
   85 |  char num[20] = {};
      |       ^~~

 

Habilite todos os avisos. E não use nunca esse lance de declarar um vetor com um tamanho dado por uma variável. Não está de fato na linguagem e há razões para isso, embora iniciantes amem VLA, o nome disso, uma extensão não oficial da linguagem.

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

2 horas atrás, arfneto disse:

Acho que nunca respondeu qual compilador usa

 

Uso o programa Dev-c++ Linguagem em c 

 

Olha o que aparece pra mim quando eu compilo:

Compilation results...
--------
- Errors: 0
- Warnings: 0
- Output Filename: C:\Users\Cliente\OneDrive\Área de Trabalho\3 - A.exe
- Output Size: 131,1298828125 KiB
- Compilation Time: 6,23s

 

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

12 minutos atrás, Weverson Meireles disse:

Uso o programa Dev-c++ Linguagem em c 

 

 

Dev-C++ não é um compilador, é apenas um IDE, e pode usar qualquer compilador. No geral estará usando o gcc que é incluído em geral na distribuição do Dev-C++. Isso quer dizer que o compilador que está usando é esse: gcc

 

Acho que já te expliquei antes: habilite todas as mensagens de erro de seu compilador.

 

No caso do gcc use -Wall e use -std=c17 para usar a linguagem C atualizada.

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

5 minutos atrás, Weverson Meireles disse:

Não tem essa opção 

somente: C90 - C99 - C++ - C++11 e GNU

 

É como eu te disse. Esse compilador aceita essa opção a menos que seja uma versão de 10 anos atrás.

 

Que versão está usando?

 

PS C:\src\C\teste> gcc -Wall -std=c17 wev.c
wev.c:8:5: error: variably modified 'vetor' at file scope
    8 | int vetor[MAX];
l' [-Wunused-variable]
   13 |  int i = 0, j, igual;
      |                ^~~~~
wev.c:13:13: warning: unused variable 'j' [-Wunused-variable]
   13 |  int i = 0, j, igual;
      |             ^
wev.c: In function 'ler_do_arquivo':
wev.c:85:7: warning: unused variable 'num' [-Wunused-variable]        
   85 |  char num[20] = {};
      |       ^~~
PS C:\src\C\teste>

 

Nesse programa muito simples c99 não faz diferença, mas acho que dá para imaginar que algo evoluiu em C entre 1999 e 2017, no popular 18 anos

 

PS C:\src\C\teste> gcc -Wall -std=c99 wev.c
wev.c:8:5: error: variably modified 'vetor' at file scope
    8 | int vetor[MAX];
      |     ^~~~~
wev.c: In function 'main':
wev.c:13:16: warning: unused variable 'igual' [-Wunused-variable]     
   13 |  int i = 0, j, igual;
      |                ^~~~~
wev.c:13:13: warning: unused variable 'j' [-Wunused-variable]
   13 |  int i = 0, j, igual;
      |             ^
wev.c: In function 'ler_do_arquivo':
wev.c:85:7: warning: unused variable 'num' [-Wunused-variable]        
   85 |  char num[20] = {};
      |       ^~~

 

Como vê, seu programa dá os mesmo erros para as duas versões.

 

Rode gcc -v na sua máquina  no final vai ler algo assim

 

Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (Rev6, Built by MSYS2 project) 
PS C:\src\C\teste> 

 

Como pode ver na tabela essa versão é de julho de 2020. A atual é 11/2 de julho de 2021

 

 

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

1 hora atrás, arfneto disse:

Como pode ver na tabela essa versão é de julho de 2020. A atual é 11/2 de julho de 2021

Mesmo observando estes erros eu não tenho conhecimento necessário para corrigi-los 

 

E agora menos tempo ainda, vou ter que entregar o código assim, inacabado e com erros 

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

11 minutos atrás, Weverson Meireles disse:

Mesmo observando estes erros eu não tenho conhecimento necessário para corrigi-los 

?

 

Eu te mostrei a "correção"... E expliquei. 

Apenas declare o vetor com um tamanho conhecido em tempo de compilação, usando um define, e incialize um vetor com algo, usando { 0 } por exemplo e não { } que não é nada.

 

 

 

 

image.png

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

3 horas atrás, Weverson Meireles disse:

E agora menos tempo ainda, vou ter que entregar o código assim, inacabado e com erros 

Uma pena. Desde o dia 8. Podia ter aproveitado melhor as coisas que te foram passadas neste forum, por exemplo.

 

Essa função por exemplo foi copiada daquela mostrar() que te mostrei na semana passada

 

int ler(int V[], int n, const char* arquivo)
{
    // le ate n elementos a partir do 'arquivo'
    // em V[] e retorna o total ou -1 em caso de erro
    // grava n elementos do vetor no arquivo, c el. por linha
    FILE* ent = fopen(arquivo, "r");
    if (ent == NULL) return -1;
    int lidos = 0;
    int res   = 0;
    int val   = 0;
    // tenta ler os 'n' pedidos
    for (int i = 0; i < n; i += 1)
    {
        if ( (res = fscanf(ent, "%d", &val)) != 1)
        {   // não leu nada
            fclose(ent);
            if (lidos == 0) return -1;  // leu nada
            return lidos;
        };  // if()
        V[lidos] = val; // poe no vetor
        lidos += 1; // conta o cara
    };  // for()
    fclose(ent);
    return lidos;
}

 

Compare com as versões de ler() que postou

 

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;
}

 

e vai ver várias das coisas que te expliquei desde o dia 9.

 

E essa versão de salvar?

 

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

 

Dez dias depois de eu ter te mostrado que podia usar

 

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");
    fclose(arq);
    return 0;
};

 

Não consegui entender o caminho que você segue para resolver um problema ou para receber ajuda.

 

Link para o comentário
Compartilhar em outros sites

4 horas atrás, arfneto disse:
int ler(int V[], int n, const char* arquivo)
{
    // le ate n elementos a partir do 'arquivo'
    // em V[] e retorna o total ou -1 em caso de erro
    // grava n elementos do vetor no arquivo, c el. por linha
    FILE* ent = fopen(arquivo, "r");
    if (ent == NULL) return -1;
    int lidos = 0;
    int res   = 0;
    int val   = 0;
    // tenta ler os 'n' pedidos
    for (int i = 0; i < n; i += 1)
    {
        if ( (res = fscanf(ent, "%d", &val)) != 1)
        {   // não leu nada
            fclose(ent);
            if (lidos == 0) return -1;  // leu nada
            return lidos;
        };  // if()
        V[lidos] = val; // poe no vetor
        lidos += 1; // conta o cara
    };  // for()
    fclose(ent);
    return lidos;
}

Como eu poderia fazer a busca do vetor neste codigo? 

Link para o comentário
Compartilhar em outros sites

15 minutos atrás, Weverson Meireles disse:

Como eu poderia fazer a busca do vetor neste codigo?

 

Não faria sentido.

 

Essa função, chamada 
 

   int ler(int V[], int n, const char* arquivo); 

 

lê até n números inteiros do arquivo e carrega no vetor V na memória. Como o nome sugere.

 

Se o arquivo for esse exemplo que eu te mostrei no dia 10:

 

  1308   8096   4588   8328   9525   8877   3962   6997    740   9746
  9286    677   6582   6377   3149   9142   1505   7068    360   2491
  5695    672   2068   6063   6108   1631   9859   4603    221   3675
  8129   9017    483   9264   3690   1434    465   5465   2410   8966
  9178   6374    341   3762    287   4013   4040   1271    616   7374
  4767   4288   5040   4139   8057   1507   8150   2583   5305   1364
  4673   5438   9678   7735    307   4918   1285   9365   2626   1125
  4813   3424   2179   4291   9835    154   4359    753   4671    691
 

 

a função vai retornar com esses 80 valores no vetor. E vai retornar 80 para você poder controlar.

  • 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>
#define MAX 10 // 10000


int vetor[MAX];                          
int quickSort(int inicio, int final);
float ler_do_arquivo(char a[]);          /// prototipo das funcoes
int main(void)
{
	
	char nom[30] = "vet100.txt";
		
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (int i = 0; i < 10; i++) {
		printf("%d\n", vetor[i]);
	}
	puts("\nPos ordenacao\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);
}

float ler_do_arquivo(char nom[]) // acredito que tenha menos erros
{
    char num[20] = {0};
	FILE* arq = fopen(nom, "r");
	
	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;
}

 

Substitui a parte do ler que me mostrou mas apresentava outros erros que não consegui identificar, então deixei assim. Algum ponto a mais que poderia me passar para modificar ou poderia dar continuidade?

 

Deixei a busca binaria e sequencia estruturada mas não consigo chama-la para o vetor

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Weverson Meireles disse:

Deixei a busca binaria e sequencia estruturada mas não consigo chama-la para o vetor

	int valor, op;
			do { 
	printf("\nDigite um valor a ser buscado:\n");
	scanf("%d", &valor);
	printf("\n Resultado: %d\n", buscaBinaria(elemento, valor, 0, 9));
	
	printf("\n 0 - Sair\n 1 - Nova busca\n");
	scanf("%d", &op);
	
	}while(op != 0);
	return 0;

 

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

1 hora atrás, Weverson Meireles disse:
int vetor[MAX];   

 

Mais uma vez vou dizer pra você tirar isso. Não conseguiu habilitar os avisos do compilador? Isso não existe. Ao menos não na linguagem oficial. VLA é o nome disso. Declare um valor conhecido em tempo de compilação.

 

1 hora atrás, Weverson Meireles disse:
	ler_do_arquivo(nom);

 

??? Depois de todas as vezes que eu expliquei isso e agora depois de eu e mostrar uma função que faz isso você volta com isso de ler_do_arquivo e que retorna simplesmente um float, como se ler do arquivo pudesse dar 0.25 certo? ou 0.80 se der quase certo?

 

1 hora atrás, Weverson Meireles disse:

Substitui a parte do ler que me mostrou mas apresentava outros erros que não consegui identificar

 

Já pensou em perguntar objetivamente sobre esses "outros erros"?

 

1 hora atrás, Weverson Meireles disse:

Algum ponto a mais que poderia me passar para modificar ou poderia dar continuidade?

 

Há dias te "passo pontos" e você não parece entender ou incorporar... Talvez deva rever os mais de 80 posts anteriores

 

32 minutos atrás, Weverson Meireles disse:

Deixei a busca binaria e sequencia estruturada mas não consigo chama-la para o vetor

 

Que significa??

 

 

 

  • 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>
#define MAX 10 // 10000


int vetor[10];       
                   
int quickSort(int inicio, int final);
        /// prototipo das funcoes


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");
    fclose(arq);
    return 0;
};

int quickSort(int inicio, int final) // ordenação 
{
	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) { // Busca no vetor 
	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);
}
	int main (){
	
	puts("\nPos ordenacao\n");
	quickSort(0, MAX);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
		
	}
	
	//	int valor, op;
//			do { 
//	printf("\nDigite um valor a ser buscado:\n");
//	scanf("%d", &valor);
//	printf("\n Resultado: %d\n", buscaBinaria(elemento, valor, 0, 9));
	
//	printf("\n 0 - Sair\n 1 - Nova busca\n");
//	scanf("%d", &op);
	
//	}while(op != 0);
//	return 0;
}

int ler(int V[], int n, const char* arquivo)
{
    // le ate n elementos a partir do 'arquivo'
    // em V[] e retorna o total ou -1 em caso de erro
    // grava n elementos do vetor no arquivo, c el. por linha
    FILE* ent = fopen(arquivo, "r");
    if (ent == NULL) return -1;
    int lidos = 0;
    int res   = 0;
    int val   = 0;
    // tenta ler os 'n' pedidos
    for (int i = 0; i < n; i += 1)
    {
        if ( (res = fscanf(ent, "%d", &val)) != 1)
        {   // não leu nada
            fclose(ent);
            if (lidos == 0) return -1;  // leu nada
            return lidos;
        };  // if()
        V[lidos] = val; // poe no vetor
        lidos += 1; // conta o cara
    };  // for()
    fclose(ent);
    return lidos;
}

 

Não estou conseguindo inserir no codigo, acredito que deveria gravar, ler, ordenar e mostra-los. Estou perdido

2 horas atrás, arfneto disse:

Mais uma vez vou dizer pra você tirar isso. Não conseguiu habilitar os avisos do compilador? Isso não existe. Ao menos não na linguagem oficial. VLA é o nome disso. Declare um valor conhecido em tempo de compilação.

int vetor[10]; // isso?

 

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

11 minutos atrás, Weverson Meireles disse:

Não estou conseguindo inserir no codigo, acredito que deveria gravar, ler, ordenar e mostra-los. Estou perdido

 

Se depender apenas do que eu te mostrei tem essas funções

 

int ler(int[], int, const char*);
int gravar(int[], int, int, const char*);
int mostrar(int[], int, int, const char*);

 

e dá pra imaginar o que elas fazem.

 

E tem a tal Quicksort() que você vem postando há 10 dias.

 

E no seu código main() aparece como

 

int main ()
{
    puts("\nPos ordenacao\n");
    quickSort(0, MAX);
    for (int i = 0; i < MAX; i++)
    {
        printf("%i\n", vetor[i]);
    }
    //	int valor, op;
    //			do { 
    //	printf("\nDigite um valor a ser buscado:\n");
    //	scanf("%d", &valor);
    //	printf("\n Resultado: %d\n", buscaBinaria(elemento, valor, 0, 9));
        
    //	printf("\n 0 - Sair\n 1 - Nova busca\n");
    //	scanf("%d", &op);
        
    //	}while(op != 0);
    //	return 0;
}

 

Você já escreveu outros programas? Você mesmo, sem tentar recortar e colar?

 

Sequer está lendo um vetor ou mostrando. 

 

Pense no que te falei no dia 9:

  • deve gerar os dados para gravar no vetor
  • mostrar ao menos uma parte
  • ler o vetor de volta
  • mostrar ao menos uma parte
  • fazer as pesquisas
  • classificar o vetor
  • mostrar ao menos uma parte
  • fazer as pesquisas
  • mostrar os tempos

Ou não?

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

3 minutos atrás, arfneto disse:

Você já escreveu outros programas? Você mesmo, sem tentar recortar e colar?

 

Sim, e não consegui justamente ler e mostrar o vetor 

Eu usei o que me mandou em outras tentativas, mas não faziam a função deles por erro meu 

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

14 minutos atrás, Weverson Meireles disse:

Sim, e não consegui justamente ler e mostrar o vetor 

 

Há uma boa probabilidade que

 

18 minutos atrás, arfneto disse:
int ler(int[], int, const char*);
int gravar(int[], int, int, const char*);
int mostrar(int[], int, int, const char*);

 

por exemplos essas funções façam o indicado pelo nome delas. Eu até te mostrei o resultado.

 

15 minutos atrás, Weverson Meireles disse:

Eu usei o que me mandou em outras tentativas, mas não faziam a função deles por erro meu 

 

Mas e agora? Que erros? Coo soube que não funcionava? Que fazer em cada caso?

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>
#define MAX 10 // 10000


int vetor[10];  // Não consegui habilitar todos os avisos para mostrar os erros que estavam acontecendo aqui          
int quickSort(int inicio, int final);
float ler_do_arquivo(char a[]);          /// prototipo das funcoes 


int quickSort(int inicio, int final) // ordenação 
{
	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) { // Busca no vetor 
	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);
}


int main(void)
{
	
	char nom[30] = "vet100.txt";
		
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (int i = 0; i < 10; i++) {
		printf("%d\n", vetor[i]);
	}
	puts("\nPos ordenacao\n");
	quickSort(0, MAX);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
		
	}
	//Não consegui chamar a recursividade para buscar o elemento na posição desejada, não consegui identificar o erro
	
//		int valor, op;
//			do { 
//	printf("\nDigite um valor a ser buscado:\n");
//	scanf("%d", &valor);
//	printf("\n Resultado: %d\n", buscaBinaria(elemento,  valor, 8, 90)); // erro elemento
	
//	printf("\n 0 - Sair\n 1 - Nova busca\n");
//	scanf("%d", &op);
	
//	}while(op != 0);
//	return 0;
}

float ler_do_arquivo(char nom[]) // acredito que tenha menos erros mas ainda apresenta alguns, algo do tipo 0.25 chance de dar certo 
{
    char num[20] = {0};
	FILE* arq = fopen(nom, "r");
	
	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;
}

 

Neste programa, é possível fazer a busca de um numero em tal posição e apresentar? se sim, como?

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Weverson Meireles disse:
ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo

 

Como será se você não passou o vetor para a função?

 

E porque acha que essa função, a mesma que eu te disse que retorna float e  tem uma lista de problemas que eu já expliquei 

 

float ler_do_arquivo(char nom[]) // acredito que tenha 
// menos erros mas ainda apresenta alguns, algo do tipo 0.25 chance de dar certo 
{
    char num[20] = {0};
	FILE* arq = fopen(nom, "r");
	
	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;
}

 

pode ser melhor que a simples solução que eu te mostrei funcionando 10 dias atrás ?

 

int ler(int V[], int n, const char* arquivo)
{
    // le ate n elementos a partir do 'arquivo'
    // em V[] e retorna o total ou -1 em caso de erro
    // grava n elementos do vetor no arquivo, c el. por linha
    FILE* ent = fopen(arquivo, "r");
    if (ent == NULL) return -1;
    int lidos = 0;
    int res   = 0;
    int val   = 0;
    // tenta ler os 'n' pedidos
    for (int i = 0; i < n; i += 1)
    {
        if ( (res = fscanf(ent, "%d", &val)) != 1)
        {   // não leu nada
            fclose(ent);
            if (lidos == 0) return -1;  // leu nada
            return lidos;
        };  // if()
        V[lidos] = val; // poe no vetor
        lidos += 1; // conta o cara
    };  // for()
    fclose(ent);
    return lidos;
}

 

 

Não, não é. 

 

E esse lance de 0.25 chance de dar certo era só uma piada poruqe o @devair1010 escrevei isso retornando nada menos que 2048.65535, quase 2049 :) 

 

1 hora atrás, Weverson Meireles disse:
//Não consegui chamar a recursividade para buscar o elemento
//na posição desejada, não consegui identificar o erro

 

 

O que seria "chamar a recursividade"?  Não há razão para usar recursão numa linear, onde você apenas olha um por para ver se é o que está procurando.

 

Esse o trecho que mostra o vetor na tela:

 

1 hora atrás, Weverson Meireles disse:
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
		
	}

 

Acha que está melhor assim do que usando o que te mostrei 10 dias atrás

 

int mostrar(int vetor[], int n, int c, const char* msg)
{  // mostra n elementos do vetor em c colunas na tela
    if (msg != NULL) printf("\n%s\n", msg);
    int col = 0;
    for (int i = 0; i < n; i += 1)
    {
        printf("%6i ", vetor[i]);
        col += 1;
        if (col == c)
        {
            printf("\n");
            col = 0;
        }
    };
    printf("\n");
    return n;
};

 

Não. Não está.

 

Sobre a busca

 

1 hora atrás, Weverson Meireles disse:
int buscaSequencial(int elemento) { // Busca no vetor 

 

1 hora atrás, Weverson Meireles disse:
int buscaSequencial(int elemento) { // Busca no vetor 

 

Acho que até imagina que vou dizer para você escrever o óbvio, copiando a lista de parâmetros das outras funções

 

    int busca_seq    (int elemento, int vetor[], int n); // 1 por 1

    int busca_seq_ord(int elemento, int vetor[], int n); // assume ordenado

    int quicksort    (int elemento, int vetor[]); // classifica o proprio vetor

 

É o normal quando se quer terminar logo:
 


int busca_seq    (int elemento, int vetor[], int n);
int busca_seq_ord(int elemento, int vetor[], int n);
int quicksort    (int elemento, int vetor[]);

    int ler(int[], int, const char*);
int gravar (int[], int, int, const char*);
int mostrar(int[], int, int, const char*);

 

 

 

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>
#define MAX 10 // 10000


int vetor[10];  // Não consegui habilitar todos os avisos para mostrar os erros que estavam acontecendo aqui          
int quickSort(int inicio, int final);
float ler_do_arquivo(char a[]);          /// prototipo das funcoes 


int quickSort(int inicio, int final) // ordenação 
{
	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) { // Busca no vetor 
	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);
}


int main(void)
{
	
	char nom[30] = "vet100.txt";
		
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (int i = 0; i < 10; i++) {
		printf("%d\n", vetor[i]);
	}
	puts("\nPos ordenacao\n");
	quickSort(0, MAX);
	
	int mostrar(int vetor[], int n, int c, const char* msg)
{  // mostra n elementos do vetor em c colunas na tela
    if (msg != NULL) printf("\n%s\n", msg);
    int col = 0;
    for (int i = 0; i < n; i += 1)
    {
        printf("%6i ", vetor[i]);
        col += 1;
        if (col == c)
        {
            printf("\n");
            col = 0;
        }
    };
    printf("\n");
    return n;
};
	}
	//Não consegui chamar a recursividade para buscar o elemento na posição desejada, não consegui identificar o erro
	
//		int valor, op;
//			do { 
//	printf("\nDigite um valor a ser buscado:\n");
//	scanf("%d", &valor);
//	printf("\n Resultado: %d\n", buscaBinaria(elemento,  valor, 8, 90)); // erro elemento
	
//	printf("\n 0 - Sair\n 1 - Nova busca\n");
//	scanf("%d", &op);
	
//	}while(op != 0);
//	return 0;
}

int ler(int V[], int n, const char* arquivo)
{
    // le ate n elementos a partir do 'arquivo'
    // em V[] e retorna o total ou -1 em caso de erro
    // grava n elementos do vetor no arquivo, c el. por linha
    FILE* ent = fopen(arquivo, "r");
    if (ent == NULL) return -1;
    int lidos = 0;
    int res   = 0;
    int val   = 0;
    // tenta ler os 'n' pedidos
    for (int i = 0; i < n; i += 1)
    {
        if ( (res = fscanf(ent, "%d", &val)) != 1)
        {   // não leu nada
            fclose(ent);
            if (lidos == 0) return -1;  // leu nada
            return lidos;
        };  // if()
        V[lidos] = val; // poe no vetor
        lidos += 1; // conta o cara
    };  // for()
    fclose(ent);
    return lidos;
}

 

Esta sendo difícil pra mim, mas não quero desistir porque quero aprender 

Link para o comentário
Compartilhar em outros sites

46 minutos atrás, Weverson Meireles disse:

Esta sendo difícil pra mim, mas não quero desistir porque quero aprender 

 

O que está fazendo para aprender? Eu tento te ajudar há dias e você sequer consegue fazer uma pergunta objetiva sobre o que está lendo.

 

Veja agora:

 

Simplesmente copiou duas funções, ler() e mostrar() para o meio de sua função main()

 

E nem se deu ao trabalho de tirar a chamada a  ler_do_arquivo() que não está mais no código.

 

Você rodou algum dos programas que eu e mostrei?

 

Você habilitou no compilador as mensagens de erro?

 

Um programa é uma série precisa de instruções. Não pode simplesmente ir copiando coisas.

 

Isso que postou é o programa como está agora?

 

 

 

 

 

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

45 minutos atrás, arfneto disse:

Você rodou algum dos programas que eu e mostrei?

Sim e percebi o que elas fazem 

 

46 minutos atrás, arfneto disse:

Você habilitou no compilador as mensagens de erro?

Não consegui habilitar todos

 

46 minutos atrás, arfneto disse:

Isso que postou é o programa como está agora?

 

Isso mesmo

 

e tirei a chamada ler_do_arquivo()

 

12 minutos atrás, Weverson Meireles disse:

Sim e percebi o que elas fazem 

achei que o mais apropriado seria usar ate o feof. 

Mas teve erros em outras estruturas em que não consegui sair 

Meu tempo expirou. Acabei enviando com os erros 

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

11 minutos atrás, Weverson Meireles disse:

Não consegui habilitar todos

 

O que você fez? Como fez? Assim não vai progredir. Objetivamente o que fez? Qual a versão de seu compilador? Qual a versão de Dev-C++?

 

12 minutos atrás, Weverson Meireles disse:

Isso mesmo

 

e tirei a chamada ler_do_arquivo()

 

 

Então já não é mais o que mostrou.

 

E sabe que nunca ia compilar como estava. Então não compila ainda?

 

 

EXEMPLO

 

Estou perdendo a paciência com isso. após quase 100 mensagens, embora sejam de fato incrementais e não deem assim trabalho, mas o fato é que dificilmente vão ajudar mais alguém enterradas em um volume assim grande de texto. Virou um chat e parece que tampouco está te ajudando porque você continua aparentemente apenas recortando texto sem um plano.

 

O programa abaixo mostra

 

os primeiros 80, 15 por linha
  1308   8096   4588   8328   9525   8877   3962   6997    740   9746   9286    677   6582   6377   3149
  9142   1505   7068    360   2491   5695    672   2068   6063   6108   1631   9859   4603    221   3675
  8129   9017    483   9264   3690   1434    465   5465   2410   8966   9178   6374    341   3762    287
  4013   4040   1271    616   7374   4767   4288   5040   4139   8057   1507   8150   2583   5305   1364
  4673   5438   9678   7735    307   4918   1285   9365   2626   1125   4813   3424   2179   4291   9835
   154   4359    753   4671    691

gravando "num.txt" com o vetor inteiro
"num.txt" gravado ok!

lendo "num.txt" de volta em outro vetor
"num.txt": lidos 10000 valores

os primeiros 80 do vetor lido
  1308   8096   4588   8328   9525   8877   3962   6997    740   9746
  9286    677   6582   6377   3149   9142   1505   7068    360   2491
  5695    672   2068   6063   6108   1631   9859   4603    221   3675
  8129   9017    483   9264   3690   1434    465   5465   2410   8966
  9178   6374    341   3762    287   4013   4040   1271    616   7374
  4767   4288   5040   4139   8057   1507   8150   2583   5305   1364
  4673   5438   9678   7735    307   4918   1285   9365   2626   1125
  4813   3424   2179   4291   9835    154   4359    753   4671    691

 

E é o programa que te mostrei acho que no dia 9.

 

No entanto ele cria o arquivo com 10.000 elementos, lê de volta e mostra os primeiros 80 nos dois casos, usando a mesma função. 

 

Sugiro que rode e tente entender isso. Ou desista desse programa.

 

É preciso ter um método, um plano. E algum foco. Isso é minha opinião apenas, claro. 

 

Sobre a permutação dos caras, eu já postei vários programas sobre isso e te mostrei até o link para uma explicação detalhada e com o programa e a saída. De todo modo me lembrei desse post 

 

 

que explica mais uma vez como fazer isso. Em C.

 

Sobre os tempos também postei um programa recentemente que compara os tempos para diferentes coisas, e é o que falta no seu programa.

 

 

 

27 minutos atrás, Weverson Meireles disse:

achei que o mais apropriado seria usar ate o feof. 

Mas teve erros em outras estruturas em que não consegui sair 

 

Que significa?

  • Obrigado 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>
#define MAX 10000
                        // 
int vetor[10000];  // Não consegui habilitar todos os avisos para mostrar os erros que estavam acontecendo aqui          
int quickSort(int inicio, int final);
void ler_do_arquivo(char a[]);          /// prototipo das funcoes 


int contaInstrBusca =0;

int quickSort(int inicio, int final) // ordenação 
{
	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) { // Busca no vetor 
	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);
}


int main(void)
{
	
	char nom[30] = "vet100.txt";
		
	ler_do_arquivo(nom);
	///  preencher();  o vetor será preenchido com numeros do arquivo
	for (int i = 0; i < 10; i++) {
		printf("%d\n", vetor[i]);
	}
	
	getchar();
	puts("\nPos ordenacao\n");
	quickSort(0, MAX);
	for (int i = 0; i < MAX; i++)
	{
		printf("%i\n", vetor[i]);
		
	}
	
	
	getchar();
	//Não consegui chamar a recursividade para buscar o elemento na posição desejada, não consegui identificar o erro
	
//		int valor, op;
//			do { 
//	printf("\nDigite um valor a ser buscado:\n");
//	scanf("%d", &valor);
//	printf("\n Resultado: %d\n", buscaBinaria(elemento,  valor, 8, 90)); // erro elemento
	
//	printf("\n 0 - Sair\n 1 - Nova busca\n");
//	scanf("%d", &op);
	
//	}while(op != 0);
//	return 0;
}

void ler_do_arquivo(char nom[]) // acredito que tenha menos erros mas ainda apresenta alguns, algo do tipo 0.25 chance de dar certo 
{
    char num[20] = {0};
	FILE* arq = fopen(nom, "r");
	
	int i = 0;
	arq = fopen(nom, "r");
	if (!arq)
	return;
	
	while(!feof(arq)) {
		char linha[40];
		fgets(linha, 40, arq);
		
		vetor[i++]=atoi(linha);
	}
		

	fclose(arq); 
}

 

Este foi meu ultimo programa. Acredito que agora falta eu fazer a comparação, criei um int contaInstrBusca =0; 

Como eu poderia montar a estrutura de comparação?

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

@Weverson Meireles  Nem sei o que dizer

 

Leu a mensagem #98?

 

Não pode estar falando sério.

 

Voltou aquela função 

 

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

 

Sumiram as outras.

 

O que tem em mente? Está me testando? Leu os links adicionais aqui do forum que te mostrei acima? O que concluiu a partir da mensagem que te mandei?

 

Rodou aquele programa em sua máquina???

 

  • Obrigado 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!