sexta-feira, 29 de outubro de 2010

Passando matrizes para uma função

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!

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!

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!

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

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!

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", &notas[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

Repetições [Parte II - For]

As informações a serem passadas para o comando for realizar a repetição são um pouco mais elaboradas, porém isto o torna um comando mais compacto:

for ( expressão inicial; expressão booleana; expressão de incremento )
{

"comandos a serem executados repetidamente";
}

No final de cada instância do for ele executa o que estiver no bloco da "expressão de incremento" e testa a "expressão booleana". Enquanto ele testar verdadeiro na "expressão booleana" ele prossegue com o for.

Considerações importantes:
-> Mesmas considerações do while, a não ser pelo fato de não se colocar a expressão dentro das chaves, ela é colocada antes como mostrado no exemplo acima.
-> A expressão inicial significa com que valor o seu contador irá iniciar na repetição, com isso não precisa atribuir este valor à variável contador antes do for.

Mesmo exemplo do fatorial, agora com for:
int main (void)
{
int i;
int n;
int f = 1; /* o fatorial do menor número não negativo é 1 */
printf("Digite um numero inteiro nao negativo:\n");
scanf("%d", &n);
/* calcula fatorial */
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;
}

Por André Calfa

quinta-feira, 23 de setembro de 2010

Repetições [Parte I - While]

Processos de repetição se vêem necessários muito commumente na computação. Como um exemplo simples, de que modo você faria para calcular o factorial de um número? Tentar resolver este problema sem um laço de repetição provavelmente dará uma dor de cabeça enorme, pois não se sabe de antemão o tamanho do número a ser calculado o factorial, podendo ser preciso processar várias multiplicações.

Para isto, a linguagem C fornece 3 comandos de repetição que facilitam muito a solução destes problemas. São eles:
-> while
-> for
-> do - while

Pretendo mostrar para vocês esses comandos, um de cada vez.

Primeiramente veremos como funciona o while.
while ( expressão booleana )
{

"comandos a serem executados repetidamente";

expressão de incremento;
}

Considerações importantes:
-> Como no caso dos condicionais, não se usa " ; " depois do while;
-> A expressão booleana é do mesmo tipo da usada nos condicionais;
-> Enquanto a expressão booleana for verdadeira, os comandos dentro das chaves serão executados.
-> A expressão de incremento precisa sempre existir, caso contrário, uma vez executado o while ele entrará em loop infinito, já que a expressão booleana ficará sempre verdadeira.

Exemplo:
int main (void)
{
int i;
int n;
int f = 1; /* o fatorial do menor número não negativo é 1 */
printf("Digite um numero inteiro nao negativo:\n");
scanf("%d", &n);
i = 1;
/* calcula fatorial */
while ( i <= n )
{
f = f * i; /* aqui será feito f*1*2*3… */
i++; /* ou i = i + 1 se preferirem */
}
printf("Fatorial = %d \n",f);
return 0;
}

Fazendo o "chinês" com n = 3 por exemplo: O while será executado 3 vezes, já que i começa de 1 e é incrementado em 1 unidade. na primeira iteração temos f = 1 * 1, na segunda f = 1 * 2 e na terceira f = 2 * 3, resultado final 6.

Por André Calfa

E é isso aí!
Os dois próximos posts serão explicando o "for" e o "do while".

Atée o/

quinta-feira, 16 de setembro de 2010

Condicionais

Imagine como faríamos para imprimir se um número é negativo ou positivo. Com o que sabemos até agora é impossível dizer se um número é positivo.

Para isso precisamos de uma estrutura chamada "if" ("se" em inglês).

O modelo do "if" é o seguinte:
if(expressão)
{
comandos a ser executados
}

Assim, imaginando que o valor a ser testado esteja armazenado numa variável de nome N, podemos imprimir se ele é positivo executando as seguintes linhas de comando.

if(N>=0)
{
printf("O numero N e positivo.\n");
}

E se quiséssemos imprimir também se o número é negativo?
Para isso temos uma estrutura complementar do if chamada else (se não, em inglês). É intuitivo que pra você testar um se não você primeiro deve ter testado um se. Então para imprimir se um número é positivo ou negativo seria:

if(N>=0)
{
printf("O numero N e positivo.\n");
}
else
{
printf("O numero N e negativo.\n");
}

Os operadores lógicos possíveis são:
"a > b" verdade se a maior que b
"a < b" verdade se a menor que b
"a >= b" verdade se a maior ou igual a b
"a <= b" verdade se a menor ou igual a b
"a == b" verdade se a igual a b
"a && b" verdade se a e b forem verdade
"a || b" verdade se ou a, ou b forem verdade

