Jump to content
Sign in to follow this  
Red_Beret

Recursividade. Help again

Recommended Posts

Red_Beret

Ppl, alguem me ajuda com este exercicio?

capturaecra7fh.png

Fiz assim

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

int media=0, pos=0;

void classe(int argc, char *argv[]){
int n=0;
for(n=1;n<argc;n++){
	media=media + atoi(argv[n]);
	if(atoi(argv[n])>=9.5)
		pos++;
	classe(argc, atoi(argv[n]));
}
media=media/argc;
}




void main(int argc, char *argv[100]){
int ct;
if (argc==1){
	printf("introduza os valores (introduza um valor negativo para terminar)\n");
	do{
		scanf("%d", &argv[ct]);
		ct++;
	}while(atoi(argv[ct])>-1);
}
classe(argc, *argv[argc]);
printf("A média e %d.\n  %d alunos tiveram nota positiva\n", media, pos);
}

Para variar, não funciona

PS - Procedimento, é função sem return.

Share this post


Link to post
Share on other sites
vbmaster

Bem, normalmente se não sabes de onde vem o erro tens de ir por tentativas. Primeiro testas se os valores estão a ser correctamente recebidos na array, se estiverem é mais de meio caminho andado...

Eu não posso ajudar muito pois só sei c++, mas o problema não é díficil.... :thumbsup:

A média faz-se somando todos os valores do array de divindo pelo númeor de elementos que este contem (não esquecendo que um array começa em 0).

Já os alunos que tiverem negativa, é a medida que se correr a média, analizar a nota do aluno e caso seja nega, fazer um ++ noutra variável.

:)

Share this post


Link to post
Share on other sites
Red_Beret

pois.  mas o erro é mesmo no codigo.  Tou a fazer isto no VS, e ele diz que não consegue converter não sei o que nas linhas classe(argc, atoi(argv[n])  e classe(argc, *argv[argc]

Share this post


Link to post
Share on other sites
vbmaster

Não terás de dar também tamanho ao apontadores para array na função classe?

Share this post


Link to post
Share on other sites
brink@ero

pois.  mas o erro é mesmo no codigo.  Tou a fazer isto no VS, e ele diz que não consegue converter não sei o que nas linhas classe(argc, atoi(argv[n])  e classe(argc, *argv[argc]

Dá erro porque está a chamar a função assim:

	classe(argc, atoi(argv[n]));

Em que no segundo parâmetro está um inteiro, mas declaraste que o segundo parâmetro era um vector char!

void classe(int argc, char *argv[])

Ainda não olhei bem para o teu código, mas numa coisa reparei.

Se estas a fazer uma chamada recursiva, isso por si só é um ciclo! Não percebo a utilidade do ciclo for :) .

Aconselho fazeres o programa sem a chamada recursiva, só com o ciclo for. Depois apagas o ciclo for e fazes o programa com chamada recursiva.

Share this post


Link to post
Share on other sites
Red_Beret

eu ja tinha tentado assim. (com inteiros, e sem o for, etc)

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

int media=0, pos=0;

void classe(int argc, int argv[]){
int n=0;
	media=media + argv[n];
	if(argv[n]>=9.5)
		pos++;
	classe(argc, argv[n+1]);
	media=media/argc;
}




void main(int argc, int argv[100]){
int ct;
if (argc==1){
	printf("introduza os valores (introduza um valor negativo para terminar)\n");
	do{
		scanf("%d", &argv[ct]);
		ct++;
	}while (argv[ct]>-1);
}
classe(argc, argv[argc]);
printf("A média e %d.\n  %d alunos tiveram nota positiva\n", media, pos);
}

Mas da exactamente os mesmos erros  😳

capturaecra0bt.th.png

Share this post


Link to post
Share on other sites
brink@ero

Eu estava a dizer para fazeres o código sem efectuares chamada recursiva, não ao contrário!!

Se o teu programa não funciona sem a chamada recursiva, ou seja, só com um ciclo for, então com a chamada recursiva é que não funciona mesmo!

Se estas a dar os primeiros passos em C, não vais logo de cabeça por uma chamada recursiva sem perceberes como funciona, por isso é que digo que deves por isso a funcionar de modo simples sem uma chamada recursiva.

Eu fiz aqui um exemplo de uma chamada recursiva sem return.

Tenta perceber como faço as coisas e vê o que o programa faz!

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

void classe(int dimensao, char **vector, int *soma, int *positivo, int i)
{
if(dimensao>0)
{
	// e' so' para veres como isto funciona
	printf("%d- Parametro =\"%s\"\n",i, vector[i]);
	// fazes aqui as contas de somar e contar o numero de alunos com nota positiva
	// Nota: soma e positivo sao apontadores
	// Nota2: o primeiro argumento e' o nome do programa
	classe(--dimensao,vector,soma,positivo,++i);
}
}




void main(int argc, char *argv[])
{
int media=0, positivo=0, soma=0, n_alunos=0;

classe(argc,argv,&soma,&positivo,0);

// As restantes contas: o calculo da media

printf("A média e %d.\n  %d alunos tiveram nota positiva\n", media, positivo);
}

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  

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