Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

[Resolvido] - Função - Dois vectores iguais. (problemas na passagem de valores para a função)

Mensagens Recomendadas

thinkabout

Consigo fazer o programa , se não tiver chamar uma função.

Mas estou com problemas em fazer o mesmo chamando a função.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
/*
Desenvolva uma função, que receba dois vectores de inteiros (e respectiva dimensão) e
verifique se estes são iguais.
A função deve devolver 1 se os dois vectores forem iguais ou devolver 0 se forem diferentes.
Considere que dois vectores são iguais se, na mesma posição, tiverem elementos com o mesmo valor.
*/
int iguais(int a[i], int b[i])
{
int i,check=0;
for (i = 0; i < 3; i++)
{
if (a[i] == b[i])
{
check++;
}
}if (check == 3)
{
return 1;
}
else
{
return 0;
}
}

main()
{
int i,j;
int a[3],b[3];printf("Quais os elementos do conjunto A ?\n" );
for (i = 0; i < 3; i++)
{
scanf("%d" , &a[i]);
}
printf("Quais os elementos do conjunto B ?\n" );
for (i = 0; i < 3; i++)
{
scanf("%d" , &b[i]);
}for (i = 0; i < 3; i++)
{
iguais (a[i], b[i]);
}

}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ainda não percebeste bem como declarar um protótipo de uma função:

<tipo_de_retorno> <nome_da_funcao>([<tipo_da_variavel> <nome_local_da_variavel> | ...])

olha bem para o que tens:

int iguais(int a[i], int b[i])
// devolve um inteiro : certo
// nome da função "iguais" : certo
// nome da primeira variável "a" : certo
// tipo de dados da primeira variável : array de inteiros e um i ??
// o que é i ??? não é nada 
// nome da segunda variável "b" : certo
// tipo de dados da segunda variável : array de inteiros e um i ???
// o que é i ??? não é nada 

o que necessitas é:

/*
* Desenvolva uma função, que receba dois vectores de inteiros (e respectiva dimensão) e verifique se estes são iguais.
* A função deve devolver 1 se os dois vectores forem iguais ou devolver 0 se forem diferentes.
* Considere que dois vectores são iguais se, na mesma posição, tiverem elementos com o mesmo valor.
*/
int iguais(int a[], int b[], int size);


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

A tua funcao iguais esta bem (tirando o i dos arrays) e devolve um valor. Usa esse valor!

Para definir uma funcao que recebe array, usa os parentesis vazios na definicao

int iguais(int a[], int b[]) { /* ... */ }

Para chamar uma funcao que recebe arrays, usa apenas o nome do array

printf("a funcao iguais() devolveu %d\n", iguais(a, b));


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

A tua funcao iguais esta bem (tirando o i dos arrays) e devolve um valor. Usa esse valor!

Para definir uma funcao que recebe array, usa os parentesis vazios na definicao

int iguais(int a[], int b[]) { /* ... */ }

Para chamar uma funcao que recebe arrays, usa apenas o nome do array

printf("a funcao iguais() devolveu %d\n", iguais(a, b));

Estava a tentar passar os valores 1 a 1 para ,dentro da função e posso mandar tudo de rajada com

iguais(a, b)

não sabia que podia fazer.

Eliminei o for que tinha na função main não estava lá a fazer nada.

O printf sabia que tinha que por para usar o valor, não o tinha feito era ainda.

o que necessitas é:

/*
* Desenvolva uma função, que receba dois vectores de inteiros (e respectiva dimensão) e verifique se estes são iguais.
* A função deve devolver 1 se os dois vectores forem iguais ou devolver 0 se forem diferentes.
* Considere que dois vectores são iguais se, na mesma posição, tiverem elementos com o mesmo valor.
*/
int iguais(int a[], int b[], int size);

Entendi o porque do a[], não entendi o porque do int size.

Segue o código já a trabalhar.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

/*
Desenvolva uma função, que receba dois vectores de inteiros (e respectiva dimensão) e
verifique se estes são iguais.
A função deve devolver 1 se os dois vectores forem iguais ou devolver 0 se forem diferentes.
Considere que dois vectores são iguais se, na mesma posição, tiverem elementos com o mesmo valor.
*/

int iguais(int a[], int b[])
{
int i,check=0;
for (i = 0; i < 3; i++)
{
 if (a[i] == b[i])
 {
  check++;
 }
}

if (check == 3)
{
 return 1;
}
else
{
 return 0;
}
}

