Leonardo Delgado (Licenciatura em Informática - IFMA)
A linguagem C é uma linguagem de alto nível, genérica. Foi desenvolvida por programadores para programadores tendo como meta características de flexibilidade e portabilidade. O C é uma linguagem que nasceu juntamente com o advento da teoria de linguagem estruturada e do computador pessoal. Assim tornou-se rapidamente uma linguagem “popular” entre os programadores. O C foi usado para desenvolver o sistema operacional UNIX, e hoje esta sendo usada para desenvolver novas linguagens, entre elas a linguagem C++ e Java.
Características do C
Entre as principais características do C, podemos citar:
- Linguagem de alto nível;
- Case-Sensitive;
- Portabilidade[1] - podem ser compilados formando um programa executável em diversas plataformas;
- Linguagem estruturada;
- Modularidade[2] - Capacidade de importar bibliotecas;
- Recursos de baixo nível – torna o código compacto e rápido, gerando um código eficiente;
- Simplicidade;
- Facilidade de uso;
- Pode ser usada para os mais variados propósitos;
- Indicada para escrever compiladores, editores de textos, bancos de dados, etc.
Um programa em C é constituído de:
- Um cabeçalho contendo as diretivas de compilador onde se definem o valor de constantes simbólicas, declaração de variáveis, inclusão de bibliotecas, declaração de rotinas, etc.
- Um bloco de instruções principal (main) e outros blocos de rotinas.
- Documentação do programa: comentários.
Cabeçalho
Arquivo cabeçalho (em inglês: header file) é em programação de computadores e notadamente nas linguagens de programação C é um arquivo contendo declarações de classes, tipos, variáveis, protótipos de funções e macros que podem ser compartilhados entre vários arquivos com código fonte.
Diretivas de Compilação
Em C, existem comandos que são processados durante a compilação do programa. Estes comandos são genericamente chamados de diretivas de compilação. Estes comandos informam ao compilador do C basicamente quais são as constantes simbólicas usadas no programa e quais bibliotecas devem ser anexadas ao programa executável.
Biblioteca na Linguagem C
A linguagem C é por natureza própria uma linguagem estruturada. A maior parte de seus recursos é conseguida via utilização de funções. Assim sendo, a linguagem possui uma coleção de bibliotecas que podem ser usadas a qualquer momento.
Diretivas de Compilação
Em C, existem comandos que são processados durante a compilação do programa. Estes comandos são genericamente chamados de diretivas de compilação. Estes comandos informam ao compilador do C basicamente quais são as constantes simbólicas usadas no programa e quais bibliotecas devem ser anexadas ao programa executável.
Biblioteca na Linguagem C
A linguagem C é por natureza própria uma linguagem estruturada. A maior parte de seus recursos é conseguida via utilização de funções. Assim sendo, a linguagem possui uma coleção de bibliotecas que podem ser usadas a qualquer momento.
Uma Biblioteca consiste de um conjunto de funções pré-programadas com objetivo de auxiliar o programador durante a criação de um programa. Ao utilizar uma biblioteca o programador irá poupar tempo podendo dar prioridade para algoritmos mais específicos.
Além da vantagem de organizar o código, bibliotecas também têm a vantagem de poderem ser utilizadas em vários programas sem necessidade de copiar grandes trechos de código; basta dizer ao compilador que queremos adicionar aquela biblioteca ao executável.
Estes arquivos, normalmente, possuem a extensão “.h” e se encontram em algum diretório pré-definido pelo compilador. Sempre que o programa utilizar alguma função da biblioteca-padrão deve ser incluído o arquivo correspondente.
Importando uma biblioteca
A importação de uma biblioteca é dada pelo comando (diretiva) include (incluir) seguido da biblioteca entre os sinais de menor (<) e maior (>).
Importando uma biblioteca em C
Toda a diretiva, em C, começa com o símbolo # no início da linha. A diretiva #include diz ao compilador para incluir na compilação do programa outros arquivos. Geralmente estes arquivos contem bibliotecas de funções ou rotinas do usuário, ou seja, a linha que contêm a diretiva é substituída pelo conteúdo do arquivo especificado.
Sintaxe:
#include <nome do arquivo>
ou
#include “nome do arquivo”
O primeiro caso é o mais utilizado. Ele serve para incluir alguns arquivos que contêm declaração das funções da biblioteca padrão, entre outras coisas.
A segunda forma, onde o nome do arquivo aparece entre aspas duplas, serve normalmente para incluir algum arquivo que tenha sido criado pelo próprio programador ou por terceiros e que se encontre no diretório atual, ou seja, no mesmo diretório do programa que está sendo compilado.
No exemplo abaixo, vamos incluir duas bibliotecas padrões de C.
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
Esta biblioteca é a responsável pela entrada e saída. Standard In/Out, ou seja, Entrada/Saída Padrão. Nela, encontramos funções para estes fins. O que pode ser a leitura do teclado, escrita formatada ou não na tela e operações com arquivos.
Algumas funções dessas bibliotecas: fprintf, printf, fscanf, scanf, getchar, putc, getc, fopen, fclose...
#include <stdlib.h>
Esta biblioteca é a responsável por conversões de números, alocação na memória e outras tarefas! Com ela podemos:
Respectivamente, as funções citadas são: atof, atol, rand, malloc, realloc, free e system...
Também não podia deixar de citar que ela retorna o valor absoluto de um número inteiro usando abs.
#include <ctype.h>
Esta biblioteca serve para testar caracteres. Alguns testes possíveis com caracteres são:
Algumas funções: isupper, islower, isspace, isdigit, toupper, tolower...
#include <string.h>
A função string é responsável por disponibilizar funções para trabalhar com conjuntos de caracteres, isto é, strings. Este header possui dois grupos de comandos, os que começam com str e os que começam com mem.
O primeiro grupo permite, por exemplo: copiar, concatenar, comparar e ver o tamanho de uma string.
As funções referentes a isso são: strcpy, strcat, strcmp e strlen.
As funções do segundo grupo mencionado fazem coisas semelhantes como copiar, mover e comparar: memcpy, memmove, memcmp.
#include <math.h>
Está biblioteca declara funções matemáticas que podem servir para:
As funções referentes a isso são: sqrt, sin, cos, tan, log10.
Fora isso, um outro uso para declaração desta biblioteca é a possibilidade de arredondar um número! Para isso usamos a função que retorna o valor absoluto: fabs.
#include <time.h>
Esta biblioteca declara funções para manipularmos a data e hora. Podemos usar esta biblioteca para pegar o horário do processador, pegar o horário do sistema, fazermos a diferença entre dois horários.
As funções referentes são: clock, time e difftime.
Além da vantagem de organizar o código, bibliotecas também têm a vantagem de poderem ser utilizadas em vários programas sem necessidade de copiar grandes trechos de código; basta dizer ao compilador que queremos adicionar aquela biblioteca ao executável.
Estes arquivos, normalmente, possuem a extensão “.h” e se encontram em algum diretório pré-definido pelo compilador. Sempre que o programa utilizar alguma função da biblioteca-padrão deve ser incluído o arquivo correspondente.
Importando uma biblioteca
A importação de uma biblioteca é dada pelo comando (diretiva) include (incluir) seguido da biblioteca entre os sinais de menor (<) e maior (>).
Importando uma biblioteca em C
Toda a diretiva, em C, começa com o símbolo # no início da linha. A diretiva #include diz ao compilador para incluir na compilação do programa outros arquivos. Geralmente estes arquivos contem bibliotecas de funções ou rotinas do usuário, ou seja, a linha que contêm a diretiva é substituída pelo conteúdo do arquivo especificado.
Sintaxe:
#include <nome do arquivo>
ou
#include “nome do arquivo”
O primeiro caso é o mais utilizado. Ele serve para incluir alguns arquivos que contêm declaração das funções da biblioteca padrão, entre outras coisas.
A segunda forma, onde o nome do arquivo aparece entre aspas duplas, serve normalmente para incluir algum arquivo que tenha sido criado pelo próprio programador ou por terceiros e que se encontre no diretório atual, ou seja, no mesmo diretório do programa que está sendo compilado.
No exemplo abaixo, vamos incluir duas bibliotecas padrões de C.
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
Esta biblioteca é a responsável pela entrada e saída. Standard In/Out, ou seja, Entrada/Saída Padrão. Nela, encontramos funções para estes fins. O que pode ser a leitura do teclado, escrita formatada ou não na tela e operações com arquivos.
Algumas funções dessas bibliotecas: fprintf, printf, fscanf, scanf, getchar, putc, getc, fopen, fclose...
#include <stdlib.h>
Esta biblioteca é a responsável por conversões de números, alocação na memória e outras tarefas! Com ela podemos:
- Converter um char em um double
- Converte um char para long
- Criar um número randômico
- Alocar na memoria
- Realocar na memória
- Desalocar da memória
- Execução de comandos do sistema operacional
Respectivamente, as funções citadas são: atof, atol, rand, malloc, realloc, free e system...
Também não podia deixar de citar que ela retorna o valor absoluto de um número inteiro usando abs.
#include <ctype.h>
Esta biblioteca serve para testar caracteres. Alguns testes possíveis com caracteres são:
- Testar se é maiúsculo
- Testar se é minúsculo
- Testar se é espaço
- Testar digito decimal
Algumas funções: isupper, islower, isspace, isdigit, toupper, tolower...
#include <string.h>
A função string é responsável por disponibilizar funções para trabalhar com conjuntos de caracteres, isto é, strings. Este header possui dois grupos de comandos, os que começam com str e os que começam com mem.
O primeiro grupo permite, por exemplo: copiar, concatenar, comparar e ver o tamanho de uma string.
As funções referentes a isso são: strcpy, strcat, strcmp e strlen.
As funções do segundo grupo mencionado fazem coisas semelhantes como copiar, mover e comparar: memcpy, memmove, memcmp.
#include <math.h>
Está biblioteca declara funções matemáticas que podem servir para:
- Achar a raiz quadrada
- Achar o seno, co-seno
- Tangente
- Logaritmo na base 10
As funções referentes a isso são: sqrt, sin, cos, tan, log10.
Fora isso, um outro uso para declaração desta biblioteca é a possibilidade de arredondar um número! Para isso usamos a função que retorna o valor absoluto: fabs.
#include <time.h>
Esta biblioteca declara funções para manipularmos a data e hora. Podemos usar esta biblioteca para pegar o horário do processador, pegar o horário do sistema, fazermos a diferença entre dois horários.
As funções referentes são: clock, time e difftime.
#include <conio.h>
Esta biblioteca possui as rotinas de console de entrada e saída no Ms-DOS, e ainda as funções de ambiente clrscr(), gotoxy(), getche() entre outras. No DEV C++ algumas destas funções estão alocadas em uma variação da biblioteca conio, chamada conio.c
Variáveis e constantes em C
Variáveis em C são porções de dados que podem mudar seu valor durante a execução do programa. Ao contrário de constantes, uma variável tem que ser nomeada sempre. A melhor maneira de entender uma variável é pensar que variáveis são locais de memória que possuem um nome. Assim, sempre que você se referir a um mesmo nome, está acessando um mesmo local da memória. Exemplos de nomes de variáveis: total, soma, resultado, nome, idade, e assim por diante.
Em C toda variável armazena apenas um tipo de dados. Por exemplo, se você cria uma variável idade para armazenar números inteiros, não vai poder armazenar caracteres depois.
O fato de C exigir que variáveis armazenem sempre o mesmo tipo de dados, é chamado tecnicamente de Tipagem Forte. Algumas linguagens de programação não seguem esta restrição e são chamadas de linguagens Fracamente Tipadas (ex.: php, JavaScript e Ruby).
Para declararmos variáveis, definimos um nome e seu tipo de acordo com a sintaxe abaixo:
tipo nome1, nome2, nome3 , ...;
Em um programa na Linguagem C podemos declarar variáveis no início do programa, fora de todas as funções, no início de uma função, ou na lista de parâmetros de uma função.
No momento da declaração de uma variável, é possível inicializá-la com um valor. Por exemplo, int soma = 0; declara uma variável e a inicializa com o valor zero.
Durante a execução do programa o valor pode ser substituído normalmente. A prática de inicializar variáveis é importante, pois o C não inicializa automaticamente suas variáveis.
Identificar ou nome de uma variável
O identificador da variável é uma espécie de apelido do seu endereço de memória, tornando mais simples sua representação. O dado correspondente ao próprio valor que é guardado na variável. Já o tipo de dado pode ser guardado numa variável e o que pode ser feito com ela durante a execução.
Palavras reservadas
Palavras reservadas são palavras definidas na sintaxe da linguagem com algum propósito bem específico. Exemplo de palavras reservadas são if, " else, return, do, const.
A lista abaixo relaciona as palavras reservadas da linguagem C:
asm | auto | bool | break | case |
catch | char | class | const | const_cast |
Continue | default | delete | do | double |
Dynamic_cast | else | enum | explicit | export |
extern | false | float | for | friend |
goto | if | inline | int | long |
mutable | namespace | new | operator | private |
protected | public | register | reinterpret_cast | return |
short | signed | sizeof | static | static_cast |
struct | switch | template | this | throw |
true | try | typedef | typeid | typename |
union | unsigned | using | virtual | void |
Volatile | wchar_t | while |
Algumas regras para nomear variáveis
Existem algumas regras para a escolha dos nomes (ou identificadores) de variáveis em C:
- Nomes de variáveis só podem conter letras do alfabeto, números e o caractere underscore “_”.
- O primeiro caractere deve ser uma letra ou o caractere sublinhado (_) e os demais caracteres podem ser letras, números ou sublinhados;
- Não podem começar com um número.
- Não é permitido o uso de espaço em branco ou de caracteres especiais, como: @, #, &, *, +, ?, $ (exceto o _ )
- Podem ser seguidos por mais caracteres alfabéticos e/ou numéricos.
- Os identificadores podem ter qualquer tamanho, mas os primeiros 31 caracteres são significativos;
- Não é possível utilizar palavras reservadas da linguagem C. Também não é possível criar uma variável que tenha o mesmo nome de uma função, mesmo que essa função tenha sido criada pelo programador, ou seja, uma função de biblioteca.
- C diferencia letras maiúsculas e minúsculas em nomes de variáveis. Ou seja, count, Count e COUNT são três nomes de variáveis distintos.
Tabela 1: Nomes de identificadores válidos e inválidos
Identificadores Válidos | Identificadores Inválidos |
NUM, NOTA1, ALTURA_MEDIA, AlturaMedia, maiorNumero | 1Nota (não inicia com letra) Nota 1 (contém espaço) FIM (palavra reservada), Not@ (contém um caractere especial), Altura.Media (contém um caractere especial) |
Tipos de dados em C
Quando um programa é escrito em qualquer linguagem de programação é necessário a definição de algumas variáveis. Variáveis são instâncias em que serão armazenados valores utilizados durante a execução de programas. Estas variáveis podem ser modificadas para suportar diferentes tipos de dados. Na tabela abaixo constam os tipos básicos de dados da Linguagem C:
A tabela abaixo mostra os principais tipos de inteiros, seus tamanhos em bits e seu intervalo de armazenamento.
Tipo | Tamanho (em bits) | Intervalo |
char | 8 | -128 a 127 |
unsigned char | 8 | 0 a 255 |
Int | 16 | -32768 a 32767 |
unsigned int | 16 | 0 a 65535 |
short | 16 | -32768 a 32767 |
unsigned short | 16 | 0 a 65535 |
long | 32 | -2147483648 a 2147483647 |
unsigned long | 32 | 0 a 4294967295 |
Alguns modificadores podem ser utilizados para alterar a faixa de valores de um tipo. Possuindo os tipos básicos de dados, pode-se ainda formatá-los para atender melhor as necessidades de cada situação. Com exceção do tipo void, todos os outros tipos básicos podem ter modificadores precedendo-os.
Os principais modificadores são short, long, signed e unsigned. Os modificadores short e long fazem com que o tipo seja armazenado com uma quantidade menor (ou maior) de bytes, alterando sua faixa de valores. Já os modificadores signed e unsigned permitem indicar se a variável deve armazenar o bit de sinal ou não, fazendo com que a variável armazene números negativos (signed) ou apenas números positivos (unsi gned).
A tabela a seguir mostra todas as combinações permitidas dos tipos básicos e dos modificadores de tipo.
Tipo | Tamanho (em bits) | Intervalo |
char | 8 | -128 a 127 |
unsigned char | 8 | 0 a 255 |
signed char | 8 | -128 a 127 |
int | 16 | -32768 a 32767 |
unsigned int | 16 | 0 a 65535 |
signed int | 16 | -32768 a 32767 |
short int | 16 | -32768 a 32767 |
unsigned short int | 16 | 0 a 65535 |
signed short int | 16 | -32768 a 32767 |
long int | 32 | -2147483648 a 2147483647 |
signed long int | 32 | -2147483648 a 2147483647 |
unsigned long int | 32 | 0 a 4294967295 |
float | 32 | 3,4E-38 a 3,4E+38 |
double | 64 | 1,7E-308 a 1,7E+308 |
long double | 80 | 3,4E-4932 a 1,1E+4932 |
Constantes em C
O conceito de constantes em linguagens de programação é atribuir certo valor constante a um nome, e quando este nome for referenciado dentro do código do programa, será utilizado nas operações o valor atribuído a este nome. Ou seja, se for definida a constante PI com o valor “3,1415926536”, quando for encontrado no código o nome PI, será utilizado em seu lugar o valor “3,1415926536”. Na Linguagem C, constantes podem ser definidas da seguinte maneira:
#define <nome_da_constante> valor
Exemplos:
#define PI 3,1415926536
#define SINAL "aberto"
#define MULT A*B
Observe que na definição de uma constante não há o “;” no final. Se for colocado, este fará parte do valor associado à constante.
Bloco de Instruções
Um programa em Linguagem C é formado por uma ou mais funções. Sendo que a única função obrigatória é a main(). Esta é a primeira função a ser chamada toda vez em que o programa é executado. Toda função deve ter o seu nome precedido de parênteses “()”, indicando que se trata de uma função. Os símbolos “{“ e “}” representam o inicio e o termino da função respectivamente.
Ao concluir a função main, com o comando return, a execução do programa é finalizada, sendo que pelo padrão ANSI, esta função deve retornar 0 (zero) se o programa foi finalizado com sucesso, ou um valor maior que zero caso ele tenha sido finalizado por uma situação anormal. Além da função main, o programa pode possuir outras funções, sendo que estas devem ser, direta ou indiretamente, chamadas pela função main.
Uso do Ponto-e-Vírgula
O ponto-e-vírgula é usado para separar diferentes comandos dentro do seu código em C. Durante o processo de compilação executado pelo compilador, o ponto-e-vírgula mostra ao compilador quando uma linha de comando termina e quando outra linha de comando se inicia. Ou seja, se você esquecer do ponto-e-vírgula seu compilador irá acusar um erro pois ele não irá saber quando termina ou começa um determinado comando dentro do código que você digitou.
System("pause")
A função system funciona como se tivéssemos digitado o que está entre aspas duplas na janela de console. Nesse caso, pause. System é uma função da linguagem C. Isso vai gerar uma mensagem: "pressione uma tecla para continuar..." ou "press any key to continue..." na tela do console. Incluímos esta função para que o programa não encerre imediatamente após se executado (se não tivéssemos a incluído, o programa apareceria na tela e em segundos encerraria.
Comentários
Os comentários servem principalmente para documentação do programa e são ignorados pelo compilador, portanto não irão afetar o programa executável gerado.
Para inserir um comentário em uma única linha no código fonte, usamos a seguinte seqüência de caracteres.
// Comentários Curtos em C
Para inserir um comentário de várias linhas usamos a seguinte seqüência de caracteres
/* Comentários Longos
Mais de uma linha em C*/
Um comentário pode aparecer em qualquer lugar no programa onde possa aparecer um espaço em branco e pode se estender por mais de uma linha.
#include <stdio.h>
#include <stdlib.h>
int main()
{
//inclusão de comentários
system("PAUSE");
}

