×
Ir ao conteúdo
  • Cadastre-se

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


Weverson Meireles

Posts recomendados

Estou com uma questão de organizar 10 mil números aleatórios que estão dentro de um arquivo e preciso utilizar o QuickSort.

Anexo com questão abaixo: 

 

 

 

 

Questao 3.png

Este é um exemplo de código que utilizei para organizar números de 0 a 9 dentro de um vetor:

 

#include <stdio.h>

int tamVetor = 10;
int vetor[] = {0,1,2,3,4,5,6,7,8,9};

void insertionSort() {

    for (int i = 1; i < tamVetor; i++) {
		int item = vetor[i];
		int j = i - 1;
		
		while ((j >= 0) && (vetor[j] > item)) {
			vetor[j + 1] = vetor[j];
			j--;
		}
		
		vetor[j + 1] = item;
	}
}
void selectionSort() { 
	int aux, min;
	for (int i = 0; i < (tamVetor-1); i++) {
		min = i;
		for (int j = (i+1); j < tamVetor; j++) {
			if(vetor[j] < vetor[min]) 
				min = j;
		}
		if (i != min) {
			aux = vetor[i];
			vetor[i] = vetor[min];
			vetor[min] = aux;
		}
	}
}
void bubbleSort(int posicao){ 
    if (posicao < 1)return; 
 
    for (int i=0; i< posicao; i++) {
        if (vetor[i] > vetor[i+1]) {
        	int temp = vetor[i];
		    vetor[i] = vetor[i+1];
		    vetor[i+1] = temp; 
		}
	}
    bubbleSort(posicao-1); 
}
void 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);
}
void heapSort(int n) {
   int i = n / 2, pai, filho, t;
   while(true) {
      if (i > 0) {
          i--;
          t = vetor[i];
      } else {
          n--;
          if (n <= 0) return;
          t = vetor[n];
          vetor[n] = vetor[0];
      }
      pai = i;
      filho = i * 2 + 1;
      while (filho < n) {
          if ((filho + 1 < n)  &&  (vetor[filho + 1] > vetor[filho]))
              filho++;
          if (vetor[filho] > t) {
             vetor[pai] = vetor[filho];
             pai = filho;
             filho = pai * 2 + 1;
          } else {
             break;
          }
      }
      vetor[pai] = t;
   }
}

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



int main(void) {

	for(int i=0; i< tamVetor; i++) {
		printf("%i\n", vetor[i]);
	}

	puts("Pos ordenacao\n\n");
    //insertionSort();
    //selectionSort();
    //bubbleSort(tamVetor-1);
    //quickSort(0, 9);
    heapSort(10);
	for(int i=0; i< tamVetor; i++) {
		printf("%i\n", vetor[i]);
	}
	
}

 

Peço que me auxiliem para que eu possa fazer com que organize os 10 mil números dentro do arquivo.

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

2 horas atrás, Weverson Meireles disse:

Peço que me auxiliem para que eu possa fazer com que organize os 10 mil números dentro do arquivo

 

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. 

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

Acho que você nem leu o código que você postou, tanto é que além do QuickSort, postou também o InsertionSort, o BubbleSort, o SelectionSort, etc.

 

Mas enfim, é só criar um for de 0 a 9999 ler cada número e armazenar num vetor global, fazer as buscas, depois chamar função QuickSort que você postou passando 0 e 9999 como argumentos e pronto o vetor vai ter ordenado e pode repetir as buscas novamente.

 

E as comparações de tempo não fazem sentido, porque a busca binária não funciona adequadamente se o vetor não estiver ordenado e a busca sequencial não se beneficia da ordenação.

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

10 horas atrás, JorgeGus disse:

E as comparações de tempo não fazem sentido, porque a busca binária não funciona adequadamente se o vetor não estiver ordenado e a busca sequencial não se beneficia da ordenação

 

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
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

11 horas atrás, JorgeGus disse:

Acho que você nem leu o código que você postou, tanto é que além do QuickSort, postou também o InsertionSort, o BubbleSort, o SelectionSort, etc.

Esse foi um exemplo de programa feito que eu encontrei 

11 horas atrás, 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

Isso que eu queria saber. 
 

ainda vou estruturar o código como acho que deve ser feito logo após envio a vocês para me darem ideia e me direcionarem se possível 

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

Peço desculpas pois não informei a vocês quanto a um pedido da questão, assim impossibilitando a ajuda. A questão pede para que eu: (Crie o programa com base no arquivo gerado pelo exercício 2, letra a).

 

Sendo o arquivo gerado:

 

#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]);
	}
	
	salvar();
	
}

 

Vendo programas relacionados a questão, cheguei a estrutura do QuickSorte. Mas não estou conseguindo relaciona-la ao que se pede. 

Estrutura QuickSorte:

 

int dividir (int vetor[], int esq, int dir){
	int aux;
	int cont = esq;
	
	for(int i = esq+1; i <= dir; i++){
		
		if(vetor[i] < vetor[esq]){
			cont++;
			aux = vetor[i];
			vetor[i] = vetor[cont];
			vetor[esq] = aux;
			
		}
		
	}
	aux = vetor[esq];
	vetor[esq] = vetor[cont];
	vetor[cont] = aux;
	
	return cont;
}

void quick(int vetor[], int esq, int dir){
	int pos;
	
	if(esq < dir){
	pos = dividir(vetor, esq, dir);
		quick(vetor, esq, pos-1);
		quick(vetor, pos+1, dir);
	}
}

 

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

Em 09/11/2021 às 00:00, JorgeGus disse:

Mas enfim, é só criar um for de 0 a 9999 ler cada número e armazenar num vetor global, fazer as buscas, depois chamar função QuickSort que você postou passando 0 e 9999 como argumentos e pronto o vetor vai ter ordenado e pode repetir as buscas novamente.

 

Acredito que seja assim:

 

int main(void){
	
	int contador;
	int armazenar[contador];
	
for (contador=0; contador <= 9999; contador++) {
		printf("%i\n", contador);
	}
	

}

 

Mas agora não estou conseguindo fazer as buscas chamar o QuickSort. 

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

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

 

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.

 

Isso que escreveu agora

 

int main(void){
	
	int contador;
	int armazenar[contador];
	
for (contador=0; contador <= 9999; contador++) {
		printf("%i\n", contador);
	}
	

}

 

também está errado e se estivesse certo nada faria exceto mostrar pouco úteis 10000 linhas na tela.

 

Você, pelo padrão da linguagem, precisa declarar um tamanho conhecido em tempo de compilação para o vetor. E você até sabe o tamanho. Porque não colocou lá afinal? Não são 10.000? Use.

 

18 horas atrás, Weverson Meireles disse:

(Crie o programa com base no arquivo gerado pelo exercício 2, letra a).

 

Poste os enunciados. É melhor para você e para quem quer te ajudar.

 

image.png.f80e881392cfb584f14c0c143ffd6f0a.png

 

 

Está claro que

  • tem que poder ler um arquivo. Isso não é importante e pode simplesmente gerar a mesma sequência a cada vez para os testes e quando estiver funcionando passar a ler os (mesmos) dados. Apenas chame srand() com um valor conhecido. É ingênuo usar time() nessa hora
  • também realizar a busca no vetor fora de ordem. Então pode programar isso antes e em separado. Faça sua vida mais simples ou vai acabar como todo mundo parece fazer, escrevendo um programa enorme interativo e um menu antes de testar sequer as partes. E vai levar uma época. Em separado.
  • escreva a busca sequencial no vetor ordenado, que é praticamente a mesma coisa que no vetor desordenado exceto pelo fato óbvio de que como o vetor está ordenado você não precisa olhar sempre o vetor todo
  • escreva a busca binária no vetor ordenado. Em separado.
  • Pense numa rotina de testes. Pode ser algo simples como fazer 1000 buscas no vetor pelos MESMOS números, claro, e comparar os tempos nas 3 situações. Em separado, depois de ter as 3 situações resolvidas

 

 

 

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

 

 

21 minutos atrás, arfneto disse:

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.

 

Aqui funciona pra mim, escreve no arquivo o que quero.

 

De todo modo, realmente não preciso de um programa para gerar o arquivo, acredito que preciso ler a sequencia que esta nele, ordena-lo com o QuickSorte e logo após, realizar a busca no vetor fora de ordem e comparar o resultado com busca no vetor ordenado com os algoritmos de busca sequencial e binária. 

 

 

 

 

 

