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

ptrci

Resolução de teste

3 mensagens neste tópico

Estou a tentar resolver este teste: http://dct.ual.pt/aed2/AP-website/acessorio/MiniTeste2-1.pdf

Criei este código.

Acho que em vez de estar a passar valores estou a passar endereços.

Qual é o erro ?

include <stdio.h>
#define dimVector 20

int SepararParesImpares(int vecOriginal[], int *N, int vecPares[], int vecImpares[])
{
int indice, par = 0;

for ( indice = 0; indice < *N; indice++ )
{
	if ((int) vecOriginal[indice] % 2 == 0)
	{
		vecPares[*N] = vecOriginal[indice];
		par = par + 1;
	}
	else
	{
		vecPares[*N] = vecOriginal[indice];
	}
	return par;
}

return par;
}


int main ()
{
int vecOriginal[dimVector] = { 78, 12, 67, 90, 23, 46, 7 ,2 };
int vecPares[dimVector];
int vecImpares[dimVector];
int indice, NelemstPares, N = 8;

printf ("Vector original: ");
for ( indice = 0; indice < N; indice++ )
	printf ("%d ", vecOriginal[indice]);
putchar ('\n');

NelemstPares = SepararParesImpares(&vecOriginal, &N, &vecPares, &vecImpares);
printf ("Numeros Pares: %d \n", NelemstPares );

printf ("Vector numeros Pares: ");
for ( indice = 0; indice < vecPares[dimVector]; indice++ )
	printf ("%d ", vecPares[indice]);
putchar ('\n');

printf ("Vector numeros Impares: ");
for ( indice = 0; indice < vecImpares[dimVector]; indice++ )
	printf ("%d ", vecImpares[indice]);
putchar ('\n');

return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens razão, estás a passar os endereços dos apontadores em vez dos próprios apontadores.

Em vez de chamares

SepararParesImpares(&vecOriginal, &N, &vecPares, &vecImpares);

chama

SepararParesImpares(vecOriginal, &N, vecPares, vecImpares);

Depois, aquele return par que está dentro do for está a mais, tens que o remover senão retornas logo na primeira iteração do for. E só estás a alterar o vector dos pares, no else tens que inserir é no dos ímpares.

E não é necessário passares um apontador para o N, mas isso não é bem um erro, é mais um warning :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Além disso, não resolves o problema.... sempre que encontras um par, estás a metê-lo no vecPares[N], e o N não muda.... tens de metê-los no vecPares[par].

depois quando não é par estás a metê-lo de novo no vecPar, e no mesmo sítio, mas isso já é distracção....... :P

deves metê-los no vecImpares[contador_de_impares].

contador de ímpares, se não me falha o raciocínio, será sempre [indice - par]. evita outra variável....

EDIT:

implementação para 20 valores:

#include <stdio.h> 
#define dimVector 20 

int SepararParesImpares(int *vecOriginal, int N, int *vecPares, int *vecImpares)
{
    int indice = 0;
    int pares  = 0;

    for(indice = 0; indice < N; indice++)
    {
        if((vecOriginal[indice] % 2) == 0)
        {
            vecPares[pares] = vecOriginal[indice];
            pares++; // nota que so incremento depois, para preencher vecPares desde [0]
        }
        else // que eu saiba so ha pares e impares xD
        {
            vecImpares[indice - pares] = vecOriginal[indice];
            // "pares" fica igual, obviamente
        }
    }

    return pares;
}

int  main ()
{ 
    int vecOriginal[dimVector] = {78, 12, 67, 90, 23, 56, 7, 2 }; 
    int indice, NelemtsPares, N = 8; 
    int vecPares[N], vecImpares[8];

    printf("Vector original: "); 
    for(indice = 0; indice < N; indice++) 
    {
        printf("%3d", vecOriginal[indice]); 
    }
    printf ("\n"); 
      
    NelemtsPares = SepararParesImpares(vecOriginal, N, vecPares, vecImpares); 

    printf("Vector de pares: ");
    for(indice = 0; indice < NelemtsPares; indice++)
    {
        printf("%3d", vecPares[indice]);
    }
    printf("\n");

    printf("Vector de impares: ");
    for(indice = 0; (indice + NelemtsPares) < N; indice++)
    {
        printf("%3d", vecImpares[indice]);
    }
    printf("\n");

    getchar();
    return 0;
}

RE-EDIT:

não fosse o exercício focar mais a função de separar os pares dos ímpares, eu criaria uma função "void imprimirVec(int *vec, int N)", uma vez que estamos a imprimir arrays 3 vezes, sempre da mesma forma.....

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