sábado, 9 de julho de 2016

9.0 - Buffer e as funções fflush e __fpurge

Buffer: "Uma região de memória temporária utilizada para escrita e leitura de dados."



O problema de usar scanf, getchar, getc e fgetc para receber caracteres em C


"Ora, é só declarar duas variáveis char e usar a scanf duas vezes, uma para cada variável", é que você deve ter pensado para criar o tal programa.

Vamos fazer isso então, e ver o resultado:

#include <stdio.h>

int main()
{
    char letra1, letra2;

    printf("Insira um caractere: ");
    scanf("%c",&letra1);

    printf("Insira outro caractere: ");
    scanf("%c",&letra2);

    printf("Você digitou: '%c' e '%c'", letra1, letra2);
}


Eu digitei 'C' (a melhor letra do alfabeto), dei enter, e antes de digitar a próxima letra o progarma terminou, exibindo a seguinte mensagem:
"Você digitou: 'C' e '
'"

Nossa! Estranho, não? Será que hackeamos a linguagem C e descobrimos uma falha?
Não ;)

Note que digitei 'C' e enter...mas enter também é uma tecla, e é representada por '\n', lembra?
Ou seja, o C entendeu que nossa segunda letra era o enter!

A solução para isso é bem simples.
Na função scanf, dê um espaço entre a aspa " e o símbolo %c.
Nosso código fica assim:

#include <stdio.h>

int main()
{
    char letra1, letra2;

    printf("Insira um caractere: ");
    scanf("%c",&letra1);

    printf("Insira outro caractere: ");
    scanf(" %c",&letra2);

    printf("Você digitou: '%c' e '%c'", letra1, letra2);
}




Pronto! Agora funciona perfeitamente!
Pois esse simples espaço é um comando para o C desconsiderar o enter, tab ou espaço em branco.
Sim, precisa nem dar enter. Tente aí digitar uma letra, dar espaço (ou tab) e a outra.

Ok, mas só é possível fazer isso na scanf().
E na getchar(), getc() e fgetc()?

Limpando o buffer em C: fflush e __fpurge

Ainda no primeiro exemplo desse artigo ( o que dá problema ), digitamos a letra 'C', que é armazenada na variável 'letra1' e em seguida apertamos enter.

Esse caractere (enter), ficará armazenado no buffer do teclado (um memória temporária).

Em seguida, noss programa em C pede para que algo seja armazenado na variável 'letra2'.
Porém, antes do C receber um novo dado do usuário, ele checa se não tem mais alguma coisa armazenada no teclado (ele sempre faz isso...fez antes, para pegar a letra 'C'). E lá tem um caractere sim, o enter.

Então o programa pega esse caractere e o coloca na variável letra2, e é por isso que aparece uma quebra de linha em nosso programa.

Portanto, uma alternativa, caso não queria usar o espaço entre " e o %c na scanf, é limpar o buffer após cada scanf(), getchar(), getc() ou fgetc().

Para limpar o buffer em Windows, use: fflush(stdin)
Para limpar o buffer em Linux, use: __fpurge(stdin)

Veja como fica nosso programa original, funcionando do jeito que queríamos:


#include <stdio.h>

int main()
{
    char letra1, letra2;

    printf("Insira um caractere: ");
    scanf("%c", &letra1);

    fflush(stdin);
    __fpurge(stdin);

    printf("Insira outro caractere: ");
    scanf("%c", &letra2);

    printf("Você digitou: '%c' e '%c'", letra1, letra2);
}



Fica ao seu dispor escolher como vai ser.
E se habitue com essas coisas, em C há várias maneiras de se fazer várias coisas. Muitas vezes, porém, a solução que usamos não é muito segura ou portável, mas é a mais simples.

Limpar o buffer, por exemplo, nem sempre é algo desejável, e para programação mais profissional e segura não é recomendado que se use fflush por exemplo.

Mas para quem está  começando, não há problema algum ficar limpando o buffer após cada scanf, e o  scanf (embora seja arriscado e não indicado em alguns casos) é o mais usado.
Até a próxima

quinta-feira, 7 de julho de 2016

8.1 - Recebendo dados do usuário pelas funções scanf, getchar, fgetc e getc