22 minutos atrás, arfneto disse:

Poste os enunciados. É melhor para você e para quem quer te ajudar.

Repostando para organização.

 

Sendo o programa criado 2 - a:

#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]);
	}
	
	salvar();
	
}

 

25 minutos atrás, arfneto disse:

Poste os enunciados. É melhor para você e para quem quer te ajudar.

 

Questao 2-a.png

Questão 3.png

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

7 minutos atrás, Weverson Meireles disse:

Aqui funciona pra mim, escreve no arquivo o que quero.

 

 

Muito bom que funcione aí. Mas está fora do padrão da linguagem e o programa não está bom.: NUNCA use variáveis globais.

 

Eis o diz o gcc sobre seu código:
 

toninho$ gcc -c s0.c
s0.c:7:5: error: variably modified ‘vet’ at file scope
    7 | int vet[TAM];
      |     ^~~

 

Ou o compilador da Microsoft

 

C:\or2.c(7):\
  error C2057: expected constant expression
C:\or2.c(7):\
  error C2466: cannot allocate an array of constant size 0
C:\\or2.c(23):\
    warning C4244: 'function': conversion from 'time_t' to 'unsigned int', possible loss of data

 

O tamanho deve ser uma constante. E como eu te disse é ingênuo usar time(NULL) nessas horas. Você precisa de uma sequência reproduzível para os testes...

 

15 minutos atrás, Weverson Meireles disse:

QuickSorte

 

Quick Sort são as palavras que formam o nome do algoritmo. Em C pode usar qsort() para ir testando... É o quicksort.

 

 

 

 

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

11 minutos atrás, arfneto disse:

Muito bom que funcione aí. Mas está fora do padrão da linguagem e o programa não está bom.: NUNCA use variáveis globais.

 

Compreendo, gostaria de aprender para que possa entregar o exercício e aperfeiçoar para continuar nesse mundo. Ainda tenho muito que aprender. Estou tentando 

Pode me dar um exemplo de como ficaria para que eu tenha uma noção para iniciar o exercício corretamente?

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

19 minutos atrás, Weverson Meireles disse:

Compreendo, gostaria de aprender para que possa entregar o exercício e aperfeiçoar para continuar nesse mundo. Ainda tenho muito que aprender. Estou tentando

 

Por exemplo nos posts #4 e #8 eu te expliquei uma série de coisas. Você não fez uma única pergunta. E no #10 eu te mostrei os erros que os compiladores apontam para o programa que você disse que funciona, mas não fez de novo uma única pergunta.

 

Se você entendeu aquilo imagino que possa alterar seu programa de acordo. É isso? E se não entendeu porque não perguntou nada?

 

Estou tentando ajudar

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

2 minutos atrás, Weverson Meireles disse:

Eu não entendi como fazer aquele processo que me passou, não estou conseguindo associar ao programa. Essa é a minha dificuldade 

 

São vários processos. É o seu enunciado. 

 

E você não fez uma única pergunta. Como vai entender então?

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

2 minutos atrás, arfneto disse:

E você não fez uma única pergunta

Do inicio.

Para testes eu compreendi gerar adicionar valores dentro de um vetor e reorganiza-los. Mas a partir do momento, que eu leio o meu arquivo, com os valores dele, não tenho ideia de como inserir o programa para organiza-lo. Como faria isso? Você me deu um exemplo mas não consegui compreender

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

5 minutos atrás, Weverson Meireles disse:

Do inicio.

Para testes eu compreendi gerar adicionar valores dentro de um vetor e reorganiza-los. Mas a partir do momento, que eu leio o meu arquivo, com os valores dele, não tenho ideia de como inserir o programa para organiza-lo. Como faria isso? Você me deu um exemplo mas não consegui compreender

 

Não entendi.

 

Você não perguntou nada sobre nada do que eu te expliquei. Só disse 2x que não entendeu.

não entendi isso que escreveu: " leio o meu arquivo, com os valores dele, não tenho ideia de como inserir o programa para organiza-lo" quer dizer o que?

 

