Guia Completo de Linguagem C: Estruturas e Funções

Classificado em Computação

Escrito em em português com um tamanho de 9,18 KB

Linguagens de Programação

Máquina

  • Linguagem natural de um computador;
  • Complexa para o homem;
  • Lenta, tediosa e propensa a erros;
  • Representada por sequências de bits (0 e 1), que são instruções executadas pelo processador.

Baixo nível

  • Chamadas de Assembly, próximas à linguagem de máquina;
  • Programas tradutores convertem Assembly em linguagem de máquina;
  • Programas com pouca portabilidade e não estruturados, tornando a programação mais difícil.

Alto nível

  • Mais próximas à linguagem humana;
  • São mais simples de entender, já que utilizam uma sintaxe estruturada, tornando seu código mais legível;
  • Criadas para acelerar o processo de programação;
  • Os compiladores convertem os programas de linguagem de alto nível em linguagem de máquina;
  • Permitem a manipulação dos dados nas mais diversas formas (números inteiros, reais, vetores, etc.).


Linguagem C

Características

  1. Imperativa: baseada em um programa principal que eventualmente executa sub-rotinas;
  2. Compilada: produz um executável independente;
  3. Fortemente tipada: as variáveis precisam ser declaradas com seus tipos de dados associados;
  4. Case Sensitive: letras minúsculas e maiúsculas não são equivalentes.

Nível médio: combina elementos de linguagem de alto nível com a funcionalidade do Assembly.

  • Estrutura em blocos;
  • Gera programas velozes, pois são compilados e não interpretados;
  • Poderosa;
  • Requer mais do programador;
  • Permite controle absoluto do hardware;
  • Manipulação de bits, bytes e endereços.


Estrutura de Seleção

Operadores Lógicos:

  • AND: &&
  • OR: ||
  • XOR: ^
  • NOT: !(condição)
if (condição) {
    // ...;
}

Operador Ternário:

Exp1 ? Exp2 : Exp3

  • Se Exp1 for TRUE, retorna Exp2;
  • Se Exp1 for FALSE, retorna Exp3;
  • Exemplo: if (b) printf("%d", a/b);
#include <stdio.h>
#include <stdlib.h>

main() {
    float a, b, maior;
    printf("Digite dois números: ");
    scanf("%f %f", &a, &b);
    maior = (a > b) ? a : b;
    printf("Maior: %f\n", maior);
    system("pause");
}

Estrutura de Seleção - Switch

switch (expressão) {
    case opc1:
        // ...;
        break;
    case opcn:
        // ...;
        break;
    default:
        // ...;
}

Exemplo com char:

switch (turno) {
    case 'M':
        printf("Matutino");
        break;
    case 'V':
        printf("Vespertino");
        break;
    case 'N':
        printf("Noturno");
        break;
    default:
        printf("Turno inválido!");
}


Estrutura de Repetição

Também conhecida como loop ou laço:

  • Iterativa: FOR
  • Controlada logicamente: WHILE, DO WHILE
  • Permite repetir um determinado bloco de código;
  • Sem estas estruturas, haveria repetição de blocos de códigos iguais, gerando programas enormes e difíceis de escrever.

FOR

for (inicialização; condição; iteração) {
    // ...;
}

Exemplo:

{
    int i;
    for (i = 1; i <= 10; i++) {
        printf("%d", i);
    }
}

WHILE e DO WHILE

Conhecidos como laços controlados logicamente por uma expressão booleana.

  • Não sabemos previamente quantas vezes o bloco será executado;
  • A condição é testada antes da primeira execução (WHILE) ou após cada repetição (DO WHILE);
  • Pré-teste vs. Pós-teste: No DO WHILE, o bloco é executado pelo menos uma vez;
  • While com apenas um comando no corpo não precisa de chaves: while (x != 10) scanf("%d", &x);
while (condição) {
    // ...;
}

do {
    // ...;
} while (condição);

Exemplo DO WHILE:

{
    int i = 0;
    do {
        i++;
        printf("%d", i);
    } while (i < 15);
}