Recebendo caracteres em C através da função scanf()

A maneira é idêntica a que fizemos quando usamos a função scanf() para capturar números digitados pelo usuário, que como ensinado no artigo passado de nossa apostila.

Mas com os caracteres, ao invés de usar %d (para números inteiros0 ou %f (para números floats), vamos usar %c, pois é assim que representamos variáveis do tipo char em C.

Portanto, um programa que pede um caractere ao usuário e o imprime na tela é feito da seguinte maneira:

#include <stdio.h>

int main()
{
    char letra;

    printf("Insira um caractere: ");
    scanf("%c",&letra);
    printf("Você digitou: '%c'", letra);
}

Recebendo caracteres em C através da função getchar()

A função scanf() é bem poderosa e flexível. Com ela, podemos pegar uma infinidade de dados do usuário, e inclusive escolher o que vai ser 'capturado', limitar o tanto de coisas que pode ser escrito, e uma série de outras funcionalidades que vocês irão aprender durante nosso curso de C.

Porém, há mais opções que facilitam nossa vida, e uma delas é o getchar().

Existe uma função que faz o mesmo papel da scanf e é voltada para o uso com caracteres, é a getchar(). Ela é mais simples, pois não precisar usar %c ou &, como fazemos na scanf(), e foi feito especialmente para ser usado com caracteres.


Entendendo a palavra 'getchar':

get -> pegar
char -> caractere


ou seja, usamos essa função para 'capturar' ou pegar um caractere.

Para usar, fazemos:
seu_caractere = getchar();

Veja como é seu uso em um código que pede um caractere para o usuário, armazena no char 'letra', e em seguida exibe esse mesmo caractere.

#include <stdio.h>

int main()
{
    char letra;

    printf("Insira um caractere: ");
    letra = getchar();
    printf("Você digitou: '%c'", letra);
}



Recebendo caracteres em C através das funçoes fgetc e getc

Essas funções também servem para armazenar caracteres, porém são mais gerais que a getchar(), pois podem receber dados de outras fontes, além da padrão (o teclado - stdin).

Seus usos são semelhantes ao getchar(), porém temos que dizer ao C por onde o programa deve receber as informações.
No nosso caso, e pelo teclado, então fica: fgetc(stind) e getc(stdin)

Por exemplo, um aplicativo em C que recebe duas letras e mostra na tela seria:

#include <stdio.h>

int main()
{
    char letra1, letra2;

    printf("Insira um caractere: ");
    letra1 = getc(stdin);

    printf("Insira outro caractere: ");
    letra2 = getc(stdin);

    printf("Você digitou: '%c' e '%c'", letra1, letra2);
}


Não se esqueça de aplicar o que aprendeu

segunda-feira, 4 de julho de 2016

8.0 - Falando sobre a função 'scanf' em C !

Até o momento temos mostrado diversos programas, porém sem controle e sem interação.
O programa simplesmente roda e mostra coisas na tela. No entanto, na vida real não é assim. Praticamente todos possuem algum tipo de interação com o usuário: recebem dados, cliques, arrastamos e soltamos etc. Desta vez, iremos apresentar a usar a função scanf e obter dados do usuário. Vamos começar a 'conversar' com o computador.

Recebendo números inteiros com a função scanf

Assim como fizemos para trabalhar com inteiros na função printf, vamos usar novamente o símbolo %d para representar os int.

Suponho que queiramos pedir um inteiro ao usuário, primeiro temos que declarar um inteiro. Vamos supor um de nome 'numero'.
Para o usuário armazenar um número nessa variável 'numero', usamos a seguinte sintaxe:

scanf("%d", &numero);

Essa função nos diz "armazene na variável 'numero' um inteiro".
O erro mais comum é esquecer o &, cuidado!

Por exemplo, vamos escrever um programa em C que pede um número ao usuário e o mostra na tela:

#include <stdio.h>

int main()
{
    int numero;
    printf("Digite um numero: ");
    scanf("%d", &numero);

    printf("O numero digitado foi: %d", numero);
}


Exemplo de código- Como usar a função scanf()

Escreva um programa em C que peça dois números inteiros e mostre sua soma.
Primeiro criamos três variáveis inteiras: num1, num2 e resultado.
Essas variáveis que vão armazenar os números que o usuário fornecer e o resultado da soma.

Após isso, usamos a função scanf() para pegar do usuário os dois número.
Em seguida, armazenamos a soma desses números na variável 'resultado', e exibimos essa variável num printf.

Veja como ficou o nosso código em C:


#include <stdio.h>

int main()
{
    int num1, num2, resultado;
    printf("Digite um numero: ");
    scanf("%d", &num1);

    printf("Digite outro numero: ");
    scanf("%d", &num2);

    resultado = num1 + num2;

    printf("%d + %d = %d", num1,num2,resultado);
}

Recebendo mais de um número dentro de uma única scanf

Para evitar o trabalho de ter que escrever a scanf cada vez que você deseje receber um número do usuário, você pode colocar mais de um %d dentro do escopo da scanf.

#include <stdio.h>

int main()
{
    int num1, num2;

    printf("Insira dois numeros: ");
    scanf("%d %d", &num1, &num2);

    printf("Você digitou: '%d' e '%d'", num1, num2);
}

No caso acima, num1 vai ser o número que você digitou antes de dar enter, espaço ou tab.
E num2 sera o número que você digitou após dar enter, espaço ou tab

Exercício: Faça um programa que peça dois inteiros ao usuário e que mostre a diferença (subtração) entre o primeiro e segundo número.


Recebendo números reais ou decimais com a função scanf

Para receber números do tipo float ou double, fazemos exatamente como na seção anterior, sobre inteiros, somente com uma diferença que talvez você já saiba qual é: usamos %f ao invés de %d.
Faz todo sentido, não?

Exemplo: Crie um programa em C que peça dois números decimais ao usuário e mostre o produto deles, com precisão de dois números.

Lembrando que o símbolo de multiplicação é o asterisco, *:

#include <stdio.h>

int main()
{
    float num1, num2, resultado;
    printf("Digite um numero: ");
    scanf("%f", &num1);

    printf("Digite outro numero: ");
    scanf("%f", &num2);

    resultado = num1 * num2;

    printf("%.1f + %.1f = %.2f", num1,num2,resultado);
}

See ya :]

