Mostrando postagens com marcador parametros. Mostrar todas as postagens
Mostrando postagens com marcador parametros. Mostrar todas as postagens

domingo, 6 de dezembro de 2009

Dividir para conquistar! Parte I (funções)

Até o presente momento vimos exemplos de códigos fontes pequenos, com uma utilidade muito pequena (coisa muito difícil de encontrar no 'mundo real'), e portanto, muito fácil de acompanhar, compreender o seu funcionamento e eliminar os seus erros.
Eu já disse algumas vezes aqui no blog que é fácil encontrar códigos fonte com mais de 1000 linhas. Imagine a dificuldade para acompanhar um código desses!
E imagine a quantidade de tempo que 1 programador levará para concluir este código!
Para resolver estas questões o C usa uma metodologia chamada de modularidade.

O que é modularidade?
Imagine que você fosse o chefe de um grupo que deveria criar uma maquete de uma fábrica. Lógico que você iria dividir este trabalho de criação em várias partes. Dividindo entre os componentes do grupo cada uma dessas partes de acordo com o que cada um sabe fazer. Não seria inteligente deixar alguém fazer algo que não é sua especialidade tendo na equipe um especialista nesta tarefa.
Isto é modularidade!
Dividir uma tarefa grande em várias partes menores e especializadas. Quando digo especializada, quero dizer que idealmente, cada módulo fará uma única tarefa.(O que você prefere? Ser atendido por um médico especializado na sua doença ou por um clínico geral?)
Cada um desses módulos é chamado de função.
As funções podem ser classificadas de acordo com seus parâmetros e retorno.

O que são parâmetros? E retorno?
Algumas funções precisam de dados para cumprir a tarefa para a qual foram criadas. Esses dados são chamados de parâmetros da função.
Voltando ao exemplo da maquete, se você quiser um prédio em sua maquete, terá que dizer a quem irá fazê-lo quantos andares ele terá, qual a cor dele, se terá entrada lateral, etc. Se essas informações não forem passadas, o responsável não saberá como fazê-lo, ou poderá fazê-lo da forma que ele quiser, que pode não ser a que você desejava.
De posse dessas informações (argumentos), o prédio será construído conforme especificado, seguindo esses parâmetros.
Existem funções que precisam de vários parâmetros, outras que precisam de apenas 1 parâmetro, e ainda, as que não precisam de nenhum paramêtro.
Se você quisesse a sua maquete bem realista, poderia pedir a um componente do grupo que fizesse alguns carros populares para ficar no estacionamento da fábrica. Este componente é especialista em fazer carros populares, portanto, não é necessário passar nenhuma informação para ele. Ele fará os carros e entregará.
Já o retorno é o dado que a função devolve depois de fazer o seu trabalho.
No exemplo da maquete, seria o prédio e os carros.
Diferente dos parâmetros, o retorno só permite duas configurações: 1 ou nenhum.
Você pode se perguntar: Mas não seriam vários carros?
Você está certo. O que acontece na verdade, é que o responsável por fazer os carros, os faz um a um. E também os entrega um a um.
Neste exemplo da maquete, você é o chefe da equipe, o coordenador do projeto. Você passa a tarefa para o componente, e ele devolve o trabalho pronto. Você apenas agrupa o resultado. Pode ser que inclusive, você tenha que passar o resultado final do trabalho de um componente para um outro componente como a matéria-prima deste.
Num programa em C, esta função de coordenação é feita pela função main (sim, a main é uma função!).
Vamos ao exemplo de um programa que faz a soma de 2 números inteiros digitados pelo usuário usando este conceito de modularidade.
Antes de ver o código propriamente dito, vamos pensar nas funções que precisamos para executar essa tarefa.
1o precisamos de uma função que receba os valores inteiros digitados pelo usuário e devolva estes valores. Como sabemos ela não pode devolver os 2 valores de uma só vez. Então ela deve ler um valor e retornar este único valor. Depois ela será executada de novo para o outro valor.
Esta função precisa de algum parâmetro? A resposta é NÃO. Ela é especializada em ler inteiros, e inteiros são sempre inteiros. Acredito que ela não necessite de nenhum. E tem algum retorno? Com certeza. São os valores digitados pelo usuário.

