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

Invertendo uma lista


arandoble

Pergunta

Preciso de ajuda para concertar esse algoritmo. O algoritmo abaixo inverte o nome EX.:

ENTRADA:

pedro

SAÍDA:

ordep

Porém preciso de um algoritmo que inverta um lista de tamanho qualquer ele lê um uma palavra em cada linha, do arquivo de entrada e escreve no arquivo de saída uma lista contendo os mesmos elementos porém na ordem inversa.

Exemplo de arquivo de Entrada

Maria

João

Carlos

Eva

Milton

Pedro

Jorge

Natália

Exemplo de arquivo de Saída

Natália

Jorge

Pedro

Milton

Eva

Carlos

João

Maria

#include <string.h>
int main()
{
   char string1[100], string2[100];
   int contador, i, j;
   int tam;
   
   printf("Digite a primeira string: ");
   scanf("%s", &string1);
   printf("\n\n");
   contador = 0;
   
   for (i=0; string1[i] != ''; i++) //for para descobrir o tamanho da string
    {   
     contador += 1;
     }
   
   j=contador-1;
    
    
   for (i=0; string1[i] != ''; i++) //for para inverter a string
     {
      string2[j] = string1[i];
      if (j == 0) break;
      j -= 1;
   }
   string2[contador]='';
   printf("A string invertida é: %s\n", string2);
   system("pause");
   return (0);
}

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
Olá arandoble,

Sua dúvida é sobre o uso das funções de manipulação de arquivos ou sobre a logica de como implementar o código?

Logica de como implementar o código.

Pois o algoritmo acima só faz inverter o nome ex.:

ENTRADA:

pedro

SAÍDA:

ordep

Preciso de um que inverta uma lista de nomes ex.:

Exemplo de arquivo de Entrada

Maria

João

Carlos

Eva

Milton

Pedro

Jorge

Natália

Exemplo de arquivo de Saída

Natália

Jorge

Pedro

Milton

Eva

Carlos

João

Maria

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, estuda esse código e se tiver dúvidas posta ai que a galera ajuda.

Abs


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

int main()
{
// cria os ponteiros para os arquivos
FILE *fpEntrada, *fpSaida;

// abre os arquivos de entrada e saida
fpEntrada = fopen("lista.txt", "r+t");
fpSaida = fopen("lista_inv.txt", "w+t");
if (fpEntrada == NULL || fpSaida == NULL)
return 1;

char buffer[256];
int n;
while (feof(fpEntrada) == 0)
{
n = 0;
if (fgets(buffer, 250, fpEntrada) != NULL)
{
// grava já invertido
while (buffer[n]) // anda pelo array até encontrar o terminar ''
{
// strlen devolve o numero de bytes numa string.
// Exemplo: strlen("João") devolve 5, mas tem que lembrar que um array em C começa em 0
fputc(buffer[(strlen(buffer)-1)-n], fpSaida);
n++;
}
}
}

fclose(fpEntrada);
fclose(fpSaida);

system("pause");
return (0);
}
[/codebox]

Link para o comentário
Compartilhar em outros sites

  • 0
Bom, estuda esse código e se tiver dúvidas posta ai que a galera ajuda.

Abs


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

int main()
{
// cria os ponteiros para os arquivos
FILE *fpEntrada, *fpSaida;

// abre os arquivos de entrada e saida
fpEntrada = fopen("lista.txt", "r+t");
fpSaida = fopen("lista_inv.txt", "w+t");
if (fpEntrada == NULL || fpSaida == NULL)
return 1;

char buffer[256];
int n;
while (feof(fpEntrada) == 0)
{
n = 0;
if (fgets(buffer, 250, fpEntrada) != NULL)
{
// grava já invertido
while (buffer[n]) // anda pelo array até encontrar o terminar ''
{
// strlen devolve o numero de bytes numa string.
// Exemplo: strlen("João") devolve 5, mas tem que lembrar que um array em C começa em 0
fputc(buffer[(strlen(buffer)-1)-n], fpSaida);
n++;
}
}
}

fclose(fpEntrada);
fclose(fpSaida);

system("pause");
return (0);
}
[/codebox]