domingo, 3 de julho de 2016

7.0 - Variavel tipo: char

Como declarar o tipo char em C

Para armazenar caracteres vamos usar um tipo especial de dados, o char (de character - caractere, em inglês).
O tipo char serve para armazenar UM, e somente UM, caractere.
Para declarar, usamos a seguinte sintaxe;
char nome_da_variavel;

Ao fazermos isso, estamos alocando 1 byte de memória para guardar nosso caractere.
Se você quiser armazenar mais caracteres, temos que usar as Strings, que são um conjunto de caracteres, usados para escrever textos maiores.Nós estudaremos as Strings mais à frente, por hora, vamos nos contentar com o armazenamento de apenas um caracter.

Como inicializar variáveis char em C

Para guardar uma letra no seu char, temos que fazer uma operação especial: sempre colocar o caractere entre aspas simples.


Por exemplo, para guardar a letra C, escrevemos:

char letra = 'C';

A sintaxe linguagem de programação é case sensitive, ou seja, minúsculo é diferente de maiúsculo.
Por exemplo:

char letraMinuscula = 'c';
char letraMaiuscula = 'C';

Esses dois caracteres, embora representem a mesma letra, são totalmente diferentes, pois uma é maiúscula e a outra é minúscula.


Como imprimir caracteres e textos na tela

Vamos agora aprender como mostrar na tela letras e caracteres, através da função printf.

Assim como usamos %d para mostrar inteiros, %f para float e double, vamos usar um símbolo especial para caracteres: %c

Por exemplo, um programa que exiba o texto "C Progressivo" na tela tem o seguinte código:

#include <stdio.h>

int main()
{
    char letra0='C', letra1=' ', letra2='P', letra3='r', letra4='o', letra5='g',
    letra6='r', letra7='e', letra8='s', letra9='i', letra10='v',letra11='o', letra12='\n';
    printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c",letra0,letra1,letra2,letra3,letra4,
    letra5,letra6,letra7,letra8,letra8,letra9,letra10,letra11,letra12);
}


