Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Urbieta

Problema com função aqui...

Recommended Posts

Tem que ter uma função pra alterar uma string e retornar ela sem suas vogais. Só que também tem q retornar a quantidade de vogais removidas.

 

Mas função só retorna 1 valor não é?

 

Bom, tirando as partes do programa principal, eu coloquei só a função aqui:

char alterastring (char a[]) {	 int i, j, cont=0;	 for (i=0;i<strlen(a);i++) {		 if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u' ||			 a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U') {				  //remove				  for (j=0;j<strlen(a);j++)					 a[j] = a[j+1];					 				  cont++;		 }	 }	 //??}

Ali no "//??" tem que ser o que vai ser retornado, mas eu não consegui fazer retornar nem a string.

Tentei colocar "return a", mas ficou dando um erro que eu não conheço lá.

 

O for que remove as vogais tá certo né? E como faz pra retornar a string e a variável cont? Tem como?

Valeu ae...

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse algoritmo está em C??

 

num manjo muito da sintaxe de C naum, mas aqui vai minha contribuição...

 

Primeiramente no "//remove" no for não seria:

for (j=i;j<strlen(a);j++)

 

você tentou return a ou return (a) ? como ja disse não conheço a sintaxe, mas eu acho que tem que ter os parenteses, ou seja return (a).

 

agora o problema da variável cont, não é melhor você passá-la como parâmetro por referência na função?!

 

falo abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, a única linguagem de programação que eu conheço onde você pode devolver duas variáveis é perl, se tais usando C é melhor usar parâmetros por referências (ou ponteiros), só peço que não tente usar variáveis globais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem! Pelo que sei, não há como retornar mais de um valor através de uma função e muito menos valores de tipos distintos, como é o seu caso (texto modificado = char e vogais removidas = int).

 

Não entendi muito bem o que você quer, mas fiz um algoritmo baseado no que entendi. Não modifiquei a sua função de alterar string.

 

Peguei a sua função para alterar a string e criei outra pra retornar o número de vogais removidas. Segue o código:

 

#include <iostream.h>#include <stdlib.h>#include <string.h>char* alterastring (char a[]) {	 int i, j, cont=0;	 for (i=0;i<strlen(a);i++)	 {		 if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u' ||			 a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U')			 {				  //remove				  for (j=0;j<strlen(a);j++)				  {					  a[j] = a[j+1];				  }				  cont++;			 }	 }	 return a;}int vogaisremovidas(char string1[50], char string2[50]){	 return strlen(string1) - strlen(string2);}int main(){	  char primString[50],  // Recebe uma string digitada pelo usuário	  secString[50];		// Recebe a string modificada	  cout<<"Digite uma string ";	  cin>>primString;	  system("cls");	  strcpy (secString, primString);  /* atribui o valor da primeira string à										  segunda, afim de preservar o valor da										  primeira string */	  strcpy (secString, alterastring(secString));  // receber string modific.	  cout<<"String modificada: "<<secString<<endl;	  cout<<"Vogais removidas: "<<vogaisremovidas(primString, secString)<<endl;	  system("pause");	  return 0;}

Apesar do tópico ser um pouco velho, espero ter ajudado. http://forum.imasters.com.br/public/style_emoticons/default/ninja.gif http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vergil,

 

eu não sei se você leu minha resposta anterior, mas nela eu havia alertado sobre o "for" na hora de remover a vogal...

 

char* alterastring (char a[], int *cont=0) {	 int i, j;	 for (i=0;i<strlen(a);i++)	 {		 if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u' ||			 a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U')			 {				  //remove				  for (j=i;j<strlen(a);j++)				  {					  a[j] = a[j+1];				  }				  cont++;			 }	 }	 return a;}
A variável "J" deve receber o valor da variável "I", senão ele vai sempre remover a letra da posição 0 da string. Muito provavel que não seja a vogal que deve ser removida.

 

Outra observação é: Pq você manteve a variável CONT na sua função alterastring, se a contagem de strings removidas você faz na função vogaisremovidas.

 

 

Eu ainda acho melhor passar a variável CONT por referência na função alterastring para não ter que criar outra função só pra contar. se não me engano para passar por referência deve-se usar uma asterísco antes do nome da variável.

char* alterastring (char a[], int *cont=0)
me corrijam se eu estiver errado.

 

 

abcd_man,

 

não entendi o motivo de não usar variáveis globais... Se eu for passar um parâmetro por referência na função alterastring eu terei que ter uma variável global no parametro real para receber o valor do parametro passado por referência no parâmetro formal da função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

frlouzada,

 

Sim, eu li sua resposta e concordo. Como disse não modifiquei a função dele (cabe a ele fazer isso, afinal, não era essa a dúvida). A dúvida era sobre retornar valores. E o programa que eu fiz satisfaz essa necessidade. Agora cabe a ele fazer as modificações lógicas do programa dele. Afinal, ele já disse que o main dele já está pronto.

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

abcd_man,não entendi o motivo de não usar variáveis globais... Se eu for passar um parâmetro por referência na função alterastring eu terei que ter uma variável global no parametro real para receber o valor do parametro passado por referência no parâmetro formal da função.

Não necessariamente, uma variável global vai ficar visível em todo o programa, incluido todos os métodos, o que eu acho que cria uma confusão desnecessária, ele apenas precisa criar espaço na memória apenas no momento de chamar o método e passar o ponteiro para a função usar, logo depois de usar a resposta da função ele pode liberar o espaço da memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah sim... entendi o que você quis dizer...mas na minha opinião uma coisa compensa a outra.O espaço ocupado por uma variável do tipo inteiro na memória é tão pequeno, sem contar que quem não sabe trabalhar muito bem com ponteiro pode se complicar e no caso do C, pode acabar gerando problemas com ponteiro, como ponteiro pendurado e variável heap-dinâmica perdida. Nesse caso sim ele terá confusão desnecessária.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Bruno!Sua proposta de solução apresentada já está correta, salvo obviamente a observação de frlouzada sobre o seu laço "for".Na linguagem C, um vetor passado como parâmetro para uma função, (no seu caso é "char a[]") já faz com que a informação contida neste vetor seja alterada.Com isso, você não precisa "retornar" a string. Ela já está sendo modificada dentro da função, entende? Já irá "retornar" para o programa principal com as modificações feitas, entende?Assim, só é preciso acrescentar um CONTADOR de vogais encontradas dentro de sua função e fazer com que ela retorne este valor INTEIRO (e não um "char" como você previu inicialmente).Espero ter auxiliado... Qualquer dúvida, estamos por aqui, ok? Abraços,Luciana.ps: a solução do Vergil é interessante, sem dúvida, mas fiquei com a impressão de que não faz exatamente o que o Bruno pediu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.