Ler o arquivo é parte do programa. Uma parte sem importância, como eu expliquei, já que o conteúdo do vetor é irrelevante para o que em que fazer. Apenas é uma maneira de colocar os dados no vetor e fazer os 3 testes de que fala seu enunciado.

 

Porque não faz ao menos 1?

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

3 minutos atrás, arfneto disse:

Porque não faz ao menos 1?

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

int main(void){

FILE *arq;

arq = fopen ("10000num.txt", "r");

if(arq == NULL){
    printf("não foi possível abrir o arquivo\n");
    getchar();
    exit(0);

}

int numeros[10001];

while (fgets(numeros, 10001, arq) != NULL){
    printf("%i", numeros);
    
}

fprintf(arq, "%i", numeros);

fclose(ar);
}

 

Não estou conseguindo ao menos ler o meu arquivo

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

Mais uma vez voltou a escrever um programa sem fazer qualquer pergunta.

 

Tem um plano para o que está escrevendo? O que esse programa deveria fazer? O que tem no arquivo? Como espera ler?

 

Faça o simples: digite o arquivo no IDE. E teste com ele. Você parece ainda não ter noção de causa e efeito do que escreve linha a linha no programa. Você precisa partir de algo conhecido...

 

Veja isso:

 

  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

 

Tem 80 números.

 

17 minutos atrás, Weverson Meireles disse:
int numeros[10001];

while (fgets(numeros, 10001, arq) != NULL){
    printf("%i", numeros);
    
}

 

 

Que significa isso?

 

Você tem um livro? Tem um manual? Usa linux? Seu IDE mostra as definições das funções? Quantos programas você já escreveu? 

 

    char *fgets(char *str, int n, FILE *stream);

 

fgets espera um char* no primeiro argumento. numeros é int[10001]. Acha que vai funcionar? Não vai.

 

E esse printf com %i vai mostrar quantos inteiros? 1. Só um. O primeiro.

 

E o arquivo de entrada? Se quer um arquivo texto deveria colocar e esperar umas quebras de linha ou vai ficar com uma linha só, BEM COMPRIDA com 10000 números.

 

E porque testar com 10.000 e não com 5 ou 20 caras apenas? 

 

 

 

 

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

7 minutos atrás, arfneto disse:

Tem um plano para o que está escrevendo? O que esse programa deveria fazer? O que tem no arquivo? Como espera ler?

Meu plano é ler o arquivo que possui 10000 números aleatórios. Esse programa deveria fazer somente a leitura e apresenta-los. 

 

 

10 minutos atrás, arfneto disse:

Você tem um livro? Tem um manual? Usa linux? Seu IDE mostra as definições das funções? Quantos programas você já escreveu? 

Possuo slides que mostram a estrutura de como se lê o arquivo somente, não utilizando um loop como preciso utilizar.

 

13 minutos atrás, arfneto disse:

E porque testar com 10.000 e não com 5 ou 20 caras apenas?

Por não possuir muito conhecimento da estrutura que tentei incrementa-los não estava conseguindo, Mas quis apresentar logo os 10000 que preciso pelo pouco tempo que me resta para aprender e apresentar a questão feita.

  

16 minutos atrás, arfneto disse:

fgets espera um char* no primeiro argumento. numeros é int[10001]. Acha que vai funcionar? Não vai.

Como poderia fazer com que lesse os números? Todos os 10000. 

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

2 minutos atrás, Weverson Meireles disse:

Por não possuir muito conhecimento da estrutura que tentei incrementa-los não estava conseguindo, Mas quis apresentar logo os 10000 que preciso pelo pouco tempo que me resta para aprender e apresentar a questão feita.

 

Usar 10000 ao invés de 30 só vai fazer você perder tempo, ao contrário do que imagina. Apresentar "logo" os 10000 não é o que quer. O que você quer é "apresentar algo agora"/ Para o programa não importa se são 10 ou 10000.

 

A questão envolve ao menos 3 questões fora o fato de criar o arquivo. Não precisa e não deve tentar resolver todos ao mesmo tempo. E eu já te disse que ler o vetor não faz diferença...

 

5 minutos atrás, Weverson Meireles disse:

Possuo slides que mostram a estrutura de como se lê o arquivo somente, não utilizando um loop como preciso utilizar.

 

