Jump to content
thinkabout

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

Recommended Posts

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

}

Edited by thinkabout

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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));
}

Edited by thinkabout

Share this post


Link to post
Share on other 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.

Edited by thinkabout

Share this post


Link to post
Share on other 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);

Edited by 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!

Share this post


Link to post
Share on other 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));

}

Edited by thinkabout

Share this post


Link to post
Share on other 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.

Edited by 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!

Share this post


Link to post
Share on other 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 ?

Edited by thinkabout

Share this post


Link to post
Share on other 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.

Edited by 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!

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

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