Você está na página 1de 6

Linguagem C – Prof.

Wellington Telles
Definições
Linguagem
Método padronizado para comunicar com um computador. O computador trabalha com lógica de bits e bytes e na
sua arquitetura o seu processamento é através de microinstruções.
Baixo nível
Mais próxima do computador, duas gerações 1GL códigos em hexadecimal e 2GL é a linguagem Assembly
(mnemônicos)
Alto nível
Mais próxima da linguagem humana.
Exemplo em Cobol:
DECIMAL-POINT IS COMMA.
Ponto decimal é vírgula.
Microcontrolador
É um computador reduzido com processor, memória, entradas e saídas agrupados em apenas um circuito integrado.
Exemplo disso é um Z80, 8051, Arduino, PIC, ESP8266, ESP32 entre outros.
Por que a linguagem C para esse curso?
A linguagem C é chamada de “médio nível”.
A linguagem C não é das mais elegantes, mas vários sistemas suportam os seus programas, para a disciplina de
programação de computadores será dada a ênfase para programação de microcontroladores.
Histórico
Criada entre 1969 e 1973 por Denis Ritchie (AT&T Bell Labs) para desenvolver o sistema operacional UNIX. Sucessora
da linguagem B, da versão BCPL - Basic Combined Programming Language (Linguagem de Programação Básica
Combinada).
Algol 60 (ALGOrithmic Language - Linguagem Algorítmica) - 1957 – Projetado por um comitê internacional.
CPL – Combined Programming Language. Desenvolvida em Cambridge e na Universidade de Londres em 1963.
BCPL – Basic Combined Programming Language. Desenvolvida em Cambridge por Martin Richards em 1967.
B – Desenvolvida por Ken Thompson, nos Laboratórios Bell em 1970, a partir da linguagem BCPL.
C – Desenvolvida por Dennis Ritchie, nos Laboratórios Bell em 1972. Aparece também a figura de Brian Kernighan
como colaborador.
ANSI C – O comitê ANSI (American National Standards Institute) foi reunido com a finalidade de padronizar a
linguagem C em 1983.
C++ - A linguagem C se torna ponto de concordância entre teóricos do desenvolvimento da teoria de Object Oriented
Programming (programação orientada a objetos): surge a linguagem C++ com alternativa para a implementação de
grandes sistemas. Essa linguagem consegue interpretar linhas de código escritas em C.
Memória
A memória armazena valores como 0 e 1 (bits), que combinados em conjuntos de 8 bits forma o byte que pode ser
256 combinações diferentes (0 até 255).
O computador divide a memória entre memória de programa e memória de dados.
A memória pode ser RAM (Random Access Memory – Memória de acesso aleatório) ou ROM (Read Only Memor –
Memória somente de leitura).
Outros tipos: EPROM (Erasable programmable read-only memory - memória programável apagável somente de
leitura), EEPROM (Electrically-Erasable Programmable Read-Only Memory – Eletricamente memória programável
apagável somente de leitura).
Barramentos (BUS)
Conjunto de fios paralelos que interconecta os dispositivos de hardware como CPU, memória, entradas e saídas.
Três tipos de barramentos:
• Barramento de controle que controla o funcionamento dos componentes do sistema;
• Barramento de endereços, onde é colocada a informação de origem ou destino para a informação a ser
enviada ou recuperada;
• Barramento de dados, onde trafegam os dados.
Página 1|6
O Microcontrolador 8051 tem 16 linhas de endereços e pode endereçar no máximo 216=65536, um barramento de
32 bits pode endereçar 232= 4294967296.
Programas de Computador
O programa é uma lista de instruções que o computador irá executar.
Normalmente o programa pode ser escrito através de um editor de texto simples como notepad++.
No formato de texto não é interpretado pelo computador, uma vez que estamos programando em alto nível e o
computador requer baixo nível, então será necessária uma “tradução” de um formato para o outro.
O texto será transformado em um formato binário e quem faz isso é chamado de compilador.
Algoritmos
É um procedimento para nós ajudar a resolver problemas independente da linguagem de programação, sintetizando
processos matemáticos e lógicos.
Os algoritmos podem ser representados através de fluxogramas.

Organização de Dados
Bits: representado por 0 e 1
Nibbles: conjunto de 4 bits, para representar números BCD ou hexadecimais.
Bytes: conjunto de 8 bits que pode representar 256 valores diferentes (0 a 255 ou -128 a +127 ou caracteres ASCII).
Word: conjunto de n bits que pode ter 8, 16, 32, 64, 128 e etc.
Double Word: compostos por duas words.
Ponto Flutuante (float): números reais.

Página 2|6
Tabela ASCII

Metodologia
Top Down
Estilo
Projete de cima para baixo (top for down): O projeto começa com a especificação do sistema completo de forma
suficientemente compacta para que uma pessoa possa rapidamente compreendê-la.
O projeto procede pela divisão do sistema em subsistemas e subunidades com as suas inter-relações bem definidas.
Depois disso, cada subsistema poderá ser descrito em detalhes mantendo a capacidade de compreender os detalhes
da unidade e do sistema como um todo. Esse processo continua até o sistema ter sido especificado de forma
completa e detalhada, podendo prosseguir com a elaboração do cronograma.
Sempre se devem utilizar técnicas que mantenham o projetista no caminho correto, dentro do processo da
implementação (técnicas foolproof – contra erros bobos). O hardware permite um alto grau de flexibilidade no
projeto. Essa excessiva flexibilidade permite aos projetistas utilizar rotinas e circuitos complexos e pouco comuns. O
uso incontrolado dessa flexibilidade promove a implementação de forma indisciplinada, não-inteligente e incorreta.
Esse fenômeno tem a contrapartida (de forma menos severa) em software de computadores, onde a linguagem
assembly permite o acesso a todo o poder do computador. A experiência na solução de problemas de software e
hardware tem mostrado que se deve restringir as ferramentas e técnicas de projeto que mostrem uma capacidade
funcional e interpretativa, sobre uma variedade de circunstâncias.
Usar técnicas de documentação para o nível de sistema e para nível dos circuitos ou rotinas de software (descrições
de software e hardware) que mostrem claramente o que o projetista estava pensando, quando o problema foi
primeiramente abstraído e depois para a implementação do software e do hardware. A violação deste preceito atua
contra o princípio da “cortesia comum”.
Durante a documentação o projetista deve-se colocar no lugar do usuário ou mantenedor do seu projeto, mantendo
uma documentação clara e completa.
Abstração
Neste contexto, a abstração permite encarar o problema num nível conceptual. O conceito de memória é um
exemplo de abstração. Quando o projeto começar, é necessário encará-lo com elementos conceituais a as suas inter-
relações. Somente mais tarde, durante o processo de implementação, será necessário trabalhar com conceitos reais.
Essa liberdade é absolutamente essencial para um começo apropriado de um projeto de complexidade considerável.
Começa-se de cima e continua-se reduzindo o problema, até seus elementos conceituais básicos. Por exemplo, um
computador precisará de uma memória, um sistema de entrada e saída, uma unidade aritmética e outros
subsistemas.
Comumente começa-se o projeto neste nível de abstração, e prossegue-se descendo a níveis inferiores, um por um,
sempre no ponto de vista conceitual. Desta forma, no próximo nível será desenhado um diagrama de blocos de uma
unidade aritmética, pela interconexão das suas unidades funcionais, tais como registradores, unidades de controle, e
barramento de dados. A abstração inicial é a parte crítica de qualquer projeto, desde que, um planejamento errado
Página 3|6
nas suas fases iniciais, levará inevitavelmente a implementações erradas. Normalmente não há forma de resgatar
um projeto mal planejado utilizando circuitos exóticos ou rotinas de ajuste.
Formalismo
O formalismo é a teoria do comportamento do sistema. Em um projeto, o formalismo ajuda a estabelecer regras e
procedimentos sistemáticos com características conhecidas. Os formalismos são importantes em todos os níveis do
projeto. Os formalismos de “alto nível” não são de grande importância para o bom desenvolvimento do projeto e
servem somente para adotar métodos sistemáticos em todos os níveis nos quais se espera a transformação correta
dos conceitos em hardware ou software. No nível de implementação, o formalismo é extremamente necessário e
deve ser rígido o suficiente para evitar erros na implementação.
Duas naves espaciais destinadas a mapear o planeta Marte foram perdidas no espaço em 1999 porque alguns dos
algoritmos projetados utilizavam unidades do sistema inglês, enquanto que outros utilizavam unidades no sistema
internacional. Como o erro era muito pequeno para ser detectado nos testes, resultou em um dos erros de
formalismo mais caros da história.
O Projeto em Top Down
O projeto começa com o estudo cuidadoso do problema geral. Deliberadamente, devem ser ignorados os detalhes
neste estágio, e devem ser feitas perguntas como:
• O problema está claramente definido?
• É possível remodelar o problema para obter mais clareza ou simplificá-lo?
• Se estivesse trabalhando com um subsistema de um sistema maior; quais seriam as relações com o
subsistema de hierarquia maior? Poderá um particionamento diferente do sistema inteiro simplificar a
estrutura?
Neste estágio, o entendimento é global e deve permanecer neste nível até ter esmiuçado e digerido o problema,
chegando ao ponto onde haja o convencimento de que este pode ser resolvido. Isto é essencial, desde que qualquer
dificuldade neste nível é séria e pode ser insolúvel.
Após ter especificado claramente o problema em nível global, procede-se ao particionamento racional do problema
em pequenas peças com inter-relações claramente definidas. O objetivo é de escolher as peças “naturais”, de tal
forma que, cada peça possa ser compreendida como uma unidade e sejam bem compreendidas as interações entre
as unidades. Esse processo de particionamento continua para níveis inferiores, até a escolha final das funções a
serem utilizadas, circuitos integrados a serem empregados, etc.
Componentes Básicos de um Programa
Um programa de computador é baseado no fluxograma do algoritmo e implementa a solução de software para o
problema.
Um programa em qualquer linguagem normalmente é composto pelos seguintes itens:
• Os programas devem obter informação de alguma fonte de entrada.
• Os programadores devem decidir a forma em que os dados de entradas serão armazenados e dispostos.
• Os programas devem utilizar uma série de instruções para manipular as entradas. Estas instruções são do
tipo simples, condicionais, laços e funções ou sub-rotinas.
• Os programas devem apresentar os resultados da manipulação dos dados das entradas.
• Uma aplicação correta incorpora os fundamentos acima listados, expressos através da utilização de um
projeto modular, incluindo uma especificação completa, uma codificação devidamente documentada e um
esquema de apresentação apropriado.
Fundamentos de Linguagem C
Características da Linguagem C
É uma linguagem de “alto nível” de sintaxe estruturada e flexível, tornando sua programação bastante simplificada.
Os programas em C são compilados, gerando programas executáveis depois de montados (linker).
A linguagem C compartilha recursos de alto e de baixo nível, pois permite acesso e programação direta do hardware
do computador. Assim, as rotinas cuja dependência de tempo seja crítica, podem ser facilmente implementadas
usando instruções em Assembly. Por essa razão, a linguagem C, é a preferida dos engenheiros programadores de
aplicativos.
A linguagem C é estruturalmente simples e portável. O compilador C gera códigos menores e mais velozes do que
outras linguagens de programação.