2o precisamos de uma função que faça a soma propriamente dita.
Esta função precisa de parâmetros? Com certeza. São os valores digitados pelo usuário, que vieram da função anterior.
E tem algum retorno? Com certeza. É o resultado da soma.

3o precisamos de uma função que mostre ao usuário o resultado da soma.
Esta função precisa de algum parâmetro? Com certeza. É o resultado da soma retornado pela função anterior.
E tem algum retorno? A resposta é NÃO. Já que o valor vai ser mostrado e nada mais será feito no programa, não existe esta necessidade.

Vamos ver uma representação gráfica disto:



As setas indicam 'o caminho' das variáveis. As vermelhas indicam as variáveis que as funções retornam para a função main, e as pretas indicam as variáveis que a função main passa para as funções. (Eu iria usar outras cores, mas não poderia deixar de fazer esta homenagem ao HEXA DO MENGÃO! rsrs)

Uma função em C, é declarada da seguinte forma:

 <tipo de retorno> nome da função (<tipo do parâmetro> nome do parâmetro, <tipo do parâmetro> nome do parâmetro, ..., <tipo do parâmetro> nome do parâmetro){
    comandos da função
}


Vamos ao código, que eu explico os detalhes depois.


//EXEMPLO DO USO DE FUNÇÕES
#include <stdio.h>
#include <stdlib.h>
 
int ler_int(){
 int num1;
 printf("Digite um numero inteiro: ");
 scanf("%d", &num1);
 return num1;
}
 
int soma_int(int val1, int val2){
 return val1 + val2;
}
 
void exibe_result(int resultado){
 printf("O resultado da operacao eh %d.\n", resultado);
}
 
int main(){
 int num1, num2, result;
 
 num1 = ler_int();
 num2 = ler_int();
 result = soma_int(num1, num2);
 exibe_result(result);
 system("pause");
}


A 1a função, que se encontra na linha 5, é a ler_int. Pelo seu cabeçalho, vemos que é uma função que devolve um valor inteiro e não necessita de nenhum parâmetro. Vejamos o que esta função faz.
Na linha 6 é declarada uma variável inteira num1, que será usada para receber o valor digitado pelo usuário e retornar este valor para a função main.
Observe a linha 7 onde é mostrada ao usuário uma mensagem indicando o que ele deve fazer. Poderíamos ter algum código para verificar se o valor digitado está dentro de uma faixa específica, dentre outras coisas.
Na linha 8, o valor digitado pelo usuário é armazenado na variável inteira num1 usando o scanf. Até aqui não há nada que já não vimos antes.
A novidade está na linha 9. Observe o uso da palavra reservada return. É assim que é feito o retorno (será por isso que ele tem esse nome?) do valor para a função main. Neste caso, o valor retornado será o que está armazenado na variável inteira num1.
Na linha 12, temos a nossa 2a função, que é a soma_int. Esta função retorna um valor inteiro e necessita de 2 parâmetros inteiros (não é obrigatório que os parâmetros sejam do mesmo tipo retornado pela função, poderia ser de qualquer tipo e em qualquer quantidade, como já vimos).
Um outro detalhe interessante está na linha 13. Observe que é retornado o resultado da soma dos valores passados como parâmetros. Poderíamos ter declarado uma variável inteira, ter atribuído o resultado desta soma à variável e, só então, retornar o valor armazenado nela. A escolha de uma forma ou outra é exclusiva do programador. Eu, particularmente, prefiro como se encontra no código.
A 3a função, exibe_result, que aparece na linha 16, já começa com uma novidade.
Como vimos acima, esta função não retorna nenhum valor. A forma em C de especificar isto é usando o tipo void (lembra dele?). Isto significa que a função não retorna NADA. Além disto, ela necessita de 1 parâmetro, que é o que vai ser exibido, neste caso o resultado da soma que é retornado pela função soma_int.
A última função deste código é a main, que aparece na linha 20. Como já falei antes é ela que coordena o 'trabalho' das outras funções. Vamos ver como ela faz isto.
Na linha 21 são declaradas 3 variáveis inteiras. Elas são necessárias para receber o valor retornado pelas funções (se uma função devolve um valor, ele tem que ser armazenado em algum lugar ou será perdido).
Observe que uma destas variável tem o nome de num1, o mesmo nome daquela variável usada pela função ler_int, lá na linha 6. Antes que você reclame, deixe-me falar uma coisa: elas tem o mesmo nome, mas são a mesma 'pessoa' (rsrs).
A variável num1 de ler_int, só 'existe' enquanto a função ler_int está em execução. E enquanto isto a variável num1 da main, fica 'desativada'.
Dizemos que essas variáveis são locais. Mais a frente falaremos detalhadamente sobre isto. Por enquanto basta saber isto.
Na linha 23, está a 1a chamada da função ler_int. Este é o nome técnico usando para indicar que uma função será executada. Observe que é feita uma atribuição nesta mesma linha. Como já falamos, é para salvar o retorno da função.
Quando não existe um retorno, a forma da chamada é igual a da linha 26: somente o nome da função e os argumentos (os valores que são passados para preencher os parâmetros de uma função são chamados de argumentos) que ela necessita, se ela necessitar de algum.
Acredito que o restante do código agora ficou fácil de entender.
Uma outra coisa interessante a respeito das funções, é que é possível passar o retorno de uma função diretamente como argumento para outra função, sem precisar armazená-lo em uma variável.
Olhe este código abaixo e veja se consegue entender o que ele faz.