Debugger (Depurador)

Com o depurador é possível:

  • Executar o programa passo a passo;
  • Acompanhar o fluxo do programa;
  • Monitorar alterações nos valores de variáveis;
  • Verificar chamadas de procedures e functions;
  • Observar alterações no console (vídeo);
  • Depurar é remover os bugs do sistema.


Funções Pré-definidas

<stdio.h>

  • printf: Saída de dados;
  • scanf: Entrada de dados;
  • gets: Lê um array de caracteres (string). Fará parte da string tudo que for digitado até o Enter.
{
    char MSG[21];
    printf("Digite uma mensagem de no máximo 20 caracteres: ");
    gets(MSG);
}
  • putchar: Mostra um caractere na tela. Retorna EOF em caso de erro. Exemplo: putchar(variável);

<conio.h>

  • getch(): Lê um caractere (tecla) sem ecoar na tela. Exemplo: variável = getch();
  • clrscr(): Limpa todo o conteúdo da tela.

<string.h> (Strings terminam com o caractere nulo \0)

  • strcpy: Copiar string. strcpy(destino, origem);
  • strcat: Concatenar strings. strcat(str1, str2);
  • strcmp: Comparar strings. Retorna 0 se forem idênticas.
  • strlen: Retorna o comprimento da string, desconsiderando o terminador nulo.

<stdlib.h>

  • atof: Converte string para float. var_float = atof(string);
  • atoi: Converte string para inteiro. var_int = atoi(string);
  • randomize: Inicializa o gerador de números randômicos;
  • random(n): Gera número aleatório de 0 até n-1;
  • rand(): Gera número aleatório de 0 a RAND_MAX;
  • system: Executa comandos externos do sistema operacional.

<ctype.h>

  • tolower: Converte para minúsculo;
  • toupper: Converte para maiúsculo;
  • islower / isupper: Verifica se é minúsculo/maiúsculo;
  • isalpha: Verifica se é letra;
  • isdigit: Verifica se é número;
  • isspace: Verifica se é espaço.

<math.h>

  • fabs: Valor absoluto (módulo);
  • pow: Potência (base elevada ao expoente);
  • sqrt: Raiz quadrada;
  • ceil: Arredonda para cima (Ex: 3.4 -> 4);
  • floor: Arredonda para baixo (Ex: 3.4 -> 3);
  • log, sin, cos, tan, etc.


Diretiva #define

  • Define um identificador e um conteúdo (string);
  • Toda vez que o identificador for encontrado, será substituído pelo conteúdo correspondente;
  • Chamamos o identificador de macro ou constante simbólica.
  • Sintaxe: #define NOME_MACRO valor

Exemplo:

#define VERDADEIRO 1
#define ERRO_DIVISAO "Erro: Divisão por zero!"

printf(ERRO_DIVISAO); // Substituído por printf("Erro: Divisão por zero!");

Macros com argumentos:

#define ABS(a) ((a) < 0 ? -(a) : (a))

main() {
    printf("\n abs de -1: %d", ABS(-1));
    getch();
}

Recomendação: Use parênteses em macros para evitar erros de precedência: #define PRODUTO(x, y) ((x) * (y))


Vetor (Array)

  • Recurso que facilita a declaração, acesso e manipulação de uma sequência de variáveis do mesmo tipo;
  • Estrutura de dados homogênea: armazena elementos de um mesmo tipo;
  • Estruturas estáticas: dimensão determinada em tempo de compilação;
  • Índice do primeiro elemento: 0;
  • Índice do último elemento: n - 1;
  • É trabalho do programador verificar os limites dos índices para evitar comportamentos anômalos.

Inicialização:

int vetor[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int vetor[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // Tamanho omitido

Exemplo de leitura de dados:

#define TAM_MAX 5

main() {
    int vetint[TAM_MAX];
    for (int i = 0; i < TAM_MAX; i++) {
        printf("Digite um número inteiro: ");
        scanf("%d", &vetint[i]);
    }
}

Entradas relacionadas: