I. Introdução A Linguagem C
I. Introdução A Linguagem C
I. Introdução A Linguagem C
Programação I
Prof. MSc. Admiro Chinapaie
II semestre do Ano acad. 2023/24
UM BREVE HISTÓRICO
1
A linguagem C foi criada por Dennis Ritchie em 1972 para reescrever de forma portável
o sistema operacional UNIX, que antes era escrito em assembly. Sua estrutura e seu
nome provêm de uma linguagem anterior B, que era uma simplificação da linguagem de
programação BCPL, escrita em 1966.
Em 1978 foi publicado o livro The C Programming Language por Brian Kernighan e
Dennis Ritchie, consagrando a linguagem no padrão chamado K&R. Durante muitos
anos esse livro foi considerado como a especificação da linguagem.
Em 1989 o padrão C foi oficializado pelo ANSI (American National Standards Institute)
através do padrão ANSI X3.159-1989, conhecido hoje como ANSI C, C89 ou C90. É
provavelmente a versão mais usada da linguagem ainda hoje.
Apesar de sua idade, C continua sendo uma das linguagens mais utilizadas (TIOBE
INdex), Ranking IEEE. A linguagem C inspirou a criação de muitas outras linguagens
de programação mais recentes, como C++, Java, C#, JavaScript, Perl, PHP, Lua, etc.
Programação
Programação, também chamada de codificação na área de TI, refere-se a todas as
actividades que permitem a escrita de programas de computador. Esta é uma etapa
importante no desenvolvimento de software (ou mesmo hardware).
2
Diferentes linguagens de programação:
JavaScript, PHP, Ruby, Java, Swift, C#, C ou C++, Python, Julia, Scala, R
Programa
Um programa de computador é um conjunto de instruções e operações destinadas a
serem executadas por um computador.
Um programa geralmente faz parte de um software que pode ser definido como um
conjunto de componentes digitais destinados a fornecer um serviço de TI. O software
pode incluir vários programas. Encontramo-lo em dispositivos informáticos
(computador, consola de jogos, caixas automáticos, etc.), em peças de equipamentos
informáticos, bem como em numerosos dispositivos electrónicos (impressora, modem,
GPS, telemóvel, máquina de lavar, aparelho de fotografia digital, decodificador de TV
digital, injecção electrónica, piloto automático, etc.).
Programar
3
Antes de começar a escrever um programa destinado a resolver um problema, o
programador deve determinar as características do problema a ser resolvido. Isso é feito
em várias etapas, independentemente da linguagem de programação utilizada. A técnica
comum é a de um ciclo de desenvolvimento, que inclui etapas de definição, projecto,
escrita, teste, instalação e manutenção.
O problema é primeiro examinado detalhadamente para conhecer o escopo do programa
a ser criado. O próximo passo é escolher soluções e algoritmos, depois descrever sua
lógica na forma de diagramas, para esclarecer o funcionamento do programa e facilitar
sua escrita.
Depois que o programa é escrito, ele passa por uma série de testes. Os resultados
produzidos pelo programa são comparados com resultados obtidos manualmente.
Muitos testes são necessários e os mesmos testes são executados várias vezes. As
necessidades dos usuários e dos sistemas de computador mudam continuamente, e o
programa é regularmente reconstruído e modificado para se adaptar às necessidades.
Novas funções são adicionadas e erros que não foram detectados anteriormente são
corrigidos.
O objectivo do ciclo de desenvolvimento é reduzir os custos de fabricação e, ao mesmo
tempo, aumentar a qualidade do programa. As qualidades procuradas são eficiência,
flexibilidade, confiabilidade, portabilidade e robustez. Também deve ser amigável e
fácil de editar.
Espera-se que um programa exija pouco esforço de programação, instruções que
ocupem pouco tempo e memória, e possa ser usado para diversos propósitos e produzir
os resultados esperados independentemente das alterações - permanentes ou temporárias
- no sistema do computador.
Espera-se também que possa ser facilmente transferido para um modelo informático
diferente daquele para o qual foi construído, que produza resultados conclusivos mesmo
quando a informação introduzida está incorrecta, que possa ser facilmente
compreendido por um utilizador principiante e que a fonte o código pode ser facilmente
modificado posteriormente.
COMPILADOR
Na computação, um compilador é um programa que transforma código-fonte em
código-objeto. Geralmente, o código-fonte é escrito em uma linguagem de programação
(a linguagem-fonte), é de alto nível de abstracção e facilmente compreensível por
humanos. O código-objeto geralmente é escrito em uma linguagem de nível inferior
(chamada linguagem alvo), como linguagem assembly ou linguagem de máquina, para
criar um programa que possa ser executado por uma máquina.
Apresentação geral
Um compilador executa as seguintes operações: análise lexical, pré-processamento (pré-
processador), análise sintáctica (parsing), análise semântica e geração de código
optimizado. A compilação geralmente é seguida por uma etapa de vinculação, para gerar
um arquivo executável. Quando o programa compilado (código-objeto) é executado em
um computador cujo processador ou sistema operacional é diferente do compilador, isso
é chamado de compilação cruzada.
4
Compilação em tempo real (just-in-time, abreviado como JIT): essa habilidade
apareceu na década de 1980 (por exemplo, com Tcl/Tk).
Características da Linguagem
Algumas das principais características da linguagem C são:
a) linguagem procedural, modular e estruturada, com tipagem estática de dados;
b) geralmente é compilada para o código de máquina da plataforma alvo;
c) gerando código compacto, eficiente e sem necessidade de um subsistema
runtime de execução sofisticado;
d) possui facilidades para acesso de baixo nível à memória, registradores e portas
de E/S;
e) extremamente portável, pode executar em plataformas de microcontroladores a
supercomputadores;
f) é muito utilizada para escrever software de sistema, como sistemas
operacionais, compiladores, serviços de rede, interfaces gráficas, bancos de
dados, editores de texto, jogos, etc;
g) a maior parte das funcionalidades da linguagem provém de vastas bibliotecas,
como a biblioteca padrão C (LibC ou Standard C Library).
5
1.3. ESTRUTURA BÁSICA
Formato Padrão
Os arquivos em C devem ser salvos com a extensão .c, por exemplo, ola.c. O formato
básico de um programa em C segue a estrutura:
6
função' se refere ao conjunto de instruções dentro da função (dentro de {}), executado
quando a função é chamada.
main(): É uma função especial. Quando um programa C é executado, começa a
execução a partir da primeira linha de main(). Assim, main() é uma função obrigatória
em todos os programas C. Não recebe entrada e produz uma saída inteira (int).
1.4. BIBLIOTECAS
Arquitetura
A biblioteca padrão foi inicialmente fornecida com o compilador, mas hoje costuma
fazer parte do sistema operacional. Em sistemas Unix, geralmente é encontrado no
diretório /usr/lib/ e possui os nomes libc.a ou libc.so; os arquivos de cabeçalho estão
no diretório /usr/include. No entanto, o compilador sempre sabe onde estão esses
arquivos, portanto não há necessidade de informá-lo.
Bibliotecas de funções
7
Para ter acesso a uma biblioteca, seu programa deve incluir uma cópia do
correspondente arquivo-interface. Por exemplo, basta escrever
#include <stdlib.h>
O arquivo bib.h deve ser incluído em todos os arquivos-fonte que usam a biblioteca
bib, bem como na implementação bib.c da biblioteca.
8
Os tipos de dados em C são os valores de dados que um programa C pode processar.
Eles são os blocos básicos de construção de um programa C. Veremos a grande
variedade de tipos de dados disponíveis em C, bem como sua importância e
aplicações.
Os 4 tipos de dados em C
Existem vários tipos de tipos de dados em C, que são:
1. int
O tipo de dados int é usado para armazenar inteiros (números inteiros) como -1, 0, 42,
etc.
Sintaxe:
9
Cenários de uso comum do tipo de dados int:
Contagem: números inteiros são comumente usados para contar objetos ou
eventos discretos. Por exemplo, contar o número de alunos em uma turma, o
número de dias em uma semana, etc.
Indexação: números inteiros são freqüentemente usados como índices para
acessar elementos em matrizes, listas ou outras estruturas de dados.
Operações matemáticas: inteiros são usados em cálculos matemáticos como
adição, subtração, multiplicação e divisão.
Iterações de loop: números inteiros são freqüentemente usados como
contadores de loop em construções de iteração, como loops for e loops while.
10
Alocação de memória: números inteiros são usados para representar
endereços, deslocamentos e tamanhos de memória.
Códigos de erro e sinalizadores: números inteiros são freqüentemente usados
para representar códigos de erro, sinalizadores de status e valores booleanos.
Entrada e saída do usuário: números inteiros são comumente usados para
representar a entrada do usuário em teclados, cliques do mouse ou outros
dispositivos de entrada.
2. caractere
O tipo de dados char é usado para armazenar caracteres únicos como 'A', '1' ou '$'. O
caractere deve estar entre aspas simples e devemos usar o especificador de formato
%c para imprimi-lo.
Sintaxe:
11
3. float
O tipo de dados float é usado para armazenar números de ponto flutuante de precisão
simples, que podem representar valores decimais com precisão limitada. O tamanho
deste tipo de dados é de 4 bytes, ou seja, ocupa 4 bytes de memória. Varia entre +/-
3,4E-38F até +/- 1,7E+308F dependendo da arquitetura do sistema.
Sintaxe:
Exemplo:
4. double
O tipo de dados double é usado para armazenar números de ponto flutuante de
precisão dupla, ou seja, 64 bits de números decimais ou pontos flutuantes, que
12
oferecem maior precisão do que float para valores decimais. O tamanho deste tipo de
dados é de 8 bytes, ou seja, ocupa 8 bytes de memória. Varia entre 1,7E-308 a
1,7E+308.
Sintaxe:
Exemplo:
5. Float vs Double
A precisão de um valor de ponto flutuante indica quantos dígitos o valor pode
ter após a vírgula decimal.
A precisão do float é de seis ou sete dígitos decimais, enquanto as variáveis
duplas têm uma precisão de cerca de 15 dígitos.
Portanto, é recomendado usar double para a maioria dos cálculos. No entanto,
double ocupa duas vezes mais memória que float (8 bytes versus 4 bytes).
6. Vazio ou Nulo
13
Quando uma função não retorna um valor ou um ponteiro não possui um tipo de dados
específico anexado a ele, C usa o tipo de dados void para expressar isso. É comumente
usado em declarações de funções como um tipo de retorno indicando que a função não
retorna nenhum valor e que simplesmente executa alguma tarefa sem produzir
nenhum resultado.
Sintaxe:
Exemplo:
1.6. VARIÁVEIS
14
Palavras-Chave: Não podem ser usadas como identificadores.
Convenções de Nomenclatura
As convenções de nomenclatura ajudam na legibilidade e manutenção do código:
Iniciação: Nomeie variáveis com letras minúsculas.
Significado: Use identificadores descritivos.
Separadores: Utilize letras maiúsculas ou sublinhados para separar "palavras"
nos identificadores.
Constantes Simbólicas: Utilize todas as letras maiúsculas.
Palavras-Chave
Palavras-chave são tokens reservados na linguagem de programação para
funcionalidades específicas. Algumas delas incluem:
Constantes em C
As constantes são valores fixos que não mudam durante a execução do programa. Elas
incluem vários tipos:
Constante Inteira: Números sem ponto decimal, podendo ser decimais, octais
ou hexadecimais.
Constante Real/Ponto Flutuante: Números com partes fraccionárias
representados em forma fraccionária ou exponencial.
Constante de Caractere: Símbolos associados a um valor ASCII.
Constante de Barra Invertida: Sequências especiais de caracteres com
efeitos especiais de impressão.
Constante de String: Sequência de caracteres entre aspas duplas.
Inicialização de Variáveis
As variáveis podem ser inicializadas com valores iniciais ao serem declaradas:
15
É aconselhável documentar variáveis inicializadas com comentários que descrevam
sua função ou uso no programa.
1.7. OPERADORES
Os operadores são símbolos que instruem o computador a realizar manipulações
matemáticas ou lógicas. Eles são utilizados em programas para manipular dados e
variáveis.
Tipos de Operadores em C
7. Operadores Bit a Bit: Operam em nível de bits e são usados para manipulação
directa de dados binários.
Os separadores:
Em nossa linguagem escrita, palavras diferentes são separadas por espaço, sinal de
pontuação ou final de linha.
Na linguagem C é a mesma coisa, dois identificadores sucessivos entre os quais a
sintaxe não impõe nenhum sinal particular devem ser separados por uma virgula ou
por um ponto-e-vírgula.
Exemplo:
16
1.8. COMANDOS DE ENTRADA E SAÍDA DE DADOS
Impressão Simples
Para imprimir uma mensagem simples na tela, utilize a função printf() da seguinte
maneira:
17
Sequências de Escape em C
As sequências de escape são uma série de caracteres que representam caracteres
especiais. O caractere de barra invertida (\) indica que os caracteres seguintes devem ser
tratados de forma especial. Em C, as sequências de escape são usadas para imprimir
certos caracteres especiais. Algumas das sequências de escape comuns são:
saída:
Impressão de Valores
A função printf() também é utilizada para imprimir valores de variáveis utilizando
formatos específicos. Por exemplo:
18
Além do formato %d para inteiros, há vários outros especificadores de formato para
diferentes tipos de dados, como %f para floats, %c para caracteres, %s para strings,
entre outros.
A saída:
19
O exemplo acima demonstra a utilização de diferentes formatos para imprimir variáveis
com espaços de largura específicos e precisão para números de ponto flutuante.
A função printf() em C é uma ferramenta poderosa para imprimir informações
formatadas e exibir dados no console de forma organizada e legível. Utilizando
correctamente os especificadores de formato e as sequências de escape, é possível
controlar a aparência da saída para atender às necessidades do programa.
20
A leitura de caracteres individuais é feita usando %c, enquanto a leitura de strings
(sequências de caracteres sem espaços) é realizada utilizando %s. Vale notar que não é
necessário utilizar & antes de %c e %s para ler caracteres e strings, respectivamente.
1.9. COMENTÁRIOS
Como qualquer linguagem avançada, a linguagem C permite a presença de comentários
no programa fonte, este é um texto explicativo destinado aos leitores do programa que
não têm impacto na sua compilação.
21
Os comentários são compostos por caracteres colocados entre os símbolos //..... ou
/* ...e... */, podendo aparecer em qualquer lugar do programa; mas em geral
escolheremos um local legível.
Exemplo:
22