Jump to content
Fórum Script Brasil
  • 0

Invertendo uma lista


arandoble

Question

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 to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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);
}

Edited by CPP
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...