Ir para conteúdo
Fórum Script Brasil
  • 0

Crie um algoritmo que leia um arquivo texto e exiba e ordem alfabetica


ana10

Pergunta

Ola boa noite! 

 

preciso de um algoritmo que leia um arquivo texto e exiba na tela todos os caracteres do arquivo em ordem alfabetica, ate a parte que abre e lê  arquivo eu consegui não consigo ordenar em ordem alfabética alguém pode ajudar???

#include <stdio.h>
main()
{
FILE *arquivo;
char c;
char nome [41];
// Pergunta o nome do arquivo
printf ("Nome do arquivo: ");
scanf (" %40[^\n]",nome);
// Abre o arquivo para leitura
arquivo = fopen (nome, "r");
// Lê caracteres até o fim do arquivo

}
// Fecha o arquivo
fclose (arquivo);
}


falta eu conseguir exibir em ordem alfabética ordem alfabética. 

 

 

 

Editado por ana10
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
8 horas atrás, rickayron disse:

Olá ana, o que você pediu ainda não ficou muito claro pra min, vamos lá.

Nesse arquivo vai ter o que? (espaço, ponto e virgula) ou terá somente carácter alfanuméricos).

se o que estiver no arquivo for caracter alfanuméricos basta criar um vetor e ordená-lo.

Somente letras. 

alguma dica de por onde começar o vetor? 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 19/10/2016 at 01:34, rickayron disse:

Olá ana, o que você pediu ainda não ficou muito claro pra min, vamos lá.

Nesse arquivo vai ter o que? (espaço, ponto e virgula) ou terá somente carácter alfanuméricos).

se o que estiver no arquivo for caracter alfanuméricos basta criar um vetor e ordená-lo.

Somente letras. 

alguma dica de por onde começar o vetor? 

#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
main()
{
FILE *arquivo;
char c;
char nome [41];
char letras[]="abcdefghijklmnopqrstuvwxyz";
int contador,x,y;
char frase[30];
char frase_v[30];

// Pergunta o nome do arquivo
printf ("Nome do arquivo: ");
scanf (" %40[^\n]",nome);
// Abre o arquivo para leitura
arquivo = fopen (nome, "r");
// Lê caracteres até o fim do arquivo
contador=0;
    for (x=0;x<=strlen(frase);x++)
     
    frase_v[++contador]=0;
while(c != EOF){
printf("%c", c);
for(x=0;x<=strlen(frase_v);x++) cout << frase_v[x];
c = getc(arquivo);
}

// Fecha o arquivo
fclose (arquivo);
}

 

Editado por ana10
Link para o comentário
Compartilhar em outros sites

  • 0

Ana, vamos imaginar o seguinte cenário, tudo que está no são letras e números ou quebra de linha.

Para esse cenário vamos propor como solução o seguinte algorítimo.

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

/******************************************************
*Essa função conta o número de caracteres que existe
*em um arquivo.
*@param char nome do arquivo
*@return inteiro.
************************************************/
int contaNumeroCaracterArquivo(char arquivo[]){
	FILE *arq=fopen(arquivo, "r");
	char caracter;
	int n=0;
	if(arq==NULL){
		return -1;
	}
	while( (caracter=fgetc(arq)) != EOF){
		if(caracter!='\n'){
			n++;
		}
	}
	fclose(arq);
	return n;
}

/******************************************************
*Famoso algoritimo de ordenação insert sort,
*sua perfomance na maioria das vezes é ridicula,
*mas serve muito bem para o proposito desse código.
*@param char vetor de caracteres que seram ordenados.
*@param int tamanho do vetor, ou melhor número de elementos do vetor.
@return nada.
***********************************************/
void insertionSort(char vetor[], int tamanho){
	int i, j;
	char temp;
	for(i=1; i<tamanho; i++){
		j=i;
		while(j>0 && vetor[j-1]>vetor[j]){
			temp=vetor[j];
			vetor[j]=vetor[j-1];
			vetor[j-1]=temp;
			j--;
		}
	}
}
   
   
int main(){
	char arquivo[]="texto.txt"; //nome do arquivo que será lido.
	int numeroCaracter=contaNumeroCaracterArquivo(arquivo); //conta o número de caracteres que existe no arquivo.
	FILE *arq=fopen("texto.txt", "r");
	if( arq==NULL){
		printf("Erro ao tentar abrir o arquivo.");
		return -1;
	}
	char caracter, vetor[numeroCaracter]; 
	int n=0;

	while( (caracter=fgetc(arq)) != EOF){
		if(caracter!='\n'){
			vetor[n++]=caracter;
		}
	}
	
	insertionSort(vetor, numeroCaracter);
	//imprimindo o  vetor.
	for(int i=0; i<numeroCaracter; i++){
		printf("%c ", vetor[i]);
	}
}

Ana, essa solução pode ser aprimorada em diversas frentes, mas o mais importante é observar o tamanho do arquivo, pois se existe muitos caracteres tipo 300 mil, 500 mil, ai é necessário utilizar ponteiros, pois creio que o sistema operacional vai s.o ou o compilador não vão liberar alocação de memoria de maneira simples.

Link para o comentário
Compartilhar em outros sites

  • 0
Em 19/10/2016 at 23:46, rickayron disse:

Ana, vamos imaginar o seguinte cenário, tudo que está no são letras e números ou quebra de linha.

Para esse cenário vamos propor como solução o seguinte algorítimo.


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

