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
- Imperativa: baseada em um programa principal que eventualmente executa sub-rotinas;
- Compilada: produz um executável independente;
- Fortemente tipada: as variáveis precisam ser declaradas com seus tipos de dados associados;
- 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. RetornaEOFem 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 aRAND_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 omitidoExemplo 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]);
}
}