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

palíndromo, sem a biblioteca string.h


Alessa Toledo

Pergunta

Preciso fazer um programa para dizer se a palavra e palindroma ou não, sem usar a biblioteca string.h, cheguei até esse ponto e não está dando certo, e gostaria de saber se tem como arrumar e como eu faço isso.

 

//Palindromo teste 6
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 250
#define MAX_SIZE_WORD 16 

void entrada(char metade1[], char metade2[]){

int main(){
    int c;
    int i;    
    int flag;
    char str[MAX_SIZE];
    char entrada[100];    
    char invertida[100];
    char metade1[50];
    char metade2[50];
    int tam=0;
    int tamcalc=0;
    int metade=0;
 
    

    /*================================================*/
    /*User Input                     */
    /*================================================*/    
    flag = 0;

    do
    {
        scanf ("%50[^\n]", str);         
        while ((c = getchar()) != '\n' && c != EOF){}

/*int tam = 0
char palavras[100]

while(palavras[tam] != '\0')
  tam++;
*/
        //checar se a string possui menos doq 15 caracteres    
        if(str[16]){    
        int i = 0;
        while (str[i] != '\0')
        {
            i++;
        }
        printf("%d\n", i);
        return 0;
            // se a string apenas possui letras maisculuas e minusculas
            {
            int i, tam;
                // 'A'-->65, 'Z'-->90, 'a'-->97, 'z'-->122
            for(i=0; i<tam; i++) {
            if ( (str[i]>=65 && str[i]<=90) ||
            (str[i]>=97 && str[i]<=122));    
            }
            flag = 1;
            str[i]='\0'; // finalização da String
            }
        }else 
        {
            printf("-1\n");
        }
    
/*    else
    {
        printf("-1\n");
    }
*/        
    } while (flag == 0);
//cálculo do palindromo
    tamcalc=tam; // Variavel para calculo da entrada espelhada
    metade=tam/2;// Variavel para calculo das metades

    for(int x=0;x<tam;x++){ //calculo inverter string entrada
        tamcalc--;
        invertida[x]=entrada[tamcalc];
    }
    invertida[tam]='\0';// Finaliza a string

    for(int x = 0; x<metade;x++){//Calculo para a primeira metade da string
        metade1[x]=entrada[x];
    }
    metade1[metade]='\0'; //Finaliza string primeira metade

    for(int x=0;x<metade;x++){ // calculos da segunda metade, essa sendo espelhada do final da string entrada
        metade2[x]=invertida[x];
    }
    metade2[metade]='\0'; //finaliza string metade2

    if(strcmp(metade1,metade2) == 0){ // logica para exibir resposta
        printf("e palindromo");
    }
    else
        printf("não e palindromo");
    
}    
    return 0;
}

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Olá

Considere que a palavra na entrada não tem acentos e que todos os caracteres já estão em CAIXA ALTA.

A entrada, nesse primeiro momento, ficará numa 'strings' definida durante sua declaração, assim pulamos a necessidade de digitá-la a todo instante da programação e com isso poupamos tempo na parte correspondente á verificação de palíndromo.

 

Para tirar a necessidade de usar a biblioteca string.h é preciso você mesmo definir as funções que existem na biblioteca, que você quer usar, mas que não pode.

 

#1

5 horas atrás, Alessa Toledo disse:

void entrada(char metade1[], char metade2[])

Já foi dito que essa ficará por último para agilizar a programação.

 

#2

5 horas atrás, Alessa Toledo disse:

