Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Rick45

programa multimodular

Recommended Posts

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

Share this post


Link to post
Share on other 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;

}

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other sites
IRX773

Mete as tags

 [ / code ]   (sem espaços) pois é muito mais simples de se perceber caso o faças.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.