"Porém preciso de um algoritmo que inverta um lista de tamanho qualquer ele lê um uma palavra em cada linha, do arquivo de entrada e escreve no arquivo de saída uma lista contendo os mesmos elementos porém na ordem inversa."

Nessa parte de cima eu disse que o algoritmo lê uma palavra do arquivo de entrada e etc, é porque o algoritmo envolve a parte de arquivo. Mas o que preciso é só do algoritmo que inverta a lista de nomes de entrada. É nessa parte que eu não estou conseguindo resolver, mas agradeço pelo seu código ele me ajudou em outras coisas.

Link para o comentário
Compartilhar em outros sites

  • 0

Ola existe uma função que você pode usar que é a strrev (que inverte string). não sei se ela faz parte do ANSI

mais você pode copiar ela para seu codigo e usala. não se esqueça se for declara depois do main de delarar o escopo dela.

da um olhada aê.

//PROGRAMA QUE INVERTE UMA  STRING USANDO A FUNÇÃO STRREV();
//ESCOPO = char *strrev(char *string);


#include <string.h>

char *strrev(char *string)
{
    char *original = string;
    char *frente = string;
    char temp;

    while(*string)
        string++;
    while(frente < string)
    {    
    temp = *(--string);
    *string = *frente;
    *frente++ = temp;
    }
    return (original);
}
pode usar tipo assim:
char name[100] = "joão";

   strrev(name);
   printf(name);

agora acho que o resto é tentar inverter depois de acordo com os nomes. talvez depois que encontrar um caracter '\n' mais ou menos.

se conseguir poste o resultado final. :closedeyes:

Link para o comentário
Compartilhar em outros sites

  • 0

Olá arandoble,

Acho que não estou entendendo o que você realmente precisa.

O codigo que eu postei faz a leitura do arquivo lista.txt independente da quantidade de linhas que ele possua e gera o lista_inv.txt com as palavras invertidas.

A funcao que o renatosantos17 postou faz a inversão que você deseja.

Mas, o que é a lista que você quer inverter?

Por exemplo, você inverter listas em memoria ou inverter linhas do arquivo usando a funcao Inverte()

Se você usar o exemplo que trata arquivos precisa ter uma arquivo chamado "lista.txt" com o conteudo para inversão.

O resultado será gravado no arquvo "lista_inv.txt"


// opcao 1 --------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *inverte(char *string)
{
static char temp[100];
int inc;
int dec = strlen(string)-1;

strcpy(temp, string);
for(inc = 0; inc < strlen(string); inc++, dec--)
temp[inc] = string[dec];
temp[inc] = 0;
return (temp);
}

void main(void)
{
char *nomes[ ] = {"pedro", "paulo", "anita", "rosana", "joao", 0};

int n = 0;
while(nomes[n])
{
printf("nome: %s\t%s\n", nomes[n], inverte(nomes[n]));
n++;
}
}
[/codebox]

[codebox]
/ opcao 2 --------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *inverte(char *string)
{
static char temp[100];
int inc;
int dec = strlen(string)-1;

strcpy(temp, string);
for(inc = 0; inc < strlen(string); inc++, dec--)
temp[inc] = string[dec];
temp[inc] = 0;
return (temp);
}

int main()
{
// cria os ponteiros para os arquivos
FILE *fpEntrada, *fpSaida;

// abre os arquivos de entrada e saida
fpEntrada = fopen("lista.txt", "r+t");
fpSaida = fopen("lista_inv.txt", "w+t");
if (fpEntrada == NULL || fpSaida == NULL)
return 1;

char buffer[256];
int n;
while (feof(fpEntrada) == 0)
{
n = 0;
if (fgets(buffer, 250, fpEntrada) != NULL)
{
// grava já invertido
fputs(inverte(buffer), fpSaida);
}
}

fclose(fpEntrada);
fclose(fpSaida);

system("pause");
return (0);
}

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

  • 0