Página 4|6
Embora, estruturalmente simples (poucas funções intrínsecas), a linguagem C não perde funcionalidade, pois
permite a inclusão de uma farta quantidade de rotinas do usuário. Os fabricantes de compiladores fornecem uma
ampla variedade de rotinas pré-compiladas em bibliotecas.
Pontos Positivos
Tamanho Pequeno: A linguagem C possui poucas regras de sintaxe, quando comparada com outras linguagens. Um
compilador C pode ser implementado com apenas 256 KB de memória.
Poucos Comandos: A linguagem C é extremamente pequena. O número total de palavras-chave é de 43. Isto faz dela
uma linguagem extremamente simples de aprender.
Velocidade: A combinação de uma linguagem pequena com regras de sintaxe simples; a falta de verificação durante
a execução; e uma linguagem parecida com o assembly faz com que o código gerado seja executado em velocidades
próximas a do assembler.
Linguagem Estruturada: Contém todas as estruturas de controle utilizadas nas linguagens de programação mais
modernas. Tem recursos de escopo utilizando variáveis locais.
Não Fortemente Figurada: Os dados são tratados de maneira muito flexível, o que permite uma grande versatilidade.
Suporte de Programação Modular: Suporta a compilação e montagem (linker) separadas, o que permite recompilar
somente as partes de um programa que tenham sido alteradas durante o desenvolvimento.
Manipulação de Bits: Uma vez que a linguagem foi criada para a implementação de sistemas operacionais, esta
linguagem foi dotada de uma vasta série de operadores para a manipulação direta de bits.
Interface para Rotinas em Assembly: Suporta a inclusão de rotinas em assembly diretamente no mesmo código fonte
em C.
Variáveis Ponteiros: Um sistema operacional deve ser capaz de endereçar áreas específicas da memória ou
dispositivos de I/O. A linguagem C utiliza variáveis do tipo ponteiro permitindo manipulá-los aritmeticamente. Uma
variável do tipo ponteiro guarda no seu conteúdo uma informação de endereço da informação.
Estruturas Flexíveis: Os arranjos de dados são unidimensionais. Os arranjos multidimensionais são construídos a
partir de arranjos unidimensionais.
Bibliotecas de Funções: Existem vastas bibliotecas de funções prontas que podem ser anexadas aos executáveis
durante a montagem (linker).
Uso Eficiente da Memória: Os programas em C tendem a ser mais eficientes em termos de memória devido à falta
de funções embutidas que não são necessárias à aplicação.
Portabilidade: A portabilidade indica a facilidade de se converter um programa feito para um hardware específico e
sistema operacional, em um equivalente que possa ser executado em outro hardware ou sistema operacional.
Atualmente, ainda pode ser considerada como uma das linguagens mais portáveis.
Pontos Negativos
Não fortemente figurada: Este fato é também um ponto negativo da linguagem. Trata-se do processamento dos
dados de acordo com a sua natureza ou tipo de dado. Este processamento é chamado comumente de tipagem que
indica o quanto a linguagem permite a troca de dados entre duas variáveis de tipos diferentes. O uso acidental de
misturas de tipos de dados pode gerar erros de execução no programa.
Verificação em Tempo de Execução: A linguagem C não possui verificação em tempo de execução, de forma que
podem acontecer problemas cujas origens são muito difíceis de detectar.
O Padrão ANSI C
O comitê ANSI (American National Standards Institute) desenvolveu padrões para a linguagem C. Anteriormente, a
única referência da linguagem era o livro The C Programming Language (V. Kernighan e D. Ritchie, Laboratórios Bell,
1988) entre os fabricantes de compiladores, prejudicando a portabilidade. O padrão ANSI surgiu para remover
ambiguidades, embora, nem todas tenham sido corrigidas, ele permanece como a melhor alternativa para produzir
um código C portátil.
O comitê ANSI adotou como norma três frases que foram denominadas “o espírito da linguagem C”, dentre elas:
“Não impeça que o programador faça aquilo que precisa ser feito”.
“Confie no programador”.
“Mantenha a linguagem pequena e simples”.
Além disso, a comunidade internacional foi consultada para garantir que o padrão ANSI C americano seria idêntico à
versão do padrão ISO (International Standards Organization)
Palavras Reservadas
Todas as linguagens de programação têm palavras reservadas. As palavras reservadas não podem ser usadas a não
ser para seus propósitos originais, i.e., não podem ser declaradas funções nem variáveis com os mesmos nomes.
Página 5|6
Como a linguagem C é "case sensitive" (sensível a maiúsculas e minúsculas) pode-se declarar uma variável chamada
For, apesar de haver uma palavra reservada for. Porém, isso não é recomendável, pois gera confusão no código.
A seguir são listadas as palavras reservadas do ANSI C, ao todo 32 palavras. Veremos o significado destas palavras-
chave, à medida que os demais conceitos forem apresentados.
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Página 6|6

Você também pode gostar