Ir ao conteúdo

Posts recomendados

Postado

Estou tentando corrigir o bug no codigo e na linha do "int i,x,acertos;" o compilador acusa erro. Peço uma ajuda, já tentei mudar o tipo da variavel e até agora nadica.

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

int main( void )
{

char nome[40];
int i,x,acertos; 

printf("Entre com uma palavra ");
scanf("%s", nome); getchar();
 

for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
if (nome[x] == nome){
acertos++;
}
}
 

if(acertos==strlen(nome)){
printf("A palavra e um palindromo");
}else{
printf("A palavra nao e um palindromo");
}
 
printf("\n\n\n\n\n");
system("pause");
return 0;
}

 

Postado

@paulo luz magalhaes Creio eu que o que você está tentando fazer é isso.

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

int main(void)
{
    char nome[40];
    int i,x,acertos; 

    printf("Entre com uma palavra ");
    scanf("%s%*c", nome);

    /*for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++)
    {
        if (nome[x] == nome)
        {
            acertos++;
        }
    }
 

    if(acertos==strlen(nome))
    {
        printf("A palavra e um palindromo");
    }
    else
    {
        printf("A palavra nao e um palindromo");
    }*/

    /* Passa a palavra para mauiscula */
    for (i = 0; nome[i] != 0; i++)
    {
        nome[i] = toupper(nome[i]);     /* toupper() e da biblioteca ctype.h */
    }
    
    /* strcmp() e da biblioteca string.h */
    if (strcmp(nome, "PALINDROMO") == 0)        /* Compara as duas palavras */
    {
        printf("\nA palavra e palindromo.");
    }
    else
    {
        printf("\nA palavra nao e palindromo.");
    }
    
    getchar();      /* Faz uma pausa */
    return 0;
}

Use espaços ao invés de tabs para indentar, tente também copiar do jeito que eu deixei a indentação.

 

Do modo que eu fiz fica mais fácil de visualizar o código.

Postado
1 hora atrás, kgin disse:

@paulo luz magalhaes Creio eu que o que você está tentando fazer é isso.


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

int main(void)
{
    char nome[40];
    int i,x,acertos; 

    printf("Entre com uma palavra ");
    scanf("%s%*c", nome);

    /*for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++)
    {
        if (nome[x] == nome)
        {
            acertos++;
        }
    }
 

    if(acertos==strlen(nome))
    {
        printf("A palavra e um palindromo");
    }
    else
    {
        printf("A palavra nao e um palindromo");
    }*/

    /* Passa a palavra para mauiscula */
    for (i = 0; nome[i] != 0; i++)
    {
        nome[i] = toupper(nome[i]);     /* toupper() e da biblioteca ctype.h */
    }
    
    /* strcmp() e da biblioteca string.h */
    if (strcmp(nome, "PALINDROMO") == 0)        /* Compara as duas palavras */
    {
        printf("\nA palavra e palindromo.");
    }
    else
    {
        printf("\nA palavra nao e palindromo.");
    }
    
    getchar();      /* Faz uma pausa */
    return 0;
}

Use espaços ao invés de tabs para indentar, tente também copiar do jeito que eu deixei a indentação.

 

Do modo que eu fiz fica mais fácil de visualizar o código.

 

Debuguei o meu programa corrigido e o seu tambem. Ao digitar a palavra "ovo" ou a frase "saudavel leva duas", ambos os programas acusam que não são palíndromos. Estou tentando quebrar a cabeça e ver como corrijo...

Postado
11 minutos atrás, paulo luz magalhaes disse:

Debuguei o meu programa corrigido e o seu tambem. Ao digitar a palavra "ovo" ou a frase "saudavel leva duas", ambos os programas acusam que não são palíndromos. Estou tentando quebrar a cabeça e ver como corrijo...

mas qual seria o propósito do seu programa?

Postado
16 minutos atrás, kgin disse:

mas qual seria o propósito do seu programa?

O proposito seria acadêmico, O professor passou exercícios e estou praticando eles, verificando os erros, aprendendo as rotinas da programação na linguagem C.

Postado

@paulo luz magalhaes Me desculpe eu acabei não prestando atenção no seu programa, eu fiz um de exemplo para você.

#include <stdio.h>

#define T_PALAVRA 256

int
checaPalindromo(char *p);
/*
 * Devolve 1 se for palindromo e 0 se não for.
 */

int main(int argc, char *argv[])
{
    char palavra[T_PALAVRA];
    int cont;
    /* Checa se foi passada alguma palavra para o programa */
    if (argc > 1) {
        /* Mostra as palavras */
        for (cont = 1; cont < argc; cont++) {
            printf("\n%s", argv[cont]);

            /* Checa palindromo */
            if (checaPalindromo(argv[cont])) {
                printf(":E palindromo!");
            } else {
                printf(":Nao e palindromo");
            }
        }
    } else {
        printf("\nDigite uma palavra:");
        fgets(palavra, T_PALAVRA, stdin);
        /* Retira o newline da palavra */
        for (cont = 0; palavra[cont]; cont++);

        palavra[cont-1] = '\0';
        
        /* Checa palindromo */
        if (checaPalindromo(palavra)) {
            printf(":E palindromo!");
        } else {
            printf(":Nao e palindromo");
        }
    }
    getchar();      /* Faz uma pausa */
    return(0);
}

int
checaPalindromo(char *p)
{
    char str[256];
    int q_caracteres_palavra, q_caracteres_iguais = 0, cont, aux;
    /* Conta a quantidade de caracteres e passa a palavra para mauiscula para outro vetor */
    for (q_caracteres_palavra = 0; p[q_caracteres_palavra]; q_caracteres_palavra++) {
        if (p[q_caracteres_palavra] > 97) {
            /* Passa a letra para mauiscula e copia para outro vetor */
            str[q_caracteres_palavra] = p[q_caracteres_palavra]+32;
        }
        str[q_caracteres_palavra] = p[q_caracteres_palavra];
    }
    /* Coloca o indicador \0 na string */
    str[q_caracteres_palavra] = '\0';
    
    /* Checa palindromo */
    aux = q_caracteres_palavra-1;
    for (cont = 0; str[cont]; cont++) {
        if (str[cont] == str[aux]) {
            q_caracteres_iguais++;
        }
        aux--;
    }

    if (q_caracteres_iguais == q_caracteres_palavra) {
        return(1);
    }
    return(0);
}

 

  • Obrigado 1
Postado

@paulo luz magalhaes Segue seu código corrigido:

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

int main( void )
{

char nome[40];
int i,x,acertos; 

printf("Entre com uma palavra ");
scanf("%s", nome); getchar();
 

for (i = strlen(nome) - 1, x = 0; i >= 0 && x < strlen(nome); i--,x++){
if (nome[i] == nome[x]){
acertos++;
}
}
 

if(acertos==strlen(nome)){
printf("A palavra e um palindromo");
}else{
printf("A palavra nao e um palindromo");
}
 
printf("\n\n\n\n\n");
system("pause");
return 0;
}

 

Postado
14 horas atrás, paulo luz magalhaes disse:

Estou tentando corrigir o bug no codigo e na linha do "int i,x,acertos;" o compilador acusa erro. Peço uma ajuda, já tentei mudar o tipo da variavel e até agora nadica.

No seu código só faltou o include de string.h e o índice no If do nome que está assim,

 

if(nome[x] == nome)

 

O correto é,

 

if(nome[x] == nome[i])

 

  • Curtir 1
Postado

É claro que cada um pode ver as questões do forum como parecer certo. 🤔

 

Por exemplo como um desafio pessoal ou uma chance de mostrar conhecimento, mas o propósito do forum em geral é tentar esclarecer uma dúvida e não  postar uma solução, por vezes sem ao menos tentar ver o que está errado no código do autor da questão.

 

@paulo luz magalhaes seu programa tem vários problemas e vou tentar explicar o que aconteceu

 

"Erro na declaração do tipo da variável" como você disse no título nem foi o caso.

 

15 horas atrás, paulo luz magalhaes disse:

Estou tentando corrigir o bug no codigo e na linha do "int i,x,acertos;" o compilador acusa erro. Peço uma ajuda, já tentei mudar o tipo da variavel e até agora nadica

 

A linha do erro muitas vezes não ajuda muito, porque o erro está em outro lugar.

 

Vou te mostrar onde estão os problemas, a seguir:

 

 

Uma saída da compilação num compilador mais ou menos recente, gcc 9.3 em Ubuntu 20.04

 

teste$ gcc -c -Wall -std=c17 plm.c
or.c: In function ‘main’:
or.c:14:8: warning: implicit declaration of function ‘strlen’ [-Wimplicit-function-declaration]
   14 | for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
      |        ^~~~~~
or.c:14:8: warning: incompatible implicit declaration of built-in function ‘strlen’
or.c:3:1: note: include ‘<string.h>’ or provide a declaration of ‘strlen’
    2 | # include <stdlib.h>
  +++ |+#include <string.h>
    3 | 
or.c:14:32: warning: left-hand operand of comma expression has no effect [-Wunused-value]
   14 | for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
      |                                ^
or.c:15:13: warning: comparison between pointer and integer
   15 | if (nome[x] == nome){
      |             ^~
or.c:21:13: warning: incompatible implicit declaration of built-in function ‘strlen’
   21 | if(acertos==strlen(nome)){
      |             ^~~~~~
or.c:21:13: note: include ‘<string.h>’ or provide a declaration of ‘strlen’
teste$ 

 

A queixa sobre strlen() é porque essas funções residem em string.h e faltou o #include. 

 

Apenas incluindo isso você fica com
 

teste$ gcc -c -Wall -std=c17 plm.c
plm.c: In function ‘main’:
plm.c:15:32: warning: left-hand operand of comma expression has no effect [-Wunused-value]
   15 | for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
      |                                ^
plm.c:16:13: warning: comparison between pointer and integer
   16 | if (nome[x] == nome){
      |             ^~
teste$ 

 

O warning na linha 16 é de fato um erro.  nome é char[40]. Em geral tem que ter um índice dos dois lados. No caso aqui você pretendia escrever
 

    if (nome[x] == nome[i]){

 

E mudando isso o programa já compila:

 

teste$ gcc -c -Wall -std=c17 plm.c
plm.c: In function ‘main’:
plm.c:14:32: warning: left-hand operand of comma expression has no effect [-Wunused-value]
   14 | for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
      |                                ^
teste$ 

 

 

O warning restante é irrelevante e vem do uso do operador ',', e talvez você não devesse mesmo ter usado isso porque só deixou  o programa mais difícil de ler. E no uso geral pode levar a muitos erros de lógica se você não souber EXATAMENTE o que está programando.  E muitas vezes iniciantes não tem essa precisa noção, ou mesmo profissionais. 

 

A vírgula vai criar uma expressão. Uma expressão em C avalia para 0 ou 1. Só isso. Sempre isso. No entanto usando a ',' apenas a parte depois da última vírgula será considerada. O resto será descartado no que diz respeito à avaliação da expressão. O artigo da wikipedia que fala disso por exemplo tem hoje --- 25/3/21 --- vários erros por exemplo :( 

 

Recomendo nunca usar isso, exceto talvez na inicialização do for ou no incremento.

 

De volta ao programa

 

Como eu disse, agora compila e está assim

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

int main( void )
{

char nome[40];
int i,x,acertos; 

printf("Entre com uma palavra ");
scanf("%s", nome); getchar();
 

for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
if (nome[x] == nome[i]){
acertos++;
}
}
 

if(acertos==strlen(nome)){
printf("A palavra e um palindromo");
}else{
printf("A palavra nao e um palindromo");
}
 
printf("\n\n\n\n\n");
system("pause");
return 0;
}

 

Só que não funciona :(

 

E porque? 

 

Você não inicializou acertos...

 

Mudando a declaração para
 

    int i,x,acertos = 0; 

 

O programa roda:
 

teste$ gcc -o plm -Wall -std=c17 plm.c
plm.c: In function ‘main’:
plm.c:15:32: warning: left-hand operand of comma expression has no effect [-Wunused-value]
   15 | for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){
      |                                ^
teste$ ./plm
Entre com uma palavra 1234321
A palavra e um palindromo
teste$ ./plm
Entre com uma palavra 1234
A palavra nao e um palindromo
teste$ 

 

E está bom assim?

Não, não está. Não sou seu instrutor nem vou corrigir seus ttrabalhos, mas vou listar de onde eu tiraria pontos de seu programa :) 

 

Os problemas restantes:
 

if(acertos==strlen(nome)){
printf("A palavra e um palindromo");
}else{
printf("A palavra nao e um palindromo");
}
 
printf("\n\n\n\n\n");
system("pause");

 

Que pretende com isso? Eu apaguei essas linhas em branco acima porque seria 8  à toa. E meu ambiente não tem "pause


Veja o que acontece:
 

toninho@DSK-2009:~/projects/dsp$ ./plm
Entre com uma palavra 123456
A palavra nao e um palindromo




sh: 1: pause: not found
toninho@DSK-2009:~/projects/dsp$ 

 

Nunca use system(). É proibida em todo lugar.  E não estará fazendo nada. Escrever system("lançar nave espacial") não quer dizer que seu programa serve para a Space X. É só uma string que vai para o sistema. 

O sistema foi escrito em C, system() foi escrita em C e você está programando em C. Deve ter outro jeito de parar o programa. E para que parar o programa? Viu no exemplo? Se funcionasse eu apenas teria de teclar um ENTER a mais. Um IDE não é a maneira normal de rodar um programa. E um IDE que não para um programa de console deveria ser simplesmente trocado por outro.

 

Seu instrutor provavelmente não vai usar um IDE pra testar seu programa, e não vai gostar de ter 4 linhas em branco e uma mensagem folclórica na tela toda vez... Certamente vai ter um script que compila e roda os programas de todos os alunos em sequência. Ou não :). Tudo é possível hoje em dia.

 

Trocando essa parte por
 

    if(acertos==strlen(nome))
        printf("A palavra e um palindromo\n");
    else
        printf("A palavra nao e um palindromo\n");

 

Seu programa sai ganhando. E seu instrutor.

 

E a tal comma-expression de que o compilador reclama?

 

É essa linha:

 

    for (i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){ /* ... */ };

 

A primeira parte do for --- inicialização --- vai ser a expressão 
 

	i=strlen(nome)-1,x=0; i>=0

 

E isso vai gerar um warning de todo modo. 

 

Mas o problema mesmo aqui é que i e x são globais. Nem precisava disso no for, já que podia ter escrito antes, na linha anterior.

 

Entenda que essas variáveis só são usadas DENTRO do for para controlar o loop, e NUNCA se deixa variáveis globais com nomes ingênuos como x e i vivas durante toda a vida de main() ou de qualquer função. Isso é um pesadelo de manutenção. Nunca use nada global. Levou uns 10 anos para corrigirem isso em C, mas depois da correção já se passaram mais 40 anos.

 

Use o simples
 

    for ( int i=strlen(nome)-1,x=0; i>=0,x<strlen(nome); i--,x++){ /* ... */ };

 

E apague x e i das declarações.

 

A segunda parte do for --- condição de saída --- vai ser a expressão 
 

    i>=0, x<strlen(nome)

 

é outra comma-expression e aqui é preciso entender que apenas a última parte será considerada. Espero que tenham te ensinado isso. O fato é que para o for a condição de saída será 
 

	( x < strlen(nome) )

 

E tudo o que você escrever antes será descartado. 

 

EXEMPLO
 

for (
    int i=strlen(nome)-1,x=0;
    i>=0, x>32, x>strlen(nome), i>32122, x<strlen(nome);
    i--,x++){  /* ... */ };

 

Se você escrever assim vai ver que seu programa continua funcionando igualzinho :D. Das 4 expressões apenas vai considerar a última. Então se você achava que (i>=0) faria alguma diferença no for esqueça...

Isso é o que está valendo no seu for:

 

for ( int i=strlen(nome)-1,x=0; x<strlen(nome); i--,x++){ /* .. */ };

 

Eis o programa como está agora

 

# include <stdio.h>
# include <string.h>
int main( void )
{

char nome[40];
int acertos = 0; 

printf("Entre com uma palavra: ");
scanf("%s", nome); getchar();
 

for ( int i=strlen(nome)-1,x=0; x<strlen(nome); i--,x++)
{
if (nome[x] == nome[i]){
acertos++;
}
}

if( acertos==strlen(nome) )
    printf("A palavra e um palindromo\n");
else
    printf("A palavra nao e um palindromo\n");
    
return 0;
}

 

E parece que funciona. Mas tem uma chamada folclórica a getchar() e está na mesma linha do scanf(). Pra que isso? Porque na mesma linha? Ruim d eler. E porque não testou o retorno de scanf()? se não conseguiu ler o número que adianta seguir com o programa? Tem um livro de C? Um manual? Um site que acompanhe? Seu IDE mostra os protótipos ao menos?

 

Estaria melhor assim:
 

    printf("Entre com uma palavra: ");
    if ( scanf("%s", nome) != 1 ) return -1;

 

E o for assim
 

for ( int i=strlen(nome)-1,x=0; x<strlen(nome); i--,x++)
    if (nome[x] == nome[i]) acertos++;

 

Que é mais fácil de ler e entender que
 

for ( int i=strlen(nome)-1,x=0; x<strlen(nome); i--,x++)
{
if (nome[x] == nome[i]){
acertos++;
}
}

 

E entenda que 
 

    scanf("%s", nome)

 

combina com 
 

14 horas atrás, paulo luz magalhaes disse:

 ou a frase "saudavel leva duas", ambos os programas acusam que não são palíndromos

 

no sentido de que %s vai ler uma única palavra e não uma frase. Se quer ler até o ENTER e usar scanf() deve usar outro especificador, como por exemplo
 

    "%[^\n]"

 

Que vai ler uma "frase". Mas claro que não vai ignorar os espaços em "saudavel leva duas"...


Veja:

 

teste$ ./plm
Entre com uma palavra: 12321 12321
A palavra e um palindromo
teste$ ./plm
Entre com uma palavra: saudade leva duas
A palavra nao e um palindromo
teste$ 

 

Programas não são mágicos. Se quer esse resultado precisa programar para tal, talvez removendo os espaços de nome ou mudando o loop para tratar essa condição.

 

E qual a palavra afinal?

 

Se acostume a mostrar o que leu.  Fica difícil achar um erro no programa como o de sua chamada a scanf() porque você vai assumir que a função leu o que você queria e ela tem outros planos. Se você tivesse mostrado a palavra desde o início saberia de "saudavel leva duas" sequer tinha sido lido como tal...

 

Use o simples
 

    if( acertos==strlen(nome) )
        printf("A palavra \"%s\" e um palindromo\n", nome);
    else
        printf("A palavra \"%s\" nao e um palindromo\n", nome);

 

 

Eis o programa como ficou, depois de corrigidos os erros e alterado o especificador de scanf():

 

# include <stdio.h>
# include <string.h>
int main( void )
{
    char nome[40];
    int acertos = 0; 

    printf("Entre com uma palavra: ");
    if ( scanf("%[^\n]", nome) != 1 ) return -1;

    for ( int i=strlen(nome)-1,x=0; x<strlen(nome); i--,x++)
        if (nome[x] == nome[i]) acertos++;

    if( acertos==strlen(nome) )
        printf("A palavra \"%s\" e um palindromo\n", nome);
    else
        printf("A palavra \"%s\" nao e um palindromo\n", nome);

    return 0;
}

 

E uns testes:

 


teste$ gcc -o plm -Wall -std=c17 plm.c
teste$ ./plm
Entre com uma palavra: outra palavra
A palavra "outra palavra" nao e um palindromo
teste$ ./plm
Entre com uma palavra: 12321 12321
A palavra "12321 12321" e um palindromo
teste$ ./plm
Entre com uma palavra: ovo
A palavra "ovo" e um palindromo
teste$ ./plm
Entre com uma palavra: 1111 1111
A palavra "1111 1111" e um palindromo
teste$ 
teste$ 

 

:) 

  • 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!