Note 3 coisas interessante que mostramos:
1 - letra1=' '
Sim, espaço também é caractere!

2 - Repetimos letra8 duas vezes no printf, por quê?
Ora, a letra 's' se repete duas vezes na frase: "C Progressivo".
Em vez de gastar memória à toa para representar o mesmo caractere, o certo é repetir duas vezes o char.

- letra12='\n'
Sim, a quebra de linha, ou ENTER, é um caractere também!

Notou também a trabalheira e o tanto de código, apenas pra escrever isso? Inviável!
Em breve, em nosso curso C Progressivo, iremos aprender sobre strings, ou vetores de caracteres, que é uma maneira bem mais simples de se escrever e manipular textos em C.

A tabela ASCII em C

Digite e rode o seguinte programa em C:

#include <stdio.h>

int main()
{
    char ascii = 67;
    printf("%c%",ascii);
}

Estranho o resultado, não? Inicializamos um caractere sem aspas simples e digitamos dois números?
Se notar bem, não inicializamos o char com um caractere, pois não usamos aspas simples, iniciamos como se char fosse um inteiro.
Por que isso?

Ver char como inteiros não seria errado.
O que acontece é que cada caractere em programação recebe um número, como se fosse uma identificação.
A letra 'C' por exemplo, tem o número 67 como sua identificação.

Ou seja, para o computador:

char ascii = 67;
ou
char ascii = 0x43;
ou 
char ascii = 'C';

É a mesma coisa. No primeiro caso, representamos o caractere como um número decimal.
No segundo, o caractere é representado pro um número no formato hexadecimal.
Altere o número para outro e veja os resultados.
Você verá que cada caractere, incluindo o ENTER, TAB ou aviso sonoro é identificado com um número.

A tabela ASCII nada mais é que uma lista completa dos números que identificam os caracteres, veja só:


Podemos fazer o contrário também. Dentro do printc colocar os %c, e números após a vírgula.
Por exemplo, a letra 'o' pode ser representada pelo número 111 e a letra 'i' pode ser representada po 105.

Então podemos escrever 'oi' da seguinte maneira:

#include <stdio.h>

int main()
{
    printf("%c%c ",111,105);
}


Sim: 111,105 quer dizer 'oi'. Legal, não?
Agora você já pode escrever cartas e códigos secreto, e só quem sabe a poderosa linguagem C que pode ler.



See ya ;)

6.0 - Os tipos float e double - números decimais (ou reais) em C

O que são e para que servem os tipos float e double


Em nosso dia-a-dia, muitas vezes usamos dados em forma de números decimais, como por exemplo:

o rendimento da poupança (0,57%, 1,01%),
valores monetários (R$ 1,99) ,
as notas da faculdade (10,0 , 5,4 , 0,5),
constantes e outrs números matemáticos ( pi = 3,14...) etc.

Não podemos, porém, armazenar essas informações em variáveis inteiras na linguagem C.
Ao invés disso, precisamos declarar usando os tipos de dados float e double, que são tipos especialmente feitos para que possamos trabalhar com números reais (decimais).
Vamos aprender como usar tais tipos de variáveis e não apavorar sem necessidade.


Como declarar e inicializar variáveis do tipo float e double na linguagem C

Lembre-se que, para inteiros, declaramos da seguinte maneira: int idade, int mes etc.

Analogamente, para floats e double:
float pi;
float juros;
double tamanho_de_uma_bacteria;
double area_de_uma_circunferencia;

A declaração também não é diferente da que fizemos com inteiros.
Podemos inicializar valores tanto na declaração das variáveis como somente depois:
float pi = 3.14;
double juros = 1.32101;

Ou
float pi;
double juros;
pi = 3.14;
juros = 1.32101;


Se você é novo no mundo da programação e nunca teve contato com uma língua estrangeira, certamente achará tais inicializações de variáveis estranha. Mas esse é uma regra bem importante:
Na linguagem de programação C, usamos o PONTO (.), e não a vírgula para separar a parte inteira da decimal.

Ou seja, no Brasil escrevemos: 1,99 e 0,57
Em programação é: 1.99 e 0.57


Qual a diferença entre float e double



