Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Não use números, use constantes: const e #define

Como saber se uma pessoa já pode ser presa? Fácil, pela idade:
if(idade>=18) ou if(idade>17)

Como saber se uma pessoa já pode votar? Fácil, pela idade:
if(idade>=16) ou if(idade>15)

Parece certo, não é? A rigor, está sim.
Está correto, mas absolutamente não recomendável. Vamos explicar isso neste tutorial de C de nossa apostila.

Como ser um programador C certificado

Por que se deve evitar usar números em programação C

Imagine que você foi contratado para fazer um programa para o governo federal.
Dentre outras coisas, seu aplicativo C deve dizer ao cidadão se ele está apto a dirigir, votar, se alistar nas Forças Armadas, doar sangue, viajar sozinho, idade pro homem se aposentar, pra mulher, tempo de serviço e milhares de outras coisas.

Facilmente, em seu código, você iria ultrapassar os milhares de testes condicionais, iria usar várias idades: 14, 16, 18, 21, 60, 65 e outras.
Isso pra você não é problema e faz todo sentido. E em um projeto profissional, é comum um programa ter dezenas de milhares de linhas de código.

Agora vamos mostrar os riscos do uso desses números.
Imagine que o governo mudou a maioridade penal: agora jovens de 16 anos podem ser presos.
Devido aos acidentes, somente pessoas com 21 anos, ou mais, podem comprar bebida alcoólica.
E como o país está crescendo e as pessoas melhoraram seu nível profissional, podem se aposentar com menos tempo de serviço.

E agora, José? Sair vasculhando milhares de testes condicionais, loopings, funções, bibliotecas em milhares de linhas de código, procurando esses números?
“Ah, vai em SEARCH e REPLACE ALL”. Errado, nem tudo deve mudar.
Nem todos os números ‘18’ (no caso da maioridade penal) vão mudar pra ‘16’ (pra se alistar, continua 18).

Pode ter certeza, isso iria levar semanas e é quase impossível fazer isso sem erros, sem ter deixado passar algo ou ter mudado algo que não devia. As complicações são muitas, e o ato de usar esses números em uma aplicação grande é irresponsabilidade, embora seja um erro catastrófico e básico, infelizmente muitos programadores que são profissionais ainda cometem esse tipo de barbaridade. Concordo com você, deviam ser queimados em praça pública (brincando).

Mas não se preocupe você estudou pelo curso C Progressivo, e caso tenha lido nossas lições e feitos os exercícios, garantimos sua competência.


Definindo e usando constantes em C

Existem, basicamente, duas maneiras de definir constantes em linguagem C:
Através do comando const e da diretiva de pré-processamento: #define

Um costume dos programadores C é declarar essas constantes no começo do programa, depois dos #include .

A sintaxe para declarar constantes usando a palavra reservada const é:
const tipo_da_variavel nome_da_variavel = valor_da_variavel;

Ou seja, é como declarar uma variável qualquer, como vínhamos fazendo.
A diferença é a palavra const no início, e o fato de termos que inicializar a variável.

É como se tivéssemos definido uma variável, e de fato é alocado um espaço em memória para essa constante, que será acessado sempre que usarmos essa variável.

O que é diferente do #define, que na verdade não faz parte da linguagem C, é algo que vem antes, é um comando pro pré-processador que ocorre antes da compilação.

A sintaxe para usar o #define é a seguinte:
#defina nome_da_variavel valor_da_variavel

Isso mesmo, sem símbolo de igual, sem o tipo de variável e sem ponto-e-vírgulo.
É como se disséssemos ao C: “Hey C, troque cada aparição da palavra ‘nome_da_variavel’ por ‘valor_da_variavel’, e só depois compile”.

Exemplo de código:
Crie um aplicativo em C que peça ao usuário sua idade, e diga se ele já pode dirigir (se tiver 16 anos ou mais), se alistar (se tiver 18 anos ou mais) e se já pode se aposentar(65 anos ou mais).
Use constantes: const e #define.

#include <stdio.h>
#define MAIORIDADE 18
const int aposentadoria = 65;
const int motorista = 16;

int main()
{
    int idade;
    printf("Digite sua idade: ");
    scanf("%d", &idade);

    if( idade >= MAIORIDADE )
        printf("Voce ja pode se alistar e dirigir.\n");
    else
        if( idade >= motorista )
            printf("Voce pode dirigir, mas nao pode se alistar.\n");
        else
            printf("Voce nao pode dirigir nem se alistar\n");

    if( idade >= aposentadoria )
        printf("Voce ja pode se aposentar!\n");
}

