Introdução à Linguagem C e Variáveis

A linguagem C

Professor: Gabriel Soares Baptista

A Linguagem C

Histórico e Características

  • Origem: Desenvolvida em 1972 por Dennis Ritchie (Bell Labs).
  • Padronização: ANSI (1989).
  • Classificação: Alto nível (abstração próxima à humana).
  • Portabilidade: Raro encontrar arquitetura que não suporte um compilador C.
  • Performance: Gera códigos enxutos e velozes.
Características de Baixo Nível

Embora de alto nível, permite acesso direto à memória e ao microprocessador, unindo abstração e controle de hardware.

Natureza da Linguagem

  • Procedural: Decomposição de problemas complexos em módulos menores.
  • Acesso de Baixo Nível: Memória e instruções Assembly (crítico para dependência de tempo).
  • Multiplataforma: Compilação para vasto gama de sistemas com ajustes pontuais.

Influência da Linguagem C

Base para C++, Java, C#, PHP, entre outras.

ProgrammingLanguagesCCawkawkC->awkC (K & R)C (K & R)C->C (K & R)nawknawkawk->nawkANSICANSICC (K & R)->ANSICC with ClassesC with ClassesC (K & R)->C with ClassesObjective-CObjective-CC (K & R)->Objective-CPerlPerlnawk->PerlPerl 5.0Perl 5.0Perl->Perl 5.0ISO C (C99)ISO C (C99)ANSIC->ISO C (C99)PythonPythonANSIC->PythonC++C++C with Classes->C++OakOakObjective-C->OakObjective-C 2.1Objective-C 2.1Objective-C->Objective-C 2.1PHP/FIPHP/FIPerl 5.0->PHP/FIPHPPHPPHP/FI->PHPC1XC1XISO C (C99)->C1XC++ ANSI/ISOC++ ANSI/ISOC++->C++ ANSI/ISOC++->OakC++11C++11C++ ANSI/ISO->C++11C#C#C++ ANSI/ISO->C#JAVA1JAVA1Oak->JAVA1JAVA2JAVA2JAVA1->JAVA2JAVA2->C#JAVAJAVAJAVA2->JAVAActionScriptActionScriptJAVA2->ActionScript

Comparativo Sintático

A lógica de estruturas de controle (como o for) é herdada por linguagens modernas.

\\ c
for (int i = 0; i <= 10; i++)
{
    printf("%d\n", i);
}
\\ java
for (int i = 0; i <= 10; i++)
{
    System.out.println(i);
}
\\ perl
for (my $i = 0; $i <= 10; $i++)
{
    print "$i\n";
}
\\ php
for ($i = 0; $i <= 10; $i++)
{
    echo $i . PHP_EOL;
}
Herança do Design

A maioria das linguagens modernas utiliza chaves { } para delimitar blocos e ponto e vírgula ; para encerrar instruções.

Questões - 1

1. A linguagem C é classificada como uma linguagem de alto nível, mas possui características singulares. Assinale a alternativa correta:

  • A) É estritamente de baixo nível, impedindo portabilidade.
  • B) É orientada a objetos pura, substituindo o Assembly.
  • C) É procedural de alto nível, permitindo acesso direto à memória e hardware.
  • D) É interpretada, executada linha a linha sem compilação.

Ambiente de Desenvolvimento (IDE)

Utilizaremos o Code::Blocks.

  • Open source e multiplataforma.
  • Suporta múltiplos compiladores (MinGW recomendado).
Instalação

Prefira versões com "mingw-setup" para garantir que as ferramentas de compilação sejam instaladas automaticamente.

Criando um Novo Projeto - I

  1. File > New > Project...

Criando um Novo Projeto - II

  1. Selecionar Console application (modo texto).

Criando um Novo Projeto - III

  1. Selecionar linguagem C.

Criando um Novo Projeto - IV

  1. Definir Título do Projeto e Pasta de Destino.

Estrutura e Compilação

O Code::Blocks gera um esqueleto básico (main.c).

Ferramentas de Build:

  • Compile (Ctrl+Shift+F9): Traduz para arquivo objeto.
  • Build (Ctrl+F9): Compila e Linka (gera executável).
  • Build and run (F9): Gera executável e roda.

Utilizando o Debugger - I