//checar se a string possui menos doq 15 caracteres    
        if(str[16]){    
        int i = 0;
        while (str[i] != '\0')
        {
            i++;
        }
        printf("%d\n", i);

Foi dito que inicialmente que a palavra já está definida durante sua declaração e com dados ideais objetivando focar mais na parte crítica do problema: verificação de palíndromo.

 

#3

5 horas atrás, Alessa Toledo disse:

for(int x = 0; x<metade;x++){//Calculo para a primeira metade da string
        metade1[x]=entrada[x];
    }

Essa etapa não é essencial para solução, que começou a propósito muito bem, foi possível ler sua intenção e acredito que a melhor opção é continuar com a lógica que demostrou no início do código.

 

alessa_toleto.c

#include"stdio.h"
#define DEBUG (1)
int
main (void) {
  //suponha o resultado da entrada e tudo antes da verificacao
  char entrada[16] = { "AMAMA-AMAMA" };
  int tam = 11;
  

  //cálculo do palindromo
  int tamcalc = tam;            //variavel para calculo da entrada espelhada
  int metade = tam/2;           //variavel para calculo das metades
  char invertida [16] = { "" }; //lista de caracteres para entrada-invertida

  for (int x = 0;  x < tam;  ++x){ //calculo inverter string entrada
      tamcalc--;
      invertida[x] = entrada[tamcalc];
  }
  invertida[tam] = '\0';// Finaliza a string

#ifdef DEBUG
  /*
   * Se a lista entrada e invertida são escritas no prompt, tudo está bem!
   * Continue o programa após 'endif'
   */
  printf ("Original: %s\n", entrada);
  printf ("Invertida: %s\n\n", invertida);

 (void) metade;

#endif //teste de progresso: apague quando ñprecisar
  
  return 0;

[🙂] acredito que tem bom conhecimento da linguagem e vá resolve o exercício com mais tentativas.

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

  • 0

cheguei até aqui, mas não roda direito, qual seria o erro

//Palindromo teste 6
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 250
#define MAX_SIZE_WORD 16 

// protótipo de funcao
// colocadas antes da funcao main
int strcmp(char*,char*);        

int main(){
    int c;
    int i;    
    int flag;
    char str[MAX_SIZE];
    char entrada[100];    
    char invertida[100];
    char metade1[50];
    char metade2[50];
    int tam=0;
    int tamcalc=0;
    int metade=0;
    flag = 0;
 
printf("Entre com a palavra: ");    

    do
    {
        scanf ("%50[^\n]", str);         
        while ((c = getchar()) != '\n' && c != EOF){

//checar se a string possui menos doq 15 caracteres    
    if(i <= 16){
        int i = 0;
        char str[16];

        while(str[i] != '\0')
          i++;
    }
        return 0;
// se a string apenas possui letras maisculuas e minusculas
            {
            int i, tam;
                // 'A'-->65, 'Z'-->90, 'a'-->97, 'z'-->122
            for(i=0; i<tam; i++) {
            if ( (str[i]>=65 && str[i]<=90) ||
            (str[i]>=97 && str[i]<=122));    
            }
            str[i]='\0'; 
            flag = 0;
            }
        }
    if (i > 16){
        flag = -1;
        printf("-1\n");
    }
//cálculo do palindromo
    tamcalc=tam; // Variavel para calculo da entrada espelhada
    metade=tam/2;// Variavel para calculo das metades

//calculo inverter string entrada
    for(int x=0;x<tam;x++){ 
        tamcalc--;
        invertida[x]=entrada[tamcalc];
    }
    invertida[tam]='\0';

//Calculo para a primeira metade da string
    for(int x = 0; x<metade;x++){
        metade1[x]=entrada[x];
    }
    metade1[metade]='\0'; 

// calculos da segunda metade, essa sendo espelhada do final da string entrada
    for(int x=0;x<metade;x++){ 
        metade2[x]=invertida[x];
    }
    metade2[metade]='\0'; 

    if(strcmp(metade1,metade2) == 0){ // logica para exibir resposta
        printf("1");
    }
    if(strcmp(metade1,metade2) != 0){
        printf("0");
    }
    return 0;
            
    } while (flag == 0);
    
}    
int strcmp(char metade1[],char metade2[]) // essa funcao pode ser colocada depois da funcao main
{
    int i;
    for( i=0; metade1[i] != 0; i++)
    {
        if(metade1[i] != metade2[i])      // caract de uma dif da outra
            return 1;           // retorn 1
    }
    if(metade2[i] != 0)              // segunda string maior que a primeira
        return 1;               // retorna 1
    return 0;                   // são iguais retorna zero
}

Link para o comentário
Compartilhar em outros sites

  • 0

Olá!

Eu falei! É muita mais fácil e produtivo falar o que certou do que gastar minutos / horas concentrado no que errou. Além disso, visto que destaquei o que está certo tudo que sobrou está errado.

 

— A única porção de código com uma intenção/lógica visível é a rotina que faz cópia invertidamente da entrada, pois de tudo escreveu somente essa parte da lógica indica uma solução; comparar a cópia invertida com a entrada e se forem iguais é palíndromo.

 

[🙂] Ficou claro? 

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,4k
×
×
  • Criar Novo...