Jump to content

[Resolvido] Strings + Função recursiva


Red_Beret

Recommended Posts

Red_Beret

Ppl, alguem me ajuda a fazer este exercicio:

http://img451.imageshack.us/img451/6056/capturaecra1qh.png

De momento o codigo esta assim:

#include <stdio.h>


char caractere(char *a, int b, int c){
char d[50];
if(b<c){
	d[c]=a[c];
	caractere(a,b,c-1);
}
else
	return *d;
}

void main(){
char a[50];
int b,c;
printf("Introduza o texto\n");
scanf("%s",a);
printf("Introduza a primeira posição\n");
scanf("%d", &b);
printf("Introduza a segunda posição\n");
scanf("%d", &c);
puts(a);
if(b>c)
	printf("%s\n", caractere(a,c,b));
else
	printf("%s\n", caractere(a,b,c));
}
 

Escusado será dizer que este código está todo mal. Não pesco nada de strings :(

Link to post
Share on other sites

Biba, vê lá se era isto que querias :P

#include <stdio.h>

int caractere(char *a, int sup, int inf)
{
if(inf<=sup)
{
	char b;
	b=a[inf];
	printf("%c",b);
	inf++;
	caractere(a,sup,inf);
}

else return 1;	

}

int main()
{
  char a[50];
  int inf,sup;
  printf("Introduza o texto\n");
  scanf("%s",a);
  printf("Introduza a primeira posicao\n");
  scanf("%d", &inf);
  printf("Introduza a segunda posicao\n");
  scanf("%d", ⊃);

  if(sup>inf)
     caractere(a,sup,inf);
  else
     caractere(a,inf,sup);


  return 0;
  }

Alterei o nome das variaveis para ser mais perceptivel :cheesygrin:

É recursiva pois a funçao chama-se a si mesma .

Link to post
Share on other sites

if(inf<=sup)
{
	char b;
	b=a[inf];
	printf("%c",b);
	inf++;
	caractere(a,sup,inf);

não percebi esta parte, porque é que no fim poes de novo caractere(a,sup,inf)

edit : serve para voltar a xamar a funçao criando tipo um ciclo while certo ?

Link to post
Share on other sites

Exacto.

Anyway, isso serve só mesmo para se aprender a usar recursividade, porque usar recursividade aí é praticamente inutil..

Como eu resolveria (só por curiosidade)

#include <stdio.h>
#include <stdlib.h>

char * meio(char * s,int inf,int sup) {
     int i;
     char * aux;
     if ((aux=(char *) malloc(sup-inf+1))==NULL)
        return aux;
     for (i=0;i<sup-inf+1;i++) aux[i]=s[inf+i-1];
     aux[i]='\0';
     return aux;
}

int main() {
    char a[50];
    int inf,sup;
    printf("Introduza o texto\n");
    scanf("%s",a);
    printf("Introduza a primeira posicao\n");
    scanf("%d", &inf);
    printf("Introduza a segunda posicao\n");
    scanf("%d", ⊃);	
    printf("%s\n",inf <= sup ? meio(a,inf,sup) : meio(a,sup,inf));
    system("pause");
    return 0;
}

Com o malloc cria-se uma nova string. Eu sei que o que foi pedido era simplesmente mostrar os caracteres entre as duas posições (e para isso um simples for chegava) mas para os mais curiosos aqui está a forma de criar uma nova string contendo os caracteres intermedios.

Link to post
Share on other sites

A primeira duvida que pode existir é no operador ternário.

printf("%s\n",inf <= sup ? meio(a,inf,sup) : meio(a,sup,inf));

Vai-se imprimir a string do meio, mas antes disso temos que verificar se a primeira posição é menor que a segunda ou não.

isto pode ser traduzido +- desta forma

if (inf <= sup) meio(a,inf,sup)

else meio(a,sup,inf)

Com uma diferença. Enquando o if permite executar instruções, o operador ternário basicamente faz return a esse valor.

A segunda (provavelmente a maior) está na criação da string em si.

É preciso compreender Apontadores e Memória Dinâmica.

Uma pesquisa no google irá demonstrar facilmente o que foi feito.

Sorry mas nao me sinto com paciencia para explicar isto, foi feito so para me entreter e não para ser explicado :/

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