Onde a e b são variáveis ou outras expressões lógicas.

E é isso por hoje! :D
o/

sexta-feira, 10 de setembro de 2010

Glossário sobre variáveis

Aqui vai um pequeno glossário dos termos que você vai ler muito frequentemente daqui pra frente nos meus posts.

Declarar uma variável significa dizer que ela existe para o programa, dizendo o tipo e o nome dela na área de declaração de variáveis.

Inicializar uma variável significa atribuir um valor a uma variável já declarada.

Ler uma variável significa atribuir um valor lido do teclado a uma variável (usando scanf).

Incrementar uma variável significa somar 1 ao valor da variável.

Decrementar uma variável significa subtrair 1 ao valor da variável.

Zerar uma variável significa atribuir a ela o valor 0.

quinta-feira, 9 de setembro de 2010

Operando com variáveis

Bom, nesse post eu acredito que vocês já saibam como funcionam as variáveis e como lemos elas do teclado (scanf) e imprimimos elas na tela (printf).

Então sigamos com alguns exemplos!

Ex1.: Atribuindo um valor a uma variável
Vamos supor que eu crie uma variável do tipo float, chamada PI e que eu queira atribuir a ela o valor 3.1415, como eu faria?
Basta escrever a linha de comando:
PI = 3.1415; (lê-se variável PI recebe 3.1415)

Lembrando que a variável PI deve ter sido declarada.

Ex2.: Atribuindo valor de uma variável a outra variável
Vamos supor agora que você no mesmo programa declare uma variável float chamada PI2, por algum motivo, e queira que ela tenha o mesmo valor de PI, como você faria?
É simples. Depois de declarar PI2 basta escrever a linha de comando:
PI2 = PI; (lê-se variável PI2 recebe o VALOR da variável PI)

Lembrando que a variável PI2 deve ter sido declarada e a variável PI deve ter sido inicializada.

Ex3.: Atribuindo o mesmo valor a várias variáveis
Um modo mais enxuto de se fazer a mesma coisa seria declarar as duas variáveis ao mesmo tempo com o valor 3.1415. Como?
Assim:
PI = PI2 = 3.1415; (lê-se variáveis PI e PI2 recebem 3.1415)

Ex4.: Atribuindo o resultado de uma expressão a uma variável
E se eu quisesse armazenar numa variável inteira chamada soma o valor da soma de dois números que eu li do teclado (usando scanf)?
É simples. Segue a linha de código:
soma = num1 + num2; (lê-se variável soma recebe o VALOR da variável num1 + o VALOR da variável num2)

Isso também vale para subtração (-), multiplicação (*), divisão (/) e resto da divisão (%).
Vale lembrar que num1 e num2 tem que ser declarados, bem como a variável soma e serem lidos do teclado com o scanf o que foi omitido no código acima, visto que, espero eu, vocês saibam fazer isso (se não souberem é só ler os posts antigos).

Ex5.: Fazendo uma variável receber seu próprio valor
Também é possível que você queira, por exemplo, dobrar o valor de uma variável.
Isso é feito da seguinte maneira:
num = num*2; (lê-se variável num recebe o VALOR da variável num vezes 2)
O que é equivalente a uma forma mais enxuta:
num *= 2; (lê-se do mesmo modo)

Lembrando que para isso é primordial que num tenha sido inicializada antes, senão o compilador tentará fazer uma operação com um lixo de memória e, acredite em mim, você não vai querer isso x)

Ex6.: No printf
Você pode fazer o printf imprimir diretamente o resultado de uma operação da seguinte maneira:
printf("O dobro desse valor e: %d", valor*2);

Ex7.: O que você não pode fazer
Você não pode tentar inicializar um VALOR. Olhe o exemplo a seguir:
2 = num;
Bem como você não pode fazer isso:
num * 2 = num;

Acho que isso é só por esse post.
Até mais galera! o/

printf, scanf, variáveis e seus tipos

No último post nós usamos a função printf sem realmente ver como ela funciona, espero que até o fim desse post você já esteja entendendo completamente como chamar a função printf e scanf.
Porém, meu primeiro objetivo nesse post é que vocês comecem a entender as variáveis e seus tipos, vocês perceberão o por quê.

O que é uma variável?
Quando você declara uma variável no seu programa, é como se você criasse uma caixa que pode armazenar dados, porém, deve-se ter cuidado, porque cada caixa dessa só pode armazenar dados de determinados tipos.

