• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Red_Beret

Recursividade. Help again

7 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);
}

0

Partilhar esta mensagem


Link 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