Eu falo sobre um livro para ver os comandos, entender um pouco da linguagem. O IDE ou o manual do linux para mostrar sobre as funções que aparentemente não sabe usar, como fgets() e os loops.

 

man fgets no Linux por exemplo mostraria algo assim, talvez em portugues

 

FGETC(3)                                      Linux Programmer's Manual                                      FGETC(3)

NAME
       fgetc, fgets, getc, getchar, ungetc - input of characters and strings

SYNOPSIS
       #include <stdio.h>

       int fgetc(FILE *stream);

       char *fgets(char *s, int size, FILE *stream);

       int getc(FILE *stream);

       int getchar(void);

       int ungetc(int c, FILE *stream);

 

 

O programa que postou nem compila direito...

 

or3.c(16): warning C4133:
'function': incompatible types - from 'int [10001]' to 'char *'
or3.c(18): warning C4477:
'printf' : format string '%i' requires an argument of type 'int', but variadic argument 1 has type 'int *'
or3.c(18): warning C4313:
'printf': '%i' in format string conflicts with argument 1 of type 'int *'
or3.c(20): warning C4477:
'fprintf' : format string '%i' requires an argument of type 'int', but variadic argument 1 has type 'int *'
or3.c(20): warning C4313:
'fprintf': '%i' in format string conflicts with argument 1 of type 'int *'
or3.c(21): error C2065:
'ar': undeclared identifier
or3.c(21): warning C4047:
'function': 'FILE *' differs in levels of indirection from 'int'
or3.c(21): warning C4024:
'fclose': different types for formal and actual parameter 1

 

O que faz com esses errors? Acha que não são relevantes?  São.

Sugiro fazer o simples e considerar o arquivo que te mostrei, com os 80 números que pode reproduzir....

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

@Weverson Meireles você não responde a uma pergunta sequer, de todas que eu fiz. Por exemplo as últimas sobre o livro o linux e sobre o que fez com esses erros todos de compilação.

 

Claro, você escolhe seu caminho para aprender ou para escrever seus programas. Mas acho que nesse forum você tem uma oportunidade que pode usar melhor que esta usando (ou não usando)

 

veja esse programa

 

#define TAM 100

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

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

int main(void)
{
    int vet[TAM];
    srand(211110);
    for (int i = 0; i < TAM; i += 1) vet[i] = 1 + rand()%TAM;
    mostrar(vet, 80, 10, "os primeiros 80, 10 por linha");
    mostrar(vet, 20, 4, "os primeiros 20, 4 por linha");
    mostrar(vet, 18, 6, "os primeiros 18, 6 por linha");
    printf("\n\nmostrar() 80x8 sem um titulo:\n");
    mostrar(vet, 80, 8, NULL);
    return 0;
}


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

//https:// www.clubedohardware.com.br/topic/
//1572565-quicksort-ordena%C3%A7%C3%A3o-dentro-de-arquivo/

 

que mostra

 


os primeiros 20, 4 por linha
     8     96     88     28
    25     77     62     97
    40     46     86     77
    82     77     49     42
     5     68     60     91


os primeiros 18, 6 por linha
     8     96     88     28     25     77
    62     97     40     46     86     77
    82     77     49     42      5     68



mostrar() 80x8 sem um titulo:
     8     96     88     28     25     77     62     97
    40     46     86     77     82     77     49     42
     5     68     60     91     95     72     68     63
     8     31     59      3     21     75     29     17
    83     64     90     34     65     65     10     66
    78     74     41     62     87     13     40     71
    16     74     67     88     40     39     57      7
    50     83      5     64     73     38     78     35
     7     18     85     65     26     25     13     24
    79     91     35     54     59     53     71     91

 

E entenda esse programa e como é trivial mudar isso para gravar em disco de um jeito simples e legível para 10, 10.000 ou meio milhão de números.

 

 

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

5 horas atrás, arfneto disse:

Por exemplo as últimas sobre o livro o linux e sobre o que fez com esses erros todos de compilação.

Eu respondi la em cima que so possuo slides.

não utilizo um livro, nem linux. Não fiz nada em relação aos erros do programa pois levaria muito tempo para corrigi-los e seria melhor aprender a fazer outro do que ficar corrigindo. Mesmo não estando satisfeito e tendo em mente que se possa melhorar.  Pelo pouco tempo que tenho e como ele mostra o que preciso, estou tentando aproveita-lo para entregar o que se espera.  

