A questão de passar muitos valores para uma função já foi discutida no post sobre como passar vetores para uma função, portanto, não pretendo me repetir.
Passar uma matriz para uma função é muito parecido com passar um vetor, mas é importante saber como uma matriz fica representada na memória do seu computador para entender o modo certo de fazer isso.
Uma matriz, na verdade, não é armazenada por linhas e colunas como estamos acostumados a representá-las. Na memória do seu computador os elementos da sua matriz aparecem sequencialmente. Imaginando a matriz do post anterior:
| 1 2 3 |
| 4 5 6 |
| 7 8 9 |
Ela seria representada na memória da seguinte forma:
| 1 2 3 4 5 6 7 8 9 |
Portanto, quando fizéssemos referência, na função que recebeu a matriz, ao elemento matriz[1][2], por exemplo, que representaria o valor 6, como ela encontraria esse elemento? O computador vai saber que ela está na linha 2 (de índice 1), mas não sabe quantos elementos para frente ele tem que andar na memória. Por isso, o cabeçalho da função auxiliar que receberá a matriz é declarado da seguinte forma:
tipoDaFunção nomeDaFunção (int matriz[][col])
Ao chamar essa função, como nos vetores, basta passar o nome da matriz:
...
nomeDaFunção (matriz);
...
E por hoje é só.
Até a próxima galera!
Programação I .:. PUC-Rio
sexta-feira, 29 de outubro de 2010
Matrizes
Matrizes em C são exatamente a mesma coisa que as matrizes que conhecemos da vida real. Uma matriz, como um vetor pode armazenar os tipos de valores conhecidos de C (char, int...), a diferença é que na matriz esses valores estão mapeados bidimensionalmente (em linhas e colunas).
A declaração de uma matriz é muito parecida com a declaração de um vetor:
...
int matriz[lin][col];
...
Onde lin é o número de linhas da matriz e col o número de colunas.
Todas as operações com matrizes são iguais as do vetor.
Vamos supor que tenhamos alocado uma matriz 3x3 de inteiros e preenchido ela da seguinte forma:
| 1 2 3 |
| 4 5 6 |
| 7 8 9 |
Para pegar o valor 5 digitaríamos matriz[1][1]. Lembrando que a indexação de matriz, assim como em vetores começa de 0.
Acho que não tenho muito mais o que falar sobre matrizes. :S
Então, bons estudos!
E, mandem e-mails pra mim ou os outros monitores listados ali do lado.
Até a próxima!
A declaração de uma matriz é muito parecida com a declaração de um vetor:
...
int matriz[lin][col];
...
Onde lin é o número de linhas da matriz e col o número de colunas.
Todas as operações com matrizes são iguais as do vetor.
Vamos supor que tenhamos alocado uma matriz 3x3 de inteiros e preenchido ela da seguinte forma:
| 1 2 3 |
| 4 5 6 |
| 7 8 9 |
Para pegar o valor 5 digitaríamos matriz[1][1]. Lembrando que a indexação de matriz, assim como em vetores começa de 0.
Acho que não tenho muito mais o que falar sobre matrizes. :S
Então, bons estudos!
E, mandem e-mails pra mim ou os outros monitores listados ali do lado.
Até a próxima!
quinta-feira, 28 de outubro de 2010
Cadeia de Caracteres
Até agora em C a gente só aprendeu como armazenar um caracter, usando uma variável do tipo char.
E se precisarmos armazenar uma palavra?
Para armazenar palavras, frases, textos ou cadeias de caracteres em geral usaremos um vetor de caracteres, ou seja, um vetor de char.
A idéia é muito simples.
Se precisarmos armazenar o nome "Ruan". Apenas um nome aleatório que me veio à cabeça :)
Precisaríamos, primeiramente, declarar uma variável vetor de char com 5 posições, uma a mais do que a palavra a ser armazenada. (explicarei o por quê depois).
char nome[5];
Depois faria o seguinte:
nome[0] = 'R';
nome[1] = 'u';
nome[2] = 'a';
nome[3] = 'n';
nome[4] = '\0';
O '\0' é usado para definir o final da palavra, por isso precisamos sempre definir a palavra com um espaço a mais.
Agora você me fala: "Isso não foi nada simples! E se eu precisasse guardar a palavra pneumoultramicroscopicossilicovulcanoco?"
Não seria nada agradável, é verdade.
Temos um outro problema! Como faríamos para ler uma palavra que o usuário digitou do teclado? E imagine como seria um saco imprimir isso!
Por sorte, em C existe um tipo chamado string. As strings não são tipos de variáveis, mas existe o %s no scanf e no printf, que serve para ler e escrever strings.
Note que o método usado acima, apesar de nada bom, é funcional, visto que na verdade as strings de C são vetores de caracteres.
O %s é uma maravilha do C que evita você ter que se incomodar com isso para fazer as operações de scanf e printf, portanto, sejam felizes com ela!
Até a próxima pessoal!
E se precisarmos armazenar uma palavra?
Para armazenar palavras, frases, textos ou cadeias de caracteres em geral usaremos um vetor de caracteres, ou seja, um vetor de char.
A idéia é muito simples.
Se precisarmos armazenar o nome "Ruan". Apenas um nome aleatório que me veio à cabeça :)
Precisaríamos, primeiramente, declarar uma variável vetor de char com 5 posições, uma a mais do que a palavra a ser armazenada. (explicarei o por quê depois).
char nome[5];
Depois faria o seguinte:
nome[0] = 'R';
nome[1] = 'u';
nome[2] = 'a';
nome[3] = 'n';
nome[4] = '\0';
O '\0' é usado para definir o final da palavra, por isso precisamos sempre definir a palavra com um espaço a mais.
Agora você me fala: "Isso não foi nada simples! E se eu precisasse guardar a palavra pneumoultramicroscopicossilicovulcanoco?"
Não seria nada agradável, é verdade.
Temos um outro problema! Como faríamos para ler uma palavra que o usuário digitou do teclado? E imagine como seria um saco imprimir isso!
Por sorte, em C existe um tipo chamado string. As strings não são tipos de variáveis, mas existe o %s no scanf e no printf, que serve para ler e escrever strings.
Note que o método usado acima, apesar de nada bom, é funcional, visto que na verdade as strings de C são vetores de caracteres.
O %s é uma maravilha do C que evita você ter que se incomodar com isso para fazer as operações de scanf e printf, portanto, sejam felizes com ela!
Até a próxima pessoal!
Operando Com Arquivos
Em muitas situações ao se codificar programas, o tamanho da entrada e/ou da saída de um programa pode ser relativamente grande, inviabilizando que ambas estejam visualizadas no terminal (tela). Logo, C permite que tanto a entrada quanto a saída também sejam um arquivo, facilitando assim passar os dados para o programa e recebendo a resposta de uma maneira mais organizada.
Primeiramente, deve-se saber que as funções relativas à arquivo estão já na biblioteca stdio.h (IO = Input/Output = Entrada/Saída). Porém, também precisaremos da stdlib.h, pois será necessário utilizar uma função desta biblioteca que tratará o erro relativo ao caso do arquivo a ser usado no programa não existir ou não haver memória suficiente para criá-lo.
OK, agora irei explicar aqui os passos para se trabalhar com arquivos em C:
1-> Declarar uma variável do tipo arquivo (uma variável para cada arquivo a ser utilizado). Como a declaração de variáveis de tipo int, float, double e char, ela também deve ser feita no início de uma função.
...
FILE * arquivo;
...
Como vocês devem lembrar o * indica que a variável é um ponteiro. Ela aponta para o arquivo na memória do computador.
2-> Uma vez declarada, agora você deve associar esta variável a um arquivo existente ou a um arquivo a ser criado, chamando a função fopen (chamamos esta ação também de abrir o arquivo). O primeiro parâmetro desta função é o nome do arquivo (em PROG iremos apenas trabalhar com arquivos .txt), e em seguida o modo em que este arquivo será trabalho. Não se deve esquecer de fazer o tratamento de erro citado anteriormente. Ele é feito com o comando exit(1); que aborta o programa imediatamente e fecha todos os arquivos que tenham sido abertos.
exemplo:
arquivo = fopen("entrada.txt", "r");
if ( arquivo == NULL )
{
printf("Erro na abertura do arquivo!\n");
exit(1);
}
Repare que se a função fopen não conseguir abrir o determinado arquivo ela retorna NULL para a variável arquivo.
Em PROG, só usaremos dois modos, "r" para leitura de arquivo e "w" para gravação de arquivo.
3-> Agora iremos ver como manipular este arquivo. Caso você esteja lendo arquivo, para ler as informações contidas nele, a função fscanf deve ser chamada. É praticamente idêntica à função scanf, a única informação a mais a ser passada é o nome da variável onde você armazenou o retorno da fopen (que seria o arquivo aberto). A fscanf também retorna a quantidade de dados lidos com sucesso a cada execução:
exemplo:
para ler do arquivo os dados
1 2 3
4 5 6
faz-se:
while ( fscanf( arquivo, "%d%d%d", &a,&b,&c) == 3 )
{
"operações a serem feitas com os valores lidos"
}
Traduzindo: "Enquanto forem lidos 3 valores por linha do arquivo, fazer..."
É importante ver que para o mesmo arquivo é válido fazer:
while(fscanf( arquivo, "%d", &a)==1)
{
"operações a serem feitas com o valor lido"
}
Quantos valores você vai ler por vez no fscanf depende unicamente do seu objetivo e é importante observar que ele separa os valores por 'caracteres brancos' que seriam tablações, espaços e quebras de linha.
Agora para imprimir, usamos a função fprintf, que também é análoga à função printf, sendo que também precisamos informar a variável do arquivo em que os dados serão escritos:
exemplo:
fprintf(arquivo,"%d\t%d\t%d", a,b,c);
4-> Finalmente, quando todas as operações em cima do arquivo forem completas, o arquivo, tendo sido aberto, agora precisa ser fechado. Para isto basta utilizar a função fclose, passando como parâmetro a variável do arquivo:
fclose(arquivo);
Quando o seu programa termina os arquivos são fechados automaticamente, mas para programas grandes e que ficarão executando por algum tempo, como um sistema operacional, é primordial que o fclose seja feito. Ainda assim, a boa prática de programação é sempre dar fclose nos seus arquivos. Se isso não te convence... você pode perder pontos na prova por esquecer um fclose.
É isso, espero ter ajudado! Bons estudos e até a próxima!
Por André Calfa
Primeiramente, deve-se saber que as funções relativas à arquivo estão já na biblioteca stdio.h (IO = Input/Output = Entrada/Saída). Porém, também precisaremos da stdlib.h, pois será necessário utilizar uma função desta biblioteca que tratará o erro relativo ao caso do arquivo a ser usado no programa não existir ou não haver memória suficiente para criá-lo.
OK, agora irei explicar aqui os passos para se trabalhar com arquivos em C:
1-> Declarar uma variável do tipo arquivo (uma variável para cada arquivo a ser utilizado). Como a declaração de variáveis de tipo int, float, double e char, ela também deve ser feita no início de uma função.
...
FILE * arquivo;
...
Como vocês devem lembrar o * indica que a variável é um ponteiro. Ela aponta para o arquivo na memória do computador.
2-> Uma vez declarada, agora você deve associar esta variável a um arquivo existente ou a um arquivo a ser criado, chamando a função fopen (chamamos esta ação também de abrir o arquivo). O primeiro parâmetro desta função é o nome do arquivo (em PROG iremos apenas trabalhar com arquivos .txt), e em seguida o modo em que este arquivo será trabalho. Não se deve esquecer de fazer o tratamento de erro citado anteriormente. Ele é feito com o comando exit(1); que aborta o programa imediatamente e fecha todos os arquivos que tenham sido abertos.
exemplo:
arquivo = fopen("entrada.txt", "r");
if ( arquivo == NULL )
{
printf("Erro na abertura do arquivo!\n");
exit(1);
}
Repare que se a função fopen não conseguir abrir o determinado arquivo ela retorna NULL para a variável arquivo.
Em PROG, só usaremos dois modos, "r" para leitura de arquivo e "w" para gravação de arquivo.
3-> Agora iremos ver como manipular este arquivo. Caso você esteja lendo arquivo, para ler as informações contidas nele, a função fscanf deve ser chamada. É praticamente idêntica à função scanf, a única informação a mais a ser passada é o nome da variável onde você armazenou o retorno da fopen (que seria o arquivo aberto). A fscanf também retorna a quantidade de dados lidos com sucesso a cada execução:
exemplo:
para ler do arquivo os dados
1 2 3
4 5 6
faz-se:
while ( fscanf( arquivo, "%d%d%d", &a,&b,&c) == 3 )
{
"operações a serem feitas com os valores lidos"
}
Traduzindo: "Enquanto forem lidos 3 valores por linha do arquivo, fazer..."
É importante ver que para o mesmo arquivo é válido fazer:
while(fscanf( arquivo, "%d", &a)==1)
{
"operações a serem feitas com o valor lido"
}
Quantos valores você vai ler por vez no fscanf depende unicamente do seu objetivo e é importante observar que ele separa os valores por 'caracteres brancos' que seriam tablações, espaços e quebras de linha.
Agora para imprimir, usamos a função fprintf, que também é análoga à função printf, sendo que também precisamos informar a variável do arquivo em que os dados serão escritos:
exemplo:
fprintf(arquivo,"%d\t%d\t%d", a,b,c);
4-> Finalmente, quando todas as operações em cima do arquivo forem completas, o arquivo, tendo sido aberto, agora precisa ser fechado. Para isto basta utilizar a função fclose, passando como parâmetro a variável do arquivo:
fclose(arquivo);
Quando o seu programa termina os arquivos são fechados automaticamente, mas para programas grandes e que ficarão executando por algum tempo, como um sistema operacional, é primordial que o fclose seja feito. Ainda assim, a boa prática de programação é sempre dar fclose nos seus arquivos. Se isso não te convence... você pode perder pontos na prova por esquecer um fclose.
É isso, espero ter ajudado! Bons estudos e até a próxima!
Por André Calfa
quinta-feira, 21 de outubro de 2010
Passando um vetor para uma função auxiliar
Essa é uma parte muito importante e muitas vezes pouco compreendida no estudo de vetores.
Vamos supor que a nossa tarefa seja passar os mil valores guardados num vetor para uma função poder fazer uma operação qualquer com todos eles.
Seria surreal você ter que fazer uma chamada de função com mais de mil parâmetros, então, logo descartamos a possibilidade de passar o valor de cada índice do vetor pra função.
Você lembra que a variável declarada como vetor guarda nela própria um endereço de memória, certo? Então, que tal passar esse valor para a função?
Essa é a melhor maneira de se passar um vetor para uma função. Você não passa os valores de seus índices, você passa um endereço de memória apenas.
A principal diferença entre fazer isso ou passar o valor da variável é que, quando você passa apenas o valor da variável, se esse valor for modificado dentro da função pouco importa para a função que a chamou, já que esse valor vai estar armazenado em uma outra variável local da função chamada; agora, quando você passa um endereço de memória, se você fizer qualquer modificação com o valor dentro desse endereço de memória ele vai ser alterado também na função que chamou, já que é o mesmo elemento.
Acredito que isso tenha ficado um pouco vago, tenha em mente o seguinte. O que diferencia dois elementos na memória é o endereço deles. Quando você passa o valor de um elemento para uma função o que essa função faz é imediatamente guardar esse valor em uma variável presente em um endereço de memória só conhecido por essa função, por isso não faz diferença alterar esse valor.
Ok, como pegamos esse endereço de memória então, preciso de uma variável especial. Não?
Exatamente! Não faz sentido pegar esse endereço de memória com uma variável do tipo int, por exemplo. Para isso existem as variáveis do tipo ponteiro que armazenam endereços de memória. Ponteiros são declarados com um * antes do nome dele.
tipoDoPonteiro * nomeDoPonteiro;
Então, para pegar o nosso vetor com mil posições bastaria fazer o seguinte:
A função que recebe o vetor vai ter como parâmetro um ponteiro do tipo do vetor. Supondo que o nosso vetor seja de char's e que nossa função não retorna nada, ficaria:
void nomeDaFunção (char * vetor);
Repare que não é preciso dizer o tamanho do vetor, visto que ele só pega um endereço de memória não faz diferença. Por isso, pode ser preciso passar o tamanho do vetor também.
Na chamada da função você faria simplesmente:
nomeDaFunção (vetor);
Existe um outro modo de declarar a sua função que recebe o vetor, que é:
void nomeDaFunção (char vetor[]);
Isso indica que você vai receber um vetor e o que ele vai fazer na verdade é criar um ponteiro, bem como já foi mostrado.
Dentro da função você vai operar com ele como um vetor normal.
É isso aí pessoal!
Até mais!
Vamos supor que a nossa tarefa seja passar os mil valores guardados num vetor para uma função poder fazer uma operação qualquer com todos eles.
Seria surreal você ter que fazer uma chamada de função com mais de mil parâmetros, então, logo descartamos a possibilidade de passar o valor de cada índice do vetor pra função.
Você lembra que a variável declarada como vetor guarda nela própria um endereço de memória, certo? Então, que tal passar esse valor para a função?
Essa é a melhor maneira de se passar um vetor para uma função. Você não passa os valores de seus índices, você passa um endereço de memória apenas.
A principal diferença entre fazer isso ou passar o valor da variável é que, quando você passa apenas o valor da variável, se esse valor for modificado dentro da função pouco importa para a função que a chamou, já que esse valor vai estar armazenado em uma outra variável local da função chamada; agora, quando você passa um endereço de memória, se você fizer qualquer modificação com o valor dentro desse endereço de memória ele vai ser alterado também na função que chamou, já que é o mesmo elemento.
Acredito que isso tenha ficado um pouco vago, tenha em mente o seguinte. O que diferencia dois elementos na memória é o endereço deles. Quando você passa o valor de um elemento para uma função o que essa função faz é imediatamente guardar esse valor em uma variável presente em um endereço de memória só conhecido por essa função, por isso não faz diferença alterar esse valor.
Ok, como pegamos esse endereço de memória então, preciso de uma variável especial. Não?
Exatamente! Não faz sentido pegar esse endereço de memória com uma variável do tipo int, por exemplo. Para isso existem as variáveis do tipo ponteiro que armazenam endereços de memória. Ponteiros são declarados com um * antes do nome dele.
tipoDoPonteiro * nomeDoPonteiro;
Então, para pegar o nosso vetor com mil posições bastaria fazer o seguinte:
A função que recebe o vetor vai ter como parâmetro um ponteiro do tipo do vetor. Supondo que o nosso vetor seja de char's e que nossa função não retorna nada, ficaria:
void nomeDaFunção (char * vetor);
Repare que não é preciso dizer o tamanho do vetor, visto que ele só pega um endereço de memória não faz diferença. Por isso, pode ser preciso passar o tamanho do vetor também.
Na chamada da função você faria simplesmente:
nomeDaFunção (vetor);
Existe um outro modo de declarar a sua função que recebe o vetor, que é:
void nomeDaFunção (char vetor[]);
Isso indica que você vai receber um vetor e o que ele vai fazer na verdade é criar um ponteiro, bem como já foi mostrado.
Dentro da função você vai operar com ele como um vetor normal.
É isso aí pessoal!
Até mais!
Vetores
O que são?
Vetores são variáveis, capazes de armazenar um ou mais valores de um determinado tipo.
Declaração
Vetores também são declarados na área de declaração de variáveis da seguinte maneira:
tipoDoVetor nomeDoVetor[númeroDeElementos];
O conceito parece bem simples, mas é um pouco mais complexo que isso. A variável declarada como um vetor, na verdade, não armazena nenhum valor do tipo int ou do tipo char. Isso pode parecer um pouco contraditório, mas tem uma boa explicação.
Quando você declara um vetor, é reservado na memória do seu computador espaço suficiente para ele, e dentro da variável declarada como um vetor é armazenado o endereço de memória inicial desse espaço. Dizemos que essa variável é um ponteiro para esse endereço de memória, mas esse é um conceito que só será abordado em progII, portanto não se prendam a essa parte, apenas tenham isso em mente.
Já que você não está aqui pra me fazer perguntas nesse momento, eu pergunto por você: "Peraí. Como eu faço pra acessar os elementos desse vetor então?"
Os elementos desse vetor são espertamente mapeados em C com índices que variam de 0 (primeiro elemento) e n-1 (último elemento), onde n é o número de elementos do seu vetor. Você faz referência a esses elementos da seguinte maneira.
nomeDoVetor[0] (primeiro elemento)
nomeDoVetor[1] (segundo elemento)
...
nomeDoVetor[n-2] (penúltimo elemento)
nomeDoVetor[n-1] (último elemento)
E é importante saber que se você fizer referência ao vetor, sem um índice, você estará pegando o endereço de memória do início do seu vetor, que, como já foi dito, é o que a variável guarda.
Pra quem não lembra, ou não sabe, a gente já usou endereços de memória antes, no scanf. Quando a gente digitava &nomeDaVariável o que a gente fazia era pegar o endereço da tal variável. Portanto, repare que para fazer um scanf da primeira posição do vetor basta, no scanf, nomeDoVetor ao invés de &nomeDoVetor. Imagine que tenhamos declarado um vetor notas[10] (10 posições), e veja um dos meios de fazer scanf dos valores desse vetor:
scanf("%d", notas); (scanf do primeiro elemento)
scanf("%d", notas+1); (scanf do segundo elemento)
...
scanf("%d", notas+8); (scanf do nono elemento)
scanf("%d", notas+9); (scanf do décimo elemento)
Repare que fazendo nomeDoVetor+índiceDoElemento você consegue diretamente o endereço de memória do elemento do determinado índice.
Mas e como pegar o VALOR armazenado em um determinado índice do vetor?
Para isso você faz o seguinte nomeDoVetor[índiceDoElemento]. Vamos supor que tenhamos um vetor de 5 posições com os seguintes valores {3, 6, 9}, se os seguintes comandos fossem digitados:
printf("%d\n", nomeDoVetor[0]);
printf("%d\n", nomeDoVetor[1]);
printf("%d\n", nomeDoVetor[2]);
printf("Fim :D\n");
A saída esperada seria:
3
6
9
Fim :D
Repare que ao usar nomeDoVetor[índiceDoVetor] você pode usar o & para pegar o endereço dele. Experimente fazer os scanf's dessa maneira também!
Repare também que é bem burro fazer scanf's da maneira que eu fiz. Se você tiver o mesmo vetor notas, mas agora com 1.000 posições, faria 1.000 scanf's? Espero fortemente que não, hahaha! Para isso aprendemos as estruturas de repetição. Veja o exemplo abaixo:
for(i = 0 ; i<1000 ; i++)
{
scanf("%d", ¬as[i]); ou scanf("%d", notas+i);
}
Repare que seu i varia entre 0 e 999 nessa repetição, que são exatamente os índices do seu vetor.
Valeu galera,
Até a próxima!
Vetores são variáveis, capazes de armazenar um ou mais valores de um determinado tipo.
Declaração
Vetores também são declarados na área de declaração de variáveis da seguinte maneira:
tipoDoVetor nomeDoVetor[númeroDeElementos];
O conceito parece bem simples, mas é um pouco mais complexo que isso. A variável declarada como um vetor, na verdade, não armazena nenhum valor do tipo int ou do tipo char. Isso pode parecer um pouco contraditório, mas tem uma boa explicação.
Quando você declara um vetor, é reservado na memória do seu computador espaço suficiente para ele, e dentro da variável declarada como um vetor é armazenado o endereço de memória inicial desse espaço. Dizemos que essa variável é um ponteiro para esse endereço de memória, mas esse é um conceito que só será abordado em progII, portanto não se prendam a essa parte, apenas tenham isso em mente.
Já que você não está aqui pra me fazer perguntas nesse momento, eu pergunto por você: "Peraí. Como eu faço pra acessar os elementos desse vetor então?"
Os elementos desse vetor são espertamente mapeados em C com índices que variam de 0 (primeiro elemento) e n-1 (último elemento), onde n é o número de elementos do seu vetor. Você faz referência a esses elementos da seguinte maneira.
nomeDoVetor[0] (primeiro elemento)
nomeDoVetor[1] (segundo elemento)
...
nomeDoVetor[n-2] (penúltimo elemento)
nomeDoVetor[n-1] (último elemento)
E é importante saber que se você fizer referência ao vetor, sem um índice, você estará pegando o endereço de memória do início do seu vetor, que, como já foi dito, é o que a variável guarda.
Pra quem não lembra, ou não sabe, a gente já usou endereços de memória antes, no scanf. Quando a gente digitava &nomeDaVariável o que a gente fazia era pegar o endereço da tal variável. Portanto, repare que para fazer um scanf da primeira posição do vetor basta, no scanf, nomeDoVetor ao invés de &nomeDoVetor. Imagine que tenhamos declarado um vetor notas[10] (10 posições), e veja um dos meios de fazer scanf dos valores desse vetor:
scanf("%d", notas); (scanf do primeiro elemento)
scanf("%d", notas+1); (scanf do segundo elemento)
...
scanf("%d", notas+8); (scanf do nono elemento)
scanf("%d", notas+9); (scanf do décimo elemento)
Repare que fazendo nomeDoVetor+índiceDoElemento você consegue diretamente o endereço de memória do elemento do determinado índice.
Mas e como pegar o VALOR armazenado em um determinado índice do vetor?
Para isso você faz o seguinte nomeDoVetor[índiceDoElemento]. Vamos supor que tenhamos um vetor de 5 posições com os seguintes valores {3, 6, 9}, se os seguintes comandos fossem digitados:
printf("%d\n", nomeDoVetor[0]);
printf("%d\n", nomeDoVetor[1]);
printf("%d\n", nomeDoVetor[2]);
printf("Fim :D\n");
A saída esperada seria:
3
6
9
Fim :D
Repare que ao usar nomeDoVetor[índiceDoVetor] você pode usar o & para pegar o endereço dele. Experimente fazer os scanf's dessa maneira também!
Repare também que é bem burro fazer scanf's da maneira que eu fiz. Se você tiver o mesmo vetor notas, mas agora com 1.000 posições, faria 1.000 scanf's? Espero fortemente que não, hahaha! Para isso aprendemos as estruturas de repetição. Veja o exemplo abaixo:
for(i = 0 ; i<1000 ; i++)
{
scanf("%d", ¬as[i]); ou scanf("%d", notas+i);
}
Repare que seu i varia entre 0 e 999 nessa repetição, que são exatamente os índices do seu vetor.
Valeu galera,
Até a próxima!
quinta-feira, 7 de outubro de 2010
Repetições [Parte III - Do While]
do-while ( faça - enquanto ) é de certa forma o contrário do while. No while, a expressão booleana é avaliada primeiramente, se for verdadeira o bloco de comandos é executado. Já no do-while, o bloco de comandos é executado primeiro, e então a a expressão booleana é verificada. As demais considerações do while valem aqui também
Exemplo:
do
{
"comandos a serem executados repetidamente";
}
while ( expressão booleana ) ;
Observação Importante: Notem que é necessário um ";" após o while desta vez.
Finalizando com o mesmo exemplo do fatorial:
int main (void)
{
int i;
int n;
int f = 1; /* o fatorial do menor número não negativo é 1 */
do{
printf("Digite um numero inteiro nao negativo:\n");
scanf("%d", &n);
}
while(num < 0);
for( i = 1; i<=n ; i++) {
f = f * i; /* aqui será feito f*1*2*3… */
i++; /* ou i = i + 1 se preferirem */
}
printf("Fatorial = %d \n",f);
return 0;
}
Neste exemplo o do-while serve para fazer o programa continuar pedindo um número ao usuário enquanto ele não digitar um número válido. Pense em como você faria isso sem o do-while.
Espero ter ajudado a todos, até uma próxima vez!
Por André Calfa
Assinar:
Comentários (Atom)