Ferramenta para examinar o código em busca de erros lógicos (bugs).

  • Breakpoints (Pontos de Parada): Pausa a execução em linhas específicas.
  • Inserção: Clicar na margem ou F5. (Esfera vermelha).

Utilizando o Debugger - II

Controles de Depuração:

  • Start (F8): Inicia até o primeiro breakpoint.
  • Watches: Janela para monitorar valores de variáveis em tempo real.
  • Next line (F7): Executa linha a linha.
  • Step into (Shift+F7): Entra no código de uma função.
  • Step out (Shift+Ctrl+F7): Sai da função atual.

Utilizando o Debugger - III

Utilizando o Debugger - IV

Esqueleto de um Programa em C - I

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

int main(){
    printf("Hello World \n");
    system("pause");
    return 0;
}

Esqueleto de um Programa em C - II

Componentes do Esqueleto

  • Bibliotecas (#include): Importa funções prontas (stdio.h para I/O, stdlib.h para sistema).
  • main(): Ponto de início da execução. Obrigatório.
  • Blocos { }: Delimitam início e fim de instruções.
  • printf(): Exibe texto na tela.
  • system("pause"): Pausa a execução para visualização (Windows).
  • return 0;: Sinaliza ao SO que o programa terminou com sucesso.
  • Ponto e vírgula ;: Finaliza instruções.

Indentação

Espaçamento (tabulação) para indicar hierarquia visual. Fundamental para legibilidade.

Legível (Indentado)

int main(){
    printf("Ola");
    return 0;
}

Difícil Leitura (Não Indentado)

int main(){printf("Ola"); return 0;}
Dica de Estilo

O compilador ignora espaços, mas a indentação previne erros lógicos.

A Compilação do Programa

Processo de tradução de código-fonte para código de máquina.

  1. Pré-processamento: Expansão do arquivo, interpretação de diretivas (#), remoção de comentários.
  2. Verificação Sintática: Validação das regras da linguagem. Erros interrompem o processo.
  3. Compilação: Geração de arquivo objeto (instruções de máquina parciais).
  4. Link-edição: Unificação dos objetos e bibliotecas em um único arquivo executável.

Comentários e Documentação

Trechos ignorados pelo compilador, usados para documentação interna.

  • Comentário de Linha: // (até o fim da linha).
  • Comentário de Bloco: /* ... */ (múltiplas linhas).
/* Bloco de comentario
  Explicacao complexa
*/
int main() {
    printf("Oi"); // Comentario de linha
}
Dica de Ouro

Comente o "porquê" da decisão lógica, não apenas o "o que" o comando faz.

Questões - 2

2. Explique detalhadamente o que ocorre nas etapas de Pré-processamento e Link-edição.

3. No esqueleto abaixo, qual a função da linha return 0; e a quem esse valor é retornado?

int main(){ return 0; }

4. Julgue (V/F):
( ) Comentários de bloco iniciam com //.
( ) Erros de sintaxe dentro de comentários /* */ interrompem a compilação.
( ) A indentação não altera o desempenho do executável.

Parte II: Variáveis e Dados

Manipulação de Memória e I/O

O Conceito de Variável

Definição Computacional

  • Matemática: Entidade que representa um valor ($x^2$).
  • Computação: Posição de memória específica, com endereço físico, para armazenar dados modificáveis.
Analogia

Uma "caixa" com etiqueta (nome) na memória. O tipo define o tamanho da caixa.

EndereçoVariávelConteúdo
121int x10

Declaração e Inicialização

Sintaxe obrigatória: tipo_da_variável nome_da_variável;

int x;         // Declaração (reserva espaço)
x = 5;         // Atribuição (define valor)
int a, b, c;   // Múltiplas declarações
Lixo de Memória

A memória nunca está "vazia". Se você usar uma variável sem inicializar, ela conterá bits aleatórios de processos anteriores.

Regras de Nomenclatura

O computador vincula o nome ao endereço de memória.

Regras Rígidas:

  1. Caracteres: Letras, números e underscore (_).
  2. Início: Obrigatório letra ou _. Nunca número.
  3. Case-sensitive: Soma $\neq$ soma.
  4. Palavras-chave: Proibido usar reservadas (int, return, if, etc.).

Válidos

  • nota_final
  • _valor
  • x1

Inválidos

  • 1nota (começa com número)
  • valor-total (hífen proibido)
  • float (reservada)

Questões - 3

1. Qual a definição correta de variável em C?

  • A) Abstração sem relação física.
  • B) Posição de memória com endereço físico.
  • C) Valor constante em disco.