//EXEMPLO DO USO DE FUNÇÕES
#include <stdio.h>
#include <stdlib.h>
 
int ler_int(){
 int num1;
 printf("Digite um numero inteiro: ");
 scanf("%d", &num1);
 return num1;
}
 
int soma_int(int val1, int val2){
 return val1 + val2;
}
 
void exibe_result(int resultado){
 printf("O resultado da operacao eh %d.\n", resultado);
}
 
int main(){
 
 exibe_result(soma_int(ler_int(), ler_int()));
 system("pause");
}


Fácil não é?
Até a próxima.

sábado, 24 de outubro de 2009

Imprimindo na tela (printf)

No último post da série sobre código fonte nós analisamos (pelo menos, tentamos analisar ;) linha a linha um típico código fonte em C. Eu deixei um desafio para que você descobrisse o que fazia o comando da linha 11 do código analisado, no caso, system ("pause"). Descobriu?
Antes que os mais puristas venham me criticar sobre o uso deste comando, já que existem outros que atingem o mesmo objetivo; e de forma melhor, já que não deixam o código fonte dependente do sistema (leia-se Rwindow$); deixem que eu me defenda. Também não gosto deste comando, mas utilizo-o por 2 motivos:
1 - É o comando ensinado pela maioria dos professores de C (não é verdade?);
2 - Como uso o Dev C++, estou seguindo a recomendação da página oficial desta IDE (duvida? veja aqui, em inglês).

Isto posto, vamos ao assunto de hoje.

O comando printf
Por falar no código fonte do post anterior, você deve lembrar que falamos que o comando printf (linha 10) era muito importante e iríamos fazer um post só para ele, não é? Pois bem, este é o post.

Imprimindo...
O comando printf foi criado para imprimir. Isso você já deve ter percebido, mas imprimir o que e onde?
É aí que entra você, programador (gostou de ser chamado de programador???)!
Quem diz o que e onde o printf vai imprimir é você. Como você vai fazer isto? É o que veremos agora. Vamos começar com o onde.

A saída padrão
O comando printf pode imprimir em qualquer lugar. Por qualquer lugar, entenda a tela, uma impressora, um arquivo (existe uma função especializada, construída a partir do printf, para imprimir em arquivos (fprintf)), etc.
O alvo da impressão feita pelo printf é a saída padrão (stdout) que, geralmente, é a tela (existem formas de alterar isto).