/******************************************************
*Essa função conta o número de caracteres que existe
*em um arquivo.
*@param char nome do arquivo
*@return inteiro.
************************************************/
int contaNumeroCaracterArquivo(char arquivo[]){
	FILE *arq=fopen(arquivo, "r");
	char caracter;
	int n=0;
	if(arq==NULL){
		return -1;
	}
	while( (caracter=fgetc(arq)) != EOF){
		if(caracter!='\n'){
			n++;
		}
	}
	fclose(arq);
	return n;
}

/******************************************************
*Famoso algoritimo de ordenação insert sort,
*sua perfomance na maioria das vezes é ridicula,
*mas serve muito bem para o proposito desse código.
*@param char vetor de caracteres que seram ordenados.
*@param int tamanho do vetor, ou melhor número de elementos do vetor.
@return nada.
***********************************************/
void insertionSort(char vetor[], int tamanho){
	int i, j;
	char temp;
	for(i=1; i<tamanho; i++){
		j=i;
		while(j>0 && vetor[j-1]>vetor[j]){
			temp=vetor[j];
			vetor[j]=vetor[j-1];
			vetor[j-1]=temp;
			j--;
		}
	}
}
   
   
int main(){
	char arquivo[]="texto.txt"; //nome do arquivo que será lido.
	int numeroCaracter=contaNumeroCaracterArquivo(arquivo); //conta o número de caracteres que existe no arquivo.
	FILE *arq=fopen("texto.txt", "r");
	if( arq==NULL){
		printf("Erro ao tentar abrir o arquivo.");
		return -1;
	
	
	insertionSort(vetor, numeroCaracter);
	//imprimindo o  vetor.
	for(int i=0; i<numeroCaracter; i++){
		printf("%c ", vetor[i]);
	}
}

Ana, essa solução pode ser aprimorada em diversas frentes, mas o mais importante é observar o tamanho do arquivo, pois se existe muitos caracteres tipo 300 mil, 500 mil, ai é necessário utilizar ponteiros, pois creio que o sistema operacional vai s.o ou o compilador não vão liberar alocação de memoria de maneira simples.

ok muito obrigado! No caso eu precisaria ta digitando o caminho do arquivo no computador,ao invés de defini-lo já no código.

tentei trocar mas só da erro ao ler.

 

nessa parte

int main(){
	char arquivo [40];
	// Pergunta o nome do arquivo
     printf ("Nome do arquivo: ");
      scanf (" %40[^\n]",arquivo);
	
	
	int numeroCaracter=contaNumeroCaracterArquivo(arquivo); //conta o número de caracteres que existe no arquivo.
   // Abre o arquivo para leitura
	FILE *arq=fopen(arquivo, "r");
		return -1;
	}

 

 

Editado por ana10
Link para o comentário
Compartilhar em outros sites

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

/******************************************************
*Essa função conta o número de caracteres que existe
*em um arquivo.
*@param char nome do arquivo
*@return inteiro.
************************************************/
int contaNumeroCaracterArquivo(char arquivo[]){
	FILE *arq=fopen(arquivo, "r");
	char caracter;
	int n=0;
	if(arq==NULL){
		return -1;
	}
	while( (caracter=fgetc(arq)) != EOF){
		if(caracter!='\n'){
			n++;
		}
	}
	fclose(arq);
	return n;
}

/******************************************************
*Famoso algoritimo de ordenação insert sort,
*sua perfomance na maioria das vezes é ridicula,
*mas serve muito bem para o proposito desse código.
*@param char vetor de caracteres que seram ordenados.
*@param int tamanho do vetor, ou melhor número de elementos do vetor.
@return nada.
***********************************************/
void insertionSort(char vetor[], int tamanho){
	int i, j;
	char temp;
	for(i=1; i<tamanho; i++){
		j=i;
		while(j>0 && vetor[j-1]>vetor[j]){
			temp=vetor[j];
			vetor[j]=vetor[j-1];
			vetor[j-1]=temp;
			j--;
		}
	}
}
   
   
int main(){
	char arquivo[40]; //="texto.txt"; //nome do arquivo que será lido.
	printf("Informe o nome do arquivo: \n");
	scanf("%s", arquivo);
	
	int numeroCaracter=contaNumeroCaracterArquivo(arquivo); //conta o número de caracteres que existe no arquivo.
	FILE *arq=fopen("texto.txt", "r");
	if( arq==NULL){
		printf("Erro ao tentar abrir o arquivo.");
		return -1;
	}
	char caracter, vetor[numeroCaracter]; 
	int n=0;

	while( (caracter=fgetc(arq)) != EOF){
		if(caracter!='\n'){
			vetor[n++]=caracter;
		}
	}
	
	insertionSort(vetor, numeroCaracter);
	//imprimindo o  vetor.
	for(int i=0; i<numeroCaracter; i++){
		printf("%c ", vetor[i]);
	}
}

Ana, no seu código acima deu erro porque no scanf a variável de saída é uma referência.

%s -> para receber uma string (ou vetor de char).

&variavel -> referencia (endereço de memória) da variável. (claro que no caso de vetor, ele já é uma referência por isso não precisa do operador &.

Você também poderia usar a função gets que faz a mesma coisa, porém mais simples e melhor.

até mais.

Editado por rickayron
correção ortográfica.
Link para o comentário
Compartilhar em outros sites

  • 0
Em 20/10/2016 at 11:10, rickayron disse:

Ana, no seu código acima deu erro porque no scanf a variável de saída é uma referência.

%s -> para receber uma string (ou vetor de char).

&variavel -> referencia (endereço de memória) da variável. (claro que no caso de vetor, ele já é uma referência por isso não precisa do operador &.

Você também poderia usar a função gets que faz a mesma coisa, porém mais simples e melhor.

até mais.

Ótima explicação!

e muito obrigado mesmo! fico grata pela sua disposição em ajudar! 

 

 

Editado por ana10
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...