Ir ao conteúdo

Posts recomendados

Postado

Como faço esse codigo funcional sem a biblioteca sting.h

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

  • Obrigado 1
Postado

@alessa.chagas     detectar se uma palavra é políndromo ou não é bem difíciL , pois existem fatores que não são exatos e dependem da interpretação , pois algumas tem qtd ímpar de caracteres outras par ,  algumas usam o caractere do meio em comum e outras não ,  e então precisa comparar os carateres da string ,  e para comparar caracteres , você não precisa usar a biblioteca string.h  ,  e como você postou no tópico de c++ esse seu código poderia ser nessa linguagem c++ , e mesmo nela  não precisaria dessa string.h nem da cstring  nem da string ou da strings.h ,  mas se você Quer usar a função strcmp sem nenhuma dessas bibliotecas , você pode criar essa função strcmp aí no seu código :

#include <stdio.h>
int strcmp(char*,char*);        // protótipo de funcao
                                // colocadas antes da funcao main
int main()
{
    char str[] = {"O decote V: veto cedo."}; // só conta letras e numeros
    int tam = 0;
    char st1[20];                 // primeira metade da palavra ou frase
    char st2[20];                 // segunda metade
    int i;
    while(str[tam] != 0)
    {
        if( str[tam] < 'a' || str[tam] < 'A' ||  // eliminar caract invalido
            str[tam] < '0' || str[tam] > '9' ||  // eliminar caract invalido
            str[tam] > 'z' || str[tam] > 'Z'  )  // eliminar caract invalido
        {
            for(i=tam; str[i] != 0; i++)         // vai do caract até o final da string
            {
                str[i] = str[i+1];               // puxar os caract para baixo
            }
            str[i - 1] = 0;                      // finaliza a string
        }
    }
    for(i=0; str[i] != 0; i++)
        tam++;                    // calcula o tamanho da string
    for(i=0 ; i<tam/2; i++)       // loop vai ate o meio
    {
        st1[i] = str[i];          // pega a primeira metade
        st2[i] = str[tam - i];    // pega a segunda  metade
    }
    st1[i] = 0;
    st2[i] = 0;
    if(strcmp(st1 , st2) == 1)    // compara as duas string's
        printf("não ");           // se não for polindromica
    printf("eh polindromo .\n");  // se for
    return 0;
}
int strcmp(char m1[],char m2[])   // essa funcao pode ser colocada depois da funcao main
{
    int i;
    for( i=0; m1[i] != 0; i++)
    {
        if(m1[i] != m2[i])        // caract de uma dif da outra
            return 1;             // retorna 1
    }
    if(m2[i] != 0)                // segunda string maior que a primeira
        return 1;                 // retorna 1
    return 0;                     // sao iguais retorna zero
}

 

  • Curtir 3
Postado

@alessa.chagas Se criar funções ficará bem mais fácil. Já que não pode usar nada de string.h, pode fazer uma função com a mesma característica da que achar necessária para o seu código. Uma para contar as letras seria útil, assim você pode passar a quantidade de caracteres como argumento para outra que testa se a palavra é um palindromo, p.ex,

int palindromo(const char *palavra, int n){
    for(int i = 0; i < n/2; i += 1){
        if(palavra[i] != palavra[n - i - 1]){
            return 0;
        }
    }
    return 1;
}

 

Como é só um exemplo não me preocupei se tem maiúsculas e minúsculas. Veja que o parâmetro int n espera o tamanho da palavra, assim fica simples testar a string.

  • Curtir 1
  • Obrigado 1
Postado

Esta dando erro nesta parte, tem como me falar onde estou errando

 

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

 

 

  • Obrigado 1
Postado

@alessa.chagas Está atribuindo valor a esse flag no teste das letras do alfabeto. Qual a necessidade disso?

 

E essa condicional está errada, veja que você colocou o ponto e vírgula no fim sem nenhum bloco ou comando referente a esse teste. E parece que fechou chaves onde não devia.

  • Curtir 1
  • Obrigado 1
Postado

seria para indicar se está correta a leitura do palindromo, pois não sai da parte que pede a palavra

na hora da compilação não da nenhum erro, porém não funciona corretamente

  • Obrigado 1
Postado