Impressão formatada
Certamente você já ouviu falar em formatar (dar formato, forma, organizar segundo um padrão). A impressão feita pelo printf é formatada, ou seja, tem uma forma definda.
A forma que esta impressão terá é definida pelos parametros que são passados à função printf. Estes parametros ficam entre os ( ), como já vimos antes.

Os parametros da printf
Seguindo a teoria de que é fazendo que se aprende, vamos ao Dev C++.
Abra o Dev C++, crie um novo Arquivo fonte e copie o código abaixo.

//Exemplo 01 de printf

#include <stdio.h>

#include "stdlib.h"


int main( )

{

printf("Ola mundo!");

system ("pause");

}



Este código simples, é a minha versão do "Hello world", o programa mais simples feito em C (o mais simples que exibe algo na tela).
Pode compilar e executar.
Reparou na saída?

Olá mundo!Pressione qualquer tecla para continuar. . .

Não era isto que queríamos escrever! Era para aparecer só o Ola mundo!.
A frase Pressione qualquer tecla para continuar. . . é impressa pelo system("pause"). Só que ela está 'colada' no texto que escrevemos. Não ficaria mais 'bonito' se esta frase ficasse numa linha separada do nosso texto? Para isto é só imprimir um "enter". E como se faz isso?
O printf consegue imprimir qualquer caracter imprimível (verdade?). E os não imprimíveis, como é o caso do "enter" que nós precisamos?

Imprimindo o que não pode ser impresso
Para resolver esta questão complicada, o C dispõe de um recurso simples. Qual recurso é este?
Os códigos de escape, também conhecidos como códigos de barra invertida.
O símbolo '\' é conhecido no C como símbolo de escape. Ele é usado para tornar possível a impressão de alguns caracteres de controle e alguns símbolos especiais do C.
Os mais usados estão nesta tabela:




Conforme podemos ver, o 'enter' que precisamos é o '\n'.
Quanto aos símbolos especiais, um exemplo é o caracter ". Este caracter delimita o que vai ser impresso pelo printf. Agora, imagine que você queira imprimir um texto que tenha um outro texto delimitado por ". Exemplo: ("alguma "coisa""). A forma correta seria ("alguma \"coisa\"").
Substitua o comando da linha nn por este:

printf("Alo mundo!\n");

Agora, recompile e execute.
Ficou 'bem melhor'.

Imprimindo valores desconhecidos
Salve o seu Arquivo fonte do exemplo anterior e crie um novo em branco.
Copie o código abaixo.


//Exemplo 2 de printf

#include <stdio.h>
#include "stdlib.h"

int main( )
{
int num1=5, num2=2, resultado;



resultado=num1 / num2;
printf("O resultado da divisao de num1 por num2 eh igual a resultado.\n");
system ("pause");
}



Compile e execute.

Repare na saída. Você pode dizer, só olhando para a frase impressa, qual o valor armazenado nas variáveis? É bem capaz que você diga quais são os valores, porque viu no código fonte quais são eles. Sendo assim poderíamos substituir o comando da linha 9 por este:

printf("O resultado da divisao de 5 por 2 eh igual a 2.5.\n");

E se não tivesse nenhum valor no código fonte? Se tivéssemos dado ao usuário do programa a possibilidade de digitar os valores para a nossa soma (o que é muito comum)?
Entra em cena aqui mais um parametro de formatação da função printf, os especificadores de formato.
Os principais estão na tabela abaixo:




Agora que conhecemos este recurso do C, vamos corrigir o nosso código fonte para exibir os dados que desejamos mesmo sem saber o valor deles. É só substituir o comando da linha 9 por este:

printf("O resultado da divisao de %d por %d eh igual a %d.\n",num1, num2,resultado);

