Jump to content

contar palavras e depois encontrar uma numa sequencia introduzida pelo user...


mymind
 Share

Recommended Posts

boas

estou a tentar elaborar um prog que me peça para introduzir duas strings .

depois pensei em armazenar essa mesma string num vector e gostaria de poder contar as palavras que foram introduzidas

depois gostaria de saber se a st2 introduzida existe em str1....

ou seja :

isto foi o que fiz , mas acontece que não estou a conseguir ainda contar as palavras e não percebo mt bem pk ainda visto não ter erros no gdb....

alguem me pode dar umas dicas ????

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

char Frase[100];
char Palavra[20];

char introduz_texto(){

puts("Por favor introduza uma frase: ");
gets(Frase);
puts("Por favor introduza uma palavra:  ");
gets(Palavra);
}



int conta_palavra(char *Frase, char *Palavra){

int i,palavras=0;
for (i=0;i<100;i++){
	if (Frase[i] = '\0'){
		palavras++;
	}
return palavras;		
}

}



void main () {
    
introduz_texto();



int conta_palavra( char *Frase, char *Palavra );   


}

Obrigado.

Link to comment
Share on other sites

coloca o teu programa entre [ code=c][ /code].

aqui está com espaços por isso se fizeres copy past destas daqui não te esqueças de tirar os espaços.

1º-Evita o maximo utilizar variaveis globais só se for mesmo necessario é que utilizas.

Por isso declara as tuas variaveis na função main.

2º-Um conselho faz a introdução de texto e da palavra na função main.

3º-Utiliza estas duas funções strtok e strcmp. A primeira é para partires a frase em palavras a segunda para comparares as as palavras da frase com a palavra introduzida. Para usares tais funções tens de incluir esta biblioteca string.h

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

strcmp:

retorna um inteiro.

Se:

< 0 str1 é menor alfabeticamente que a str2

0 str1 são iguais str2

>0 str1maior alfabeticamente do que str2

strtok:

tokenPtr = strtok( string, " " );

  while ( tokenPtr != NULL ) {

      if(strcmp(tokenPtr,palavra)==0)

        ++contador;

      tokenPtr = strtok( NULL, " " );

  }

Link to comment
Share on other sites

Boas

antes de mais obrigado pelas dicas, eu jà tinha reparado nessas funções num livro que tenho aqui .....

tomei a liberdade de seguir os vossos concelhos e tentar usa-los acontece que continuo sem qualquer output .....

ou seja :


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

//verifica o numero de palavras 

int conta_palavra(char *Frase, char *Palavra){
int contador=0;
while ( Frase != NULL ) { 
	if(strcmp(Frase,Palavra)==0)
		++contador;
	Frase = strtok( NULL, " " );
	return contador;
}
}

// func main

int main () {
    
char Frase[100];
char Palavra[20];

puts("Por favor introduza uma frase: ");
fgets(Frase,100,stdin);
puts("Por favor introduza uma palavra:  ");
fgets(Palavra,20,stdin);
int conta_palavra( char *Frase, char *Palavra );
}

outra duvida pertinente que tenho é no main:

quando chamo a função conta_palavras porque é que tenho que declarar o tipo de função que é e não apenas colocar

conta_palavra( char *Frase, char *Palavra );

pergunto porque ja ontem obtive erro e so o ultrapassei quando juntei o tipo de função que era.....

Desculpem me estas perguntas de maçarico mas estou na Linguagem C a pouco tempo e não sou conhecedor ainda de muita metedeologia....

Obrigado......

Link to comment
Share on other sites

Ainda não vi o teu programa mas respondendo à tua questão.

Tens de dizer ao compilador que tipo irá ser retornado pela função, por outras palavras, basicamente estás a dizer ao compilador que os valores que saem dessa função para a main (neste caso) são desse tipo.

Exemplo:

A main es tu, e a função é como aquelas maquinas de chocolate.