Em nossos exemplos, usamos tanto float como double para representar números reais.
Temos, então, duas opções iguais para representar esses números decimais? Na verdade não, há uma diferença.

Variáveis float exigem, geralmente, 4 bytes de memória para serem armazenadas enquanto double necessitam de 8 bytes.
Essa diferença serve para termos uma melhor precisão na hora de realizar cálculos.

O número PI, por exemplo, é irracional. Ou seja, ela possui uma quantidade INFINITA de casas decimais.
Obviamente, uma cálculo com o uso do pi nunca é totalmente preciso. Além do mais, computadores tem uma quantidade de memória limitada.

Então, nos seus trabalhos escolares você deve declarar e usar uma variável do tipo float para representar o número pi:
float pi = 3.14;
Se quiser ser mais preciso pode fazer até: pi = 3.1415;

Já um Engenheiro Civil ou um Físico da NASA terá que usar uma precisão maior, pois quanto mais casas decimais, mais correto

será seu resultado. Então, eles usariam:
double pi = 3,14159265358979323

Ok, agora você sabe a diferença entre um float e um double - apenas a precisão.
Mas qual a diferença entre 0 e 0.0? E a diferença de 1 e 1.00?

Você sabe que um inteiro ocupa 2 bytes na memória, e que um float ocupa 4 bytes.
Além do tamanho alocado em sua máquina, qual outra diferença que faz esses valores diferentes?
Sim, o ponto. Ou seja, a parte decimal.

Fazer: int erro = 0
É totalmente diferente de: float erro = 0.0;

Uma vez declarado um inteiro, não poderá usar decimais nele. Mesmo sabendo que 0 = 0.0
Já os decimais podem ser trabalhados com inteiros.
Por exemplo:
double erro = 0.00
int juros = 1

Podemos fazer: juros + erro = 1.00
Ou seja, quando fazemos uma operação matemática de um decimal com inteiro, obteremos sempre um decimal.
Assim, o resultado dessa operação deverá sempre ser armazenado em um float ou em um double.
Veremos mais sobre isso quando estudarmos operações matemáticas na linguagem C.

Imprimindo números reais float e double na tela através do printf

Vimos na aula passada que representamos inteiros como %d dentro das aspas, de um printf.

Para variáveis decimais ou reais, como o float e o double usamos: %f
Vejamos um exemplo que mostra um valor de pi com precisão simples (float) e outro com precisão dupla(double):

#include <stdio.h>

int main()
{
    float pi = 3.14;
    double piDouble = 3.1415926535897932384626433832795;
    printf("Valor de pi %f\n", pi );
    printf("Valor de pi mais preciso %f\n", piDouble );
}

Aqui notamos uma coisa curiosa no segundo valor, é exibido: 3.141593
Ou seja, o C não mostrou todo o valor da variável double 'piDouble' e ainda arredondou!

Podemos resolver isso da seguinte maneira. Supondo que você queira que seja exibido 6 casas decimais:
Ao invés de usar '%f' coloque: '%.7f'
Ou seja, esse 0.7f diz ao C o seguinte "Após o ponto, exiba 7 casas decimais".
Teste e veja o resultado:

#include <stdio.h>

int main()
{
    float pi = 3.14;
    double piDouble = 3.1415926535897932384626433832795;
    printf("Valor de pi %f\n", pi );
    printf("Valor de pi mais preciso %.7f\n", piDouble );
}


Será exibido: 3.1415927

Agora veja o seguinte: a variável 'pi' tem somente duas casas decimais depois do ponto.
O que ocorre se eu ordenar ao printf que imprima com 5 casas decimais?
Programe e veja você o que acontece:

#include <stdio.h>

int main()
{
    float pi = 3.14;
    double piDouble = 3.1415926535897932384626433832795;
    printf("Valor de pi %.5f\n", pi );
    printf("Valor de pi mais preciso %.7f\n", piDouble );
}


Como imprimir números na forma exponencial em C

Outra maneira de imprimir variáveis decimais é usando exponenciais.
Podemos inicializar uma variável da seguinte maneira:
float numero = xEy;

Isso significa: x vezes 10 elevado a y = x * 10^y
Ou seja, 1E6 = 1 vezes 10^6 = 1 milhão