Note que usamos o especificador %d que imprime um número inteiro com sinal (poderíamos usar %i ou %u, já que nossos números são 'pequenos').
Além disto, o número de parametros do nosso comando printf ficou maior. Vejamos o porque disto.
Os especificadores de formato funcionam como comandos de substituição. Onde aparece o especificador de formato deverá ficar o valor que queremos mostrar; neste caso, o conteúdo das variáveis num1, num2 e resultado, exatamente nesta ordem. É importante observar isto, a ordem de impressão dos valores é a mesma em que eles são passados para a função printf.
Pode recompilar e executar.
Funcionou?
Na verdade não, correto? Nós sabemos que 5 dividido por 2 é igual a 2,5. E por que foi impresso 2?
A resposta é o tipo.
O tipo escolhido para a variável resultado foi int que armazena números inteiros. O resultado da divisão de um número inteiro por outro número inteiro na matemática nem sempre dá um número inteiro, veja o nosso exemplo. Para resolver isto temos que mudar o tipo da variável resultado para float.
Assim as linhas 6 e 7 ficarão assim:

int num1, num2;
float resultado;

Corrija, recompile e execute.
Além de não funcionar, agora ficou pior. Tá aparecendo que o resultado é 0 (zero). Por quê?
Porque não alteramos o printf, que deveria ficar assim:

printf("O resultado da divisao de %d por %d eh igual a %f.\n",num1, num2, resultado);

Novamente, recompile e execute.
Funcionou agora? Nada ainda, não é? Por quê?
Simples: Apesar da variável resultado ser do tipo float, o resultado da divisão continua dando um inteiro para o computador (ele não sabe das regras matemáticas!).
Temos duas soluções para isto (tem outra, mais veremos isso mais tarde):
A 1ª é mudar o tipo da variável num2 para float. A divisão de um número armazenado numa variável do tipo inteiro por outro número armazenado numa variável do tipo float tem como resultado um número com casas decimais (tipo float).
A 2ª é mais drástica. Mudar o tipo de todas as variáveis para float.

Tente a 1ª que já resolve. Não esqueça de mudar o comando printf da linha 9. Sabe como, certo?
Experimente esquecer e veja o que acontece.

Agora funcionou, não é?
Funcionar, funcionou; mas ainda não tá legal. Tá aparecendo um monte de zeros desnecessários.

Os especificadores de largura de campo
Dentre os parametros de formatação do printf, tem um que ainda não vimos que resolve isso. São os especificadores de largura de campo. Pode ficar tranquilo, que esses não precisam de tabela (rsrsrs).
Na verdade, os especificadores de largura de campo trabalham juntos com os especificadores de formato. É um número (e ponto) que fica entre o símbolo % e a letra do formato.
No nosso exemplo, para imprimir 2 e 2.5, usaríamos o seguinte especificador de largura de campo:

printf("O resultado da divisao de %d por %.0f eh igual a %.1f.\n",num1, num2, resultado);

Que significa que desejamos imprimir o valor armazenado na variável num2 com 0 (nenhuma) casas decimais, e o valor armazenado na variável resultado com uma casa decimal.

Corrija, recompile e execute (De novo! De novo!).

Finalmente, funcionou da forma esperada.

Agora você já pode fazer seus próprios teste.
Altere o nosso código fonte de exemplo para que ele faça a soma de 2 inteiros e exiba o resultado usando o comando abaixo:

printf("O resultado da soma de %03d + %3d eh igual a %d.\n",num1, num2, resultado);

Sabe explicar o que está acontecendo?

Nos 'vemos' no próximo post.

sexta-feira, 23 de outubro de 2009

Código Fonte... Parte III - Final (Estrutura)

Com os conceitos que vimos no post anterior, já estamos próximos (na verdade hoje é o dia) de fazer um código fonte que compile (gere um programa executável). Não necessáriamente, que funcione; afinal um programa pode compilar e mesmo assim não funcionar rsrs. Veremos isto mais a frente.

No primeiro post desta série, falamos sobre a necessidade de estruturar um texto. Separá-lo em parágrafos, pontuar corretamente, etc.
Este é o assunto de hoje: a estrutura de um código fonte em C.

