thinkabout Posted January 6, 2013 at 09:09 PM Report #489943 Posted January 6, 2013 at 09:09 PM (edited) 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 January 6, 2013 at 11:42 PM by thinkabout
HappyHippyHippo Posted January 6, 2013 at 09:20 PM Report #489945 Posted January 6, 2013 at 09:20 PM 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 Portugol Plus
pmg Posted January 6, 2013 at 09:25 PM Report #489948 Posted January 6, 2013 at 09:25 PM 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!
thinkabout Posted January 6, 2013 at 09:49 PM Author Report #489951 Posted January 6, 2013 at 09:49 PM (edited) 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 January 6, 2013 at 09:50 PM by thinkabout
thinkabout Posted January 6, 2013 at 10:09 PM Author Report #489952 Posted January 6, 2013 at 10:09 PM (edited) 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 January 6, 2013 at 10:12 PM by thinkabout
pmg Posted January 6, 2013 at 10:15 PM Report #489953 Posted January 6, 2013 at 10:15 PM (edited) 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 January 6, 2013 at 10:16 PM 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!
thinkabout Posted January 6, 2013 at 10:50 PM Author Report #489955 Posted January 6, 2013 at 10:50 PM (edited) 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. 😕 😕 😕 😕 😕 , 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 January 6, 2013 at 10:53 PM by thinkabout
pmg Posted January 6, 2013 at 11:03 PM Report #489957 Posted January 6, 2013 at 11:03 PM (edited) 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 January 6, 2013 at 11:13 PM 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!
thinkabout Posted January 6, 2013 at 11:24 PM Author Report #489960 Posted January 6, 2013 at 11:24 PM (edited) 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 January 6, 2013 at 11:30 PM by thinkabout
pmg Posted January 6, 2013 at 11:39 PM Report #489963 Posted January 6, 2013 at 11:39 PM (edited) 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 January 6, 2013 at 11:40 PM 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!
thinkabout Posted January 6, 2013 at 11:45 PM Author Report #489964 Posted January 6, 2013 at 11:45 PM Certo, vou arrumar este então 🙂 Obrigado aos dois pela a ajuda.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now