E float numero = xE-y
Significa: x vezes 10 elevado a -y = x * 10^(-y)
Por exemplo: 2E-3 = 2 vezes 10^(-3) = 0.002

Veja o seguinte código e tente adivinhar sua saída. Logo após, rode o programa para vê se acertou:


#include <stdio.h>

int main()
{
    float salarioSonho = 1E6,
           salarioReal = 10E-3;
    printf("Sonhei que meu salario era de R$%.2f, \nmas acordei e lembrei que era %.2f centavos", salarioSonho, salarioReal);
}

Nesse último exemplo, note como declaramos mais de uma varíável.
Em vez de fazer:
float variavel1;
float variavel2;
float variavel3.

Você pode fazer:
float variavel1, variavel2, variavel3;

Ou, para ficar mais legível:
float variavel1,
       variavel2,
       variavel3.

Até a proxima ;)

sábado, 2 de julho de 2016

5.1 - Variantes do tipo 'int': short, long, signed e unsigned

Variantes do tipo inteiro - short, long, signed e unsigned

Recomendamos o uso do Dev-C++

Trabalhar com a linguagem  de programação C é gratificante devido ao poder e liberdade que você tem, já que podemos atuar em um nivel proximo ao sistema, inclusive selecionando espaços de memória.

Porém, isso tem um custo: estudo e cuidados adicionais, em relação a grande maioria das outras linguagens de programação.

Por exemplo, o tamanho que um variável do tipo inteira (int) pode ocupar em diferentes computadores e sistemas. 

O tamanho que cada variável em C pode ocupar em memória

Vimos que uma variável do tipo int (inteira) em C, geralmente ocupa 2 ou 4 bytes na memória de seu computador.

Essa diferença, de inicio pode parecer insignificante. Mas é porque estamos no início de nossos estudos na linguagem C, e por hora, nossos códigos e programas são bem simples e pequenos, não ultrapassando mais que algumas dezenas de linhas de código.

Mas a maior parte dos sistemas operacionais, como o Linux e o Windows, são feitos em C e aí essa diferença pode se tornar um problema, principalmente por questões de portabilidade.
Ou seja, você pode compilar/rodar seu código em C no seu computador e obter um resultado, mas pode rodar em outro computador ou sistema (de diferentes configurações) e obter resultados totalmente diferentes (e erros, as vezes).

O grande diferencial da linguagem de programação Java é que ela não roda em sua máquina, e sim em uma máquina virtual.
Essa máquina virtual (JVM - Java Virtual Machine) é simulada em todos os dispositivos, portanto, o Java roda da mesma maneira em todos os sistemas (porém, geralmente suas aplicações são bem mais lentas que aquelas feitas em C ou C++, por exemplo). Por hora, deixaremos de lado Java, e focaremos nossos estudos em C, posteriormente incluiremos Java.

Se quiser saber quanto vale o valor do int, ou de qualquer outra variável, use a função 'sizeof( tipo )', e troque 'tipo' por um tipo de variável.

O exemplo a seguir mostra como descobrir o valor da variável int em C, usando a função sizeof:

#include <stdio.h>

int main()
{
    printf("O tamanho do inteiro em meu computador: %d bytes", sizeof(int));
}



No meu computador, esse foi o resultado.

Tendo um maior controle sobre o tamanho dos inteiros - short e long


Vamos apresentar agora dois modificadores do tipo inteiro em C: short e long, ele alteram o tamanho de bytes do inteiro.
A diferença entre os inteiros e modificadores está na faixa de valores armazenadas.

Um inteiro de 1 byte (char) armazena do número -128 a +127
Um inteiro de 2 bytes armazena do número -32 768 a +32 767
Um inteiro de 4 bytes armazena do número -2 147 483 648 a +2 147 483 647
Um inteiro de 8 bytes armazena do número -9 223 372 036 854 775 808 a +9 223 372 036 854 775 807

'short' em inglês, significa curto e 'long', longo.
Colocando uma dessas palavras antes da 'int', você definirá um tamanho e uma faixa de valores para suas variáveis.

Por exemplo, se criar a variável inteira 'numero' como short, deverá fazer:
short int numero;