2. Identifique os identificadores INVÁLIDOS:

( ) 1contador
( ) valor_total
( ) return
( ) nota-final

3. O que será impresso se tentarmos exibir uma variável declarada mas não inicializada? Explique o conceito de "lixo de memória".

Tipos de Dados Primitivos

O tipo define o conjunto de valores e operações permitidas.

TipoBitsIntervalo Típico
char8-128 a 127 (ou caractere ASCII)
int32-2.147.483.648 a 2.147.483.647
float32Precisão Simples ($10^{-38}$ a $10^{+38}$)
double64Precisão Dupla ($10^{-308}$ a $10^{+308}$)
void-Ausência de valor (funções/ponteiros)

Bases Numéricas em C

Para tipos inteiros (int, char), a linguagem aceita três bases na inicialização:

  • Decimal: Padrão.

    • Ex: int a = 125;
  • Octal: Precedido por 0.

    • Ex: int b = 044; (36 decimal)
  • Hexadecimal: Precedido por 0x.

    • Ex: int c = 0x1FA;
printf("%d", 0x10); // Imprime 16

Modificadores de Tipo

Alteram capacidade e sinal.

  • unsigned: Apenas positivos. Dobra a capacidade positiva (ex: unsigned char vai até 255).
  • signed: Padrão (positivo e negativo).
  • short: Força "inteiro pequeno" (16 bits).
  • long: Garante "inteiro grande" (32 bits) ou aumenta precisão (long double).
Combinação
unsigned long int m; (Inteiro grande sem sinal).

Saída de Dados: printf()

Exibe dados formatados na tela. Não exige &.

Sintaxe: printf("texto e máscaras", variáveis);

FormatoTipo
%d / %iInteiro
%fReal (float/double)
%cCaractere
%sString
int x = 10;
float y = 5.5;
printf("Total: %d e Media: %f\n", x, y);

Entrada de Dados: scanf()

Captura dados do teclado.

Sintaxe: scanf("máscaras", &variáveis);

Regra de Ouro

Obrigatório usar & (operador de endereço) antes da variável. O scanf precisa saber onde gravar o dado na memória.

int idade;
scanf("%d", &idade); // Lê um inteiro

Questões - 4

4. Julgue (V/F):

( ) unsigned dobra a capacidade positiva do int.
( ) char armazena inteiros pequenos e códigos ASCII.
( ) O tipo void pode declarar variáveis comuns (void x = 10;).

5. Qual o valor decimal de int b = 010;?

6. Diferencie printf e scanf quanto ao uso do operador &. O que acontece se esquecer o & no scanf?

Constantes

Dados que não mudam durante a execução.

1. O comando #define

Diretiva de pré-processamento. Substituição textual antes da compilação. Sem tipo de memória associado.

#define PI 3.1415

2. O modificador const

Variável de "apenas leitura". Possui tipo e endereço de memória.

const float PI = 3.1415;

Sequências de Escape

Comandos de controle visual dentro de strings.

CódigoEfeito
\nNova linha
\tTabulação
\"Imprime aspas duplas
\\Imprime barra invertida
printf("Linha 1\nLinha 2");
printf("Item:\tPreco:");

Questões - 5

7. Corrija o código:

int main(){
    int idade;
    float altura;
    scanf("%f %d", &idade, &altura); 
    printf("Idade: %d - Altura: %d", idade, altura);
    return 0;
}

8. Qual a saída visual?

printf("A\\B\t%d", 100);

9. Diferencie #define (pré-processador) de const (memória alocada).

Próximos Passos

No próximo capítulo:

  • Operações com Variáveis:

    • Cálculos matemáticos básicos.
    • Operadores de incremento/decremento.
    • Operadores relacionais.
  • Controle Condicional:

    • Estruturas if-else e switch-case.
    • Avaliação de expressões lógicas.
    • Uso de operadores relacionais e lógicos em condições.
    • Aninhamento de condições.