Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Rick45

programa multimodular

Mensagens Recomendadas

Rick45

boas. estou aqui com um problema neste exercicio da aula.

é um exercício multi modular. mas nao esta a funcionar correctamente. ja tentei varias cenas mas n consigo ver o problema

da n faz a verificação se a frase/ palavra é capicua. e tmbm n verifica se as duas frases sao diferentes identicas ou iguais.

podiam dar-me uma ajuda?

Main.c

#include <stdio.h>

#include <stdlib.h>

#include "mystrings.h"

main(){

      char frase1[TMAXSTR+1];

      char frase[TMAXSTR+1];

      printf("insira uma frase:");

      gets(frase1);

      if(isnull(frase1))

      puts("frase nula");

      else

      printf("tamanho da frase:%d\n",strlen(frase1));

      printf("Tudo em maiusculas: %s\n",strupr(frase1));

      printf("tudo em minusculas: %s \n", strlwr(frase1));

      printf("o caracter 'a' aparece %d vez(es), a 1a delas na %d a posicao\n", strcountc(frase1,'a'),indchr(frase1,'a')+1);

      printf("frase invertida:%s\n",strrev(frase1));

      printf("insira agora uma frase que inclua varios espacos desnecessarios:");

      gets(frase);

      printf("<%s>\n",frase);

      printf("<%s>\n",trimleft(frase));

      printf("<%s>\n",trimright(frase));

      printf("<%s>\n",trimmiddle(frase));

      puts(strcat(frase," FIM"));

      if(strcap(frase))

      printf("a frase n e capicua \n");

      else

      puts("e capicua!");

      if(strcmp(frase1,frase)==0)

      puts("strings exactamente iguais");

      else

      if(stricmp(frase1,frase)==0)

      puts("strings equivalentes");

      else

      puts("strings diferentes");

      system("pause");

      }

mystrings.c

#include<stdio.h>

#include<stdlib.h>

#include"mystrings.h"

int isnull(char *str){

    return str[0]=='\0';

    }

int strlen (char *str){

    int i;

    for(i=0;str!='\0';i++);

    return i;

    }

char *strlwr(char str[]){

    int i;

    for (i=0;str!='\0';i++)

    if(str>='A' && str<='Z')

    str=str+'a'-'A';

    return str;

    }

   

char *strupr(char *str){

    int i;

    for (i=0;str!='\0';i++)

    if(str>='a' && str <='z')

    str=str+'A'-'a';

    return str;

    }

   

int strcountc(char *str, char ch){

    int i,noc=0;

    for(i=0;str!='\0';i++)

    if(str==ch) noc ++;

    return noc;

    }

int indchr(char *str, char ch){

    int i;

    for(i=0;str!='\0' && str!=ch;i++);

    if(str==ch) return i;

    else return -1;

    }

char *strrev(char *str){

    int i,tamanho=strlen(str);

    char aux;

    for(i=0;i<tamanho/2;i++){

    aux=str;

    str=str[tamanho-i-1];

    str[tamanho-i-1]=aux;

    }

    return str;

    }

                             

int iswhite(int ch){

    return ch ==' ' || ch =='\t' || ch =='\n';

    }

       

char *trimright (char *str){

    int i;

    for(i=strlen(str)-1;i>=0 && iswhite(str);i--);

    str[i+1]='\0';

    return str;

    }

char *trimleft(char *str){

    int i,j;

    for(j=0;str[j]!='\0' && iswhite(str[j]);j++);

    if(j>0){

    for(i=j;str !='\0';i++)

    str[i-j]=str;

    str[i-j]='\0';

    }

    return str;

    }

           

char *strcpy(char *destino,char *origem){

    int i;

    for(i=0;origem !='\0';i++);

    destino=origem;

    destino='\0';

    return destino;

    }

   

char *strcat(char *str1,char *str2){

    int i, len=strlen(str1);

    for(i=0;str2!='\0';i++)

    str1[len+i]=str2;

    str1[len+i]='\0';

    return str1;

    }

       

       

int strcap(char *str){

    int i,tamanho=strlen(str),cap=1;

    for(i=0;i<tamanho/2; i++);

    if(str!=str[tamanho-i-1]) cap=0

    return cap;

    }

       

int strcmp(char *str1,char *str2){

    int i;

    for(i=0;str1==str2 && str1!='\0';i++);

    return str1-str2;

    }

       

char mytolower(char ch){

    if(ch>='A' && ch <='Z') return ch - 'A'+'a';

    else return ch;

    }

                   

int stricmp(char *str1,char *str2){

    int i;

    for(i=0;mytolower(str1)== mytolower (str2) && str1!='\0';i++);

    return mytolower(str1 )- mytolower(str2);

    }

         

char *trimmiddle (char *str){

    int i;

    for(i=0;str!='\0';i++)

    if(iswhite(str)) trimleft (&str[i+1]); 

    return str;

    }

mystrings.h

#define TMAXSTR 80

int isnull(char *str);

int strlen (char *str);

char *strlwr(char *str); 

char *strupr(char *str); 

int strcountc(char *str, char ch);

int indchr(char *str, char ch);

char *strrev(char *str);   

int iswhite(int ch);

char *trimright (char *str);

char *trimleft(char *str);

char *strcat(char *str1,char *str2);

int strcap(char *str);

int strcmp(char *str1,char *str2);

char mytolower(char ch);

int stricmp(char *str1,char *str2);     

char *trimmiddle (char *str);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Boas !

Começo por te dizer que estás a ler as strings com "gets" ... não é aconselhável, em alternativa tens o fgets. Do teu código não tive ainda tempo para analisar, mas deixo-te aqui um programa que eu fiz para ver se uma palavra é capicua, pode ser que ajude.

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

int capicua (char *p);

int main () {

     char palavra[20];
     int res;
     
     printf("\nInsira uma palavra: ");
     fgets(palavra,19,stdin);
     palavra[strlen(palavra)-1] = '\0';

     res = capicua (palavra);

     if ( res == 1 ) printf("\nNao e capicua!\n");
     else printf("\nE capicua!\n");

     return 0;

}

int capicua (char *p) {

   int flag;
   char *sup;

   sup = p + strlen (p) - 1;
   flag = 0;

   while ( *p < *sup && flag == 0 ) {

         if ( *p == *sup  ) {
            sup--;
            p++;
         } else {
            flag = 1;
         }
   }

   return flag;

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Localhost: ANA .. RAPAR ... ASSA são capicuas ... lido da direita para a esquerda, e da esquerda para a direita formam a mesma palavra.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rick45

@BrunoT

obrigado. vou ver o seu codigo para ver se tiro algumas ideias, pois o meu se introduzir uma palavra par diz-me sempre que é capicua e se for impar diz que não é xD.

cumpz

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Eu conhecia isso como um palindromo.

Ainda no outro dia tive de resolver um problema da usaco que envolvia isso.  :thumbsup:


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Para verificar se uma palavra é um palindromo basta percorrer comparar a posição actual com a sua posição simétrica na string. Percorrer a string até meio, então.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Foi essa a lógica que segui  :(

Rick45, quando puseres aqui código tenta "identar" melhor, é mais fácil para toda a gente perceber  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.