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

mymind

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

Mensagens Recomendadas

mymind

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

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

  }

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Sim tens razão :P

Por razoes de segurança faz o que Localhost disse, usa fgets() ao invés de gets basta fazeres fgets(string,tamanhodastring,strdin).

exemplo:

char palavra[50];

fgets(palavra,50,stdin);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

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  :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

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'

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

void func(int *pt) {
  *pt = 2;
}

int main(void) {
  int i = 10;
  func(&i);
  printf("%i\n", i);
  return 0;
}

Aconselho-te a leres sobre ponteiros.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

ok


void func(int *pt) { //este parametro e de saida ou entrada??? calculo que seja de saida!!!
  *pt = 2; // das o valor 2 ao ponteiro
}

int main(void) {
  int i = 10;  // este I  toma o valor de dez
  func(&i); passas o endereço de I a func que que tem como parametro um ponteiro *pt  como argumento de saida ou entrada?????
  printf("%i\n", i); // pk  print %i\n e não %d\n....
  return 0;
}

o que me faz confusão e os parametros nas unções quais o que recebem e devolvem ....

não sei se estou a ser claro

e sei que o output deste e 2 sim  ....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Paramêtros de entrada e de saída? O que é isso?

Quanto ao %i é exactamente a mesma coisa que ter %d.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

void func(int *pt) {  // tudo o que está entre parenteses é de entrada. os unicos valores que podem sair tera de ser por retorn.
  *pt = 2; // das o valor 2 ao ponteiro
}

int main(void) {
  int i = 10;  // este I  toma o valor de dez
  func(&i); passas o endereço de I a func que que tem como parametro um ponteiro *pt  para que possas interagir com o i fora da função, isto é, tudo o que fizeres fora main com o *pt, que é um apontador, estarás a mudar directamente os valores de i por isso neste caso não precisas de fazer retorn
  printf("%i\n", i); // pk  print %i\n e não %d\n....
  return 0;
}

Aconselho vivamente a ler um livro de c para teres as bases todas direitinhas se não quando estiveres com um problema mais avança vais te confundir...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Em passagem por valor é feita uma cópia do valor que estás a passar. Ou seja, a variável que declarares como parâmetro formal vai receber esse valor. Essa variável (parâmetro formal) existe realmente na memória mas só vai receber esse valor. No final de contas nunca vais poder alterar a variável que foi passada para a função mas só a variável que receber o valor da mesma.

Na verdade, nas passagens por referência acontece exactamente a mesma coisa, é passada uma cópia do valor. No entanto, neste caso nós vamos passar o endereço da variável que queremos modificar. O tipo de variável que recebe endereços são os ponteiros, ou seja, declaras como parâmetro formal um ponteiro, em seguida passas para a função o endereço da variável. A partir daí trabalhas com esse ponteiro. Estás na realidade a trabalhar com a variável que se encontra no endereço da variável que passaste para a função.

Existe ainda outros casos em que por exemplo queres retornar um ponteiro mas isso já é outra conversa.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mymind

boas

decidi mandar o meu xcode a fava infelismente e fui buscar o meu eclipse e então voltei a rescrever esta treta toda...

agora consigo correr o o programa e ja tenho output como pretendia ....

acabei por não ser necessário a utilização de ponteiros mas não deixei o caso em claro, ate pk ja tenho contemplado o assunto com alguma literatura....

a minha questão neste momento prende se ao facto de necessitar de ter este programa escrito sem necessidade de recorrer ao uso das bibliotecas de string s pk assim mo exigem....

poderei contar com algumas ideias vossas para saber como comparar a string com uma outra e ao mesmo tempo como separar uma palavra de uma frase tb....

junto envio o codigo....


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


void conta_palavra(char *frase,char *palavra){
    int cont=0, cont1=0;
    char *str1;

    /* extract first string from string sequence */
    str1 = strtok(frase, " ");

    /* loop until finishied */
    while (str1 != NULL){
        cont++;

    if(strcmp(str1,palavra)==0){
            cont1++;
        }
        str1 = strtok(NULL," ");
    }

    printf("O total de palavras encontradas foi de: %d\n", cont);
    printf("A segunda palavra foi encontada: %d, vezes", cont1);
}


void main(){
    char frase[100], palavra[100];
    printf("Por favor introduza a frase: ");
   
    gets(frase);
    printf("Por favor introduza a palavra: ");
   
    gets(palavra);
    conta_palavra(frase,palavra);
}


tank s

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.