De modo análogo para uma variável com o modificador 'long':
long int numero;

Para saber o tamanho de bytes de seu sistema, use novamente a função sizeof:

#include <stdio.h>

int main()
{
    printf("int : %d bytes\n", sizeof( int ) );
    printf("short int: %d bytes\n", sizeof( short ) );
    printf("long int: %d bytes\n", sizeof( long ) );
}


Controlando a faixa de valores dos inteiros através do sinal: signed e unsigned

Todos nós sabemos que os números, como os inteiros, podem assumir tanto valores negativos como positivos.
Porém, muitas vezes, valores negativos (ou positivos) podem ser inúteis, chegando até a atrapalhar em termos de computação.

Por exemplo, o tamanho de memória é sempre positivo, não existe um bloco de -2 bytes em sua máquina.
Então, para declarar que um número seja apenas positivo (incluindo o 0), usamos o modificador unsigned:
unsigned int teste;

Analogamente para especificar que o inteiro possui valores positivos e negativos:
signed int teste;

Em C, por padrão, ao declararmos uma variável do tipo int, ele será automaticamente do tipo signed.
Portanto, a declaração passada é inútil, serve apenas para fins didáticos.

Caso queiramos apenas números positivos, a faixa de valores negativos que apresentamos é inútil e podemos desconsiderar ela, aumentando a faixa de valores positivos.
Então, ao declararmos inteiros com o modificador unsigned, as faixas de valores passam a ser:
Um inteiro de 1 byte (char) armazena do número 0 a +255
Um inteiro de 2 bytes armazena do número 0 a +65 535
Um inteiro de 4 bytes armazena do número 0 a +4 294 967 295
Um inteiro de 8 bytes armazena do número 0 a +18 446 744 073 709 551 615


Quando usar short, long, signed e unsigned

No futuro, quando você for um programador profissional, será um ótimo e diferenciado costume usar esses modificadores.

Quando usar o short int em C
Você deverá usar o short quando quiser armazenar, sempre, valores pequenos.
Por exemplo, suponha que você vá fazer um banco de dados para o Governo Federal, onde terá que criar milhões de cadastros.
Para armazenar idades, usar short int. Ora, valores inteiros de idades são pequenos e raramente passam do 100.
Então não desperdice memória à toa, use short!

Quando usar o long int em C

O long é bastante usado para cálculos de cunho acadêmico, como científico e estatístico.
É comum também usarmos o long int para armazenar números como RG e CPF, que são compostos de vários dígitos.

Quando usar unsigned int em C

Você pode usar o unsigned para se certificar que essa variável inteira nunca irá receber um valor negativo, como para armazenar dados de memória, idade, o life de um jogo etc.


Para saber mais sobre esse limites e padrões da linguagem C, acesse:
http://en.wikipedia.org/wiki/Limits.h


sábado, 25 de junho de 2016

05 - Falando sobre a variável 'int' em C !

O tipo de dado inteiro "int" na Linguagem C

Vamos estudar agora um dos tópicos mais básicos, bastante usado e importante na linguagem de programação C: os tipos de dados. Este é um tipo comum, e provavelmente o mais usado.



Como declarar variáveis inteiras na linguagem C


Variáveis são os nomes que vamos dar a determinado bloco de memória. Sempre que você quiser usar um dado (um número, um caractere, um texto etc) na linguagem C, você precisará declarar uma variável.

Ao fazer isso, você estará selecionando um espaço na memória (lembre-se que o C é uma linguagem poderosíssima e age no hardware de sua máquina). Por exemplo, suponha que você queira armazenar sua pontuação em um jogo que você desenvolveu em C. Se esse valor for inteiro, você precisará declarar uma variável (poderia usar o nome 'pontos', por exemplo), e o C irá alocar um espaço de 2 ou 4 bytes de memória. Aquele  espaço em memória serve somente para sua variável, é o endereço dela.

Para declarar uma variável inteira fazemos:

int nome_de_sua_variavel;

Ao fazer isso, estamos reservando um espaço em memória para guardar um número. Em vez de lidarmos com o número da posição da memória, vamos usar seu nome, que é nome_de_sua_variavel;

