Entendi, então é por isso que na aula 36 não foi necessário retornar o resultado da ordem crescente do vetor/matriz, já que não estamos mexendo com a copia daquele vetor, e sim com o endereço de memoria dele, então qualquer função pode alterar o valor dele a qualquer momento e mesmo assim não será necessário retornar o valor dele caso outra função queira acessar as alterações feita nele. MUITO BOM!! Estou gostando muito das aulas e estou aprendendo bastante com suas aulas prof, muito obrigado por compartilhar mais uma aula incrível!!
Quem também ficou com dúvida em relação à posição do vetor eu fiz um teste aqui colocando o valor 20 em vetor[0]. E o que acontece é que o vetor, assim como ele explica no vídeo, acaba mantendo esse valor. É possível ver um exemplo disso na aula 36.
Muito bom, estou aprendendo muito, e sei que quando eu estiver trabalhando em uma empresa como programador irei lembrar que muita coisa que saberei fazer dentro da empresa foi graças a suas preciosas aulas. Mas me tira uma duvida, o valor 10 do vetor[3], não esta atribuido no vetor[0] que é a primeira linha ?,Pois foi assim que aprendi com vocë.
Acontece que o professor atribuiu 10 à primeira posição e quando alterou, fez na segunda! Se a intenção era alterar o primeiro item do vetor, devia ser vetor[0]=20! Pequena falha técnica mas valeu muiiiiiiiiiito pelas aulas que estão me ajudando a desenferrujar!
+Ana Souza isso, viu bem o erro. Ou só colocar vetor = 20; Pq só a palavra VETOR sem as "[]"? Quando chamamos apenas a palavra VETOR, isso que dizer que estamos chamando a primeira posição desse vetor. Ou seja, se quiser chamar/atribuir a primeira posição, apenas deixa o nome do array, que no exercício é VETOR. Espero ter ajuda!
A intenção era mostrar que a variável é um cópia e o vetor não, logo o vetor ele inicia na posição que ele quiser, pois se iniciar na posição 2, por exemplo, não terá nenhuma diferença para passar a didática desta aula.
Jesimiel Efraim Só comentei pois, se me recordo bem, o professor ficou meio confuso na hora. Isso acontece. ;-) Quem programa sabe que são muitos detalhes e a gente se distrai.
É um comportamento diferente de outras linguagens! descobri pq o codigo que tentei adaptar de python para C estava dado erro, por causa que eu achei que estava criando uma coipia do vetor board que continha os dados do jogo da velha.
Se entendi bem, o valor imprimido do vetor foi 20 das 2 vezes, porque usou o endereço vetor[1], e o endereço do valor "10" é vetor[3]. Nao teve a ver com o caso de ser o valor da "copia" ou segunda variavel com o mesmo nome (como preferir chamar) e sim de ser o valor de endereços diferentes, em que num era a posição "1" do vetor e no outro era a posição "3" do mesmo vetor (quase como se fossem variáveis diferentes, pois correspondem a endereços de memoria diferentes). Certo?
Não cara vetor[3] é o tamanho do seu vetor, se você fizesse um printf("%d", vetor[3]); iria ser imprimido o valor 0 e não 10. de uma olhada nas aulas anteriores que falam sobre vetores
Desculpe meu linguajar, mas ele fez isso porque sim, pois veja bem, não há diferença nesse algoritimo se ele usar a posição inicial "0" ou o "1". Porém, se você quiser iniciar na posição 0, faça o seguinte. Dentro do main teŕa o "printf("Vetor na funcao principal = %d ",vetor[1]);" troque o 1 por 0 que ficará "printf("Vetor na funcao principal = %d ",vetor[0]);" e dentro da função void printf, troque o vetor[1]=20 por vetor[0]=20, e o, "printf("Vetor na funcao print = %d
",vetor[1]);" por "printf("Vetor na funcao print = %d
",vetor[0]);". Além disso, reveja as aulas de vetores, pois já era pra vc saber que ele inicia o vetor na posição que ele quiser.
Jesimiel Efraim Engano seu amigo, o 10 tá na posição 0, ele imprimiu 20 pelo simples fato de dentro da função ele ter atribuído 20 na posição 1, e quando imprimiu o vetor na posição 1 saiu o valor 20, mas se ele agora imprimir o vetor na posição 0 na função principal vai sair 10.
isso acontece pq apesar de ambas as variáveis se chamarem x, a da função print seria local da função, e por isso alterada apenas dentro desta e aparecendo a alteração só no print da função?? enquanto a variável x da main é também local apenas da main, e por isso uma variável diferente daquela da funçãoprint?? e vetores são sempre globais?? ou não tem nada a ver??
É feita uma cópia da variável que colocamos na passagem do parâmetro, sendo assim sendo uma variável diferente da que esta na função main, e vetores não são globais, já que para acessar um vetor, é preciso fazer também a passagem dele assim como qualquer outra variável ou dado que desejamos fazer uma passagem. Porém o compilador, diferente do que nas variáveis. No caso do vetor, ele faz a passagem do endereço de memoria do nosso vetor/matriz, o que faz com que qualquer função possa fazer alteração nele, já que estamos mexendo com o próprio vetor e não uma copia dele. Todo vetor que estiver dentro de uma função ele será local e apenas aquela função pode acessa-lo, (a não ser que feita a passagem do parâmetro). Se um vetor for declarado fora da função main, ele será global. Ai sim outras funções pode acessa-lo sem a necessidade de passar os argumentos.
O meu está exatamente igual e não compila por um erro na primeira void da funçao main, não entendo pq da esse erro se alguem poder me explicar eu agradeço desde já!
ALGUÉM ME CORRIJA POR FAVOR Criei dois vetores (Um para a Função secundária e um para a função principal) Linkei um vetor ao outro e funfo Aula boa mas no finalzinho eu fiquei meio em dúvida. Acho que a explicação no finalzinho saiu meio estranha. Ex: O código abaixo mostra que o valor do vetor na posição vetor[0] (Corrigindo o but no algoritmo) pode mudar dependendo de em que posição no algoritmo, a função (FunctionPrintf) é chamada e acho que mostra que o valor do (vetor[3]) foi copiado para o vetor (vet1[])... int main(void){ setlocale(LC_ALL, "portuguese"); system("color F0"); void FunctionScanf(int vet1[]); void FunctionPrintf(int y, int vet1[]); int x = 10; int vetor[3]; FunctionScanf(vetor); printf(" \t\t OS NÚMEROS DIGITADOS FORAM: "); printf(" \t\t\t VALOR DE X: [%i] ", x); printf("\t\t\t VALORES DO VETOR DE 3 BLOCOS: \t\t\t "); for(int c2 = 0; c2 < 3; ++c2){ printf("[%i] ", vetor[c2]); } printf("
"); printf("\t\t Variável INT X na Função principal = [%i] ", x); printf("\t\t Valor do Vetor na Posição [0] pela Função principal = [%i] ", vetor[0]); FunctionPrintf(x, vetor); // INTRODUZ O VALOR DA VARIÁVEL LOCAL X DA FUNÇÃO (main) NA VARIÁVEL LOCAL Y DA // FUNÇÃO (FunctionPrintf) E OS VALORES DO VETOR LOCAL (vetor) DENTRO DO VETOR // (vet1) DA FUNÇÃO (FunctionPrintf) printf("
\
"); system("pause"); return 0; } void FunctionScanf(int vet1[]){ // INTRODUZ 1 VALOR EM CADA UM DOS 3 BLOCOS DO vetor[3] printf(" \t\t DIGITE 3 NÚMEROS PARA O VETOR DE 3 BLOCOS: ...
"); for(int c1 = 0; c1 < 3; ++c1){ printf("\t\t "); scanf("%i", &vet1[c1]); } } void FunctionPrintf(int y, int vet1[]){ y += y; vet1[0] += vet1[0]; printf("
\t\t Variável X INT na Função Print é: = [%i] ", y); printf("\t\t O Valor do Vetor na posição [0] pela Função Print é: = [%i]
", vet1[0]); } //Copy Palladinus O que você quis dizer é que os valores de variáveis locais não podem ser alterados dentro de outras funções a não ser dentro das funções nas quais elas foram definidas mas os vetores sim?!
na verdade voce atribuiu 10 à primeira posição do vetor, e 20 à segunda. estou certo? porque pelo que eu havia entendido a primeira posição é o [0] e nao o [1]. so pra ter certeza pq me confundi nessa parte.
Só uma coisa, quando vc chama a função de um outro arquivo tipo "Funcoes.h" eu nao preciso declarar ela ne, pq quando o programa faz o #include "Funcoes.h" ele ja faz isso?
isso acontece porque a variavel x foi declarada dentro da função principal e se por acaso voce tivesse declarado a variavel X como uma variavel global (fora da função principal ) sera que mesmo assim ainda seria uma copia , ou se comportaria da mesma forma ???
Declarando "x" como uma variável global, não será preciso declarar uma variável local automática dentro da "funcaoPrint". Portanto, você alteraria o valor da variável global "x".
Corrigindo um vício de programação de funções. Ou você implementa a função: [tipo_retorno] nomeFuncao() { // Essa função define um campo, que pode receber o valor durante a depuração. [tipo] campo = {valor}; } ou [tipo_retorn] nomeFuncaoComArgumento([tipo] parametro) { /* Operacoes com os valores passados como argumento */ } void main() { [tipo] campo = "argumento"; nomeFuncaoComArgumento(campo); } Definir um campo dentro da função que já declara um parâmetro do mesmo tipo que este campo seria redundante. Ou se implementa de um jeito, ou do outro (dependendo do projeto). Ou seja: [valor_retorno] nomeFuncao([tipo] t) { // Esta forma de programação é uma má prática, mesmo que usada na explicação sob efeito didático. t = {valor}; } Observação: [tipo_retorno], [tipo], e {valor} estão baseados em conceito puramente matemático. É desnecessário definir [tipo] e [tipo_retorno] como int e subistituir {valor} por um número decimal.
like, like e like. A melhor explicação do YT sobre linguagem C!!!!!!
estou aprender bastante, obrigado jovem.
Entendi, então é por isso que na aula 36 não foi necessário retornar o resultado da ordem crescente do vetor/matriz, já que não estamos mexendo com a copia daquele vetor, e sim com o endereço de memoria dele, então qualquer função pode alterar o valor dele a qualquer momento e mesmo assim não será necessário retornar o valor dele caso outra função queira acessar as alterações feita nele. MUITO BOM!!
Estou gostando muito das aulas e estou aprendendo bastante com suas aulas prof, muito obrigado por compartilhar mais uma aula incrível!!
Melhor curso de C do youtoba!
isso mesmo.
Quem também ficou com dúvida em relação à posição do vetor eu fiz um teste aqui colocando o valor 20 em vetor[0]. E o que acontece é que o vetor, assim como ele explica no vídeo, acaba mantendo esse valor. É possível ver um exemplo disso na aula 36.
Fiz exatamente a mesma coisa. Boa garoto!!
Muito bom, estou aprendendo muito, e sei que quando eu estiver trabalhando em uma empresa como programador irei lembrar que muita coisa que saberei fazer dentro da empresa foi graças a suas preciosas aulas.
Mas me tira uma duvida, o valor 10 do vetor[3], não esta atribuido no vetor[0] que é a primeira linha ?,Pois foi assim que aprendi com vocë.
conseguiu trabalhar na area de programação?
Isso mesmo :)
Acontece que o professor atribuiu 10 à primeira posição e quando alterou, fez na segunda! Se a intenção era alterar o primeiro item do vetor, devia ser vetor[0]=20!
Pequena falha técnica mas valeu muiiiiiiiiiito pelas aulas que estão me ajudando a desenferrujar!
Ana Souza Eu testei aqui e rodou. pastebin.com/g19R4Z7v
+Ana Souza isso, viu bem o erro. Ou só colocar vetor = 20;
Pq só a palavra VETOR sem as "[]"?
Quando chamamos apenas a palavra VETOR, isso que dizer que estamos chamando a primeira posição desse vetor. Ou seja, se quiser chamar/atribuir a primeira posição, apenas deixa o nome do array, que no exercício é VETOR.
Espero ter ajuda!
A intenção era mostrar que a variável é um cópia e o vetor não, logo o vetor ele inicia na posição que ele quiser, pois se iniciar na posição 2, por exemplo, não terá nenhuma diferença para passar a didática desta aula.
Jesimiel Efraim Só comentei pois, se me recordo bem, o professor ficou meio confuso na hora.
Isso acontece. ;-)
Quem programa sabe que são muitos detalhes e a gente se distrai.
Ana Souza realmente...
muito bom
Seria legal se os códigos estive no disponível no GitHub :)
Escreva o código... ajuda a aprender mais.
Cara, onde vc conseguiu baixar o DevC++ em português? Acho q isso iria me ajudar um pouco, no caso, se eu errasse alguma coisa no meu código. Vlw!
É um comportamento diferente de outras linguagens! descobri pq o codigo que tentei adaptar de python para C estava dado erro, por causa que eu achei que estava criando uma coipia do vetor board que continha os dados do jogo da velha.
Se entendi bem, o valor imprimido do vetor foi 20 das 2 vezes, porque usou o endereço vetor[1], e o endereço do valor "10" é vetor[3]. Nao teve a ver com o caso de ser o valor da "copia" ou segunda variavel com o mesmo nome (como preferir chamar) e sim de ser o valor de endereços diferentes, em que num era a posição "1" do vetor e no outro era a posição "3" do mesmo vetor (quase como se fossem variáveis diferentes, pois correspondem a endereços de memoria diferentes). Certo?
Se tivesse colocado Vetor [3] ali na função main, iria exibir 10?
Não cara vetor[3] é o tamanho do seu vetor, se você fizesse um printf("%d", vetor[3]);
iria ser imprimido o valor 0 e não 10. de uma olhada nas aulas anteriores que falam sobre vetores
Nesse caso não tem como imprimir o vetor[3], pois só tem o vetor[0], vetor[1] e vetor[2], sendo que o vetor[2] é 0 ou '\0'
hmm.. foi direto do site deles mesmo cara... bloodshed é o site
Pq o vetor dele ta com indice "1", o primeiro indice nn é sempre o "0"... mi deixo confuso!?
Desculpe meu linguajar, mas ele fez isso porque sim, pois veja bem, não há diferença nesse algoritimo se ele usar a posição inicial "0" ou o "1". Porém, se você quiser iniciar na posição 0, faça o seguinte.
Dentro do main teŕa o "printf("Vetor na funcao principal = %d
",vetor[1]);" troque o 1 por 0 que ficará "printf("Vetor na funcao principal = %d
",vetor[0]);" e dentro da função void printf, troque o vetor[1]=20 por vetor[0]=20, e o, "printf("Vetor na funcao print = %d
",vetor[1]);" por "printf("Vetor na funcao print = %d
",vetor[0]);". Além disso, reveja as aulas de vetores, pois já era pra vc saber que ele inicia o vetor na posição que ele quiser.
Jesimiel Efraim Engano seu amigo, o 10 tá na posição 0, ele imprimiu 20 pelo simples fato de dentro da função ele ter atribuído 20 na posição 1, e quando imprimiu o vetor na posição 1 saiu o valor 20, mas se ele agora imprimir o vetor na posição 0 na função principal vai sair 10.
isso acontece pq apesar de ambas as variáveis se chamarem x, a da função print seria local da função, e por isso alterada apenas dentro desta e aparecendo a alteração só no print da função?? enquanto a variável x da main é também local apenas da main, e por isso uma variável diferente daquela da funçãoprint?? e vetores são sempre globais?? ou não tem nada a ver??
É feita uma cópia da variável que colocamos na passagem do parâmetro, sendo assim sendo uma variável diferente da que esta na função main, e vetores não são globais, já que para acessar um vetor, é preciso fazer também a passagem dele assim como qualquer outra variável ou dado que desejamos fazer uma passagem. Porém o compilador, diferente do que nas variáveis. No caso do vetor, ele faz a passagem do endereço de memoria do nosso vetor/matriz, o que faz com que qualquer função possa fazer alteração nele, já que estamos mexendo com o próprio vetor e não uma copia dele. Todo vetor que estiver dentro de uma função ele será local e apenas aquela função pode acessa-lo, (a não ser que feita a passagem do parâmetro).
Se um vetor for declarado fora da função main, ele será global. Ai sim outras funções pode acessa-lo sem a necessidade de passar os argumentos.
e quanto a passagem por referencia? n existe isso em C?
Uma função pode retornar mais de um valor?
Wesley Feitosa Não, a função só pode retorna uma valor mesmo
claro que pode return a, b , c; e assim por diante quantos vc quiser.
Wesley Feitosa você pode testar condições para poder retornar vários valores de acordo com qual condição será verdadeira.
por exemplo, se isso for verdadeiro retorna isso , caso contrário retorna isso, etc.
O meu está exatamente igual e não compila por um erro na primeira void da funçao main, não entendo pq da esse erro se alguem poder me explicar eu agradeço desde já!
+Luiz Eduardo Horbe Alves posta o teu código no pastebin e manda para que podemos ver e solucionar os problemas.
Provavelmente você não soube declarar sua função
show
ALGUÉM ME CORRIJA POR FAVOR
Criei dois vetores (Um para a Função secundária e um para a função principal)
Linkei um vetor ao outro e funfo
Aula boa mas no finalzinho eu fiquei meio em dúvida.
Acho que a explicação no finalzinho saiu meio estranha.
Ex: O código abaixo mostra que o valor do vetor na posição vetor[0] (Corrigindo o but no algoritmo) pode mudar dependendo de em que posição no algoritmo, a função (FunctionPrintf) é chamada e acho que mostra que o valor do (vetor[3]) foi copiado para o vetor (vet1[])...
int main(void){
setlocale(LC_ALL, "portuguese");
system("color F0");
void FunctionScanf(int vet1[]);
void FunctionPrintf(int y, int vet1[]);
int x = 10;
int vetor[3];
FunctionScanf(vetor);
printf("
\t\t OS NÚMEROS DIGITADOS FORAM:
");
printf("
\t\t\t VALOR DE X: [%i]
", x);
printf("\t\t\t VALORES DO VETOR DE 3 BLOCOS:
\t\t\t ");
for(int c2 = 0; c2 < 3; ++c2){
printf("[%i] ", vetor[c2]);
}
printf("
");
printf("\t\t Variável INT X na Função principal = [%i]
", x);
printf("\t\t Valor do Vetor na Posição [0] pela Função principal = [%i]
", vetor[0]);
FunctionPrintf(x, vetor);
// INTRODUZ O VALOR DA VARIÁVEL LOCAL X DA FUNÇÃO (main) NA VARIÁVEL LOCAL Y DA
// FUNÇÃO (FunctionPrintf) E OS VALORES DO VETOR LOCAL (vetor) DENTRO DO VETOR
// (vet1) DA FUNÇÃO (FunctionPrintf)
printf("
\
");
system("pause");
return 0;
}
void FunctionScanf(int vet1[]){
// INTRODUZ 1 VALOR EM CADA UM DOS 3 BLOCOS DO vetor[3]
printf("
\t\t DIGITE 3 NÚMEROS PARA O VETOR DE 3 BLOCOS: ...
");
for(int c1 = 0; c1 < 3; ++c1){
printf("\t\t ");
scanf("%i", &vet1[c1]);
}
}
void FunctionPrintf(int y, int vet1[]){
y += y;
vet1[0] += vet1[0];
printf("
\t\t Variável X INT na Função Print é: = [%i]
", y);
printf("\t\t O Valor do Vetor na posição [0] pela Função Print é: = [%i]
", vet1[0]);
}
//Copy Palladinus
O que você quis dizer é que os valores de variáveis locais não podem ser alterados dentro de outras funções a não ser dentro das funções nas quais elas foram definidas mas os vetores sim?!
Cara, reformule a sua dúvida kk Seu cometário tá muito confuso... :/
na verdade voce atribuiu 10 à primeira posição do vetor, e 20 à segunda. estou certo? porque pelo que eu havia entendido a primeira posição é o [0] e nao o [1]. so pra ter certeza pq me confundi nessa parte.
Sim, você está certo. Ele errou.
@@paulodesouza262 Ah sim, obrigado. Até hoje estava tentando entender isso.
Só uma coisa, quando vc chama a função de um outro arquivo tipo "Funcoes.h" eu nao preciso declarar ela ne, pq quando o programa faz o #include "Funcoes.h" ele ja faz isso?
Precisa! kk
A diferença é q vc deve declarar a função nesse arquivo " .h " kk :(
isso acontece porque a variavel x foi declarada dentro da função principal e se por acaso voce tivesse declarado a variavel X como uma variavel global (fora da função principal ) sera que mesmo assim ainda seria uma copia , ou se comportaria da mesma forma ???
Declarando "x" como uma variável global, não será preciso declarar uma variável local automática dentro da "funcaoPrint". Portanto, você alteraria o valor da variável global "x".
Corrigindo um vício de programação de funções.
Ou você implementa a função:
[tipo_retorno] nomeFuncao() {
// Essa função define um campo, que pode receber o valor durante a depuração.
[tipo] campo = {valor};
}
ou
[tipo_retorn] nomeFuncaoComArgumento([tipo] parametro) {
/* Operacoes com os valores passados como argumento */
}
void main() {
[tipo] campo = "argumento";
nomeFuncaoComArgumento(campo);
}
Definir um campo dentro da função que já declara um parâmetro do mesmo tipo que este campo seria redundante. Ou se implementa de um jeito, ou do outro (dependendo do projeto). Ou seja:
[valor_retorno] nomeFuncao([tipo] t) {
// Esta forma de programação é uma má prática, mesmo que usada na explicação sob efeito didático.
t = {valor};
}
Observação: [tipo_retorno], [tipo], e {valor} estão baseados em conceito puramente matemático. É desnecessário definir [tipo] e [tipo_retorno] como int e subistituir {valor} por um número decimal.