@alessa.chagas A parte que pede a palavra é do único scanf. Na linha seguinte a ele você fez um loop, não é esse o problema? Ele deve estar rodando indefinidamente... Mas você pode remover esse loop. Alguns usam um recuros parecido por causa daquela questão do buffer que faz o programa pular a linha da próxima entrada, mas o seu código só tem uma, então não precisa disso. Se ainda não conseguir resolver poste o seu código completo para melhor entendimento do problema.

  • Curtir 1
  • Obrigado 1
Postado

ao rodar programa ele não da continuação, acho eu que e nessa parte da flag, e não sei como arrumar, ele pede a palavra e escrevemos, porém o código não dá sequencia no restante que precisa fazer

 

 

//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; 
    metade=tam/2;

//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'; 

    for(int x=0;x<metade;x++){ 
        metade2[x]=invertida[x];
    }
    metade2[metade]='\0'; 

    if(strcmp(metade1,metade2) == 0){ 
        printf("1");
    }
    if(strcmp(metade1,metade2) != 0){
        printf("0");
    }
    return 0;
            
    } while (flag == 0);
    
}    
int strcmp(char metade1[],char metade2[]) 
{
    int i;
    for( i=0; metade1[i] != 0; i++)
    {
        if(metade1[i] != metade2[i])      
            return 1;           // retorn 1
    }
    if(metade2[i] != 0)            


        return 1;               
    return 0;                  

  • Obrigado 1
Postado

@alessa.chagas O seu código tem muitos problemas e algumas partes que estão lá sem um motivo claro (talvez se postar e enunciado ajude a entender...). Por exemplo, por que está verificando se a variável i é menor ou igual a 16? Você só declarou essa variável e não atribuiu nada. O mesmo vale para a variável tam, ela só foi iniciada com zero e nenhuma atribuição foi feita. E na parte em que tenta pegar a metade, só divide zero com 2. Seu código tem dois loops para pegar a metade da string, mas isso não é necessario. Se quer testar um palíndromo pode usar apenas um loop. Postei um exemplo assim. Tente começar de novo, crie uma string com um texto qualquer e teste se é um palíndromo.

  • Curtir 1
  • Obrigado 1
Postado

Cheguei nesse agora, porém ainda não está rodando corretamente, teria como me ajudar?

 

//teste 7 - palindromo
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 250
#define MAX_SIZE_WORD 16 

int strcmp(char*,char*);        // protótipo de funcao
                                // colocadas antes da funcao main
int main()
{
    char str[MAX_SIZE] ; // só conta letras e numeros
    int tam = 0;
    int i, c;
    char st1[20];                 // primeira metade da palavra ou frase
    char st2[20];                 // segunda metade
    int flag;
    
    
    flag = 0;
    do
    {
        printf ("Entre com a palavra: ");
        scanf ("%50[^\n]", str);         
        while ((i = getchar()) != '\n' && i != EOF){}
    {
    for(i=0; str[i] != 0; i++)
        tam++;           // calcula o tamanho da string    
    if (tam <= 16){
        flag = 0;
        {
    // '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';
            }
            else{
            flag = -1;
            printf("-1");
            }
    else{
    flag = -1;
    printf("-1");
        }
    }
    } while (flag == 0);
    return 0;
                   
    for(i=0 ; i<tam/2; i++)       // loop vai ate o meio
    {
        st1[i] = str[i];          // pega a primeira metade
        st2[i] = str[tam - i];    // pega a segunda  metade
    }
    st1[i] = 0;
    st2[i] = 0;
    if(strcmp(st1 , st2) == 0){ // compara as duas string's
    printf("eh polindromo .\n"); 
    }
    if(strcmp(st1 , st2) != 0){
    printf("não eh palindromo");
    }
    
    return 0;
}
int strcmp(char st1[],char st2[])   // essa funcao pode ser colocada depois da funcao main
{
    int i;
    for( i=0; st1[i] != 0; i++)
    {
        if(st1[i] != st2[i])        // caract de uma dif da outra
            return 1;             // retorna 1
    }
    if(st2[i] != 0)                // segunda string maior que a primeira
        return 1;                 // retorna 1
    return 0;                     // sao iguais retorna zero
}

  • Obrigado 1
Postado

@alessa.chagas      seu código editado para compilar , mas não ainda tem erros e não detecta  as palíndromas

                                     // teste 7 - palindromo
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 250
#define MAX_SIZE_WORD 16 

int strcmp(char*, char*);            // protótipo de funcao
                                     // colocadas antes da funcao main
int main()
{
    char str[MAX_SIZE];              // só conta letras e numeros
    int tam = 0;
    int i, c;
    char st1[20];                    // primeira metade da palavra ou frase
    char st2[20];                    // segunda metade
    int flag;

    flag = 0;
    do
    {
        printf("Entre com a palavra: ");
        scanf("%50[^\n]", str);
        while ((i = getchar()) != '\n' && i != EOF) {}
        for (i = 0; str[i] != 0; i++)
        {
            tam++;                   // calcula o tamanho da string    
        }
        if (tam <= 16)
        {
            flag = 0;
                                     // 'A'-->65, 'Z'-->90, 'a'-->97, 'z'-->122
            for (i = 0; i < tam; i++)
            {                        // o pont_e_virgula ai de baixo termina o comando IF sem fazer Nada
                if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) // ;
                // if ((str[i] >= 65 && str[i] <= 90) || (str[i] >= 97 && str[i] <= 122));
                                     // essa primeira linha aqui eh + fácil de entender
                {
                                     // Faltou o que fazer se o IF for Verdadeiro 
                }
            }
                                     // str[i] = '\0';  esse aqui não precisa e não faz diferenca
        }
        else
        {                            // o enunciada diz Que
            flag = 1;                // eh necessario fazer flag igual a 1 e não menos 1
            printf("-1");
        }
    } while (flag == 0);
                                     // return 0;    para Quê esse return ?  isso farah terminar a execução do prograMa
    for (i = 0; i < tam / 2; i++)    // loop vai ate o meio
    {
        st1[i] = str[i];             // pega a primeira metade
        st2[i] = str[tam - i];       // pega a segunda  metade
    }
    st1[i] = 0;                      // finaliza a string para validar e poder escreve-la com printf
    st2[i] = 0;                      // o zero "0" ou o "\0" barra zero , finalizam uma strig
    if (strcmp(st1, st2) == 0)       // compara as duas string's e se forem iguais o resultado eh zero
    {
        printf("eh polindromo .\n"); // strcmp retornou zero , entao as duas string's sao iguais
    }
    if (strcmp(st1, st2) != 0)       // deferente de zero pois strcmp só retorna zero ou hum 
    {
        printf("não eh palindromo"); // strcmp retornou 1 , as 2 string's sao diferentes
    }
    return 0;
}
int strcmp(char st1[], char st2[])   // essa funcao pode ser colocada depois da funcao main
{
    int i;
    for (i = 0; st1[i] != 0; i++)
    {
        if (st1[i] != st2[i])        // caract de uma dif do da outra
            return 1;                // retorna 1
    }
    if (st2[i] != 0)                 // segunda string maior que a primeira
        return 1;                    // retorna 1
    return 0;                        // sao iguais retorna zero
}

 

  • Curtir 1
Postado

@alessa.chagas Com o enunciado fica mais fácil entender. Como são muitas coisas, tente resolver cada uma e só avance para a próxima quando estiver funcionando corretamente. Primeiro acho que devia focar nas entradas válidas, a variável flag é que recebe a validação dos dados e faz sair do loop quanto tudo estiver ok. Se criar uma função com as validações exigidas, pode atribuir o retorno dela ao flag, p.ex,

#include <stdio.h>

#define MAX_SIZE 250
#define MAX_SIZE_WORD 16

int conta(char *);
int valida(char *, int);

int main(){
    int c;
    int flag = 0;
    int tamanho = 0;
    char str[MAX_SIZE];
    
    do{
        str[0] = 0;
        printf("Palavra: ");
        scanf("%50[^\n]", str);

        while((c = getchar()) != '\n' && c != EOF){}
      
        tamanho = conta(str);
        flag = valida(str, tamanho);
    }while(flag == 0);     

    return 0;
}

int valida(char *str, int n){
    if(n == 0 || n >= MAX_SIZE_WORD){
        return 0;
    }
    for(int i = 0; i < n; i += 1){
        if(!(
            (str[i] >= 'a' && str[i] <= 'z') ||
            (str[i] >= 'A' && str[i] <= 'Z')
            )
        ){
            return 0;
        }
    }
    return 1;
}

int conta(char *str){
    int i = 0;
    while(str[i]){
        i += 1;
    }
    return i;
}

 

Crie duas funções para facilitar isso, uma para contar os caracteres e outra só para retornar se a string é válida. Acho que assim fica mais organizado do que fazer tudo em main.

  • Curtir 1
  • Obrigado 1

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!