Olá arandoble,

Acho que não estou entendendo o que você realmente precisa.

O codigo que eu postei faz a leitura do arquivo lista.txt independente da quantidade de linhas que ele possua e gera o lista_inv.txt com as palavras invertidas.

A funcao que o renatosantos17 postou faz a inversão que você deseja.

Mas, o que é a lista que você quer inverter?

Por exemplo, você inverter listas em memoria ou inverter linhas do arquivo usando a funcao Inverte()

Se você usar o exemplo que trata arquivos precisa ter uma arquivo chamado "lista.txt" com o conteudo para inversão.

O resultado será gravado no arquvo "lista_inv.txt"


// opcao 1 --------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *inverte(char *string)
{
static char temp[100];
int inc;
int dec = strlen(string)-1;

strcpy(temp, string);
for(inc = 0; inc < strlen(string); inc++, dec--)
temp[inc] = string[dec];
temp[inc] = 0;
return (temp);
}

void main(void)
{
char *nomes[ ] = {"pedro", "paulo", "anita", "rosana", "joao", 0};

int n = 0;
while(nomes[n])
{
printf("nome: %s\t%s\n", nomes[n], inverte(nomes[n]));
n++;
}
}
[/codebox]

[codebox]
/ opcao 2 --------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *inverte(char *string)
{
static char temp[100];
int inc;
int dec = strlen(string)-1;

strcpy(temp, string);
for(inc = 0; inc < strlen(string); inc++, dec--)
temp[inc] = string[dec];
temp[inc] = 0;
return (temp);
}

int main()
{
// cria os ponteiros para os arquivos
FILE *fpEntrada, *fpSaida;

// abre os arquivos de entrada e saida
fpEntrada = fopen("lista.txt", "r+t");
fpSaida = fopen("lista_inv.txt", "w+t");
if (fpEntrada == NULL || fpSaida == NULL)
return 1;

char buffer[256];
int n;
while (feof(fpEntrada) == 0)
{
n = 0;
if (fgets(buffer, 250, fpEntrada) != NULL)
{
// grava já invertido
fputs(inverte(buffer), fpSaida);
}
}

fclose(fpEntrada);
fclose(fpSaida);

system("pause");
return (0);
}

Agradeço a você e a todos pela a ajuda, conseguir resolver o problema. abaixo está como ficou o código.

#include "Arquivo.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
   
       FILE *entrada; 
       FILE *saida; 
    
       char abrirArquivoEntrada[80] = "L02Q02-entrada.txt";
       char abrirArquivoSaida[80] = "L02Q02-saida.txt";
       
       char **nomes, LDE[1000];
       int cont, maior=0, contstrig=0;

      if((entrada = fopen(abrirArquivoEntrada, "r")) == NULL){
          printf("Arquivo não encontrado...\n");
          system("PAUSE");
          return(1);
                                                               }
         else
       {  
         saida = fopen(abrirArquivoSaida, "w");

        while(fscanf(entrada, "%s", LDE)!= EOF){
             
             if(maior<(strlen(LDE)))
            {
              maior=strlen(LDE);
            }  
              contstrig++;
                                                }
        fclose(entrada);

        nomes = malloc(contstrig* maior* sizeof(char));
        for(cont=0; cont<contstrig; cont++){
            nomes[cont] = (char *)calloc(maior, sizeof(char));
                                            }
        cont=0;
        
        entrada = fopen(abrirArquivoEntrada, "r");
        while(fscanf(entrada, "%s", nomes[cont])!= EOF){
                                                        cont++;
                                                        }
        
        while(cont>0)
          {
             cont = cont-1;
             fprintf(saida, "%s\n", nomes[cont]);
           }
       }
    
    fclose(entrada);
    fclose(saida);
    
    printf("Sua saida:"); 
    print(nomeSaida);    
    
    compararSaidaResposta();
    
    system("PAUSE");
}

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...