main()
{
int i;
int a[3],b[3];
printf("Quais os elementos do conjunto A ?\n" );
for (i = 0; i < 3; i++)
{
scanf("%d" , &a[i]);
}
printf("Quais os elementos do conjunto B ?\n" );
for (i = 0; i < 3; i++)
{
scanf("%d" , &b[i]);
}

printf("A funcao iguais() devolveu %d \n", iguais(a, b));
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

o que necessitas é:

/*
* Desenvolva uma função, que receba dois vectores de inteiros (e respectiva dimensão) e verifique se estes são iguais.
* A função deve devolver 1 se os dois vectores forem iguais ou devolver 0 se forem diferentes.
* Considere que dois vectores são iguais se, na mesma posição, tiverem elementos com o mesmo valor.
*/
int iguais(int a[], int b[], int size);


#define _CRT_SECURE_NO_WARNINGS
#define SIZE 5
#include<stdio.h>

int iguais(int a[], int b[], int size)
{
int i,check=0;

for (i = 0; i < size; i++)
{
if (a[i] == b[i])
{
check++;
}
}

if (check == size)
{
return 1;
}
else
{
return 0;
}
}


main()
{
int i;
int a[],b[];

printf("Quais os elementos do conjunto A ?\n" );
for (i = 0; i < SIZE; i++)
{
scanf("%d" , &a[i]);
}

printf("Quais os elementos do conjunto B ?\n" );
for (i = 0; i < SIZE; i++)
{
scanf("%d" , &b[i]);
}

printf("A funcao iguais() devolveu %d \n", iguais(a, b, SIZE));

}

Humm... Tenho que ver como é faço para ele receber a "(e respectiva dimensão)"

Penso que é isso que eles querem a primeira pergunta ser, o tamanho dos conjuntos.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Pois agora o teu programa funciona para arrays com tres elementos.

Se os arrays passarem a ter 7 elementos tens que mudar a funcao!

Para evitar essa alteracao na funcao (e como pedido no enunciado) passa-se tambem o numero de elementos (foi a sugestao do Hippo).

Atencao que os arrays passados a funcao sao automaticamente convertidos em ponteiros para o primeiro elemento e, por isso mesmo, perdem a informacao do seu tamanho (os arrays sabem o seu proprio tamanho; os ponteiros para a posicao inicial dum array nao sabem quantos elementos tem o array).

Esta parte do teu codigo

if (check == size)
{
return 1;
}
else
{
return 0;
}

escreve-se, normalmente, assim

return check == size; // ha quem goste do parentesis: return (check == size);

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Pois agora o teu programa funciona para arrays com tres elementos.

Se os arrays passarem a ter 7 elementos tens que mudar a funcao!

Devo perguntar primeiro quanto elementos quero que o conjunto tenha , acho eu.

Mas os vectores não gostam de

int a[size],b[size];

Atencao que os arrays passados a funcao sao automaticamente convertidos em ponteiros para o primeiro elemento e, por isso mesmo, perdem a informacao do seu tamanho (os arrays sabem o seu proprio tamanho; os ponteiros para a posicao inicial dum array nao sabem quantos elementos tem o array).

Completamente a anhar com com esta parte. :confused: :confused: :confused: :confused: :confused: , ainda não dei ponteiros.

escreve-se, normalmente, assim

return check == size; // ha quem goste do parentesis: return (check == size);

Obrigado já "corrigi".




#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int iguais(int a[], int b[], int size)
{
int i,check=0;

for (i = 0; i < size; i++)
{
if (a[i] == b[i])
{
check++;
}
}

return check == size;
}


main()
{
int i;
int a[],b[];
int size;

printf("Tamanho dos conjuntos ?\n" );
scanf("%d" , &size);


printf("Quais os elementos do conjunto A ?\n" );
for (i = 0; i < size; i++)
{
scanf("%d" , &a[i]);
}

printf("Quais os elementos do conjunto B ?\n" );
for (i = 0; i < size; i++)
{
scanf("%d" , &b[i]);
}

printf("A funcao iguais() devolveu %d \n", iguais(a, b, size));

}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Mas os vectores não gostam de

int a[size],b[size];

Uma solucao comum (?) é definir os arrays com "tamanho suficiente" e ignorar os elementos nao necessarios.

int a[10000], b[10000]; // tamanho "suficiente"
a[0] = 42; a[1] = 17; a[2] = -4;
b[0] = -1; b[1] = -9; b[2] = 60;
printf("%d\n", iguais(a, b, 3)); // ignora a[3], a[4], ... assim como b[3], b[4], ...

Outra solucao é usar ponteiros e memoria dinamica :)

Ainda outra solucao é usar um compilador mais recente (de C99) que aceita a definicao de arrays com tamanho nao constante (tal e qual como no teu exemplo). Nao me lembrei desta solucao antes porque nao a costumo usar -- esta solucao levanta outros problemas que prefiro evitar.

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Mas os vectores não gostam de

Código ©:

int a[size],b[size];

Queria dizer que eles não gostam de uma expressão que não seja constante.

int a[10000], b[10000]; // tamanho "suficiente"
a[0] = 42; a[1] = 17; a[2] = -4;
b[0] = -1; b[1] = -9; b[2] = 60;
printf("%d\n", iguais(a, b, 3)); // ignora a[3], a[4], ... assim como b[3], b[4], ...

Asssim já meti a bombar

Tentei fazer outra coisa mas recebo um warning, apesar de funcionar.

#include<limits.h>
{
main()
unsigned int a[iNT_MAX],b[iNT_MAX];  <--  total size of array must not exceed 0x7fffffff bytes  
/* .... */
}

Penso que tem haver com a memória, como é posso saber até onde o programa pode ir sem estoirar ?

Ao chegar esse valor se quiser continuar para a frente, existe algum "artificio" para libertar a memória e continuar ?

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

INT_MAX !!!! Sabes quanto isso é? :)

Muito provavelmente é 2,147,483,647. Para que é que queres tantos elementos? !?!?!?!?!@@@##

... como é posso saber até onde o programa pode ir sem estoirar ?

Nao te preocupes com isso. Usa um valor "suficiente" relativamente pequeno (nao estou a ver o teu professor a fazer 10,000 numeros para testar o programa), na ordem dos milhares ou dezenas de milhar quando muito.

Quando precisares de mais do que isso ja deste topicos mais avancados.

Ao chegar esse valor se quiser continuar para a frente, existe algum "artificio" para libertar a memória e continuar ?

Sim, nao é artificio nenhum. Podes usar outro tipo de zona de memoria ou ponteiros (mas deixa isso para quando o professor falar disso) ... e na pior das hipoteses podes usar o disco duro como memoria auxiliar.

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.