Tu inseres moedas (os valores que envias para a função) e sabes que vais receber de certeza um chocolate (pois o tipo da maquina/função é chocolate) não outra coisa qualquer.

Agora poe te na posição que a maquina enão estava identificada nem podias ver o seu conteudo (a função não tem um tipo), agora inseres as moedas(valores) e não sabes o que vais receber pode ser um char, int, float... Dai o erro de compilação.

OBS: Coloca o return contador fora do ciclo

Link to comment
Share on other sites

Reparei que tens inumeros erros no teu programa. Eu tenh aqui um programa que não é igual mas é similar a esse.

Tenta guiar te por ele se tiveres duvidas pergunta.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
int contar(char *,char*);

int main()
{
    char s[MAX], pal[50];
    printf("Inserir string:");
    gets(s);
    s[strlen(s)+1]='\0';//tenos de colocar primerio o terminador no fim para nunca deixar de ser uma string
    s[strlen(s)]=' ';
    printf("A \"%s\" repete-se %d vezes na string.\n",pal,contar(s,pal));
    system("pause");
}

int contar(char *s, char *pal)
{
    int i,contador=0,j=0;
    char *auxv;
    
    for(i=0;s[i]!='\0';i++)//ignora esta parte, é apenas para ir buscar a primeira palavra da frase e assim evitas escrever uma palavra para comparar

      {if(s[i]!=' ')
        pal[i]=s[i];
       else
         break; 
       pal[i+1]='\0';
        
      }
    
    //é isto que te interessa
    auxv=strtok(s," ");
    while(auxv!=NULL) 
    {if(strcmp(auxv,pal)==0)
       ++contador;
     auxv=strtok(NULL," ");
    } 
   free(auxv);     
     
     return contador;
}
              
         

EDIT:MODIFICA TODOS OS GETS POR FGETS

Link to comment
Share on other sites

boas

olhei para o teu programa e retirei algumas coisas ....

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



//verifica o numero de palavras 

int conta_palavra(char *Frase, char *Palavra){

char *str; //pont  k recebe a1 palavra do 1 vector
char *str2; // pont k recebe 2 vector

int contador=0; // cont

str =strtok(Frase," "); // str e delimitada pelo 1 espaço encontrado
while ( str != NULL ) {  //enq for difrente de vazio
	if(strcmp(str,str2)==0) // compara a 1 palavra retirada da str1 com a de str2
		++contador;  // se verdade incrementa
	str = strtok( NULL, " " ); //continua a procura da 2 palavra na srt1 e volta pra cima 
	}
return contador; // retorna contador
}
// func main

int main (){
    int contador;

char Frase[100];
char Palavra[20];

puts("Por favor introduza uma frase: ");
fgets(Frase,100,stdin);
puts("Por favor introduza uma palavra:  ");
fgets(Palavra,20,stdin);
Frase[strlen(Frase)+1]='\0';//adicionamos o caracter que indica o fim da string dentro das 100 pos

int conta_palavra( char *Frase, char *Palavra );


}

continuo sem return....

outra questão: eu estou a colocar um contador para me ir somando as palavras que encontra iguais

mas quando a função retorna ela devolve me o valor inteiro do contador ou o id da função??????

outra questão:

caso eu queira tambem saber qts palavras ele encontrou na 1 string  como as posso contar ????

Obrigado.... 

Link to comment
Share on other sites

Para chamares a função basta conta_palavra( Frase, Palavra );

Quando declaras é que precisas de colocar todo pois estás a dizer ao compilador quais são os tipos que a função vai trabalhar depois disso basta chamares a função e dizeres o que vais enviar.

Não entendi a segunda questão  😛

Link to comment
Share on other sites

desculpa a minha ignorancia....

mas sim eu sei isso como chamar a função  . foi por isso que perguntei no 2 post o pk de ter que colocar int antes de a chamar.