A estrutura de um código fonte
Um típico código fonte em C é igual a este aqui embaixo.



//Programa para apresentar resultado da soma de dois números inteiros
#include <stdio.h>
#include "stdlib.h"
const int NUM2 = 10; //ESTE VALOR É UMA CONSTANTE
int main( )
{
int num1, resultado;
num1 = 5;
resultado = num1 + NUM2;
printf("O resultado da soma %d + %d eh igual a %d.\n",num1,NUM2,resultado);
system ("pause");
}


Vamos analisar este código linha a linha.

Comentários
Os comentários servem para esclarecer alguns pontos obscuros (obscuros? que não estão claros). Viu para que serve um comentário?
Como você viu acima, eu uso (e muito) os parênteses para fazer comentários.
No C, a forma de fazer um comentário é usando as barras paralelas //. Na verdade este é um dos padrões do C++, é o mais usado hoje em dia. Existe outro, que não vou comentar aqui. Esteja livre para procurar no Google qual é ele.
Assim sendo, a linha 1 é um comentário, que diz o propósito deste código fonte de forma simplificada. Há programadores que fazem verdadeiros cabeçalhos utilizando os comentários. Embora eles não sejam necessários, ajudam a esclarecer o código fonte. Esclarecer para nós programadores, porque para o C eles não significam nada! O C simplesmente os ignora. Repare que não tem ponto final (;) no fim dele.
Os comentários não precisam ficar separados em uma linha. Eles podem ser colocados no meio do código, após os comandos, como você pode ver na linha 4.
Lembre-se que TUDO o que for colocado após as barras paralelas é ignorado pelo C, mesmo que seja um comando válido.

Que # é esse? E porque não tem ;?
No post em que falei sobre compilação, falei sobre um tal de pré-processador, que é responsável por fazer alguns ajustes no código antes de 'entregá-lo' ao compilador.
É aí que entram as linhas 2 e 3. Nelas estão comandos para o pré-processador, por isto elas não seguem o padrão C, e sim o padrão do pré-processador.
O que elas fazem? Elas incluem (compliquei mais ainda rsrs). Para explicar o que elas incluem temos que ver outro conceito do C: as bibliotecas.

Bibliotecas
O Natal está se aproximando e eu já começo a lembrar do cheirinho das comidas especiais desta época: chester, rabanada, panetone, etc.
E o que isso tem a ver com Bibliotecas? Não era melhor falar em livros?
Vamos falar em livros agora e você vai entender o porquê desta instrodução.
As comidas especiais de Natal são tão especiais que só são feitas no Natal. Por isto, quem as faz não lembra exatamente como fazê-las, e por isto, recorre a livros de receita. (Não falei que ia chegar nos livros?)
Pois bem, algumas receitas são tão complexas que às vezes precisam de duas ou mais receitas que nem sempre estão num livro só. São necessários alguns livros.
O C também trabalha com seus 'livros de receitas'. Cada um destes 'livros' é chamado de biblioteca. Voltando as receitas culinárias; se quisermos passar uma receita para alguém teremos que copiar todas as partes das receitas que usamos para fazer aquela comida, mesmo que ela esteja em vários livros.
Agora vejam que idéia brilhante!
Um código fonte é na verdade uma 'receita', onde dizemos ao computador o que desejamos que ele faça. Se nossa 'receita' for complexa, nós usamos as bibliotecas. Só que, ao invés de copiar cada pedaço das várias 'receitas' dos vários livros, só precisamos dizer em que livro, ou melhor biblioteca, a receita está.
Isto é feito neste código pelas linhas 2 e 3. Elas incluem as bibliotecas que contém as receitas dos comandos printf (linha 10) e system (linha 11). Neste recurso que estou usando para exibir os códigos aqui no blog (Syntax Highlight), esses comandos aparecem em vermelho.
Existem várias bibliotecas (que são chamadas de especializadas), para os mais variados propósitos.
Se você reparou bem existe uma pequena diferença entre as linhas 2 e 3. Na linha 2, o nome da biblioteca está entre <>; já na linha 3, está entre " ". Este é um padrão para o local em que estas bibliotecas estão instaladas no seu computador, e indicam onde o pré-processador vai procurar por elas para poder incluí-las no código.
Os <> dizem para o pré-processador começar a procurar por elas no diretório padrão das bibliotecas ( se você instalou o Dev C++ no diretório sugerido pelo seu programa de instalação, este diretório é o C:\Dev-Cpp\include ). Já as " ", dizem para começar a procura pelo diretório onde o código fonte está salvo. Você pode usar qualquer um dos dois modos, conforme a sua necessidade.