Tipos de variáveis
Existem alguns tipos de variáveis em C, explicitarei 3 das principais e direi que tipo de valor elas armazenam.
int (sigla de tipo - %d) - armazena um número inteiro
float (sigla de tipo - %f) - armazena um número real
char (sigla de tipo - %c) - armazena UM caracter
Siglas de tipo logo serão explicadas.

Declarando Variáveis
Para declarar variáveis basta colocar o tipo dela, seguido pelo nome desejado para a variável (de preferência algo que faça referência à função dela no seu programa).

Exemplo: int soma;

Agora sim, estamos prontos para explicar printf's e scanf's decentemente.

scanf
É comum termos que ler um valor digitado pelo usuário em um programa. Na verdade, imagine se fizéssemos um programa que soma dois números, mas esses dois números são sempre os mesmos? Que sentido teria?
Nenhum.

O que o scanf faz é pegar o valor digitado no teclado até que o usuário aperte enter.

E para onde vai esse valor?
Para uma variável, é claro.

O modo certo de se chamar a função scanf é a seguinte:
scanf("sigla de tipo", &nome da variável);

A sigla de tipo indica pro scanf o tipo da variável que vai ser lida e o & não foi um erro de digitação, ele é obrigatório antes do nome da variável (mais uma vez, o significado não é importante).

printf
Vocês já sabem que a função printf imprime algo na tela, certo? Mas como é o modo certo de usá-la?
A função printf é uma função como qualquer outra, vista no último post sobre funções. Ela precisa receber parâmetros e ela tem um retorno. Por enquanto, o que interessa é saber como chamá-la corretamente e, para isso, precisamos apenas saber os parâmetros que ela recebe.

A função printf recebe como parâmetro um texto, ou, uma sequência de "char's" e é interessante dizer que se você quiser imprimir o valor de uma variável basta colocar a sigla de tipo no meio da sequência e indicar o nome da variável no fim. Vejamos como ela funciona:
printf("Texto a ser impresso e/ou sigla(s) de tipo(s)", nome(s) da variável(is));

Lembrando que dessa vez o nome da variável vem sem o &.

Se eu quiser imprimir a soma de dois números, supondo que eu já tenha calculado isso e armazenado numa variável chamada soma seria da seguinte forma:
printf("A soma foi: %d", soma);

Muito bem, acredito que tenhamos desvendado um pouco esses tópicos. Na próxima postagem veremos um pouco de aplicação dessas variáveis.

Enquanto isso, modifique o 'Alô Mundo' para imprimir coisas diferentes. Tente também fazer esse programa ler um valor que o usuário digitar e imprimir esse valor.

Até a próxima! o/

Funções

Olá pessoal!

Até o fim desse post eu garanto, desde que tenham entendido tudo até aqui, que vocês estarão prontos pro seu primeiro programa em C.

Neste post falaremos sobre funções em C.

Primeiramente vale a pena dizer que seu programa tem funções auxiliares e a função principal, chamada de "main".

O que é uma função?
Funções são blocos de comando que seu programa executará, começando da função principal.

Estrutura das funções
Do mesmo modo que um programa é escrito seguindo uma estrutura, as funções são escritas seguindo sua própria estrutura.

A estrutura das funções segue o seguinte modelo:
tipo_de_retorno nome_da_função (parâmetros (com seus tipos))
{
declaração das variáveis que a função usará
comandos que a função executará
retorno da função (pode ou não existir)
}

Não se desespere, vamos entender tudo isso agora.

Funcionamento de uma função
Vocês tem que entender que as funções executam ações e te retornam o resultado dessas ações. Esse é o papel delas.

Você pode criar uma função que some 2 números inteiros que o usuário digitar, por exemplo.

Nesse exemplo sua função receberia como parâmetros os 2 números inteiros (esse é o tipo deles, "inteiro") da função que a chamou, afinal, o computador não faz idéia dos números que você deseja que ele some, a menos que você indique-os.
Depois de somar os dois números a função retornaria esse resultado, daí o tipo de retorno que também seria um número inteiro.

Esses tais "tipos" ficarão claros no próximo post sobre variáveis.

Main, a função especial
A main tem sempre o seguinte cabeçalho:
int main (void)
{
declaração de variáveis
comandos que a função executará

return 0;
(a main sempre deve retornar zero, por isso o código fixo, o motivo não é importante, é algo a nível de sistema, por isso, não vale a pena explicar)
}

Agora acredito que vocês estejam prontos pro seu primeiro programa em C, chamado 'Alô Mundo'.

Se você foi curioso o suficiente você já viu esse programa no tutorial do primeiro post.

Esse programa é realmente inútil, mas é emocionante ver seu primeiro programa rodando *-*
Hahahaha!
Então, mãos à massa.