a analogia feita a maquina do chocolate penso não me ter ajudado muito, porque se a função é inteira e eu quero que ela me devolva inteiros pk tar outra vez a dizer int ?????  será que é porque a função recebe como parametros char????

ora se a função e int e se ela recebe char e se eu faço um return dela teoricamente sera int right???

a segunda questão é o seguinte :

no codigo que coloquei anteriormente estava a atribuir um contador para as palavras que encontrava como iguais .

mas alem desse contador quero tambem um outro para me contabilizar o numero toltal de palavras ...

so que continuo sem conseguir return da função conta_palavra.... mesmo ja tendo retirado o return fora do ciclo.....

obrigado... 

Link to comment
Share on other sites

Que confusão que vai aí.

Tu podes ter outros tipos de returns. Aliás podes ter muitos tipos de return!

Por exemplo:

int func1();
char func2();
void func3();
int *func4();
char *func5();

E depois ainda tens as structs definidas pelo programador e mais.

Tu não podes simplesmente dizer que queres retornar inteiros e não teres de declarar isso. O compilador não adivinha.

Quanto ao return 0 na main indica ao teu SO que o programa terminou sem erros.

O comando return retorna o valor 0 para o sistema, que é interpretado pelo mesmo como que a função main() foi executada e encerrada com sucesso (sem erros)

Algumas normas

here since 2009

Link to comment
Share on other sites

Tal como o Localhost disse o compilador não adivinha. Podes enviar só inteiros e receber um do tipo char ou enviar só char e receber um inteiro ou mesmo enviar dados e não receber nada (void). Logo tens de dizer sempre o que irá enviar. 

E tal como a analogia que fiz as moedas nada têm a ver com o chocolate são de tipos diferentes.

Tens de ter uma variavel que receba o  que é enviado pela função tu fazes return mas nenhuma variavel na main está a receber...

Só podes fazer return de uma variavel se quieseres mais informações dessa função teras de usar apontadores

Link to comment
Share on other sites

essa questão da variavel ja me tinha ocorrido e inclusive tinha testado fazendo

main()

.....

int total;

e depois

total =conta_palavra( char *Frase, char *Palavra );

}

so que ai da me erro dizendo  main. c : 40: error: expected expression before 'int'

Link to comment
Share on other sites

aqui vai


//verifica o numero de palavras 
int conta_palavra(char *Frase, char *Palavra){

char *str; //pont  k recebe a1 palavra do 1 vector
char *str2; // pont k recebe 2 vector

int contador=0; // cont
int contador2=0;

str =strtok(Frase," "); // str e delimitada pelo 1 espaço encontrado
while ( str != NULL ) {  //enq for difrente de vazio
	if(strcmp(str,str2)==0) // compara a 1 palavra retirada da str1 com a de str2
		++contador;  // se verdade incrementa
	str = strtok( NULL, " " ); //continua a procura da 2 palavra na srt1 e volta pra cima
	++contador2;
	}
return contador;
}
// func main

int main (){
    int total;

char Frase[100];
char Palavra[20];

puts("Por favor introduza uma frase: ");
fgets(Frase,100,stdin);
puts("Por favor introduza uma palavra:  ");
fgets(Palavra,20,stdin);
Frase[strlen(Frase)+1]='\0';//adicionamos o caracter que indica o fim da string dentro das 100 pos


total = int conta_palavra( char *Frase, char *Palavra );

}

explica me melhor essa parte de passagem por parametros caso possas.. par eu fazer return dos dois contadores da função para a main...

Obrigado..

Link to comment
Share on other sites

isso ficou me claro no outro post ....

dai ja so ter colocado um return....

agora como posso passar então por referencia  (apontador creio eu )???

colocando mais um argumento no inicio da funç????

desculpem se digo alguma estupidez mas quero mesmo perceber esta porcaria....LOL....

Link to comment
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
 Share

×
×
  • Create New...

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.