Voltando ao código
O comando da linha 4 já é um conhecido nosso. Ele declara uma constante inteira e a inicializa com o valor 10.

Na linha 5, temos a função main. Esta merece uma atenção toda especial. Então vamos sair do código de novo rsrs.

A função main (Amém rsrs)
Se você fosse fazer alguma coisa dentre um um conjunto de quaisquer outras coisas, qual iria escolher para fazer?
Seguindo algum critério próprio, você decidiria por alguma delas. E o computador? Qual critério ele usa para escolher o que fazer?
Ele não usa critério nenhum (lembra que computador não pensa... ainda), quem diz onde ele deve começar somos nós programadores.
É aí que entra a main. Ela é a função principal de um programa executável. Todo programa executável tem que ter uma main (eu não conheço nenhum que não tenha, quem conhecer pode nos apresentar ;).
Antes da main, existe um identificador de tipo inteiro int. Ele pode, até, ser ignorado (o Dev C++ acrescenta ele, 'por baixo dos panos', quando compila o programa), você já deve ter visto alguns códigos sem ele. O que ele faz?
Ainda é cedo para explicar, voltaremos a este assunto mais a frente. Pode cobrar depois.
Depois da palavra main tem ( ). Dentro deles ficam os parâmetros da função main; que neste caso, não são usados e por isto os ( ) estão vazios. Parametros?
Parametros são dados e 'informações' que as funções usam para fazer o seu trabalho.
Lembra da linha 10? Nela está um comando (printf) que, geralmente, exibe alguma coisa na tela. O que ela tem que exibir e da forma que tem que exibir é 'informando dentro dos ( ).
Por hora é isto o que precisamos saber sobre a main. Vamos voltar ao código novamente (ou não).

Voltando ao código novamente (será?)
Na linha 6 temos um {. Para saber o que ele faz vamos sair do código ( de novo!) e explicar outro conceito fundamental do C: os blocos de comando.

Os blocos de comando
Podemos comparar os blocos de comandos da linguagem C ao parágrafo da linguagem escrita.
O parágrafo é o conjunto de frases que formam uma sequência com sentido, com lógica (tirei isto daqui); ou seja, são frases que tem a ver umas com as outras.
Blocos de comandos são comandos que estão relacionados entre si (simples assim). Todos trabalham juntos para cumprir uma tarefa. Um de cada vez, mas o objetivo final é o mesmo.
Um bloco de comando é iniciado com { e encerrado com }.
O bloco de comandos da main começa na linha 6 e acaba na linha 12.

Vamos (tentar) voltar ao código agora?
A resposta é não rsrsrs. Os outros comandos já são nossos velhos conhecidos :). São feitas algumas atribuições e o resultado é exibido na tela pelo comando da linha 10, do qual já falamos.
Aliás, o comando da linha 10 (o printf) é um comando muito importante, por isto faremos um post só para ele.
Você deve estar dizendo: Tem um comando na linha 11. O que ele faz?
Resposta: Descubra!!! (kkkkk)

Este código do nosso exemplo funciona. Pode criar um Arquivo fonte novo no Dev C++ e digitá-lo (ou copiá-lo). Ele está pronto para ser compilado.
Pode fazer alterações nos valores. E fazer suas próprias descobertas.
Quer uma dica sobre a linha 11? Pense em comentários.

Por hoje é só. Até o próximo post.