O programa é bem pequeno, logo, peço que não copiem, digitem ele do zero.

#include < stdio.h > /* declaração da biblioteca que vamos usar, sem espaços */

int main (void) /* cabeçalho da main */
{
printf("Alo Mundo!");
/* chama a função de impressão que está na biblioteca "stdio.h"
essa função será vista mais a fundo em posts futuros */

return 0; /* retorno da main, sempre 0 */
}

É isso galera! Não se preocupem se ainda estiverem com algumas dúvidas, muitas coisas ainda estão por ser explicadas.

Até mais o/

Bibliotecas e Constantes

E aí pessoal!

Agora que vocês já sabem criar um novo projeto e já conhecem a estrutura de um programa em C eu vou começar a definir algumas coisas importantes mostradas no post anterior.

Bibliotecas
As bibliotecas são um grande (ou não tão grande assim) conjunto de funções já programadas em C para poupar algum trabalho seu. :D

A biblioteca padrão do C, que vocês vão adicionar em seus programas daqui pra frente é a "stdio.h".

A "stdio.h" tem várias funções mas eu só vou contar pra vocês sobre algumas x)
Duas principais são: printf e scanf.

Essas duas funções são operações de entrada e saída. São operações complicadas de serem programadas, por isso, dêem graças a Deus de terem a "stdio.h" do lado de vocês.

A printf imprime algo na tela e a scanf lê algo do teclado.
As duas serão mais bem explicadas em um post futuro.

As bibliotecas são declaradas da seguinte maneira.

#include< nome > (sem os espaços) que nesse caso ficaria #include < stdio.h > (sem os espaços)

Constantes
As constantes são nomes que você pode dar a alguma coisa que será muito usada no seu programa, seja essa coisa um número inteiro ou uma palavra.

O que o programa vai fazer é simplesmente substituir qualquer incidência dessa constante pelo valor ao qual você a atribuiu.

Constantes são declaradas da seguinte maneira.

#define nome_escolhido valor

Supondo que eu queira definir o valor de PI para que eu possa usá-lo no meu programa sem ter que ficar digitando toda vez o mesmo valor, ficaria:

#define PI 3.1415

Vale lembrar que as constantes são opcionais.

Qual é a vantagem de utilizar uma constante?
Vamos supor que você está fazendo um programa muito grande, no qual você utiliza o valor de PI. Agora vamos imaginar que você precisa aumentar a precisão de PI no seu programa. Se você utilizou o define você só precisa alterar uma linha do seu programa. Se não, você precisa alterar todas as linhas na qual utilizou o valor 3.1415.

Muito bem, agora temos metade da estrutura de um programa definida e, espero eu, entendida.

Até a próxima! o/

A estrutura de um programa em C

Agora sim, espero poder partir do preceito que todos vocês sabem abrir um novo projeto no Visual Studio 2005, certo?

Se não:
Venha pra .

Se sim:
Vamos começar pela estrutura de um programa em C que é o nosso foco aqui.

Todo programa em C segue a determinada estrutura:

- Declaração das bibliotecas que serão usadas
- Definição de constantes
- Declaração e/ou Definição de funções auxiliares que serão usadas
- Declaração da função principal

Os campos em negrito são obrigatórios.

Vocês não precisam entender nada disso que eu apresentei ali em cima, mas tenham isso em mente. Vou explicar cada uma delas em posts separados daqui a pouco.

Até mais o/

Apresentação e [talvez] primeira lição

E aí galera!

Meu nome é Ruan, sou monitor de Programação I na PUC-RJ desde 2010-1 e sei bem o perrengue que alguns de vocês passam durante essa matéria.

A questão é que programação tem um grande problema. É 8 ou 80.

Ou você reprova ou passa muito bem...

Por quê?
Porque a matéria é muito fácil, mas pode se tornar muito complicada se você não estiver certo do que está fazendo.

O objetivo deste blog é ajudar a galera que tá com problemas de prestar atenção às aulas e tá realmente boiando em Prog I, hahaha!

Vou partir do preceito de que tudo que vocês sabem até aqui é abrir um novo projeto no Visual Studio 2005.

Quer dizer... vocês sabem, não é?
Se não sabem, aqui vai a primeira lição.

E a primeira lição é: Sigam o tuorial
Vocês não precisam fazer o tutorial completo, só a parte que te ensina a criar um novo projeto, todo o resto eu vou ensinar pra vocês. É claro que se vocês aprenderem lá o resultado vai ser o mesmo. xD

Depois de estarem craques nisso estamos prontos para começar nossas "aulas particulares" de Prog I.