5 horas atrás, arfneto disse:

Mas acho que nesse forum você tem uma oportunidade que pode usar melhor que esta usando (ou não usando)

Concordo, mas acredito que o tempo que estou tendo não é suficiente para absorver informações que estou recebendo aqui. Por isso muitas das vezes eu não consigo nem realizar uma pergunta por estar perdido as informações. 

5 horas atrás, arfneto disse:
#define TAM 100

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

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

int main(void)
{
    int vet[TAM];
    srand(211110);
    for (int i = 0; i < TAM; i += 1) vet[i] = 1 + rand()%TAM;
    mostrar(vet, 80, 10, "os primeiros 80, 10 por linha");
    mostrar(vet, 20, 4, "os primeiros 20, 4 por linha");
    mostrar(vet, 18, 6, "os primeiros 18, 6 por linha");
    printf("\n\nmostrar() 80x8 sem um titulo:\n");
    mostrar(vet, 80, 8, NULL);
    return 0;
}


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

//https:// www.clubedohardware.com.br/topic/
//1572565-quicksort-ordena%C3%A7%C3%A3o-dentro-de-arquivo/

Estarei olhando com calma o programa para entender 

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

6 minutos atrás, Weverson Meireles disse:

Não fiz nada em relação aos erros do programa pois levaria muito tempo para corrigi-los e seria melhor aprender a fazer outro do que ficar corrigindo

 

Acho que está errado. Devia corrigir e entender. Só vai perder tempo ignorando essas coisas, porque já podia ter um programa ok e porque pode muito bem cometer os exatos mesmos erros porque não corrigiu e talvez sequer tenha entendido o  que estava errado, na ânsia de seguir adiante.

 

O mesmo caso de achar que rodando com 10.000 números porque é o que tem no enunciado vai ganhar algum tempo, como disse. Acho que vai perder e está perdendo.

 

O mesmo caso de perder tempo com o vetor e a leitura, quando tem 4 itens mais complexos para entender e não tinha ainda feito nada a respeito.

 

Rodou o programa que te mostrei? Gravou o arquivo que te mostrei? Aí estaria ganhando algum tempo...

 

EXEMPLO 

 

 

Como te expliquei antes, note a diferença entre essas duas funções (copiadas claro uma da outra):
 

image.thumb.png.38b113c37a5ec983007159a8095666b3.png


Pois é, a da direita grava um arquivo, de 10, 10.000  ou 1 milhão de valores. 

 

    const char* arquivo = "num.txt";
    int res = gravar(vet,TAM,10,arquivo); // cria

 

 

 

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

9 horas atrás, arfneto disse:

Acho que está errado. Devia corrigir e entender. Só vai perder tempo ignorando essas coisas, porque já podia ter um programa ok e porque pode muito bem cometer os exatos mesmos erros porque não corrigiu e talvez sequer tenha entendido o  que estava errado, na ânsia de seguir adiante.

Tomei essa decisão por conta do tempo que tenho para entregar e ainda não terminei os outros. Se eu conseguir terminar os outros antes, com certeza irei mexer nele de novo, porque quero entender e aprender para não cometer os mesmos erros. 

9 horas atrás, arfneto disse:

O mesmo caso de perder tempo com o vetor e a leitura, quando tem 4 itens mais complexos para entender e não tinha ainda feito nada a respeito.

 

Agora enxergo que é verdade.

9 horas atrás, arfneto disse:

Rodou o programa que te mostrei? Gravou o arquivo que te mostrei? Aí estaria ganhando algum tempo...

Rodei sim, fiquei um tempo tentando entender. Agora entendi a questão do time que mencionou, para não usar e testar com números conhecidos  

9 horas atrás, arfneto disse:

Pois é, a da direita grava um arquivo, de 10, 10.000  ou 1 milhão de valores. 

Ainda estou comparando. Não ignorei

10 horas atrás, arfneto disse:

Pois é, a da direita grava um arquivo, de 10, 10.000  ou 1 milhão de valores. 

 

Consegui observar

Os primeiros 80.png

  • 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!