Note que na #define usamos letras maiúsculas, pois é um costume entre programadores C.

14 comentários:

Anônimo disse...

ultra interessante

Unknown disse...

Obrigado novamente! Coloquei algumas instruções que achei bacana no meu código e gostaria de compartilhar. Segue:

#include
#define MAIORIDADE 18
const int aposentadoria = 65;
const int motorista = 18;




int main()
{
int idade;
printf("Informe sua idade.\n");
scanf("%d", &idade);

if(idade >= MAIORIDADE)
printf("Vc pode dirigir com %d anos.\n\n", idade);

else
if(idade <= motorista)
printf("Ainda nao permitido dirigir com %d anos. Joge GTA.\n\n", idade);

if(idade <= aposentadoria)
printf("Vc ainda nao pode se aposentas com %d anos. \n", idade);
printf("Aguarde %d anos para sua aposetandoria!\n\n", aposentadoria - idade);


}
Att
Alexandre

Anônimo disse...

<= se o usuário digitar 18 vai entrar na condição de não poder dirigir, de uma olhada no código e faça alguns testes.

Anônimo disse...

Mas, quando devo usar const?

Wesley disse...

Quando for CONSTANTE, caso não vá mudar de condição nem tão cedo

Anônimo disse...

Robson Araújo Lima, A escolha se vai usar const ou #define é sua. Pode usar qualquer um. Se quiser usar só const, não precisa do #define, e se quiser usar só o #define, não precisa do const.

Unknown disse...

Boa tarde professor tentei fazer este mesmo exercicio com uma funcao junto, esta correto o modo que fiz ? obrigado pela resposta

#include

#define APOSENTAR 65
#define DIRIGIR 16
#define ALISTAR 18

using namespace std;

int dirigir (int idade_dirigir);
int aposentar (int idade_aposentar);
int alistar (int idade_alistar);

main(){

int idade_dirigir, idade_aposentar, idade_alistar;


dirigir(idade_dirigir);
aposentar(idade_aposentar);
alistar(idade_alistar);

}

int dirigir (int idade_dirigir){

cout << "Informe a idade para ver se pode dirigir:\n";
cin >> idade_dirigir ;

if (idade_dirigir >= DIRIGIR){
cout << "Ja pode dirigir:\n";
}
else
cout << "NAO pode dirigir:\n";
}


int aposentar (int idade_aposentar){
cout << "Informe a idade para ver se pode se aposentar:\n";
cin >> idade_aposentar ;

if ( idade_aposentar >= APOSENTAR ){
cout << "Ja pode se aposentar:\n";
}
else
cout << "NAO pode se aposentar:\n";
}

int alistar (int idade_alistar){
cout << "Alistamento: informe sua idade:\n";
cin >> idade_alistar ;

if (idade_alistar >= ALISTAR ){
cout << "Ja pode se alistar:\n";
}
cout << "NAO pode se alistar:\n";
}

100% novidades disse...

qual a utilidade de const e define? eu poderia simplesmente declarar uma variável e usá-la

Unknown disse...

Parabéns pelo site.
Manual fodástico sobre programação em C, direto, simples e completo.

Melksedek disse...

Como foi feito o calculo e quanto tempo falta para a pessoa aposentar ou dirigir no seu programa Alexandre Richard?

Unknown disse...

Melksedek, o calculo e feito ja no printf, pois aposentadoria tem um valor fixo no codigo lembra? ele so fez o valor da aposentadoria-idade no printf.
Gostaria de saber se a escolha de aposentadoria e motorista para serem declaradas na const tem algum porque ou simplesmente para fim de exemplo, mostrando que pode ser feito tanto em define quanto em const? Se alguem souber agradeço :)

Marcelo Siqueira Lima disse...

Tanto no caso de "aposentadoria" quanto "motorista", temos certeza que o número usado será inteiro e positivo; em outras palavras, um natural. Nesse caso, usar unsigned int é mais coerente. Minha opinião.

Lucas de Lima disse...

Muito bom!

Anônimo disse...

100% novidades

A utilidade é que, caso você precise alterar, supondo que seu programa tenha milhares de linhas, você não precisa sair caçando as variáveis de uma a uma para alterá-las.