Vale realçar que os tipos (no caso, usamos o tipo int), são sempre em letras minúsculas e vêm antes do nome da variável.


Como imprimir um número inteiro na tela, usando a linguagem C

Vamos mostrar agora como imprimir o valor de uma variável na função printf.
Dentro do printf, entre as aspas duplas, os números são representados por: %d, e após o fechamento das aspas, colocamos uma vírgula e o real valor da variável que é representada por %d.

Por exemplo, vamos supor que você queira fazer um programa que imprima na tela: "Eu tenho 20 anos", mas sem digitar o 20.
Ele ficaria assim:

#include <stdio.h>

int main()
{
    printf("Tenho %d cachorros", 5);
}


Podemos colocar vários números inteiros representados por %d dentro das aspas, e seus valores serão os que vem após a vírgula, na mesma ordem.
Por exemplo, um programa em C que imprima "Eu tenho 3 cachorros, 4 gatos e 10 aves":


#include <stdio.h>

int main()
{
    printf("Eu tenho %d cachorros, %d gatos e %d aves", 3, 4, 10);
}


Agora que já sabemos declarar um número e imprimir ele na tela, vamos fazer os dois.
Vamos criar uma variável inteira chamada 'programador' e imprimir seu valor no printf:

#include <stdio.h>

int main()
{
    int cprogressivo;
    printf("O valor da variavel 'programador' eh %d", programador);
}



Aqui notamos duas coisas interessantes:
1. Digitamos 'programador' dentro do escopo da função printf, e o que aconteceu? Apareceu o nome 'programador', e não o valor dessa variável inteira. Como dissemos, para aparecer o valor dentro de um printf, usamos o %d.

2. Apareceu um número totalmente aleatório e louco (conhecido como lixo, em C), não foi? Por quê?

Ao declarar a variável 'programador', nós reservamos um espaço em memória. Dentro da printf nós imprimos o seu conteúdo, e naquela posição da memória de seu computador havia aquele número lá armazenado (não me pergunte o porquê, mas saiba que pro computador é tudo número: textos, imagens, som etc).
No meu printf apareceu o número 2456789215, e na sua máquina? Para lidarmos com isso, vamos seguir um pouco mais.

Como inicializar variáveis inteiras na linguagem C


Não nos serve para nada aqueles números aleatórios que você imprimiu com o último código.
Variáveis só servem se pudermos controlar seu valor, e para isso temos que inicializá-las, ou seja,  colocar um valor dentro dessa variável.
 Para isso, usamos o símbolo de igualdade '='.

A inicialização pode ocorrer de duas formas:
1. Junto com a declaração da variável

int idade = 18;

2. Depois da declaração, em qualquer lugar do programa (após a variável ter sido declarada)
int idade;
...
idade = 18;

Por exemplo, um programa que mostre na tela qual a sua idade:

#include <stdio.h>

int main()
{
    int idade = 18;
    printf("Eu tenho %d anos", idade);
}


Note que você pode alterar o valor da variável 'idade', e esse valor sempre será impresso no printf. Qual a idade que você colocou?

Em breve vamos estudar em detalhes as operações matemáticas na Linguagem C, mas por hora vamos mostrar como é possível usar alguns cálculos com e nas variáveis inteiras, dentro ou não do printf.
Leia o seguinte programa e tente entender cada trecho do seguinte código, que está comentado.
Ele mostra que é possível declarar variáveis inteiras em várias partes do código, que podemos fazer operações matemáticas com as variáveis, dentre outras coisas.


#include <stdio.h>

int main()
{
    int soma = 5+5;
    printf("A soma de: 5 + 5 = %d \n", soma);

    int numero_1 = 2;
    int numero_2 = 3;

    soma = numero_1 + numero_2; //Podemos fazer o valor de uma variável mudar no decorrer
                               //de um programa
    printf("A soma de: %d + %d = %d \n", numero_1, numero_2, soma);

    /*Ao invés de criar uma variável para armazenar um resultado de operação matemática,
    podemos colocar direto esses cálculos dentro do printf */
    printf("%d - %d = %d\n", soma, numero_1, (soma-numero_1));
}

Hora de praticar!

 Abra seu IDE  e comece a praticar!