Escolar Documentos
Profissional Documentos
Cultura Documentos
1- Características da Linguagem C:
-É uma linguagem de médio nível (por combinar elementos das linguagens de alto
nível com as funcionalidades da linguagem assembly);
Obs: Das funcionalidades da linguagem assembly podemos citar: manipulação de
bits, bytes e endereços e, em alguns casos, a implementação de código assembly
dentro de programas em C.
-Todo comando interno da Linguagem C está definido na língua inglesa. Então, esteja
ciente de que o significado dos referidos comandos só é mais bem entendido após
tradução para o português.
1
3- A estrutura de um programa escrito em Linguagem C:
main( ) {
●Linhas de comentário:
Servem para inserir comentários em qualquer parte do programa.
Auxiliam na documentação de um programa.
São ignoradas pelo compilador no momento da geração do executável, ou seja,
as linhas de comentário não tem ação efetiva sobre a execução de um programa.
/* Este é um conjunto de
linhas de comentário.
Estas linhas não serão
executadas quando o
programa rodar. */
2
//Esta é a segunda linha de comentário. Não depende da linha anterior.
●Linhas em branco:
As linhas em branco não são executadas em um programa em C. Servem para
introduzir espaçamento entre as linhas de código, melhorando a sua apresentação
para leitura e manutenção. Programadores bem disciplinados utilizam linhas em
branco para organizar o código dando-lhe um bom aspecto.
●Linhas de comando:
São as linhas que dizem o que o programa deve executar. Sua disposição deve
ocorrer em uma sequência lógica, para fazer corretamente o passo-a-passo do
programa.
A maior parte do nosso estudo sobre a programação em Linguagem C se
concentra em aprender o funcionamento e o uso dos comandos em C.
Uma informação importante: toda linha executável em C deve terminar com um
ponto e vírgula “ ; ”.
3
Onde:
cadeia_de_formatação: é formada por cadeias de caracteres e códigos
especiais (os especificadores de formato e caracteres de controle). É esta cadeia que
gera a forma da apresentação de frases na tela do usuário.
arg1, arg2, ..., argN: são os argumentos dos especificadores de formatos
que, na verdade, são valores ou variáveis do programa os quais queremos que sejam
exibidos em tela para o usuário. O número de argumentos se apresenta na mesma
quantidade em que colocamos especificadores de formato na cadeia de formatação.
Outro ponto bastante importante é que, na Linguagem C, a função printf( ) é
definida dentro da biblioteca stdio e esta informação precisa ser passada ao
compilador para que, durante o processo de geração do programa executável, a
função printf( ) possa ser encontrada e não ocorrendo erro de compilação pela sua
falta. Este recurso será implementado mais adiante, no primeiro programa em
Linguagem C.
main() {
//Exibe a string "Caractere :" e o caractere 'A'
//e o cursor vai para o início da outra linha.
printf("%s %c\n", "Caractere :", 'A');
#include <stdio.h>
main() {
char nome[120];
int idade;
float altura;
6.1-Tipos de Dados:
Na linguagem C existem diversos tipos de dados que podem ser manipulados
por um programa.
6
6.1.1.1- Declarando Variáveis em C:
A declaração de variáveis em C é útil para que se possam ter locais onde os
dados do programa sejam armazenados, operados e manipulados na execução de
um programa.
As variáves declaradas são criadas como posições de memória onde esses
dados ficam armazenados e disponíveis para o programa em execução.
Para a declaração de variáveis utiliza-se a sintaxe apresentada a seguir:
<tipo> <identificador>;
Onde:
tipo: é o Tipo de Dado da Tabela 3.
e
identificador: é iniciado com letra (maiúscula ou minúscula) e ser
composto exclusivamente por letras, dígitos e sublinhas.
char carac2 = ‘A’; //Declaração da variável do tipo char, identificada por carac2.
int inteiro2 = 200; //Declaração da variável do tipo int com identificador inteiro2.
//e atribuição direta do valor 200.
7
As atribuições de valores a variáveis não se dá apenas na base decimal. Um
programador poderá desejar atribuir valor a uma variável em base binária, octal ou
mesmo hexadecimal. O exemplo 9 apresenta as sintaxes para cada caso:
#include <stdio.h>
#include <stdlib.h>
main() {
int x;
6.1.1.2-Declarando constantes em C:
Uma constante é um valor fixo que não sofre alteração durante toda a
execução de um programa. Um exemplo típico de constante é o valor de
, empregado na geometria e na trigonometria. Se um programa tem que
usá-lo, devemos declará-lo como constante.
A declaração de uma constante traz algumas vantagens como: evitar se
escrever valores com muitos dígitos além de identificar a constante por um nome, fato
que facilita a leitura e a manutenção do programa.
Uma constante é declarada no início do programa, conforme a sintaxe
apresentada abaixo (uso da diretiva de pré-processador #define). Observe que neste
tipo de linha de comando não existe o ponto e vírgula (pois se existisse ele seria
interpretado como parte da constante):
8
Exemplos:
#define PI 3.14159265
main() {
int x=251;
printf(FORMATO, x);
}
Resultado da execução:
9
Signed: o compilador
considera o bit de sinal. Variável do tipo char:
Conta de -128 até +127.
Unsigned: o compilador
não considera o bit de
sinal. Conta de 0 até
255.
10
int M[5][6] = { { 1, 2, 3, 4, 5, 6}, //Declarando a Matriz M e
{ 7, 8, 9, 10, 11, 12}, // introduzindo os inteiros
{13, 14, 15, 16, 17, 18}, //(dados).
{19, 20, 21, 22, 23, 24},
{25, 26, 27, 28, 29, 30} };
Int v[6] = { 1, 2, 3, 4, 5, 6 };
struct <nome_da_estrutura>{
<tipo1> var1;
<tipo2> var2;
⁞
<tipoN> varN;
};
<nome_da_estrutura> <nome_do_registro>;
11
struct Aluno{
char nome[100];
int matricula;
float nota;
};
Com isso cria-se apenas um registro para se manipular com apenas um aluno,
ou seja, a variável alu1 do tipo struct Aluno é um registro para aluno.
E se fosse uma turma com trinta alunos, como poderia ser feito tal criação?
Veja no Exemplo 14:
Exemplo 14:
Criando um vetor cujos elementos têm a forma da estrutura Aluno:
12
Exemplo 15:
main() { //2-Podemos então declarar uma
//1-Se não declarássemos uma struct própria e // Estrutura assim:
//necessitássemos de criar várias variáveis
//(registros) com o formato da struct, struct EstrA{
//deveria então ser feito assim: char letra;
int numero;
struct { };
char letra;
int numero; main() {
} r1; //E criar as variáveis de registro assim:
typedef struct{
char letra;
int numero;
} EstrA;
main() {
//E criar as variáveis de registro assim:
EstrA r1;
EstrA r2;
EstrA r3;
}
13
6.2.2.1- Acessando os membros de uma struct (Uso do operador ponto “ . ”):
Quando um tipo struct é declarado como variável, para que possamos ter
acesso aos membros (campos ou variáveis) de uma struct, ou seja, ler os dados ou
escrever dados nesses campos utiliza-se o operador ponto (“ • “). Observe o Exemplo
16:
Exemplo 16:
#include <stdio.h>
typedef struct{
char letra;
int numero;
} EstrA;
main() {
//Emprego do operador ponto para leitura e escrita dos membros de uma estrutura:
//Declarando os registros:
EstrA r1;
EstrA r2;
EstrA r3;
//Uso do operador ponto para escrita nos membros dos registros r1, r2 e r3:
r1.letra='R'; //Cracteres são declarados entre apóstrofos.
r3.numero=15;
r2.letra='A';
r1.numero=12;
r2.numero=10;
r3.letra='K';
//Leitura dos membros de um registro:
printf("Registro r1:\n\tletra: %c\n\tnumero: %d\n\n", r1.letra, r1.numero);
printf("Registro r2:\n\tletra: %c\n\tnumero: %d\n\n", r2.letra, r2.numero);
printf("Registro r3:\n\tletra: %c\n\tnumero: %d\n\n", r3.letra, r3.numero);
}
14
Exemplo 17: Lendo o endereço de uma variável:
#include <stdio.h>
main() {
//Criando duas variáveis:
char x= 'A';
int y= 10;
//Exibindo o endereço
//das duas variáveis:
printf("O caractere x = %c esta no endereco: %X\n", x, &x);
printf("O inteiro y = %d esta no endereco: %X\n", y, &y);
}
6.2.2.3 - Ponteiros:
Conforme foi dito, variáveis em C são nomes simbólicos para referenciar
endereços de memória que armazenam dados. Ponteiros também são variáveis,
porém estas armazenam apenas valores que são endereços de memória.
Os ponteiros representam outra forma, que não seja através de uma variável
declarada, de se acessar os dados que estão na memória do computador. Eles
permitem acesso a qualquer parte da sua memória, bastando que o endereço
armazenado no ponteiro seja definido pelo programador. Com isso, a
responsabilidade do programador em gerenciar ponteiros é bem maior devido à sua
complexidade. Um acesso indevido, principalmente para atribuição (escrita) de um
dado, por um endereço de memória atribuído de forma errada ao ponteiro, pode
provocar diversos problemas, tais como:
- perda de dados.
- paralização de programas.
- danos à execução do Sistema Operacional.
15
Ponteiros são declarados da mesma forma como variáveis, diferenciando-se
apenas na indicação do ponteiro que usa o operador asterisco “ * “.
Após a sua declaração e antes da sua utilização, os ponteiros precisam ser
inicializados com o valor do endereço para onde apontam, isto significa que o
programador tem que atribuir ao ponteiro um valor de endereço de um local de
memória já definido. Há diversas formas de se atribuir valores de endereços a
ponteiros:
- Utilizar o endereço de variáveis já declaradas empregando o operador de
endereço &.
- Utilizar funções de alocação dinâmica de memória (ver seção 6.2.2.4).
- Utilizar atribuição de um valor já conhecido direto ao ponteiro (menos usual).
main() {
int i=10; //Declaração da variável.
int *p; //Declaração do ponteiro p.
p=&i; //Atribuição de endereço ao ponteiro p.
16
Funções de alocação dinâmica de memória:
As funções de alocação dinâmica de memória atendem ao programador e à
aplicação em dois passos:
1º Passo: Encontram o endereço da quantidade de memória solicitada no
parâmetro da função.
2º Passo: Retornam este endereço para quem chamou (geralmente sendo
atribuído a um ponteiro).
Exemplo19:
Para que seja possível explorar mais espaço em memória é necessário que se
saiba manipular os parâmetros das funções malloc e calloc. O exemplo seguinte
mostra formas de se definir espaços de memória maiores com auxílio da função
sizeof ( ).
17
Exemplo20:
typedef struct{
char letra;
int numero;
} EstrA;
main() {
//Emprego do operador seta para leitura e escrita dos membros de uma estrutura:
//Declarando os registros:
EstrA *p1;
EstrA *p2;
EstrA *p3;
Resultado da execução:
7- Os Operadores na Linguagem C:
7.1-Operador de Atribuição:
É o sinal de igualdade ( = ). A sua função é atribuir um valor a uma variável ou
memória.
Após a declaração de uma variável, na maioria das vezes, armazenamos
valores nas mesmas, ou seja, usamos um operador de atribuição para fazê-lo.
Exemplo 22:
int comprimento; //Declaração da variável comprimento.
comprimento = 15; //Atribuição do valor 15 à variável comprimento.
19
Estes operadores estão relacionados na Tabela 5:
Exemplo 23:
Problema: Utilizando operadores como atribuição e aritméticos, faça um
programa em C que converta um número inteiro de base decimal em um número em
base binária com 8 bits. O número binário deverá ser armazenado em um vetor de
inteiros, onde cada elemento do vetor representa um bit do número binário.
#include <stdio.h>
#include <stdlib.h>
main() {
int nB10 = 13; //Número em base decimal
int bit[8]={0,0,0,0,0,0,0,0}; //Composição do número binário
//Método de conversão:
bit[0] = nB10%2;
bit[1] = (nB10/2)%2;
bit[2] = (nB10/4)%2;
bit[3] = (nB10/8)%2;
bit[4] = (nB10/16)%2;
bit[5] = (nB10/32)%2;
bit[6] = (nB10/64)%2;
bit[7] = (nB10/128)%2;
20
Combinando operadores aritméticos e atribuição:
Algumas “abreviaturas” práticas são obtidas na Linguagem C com a
combinação entre os operadores aritméticos e o operador de atribuição, os quais são
apresentados na Tabela 6:
7.3-Operadores de Comparação:
Os operadores de comparação são operadores binários, ou seja, necessitam
de dois operandos para realizarem as suas operações que comparam tais operandos
avaliando-os através de igualdade, se um é maior, se um é menor, se maior ou igual,
se menor ou igual, ou mesmo se são diferentes.
21
Tabela 8 – Operadores de Deslocamento de Bits.
22
Exemplo24: Operações de deslocamento de bits à direita e à esquerda e os seus
efeitos:
#include <stdio.h>
#include <stdlib.h>
main() {
char a = 0b00001000;//Número em base binária.
Resultado da execução:
23
Tabela 9 – Operadores de Lógicos sobre Bits.
24
Resultado da execução do exemplo:
25
Exemplo 26: Uso do comando if na sua forma simples:
#include <stdio.h>
#include <stdlib.h>
main() {
int num;
#include <stdio.h>
#include <stdlib.h>
main() {
int num;
return(0);
}
Exemplo 28: Há também uma variação do comando if na forma if-else-if, que é uma
extensão do if-else. Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
main() {
int num;
return(0); 26
}
8.2-O comando switch:
O comando switch também é comando de decisão. Sua aplicação ocorre
quando se deseja testar uma variável para diversos valores. O switch tem a seguinte
estrutura:
switch ( variável )
{
case valor1:
declaração1; ou {bloco1}
break;
case valor2:
declaração2; ou {bloco2}
break;
⁞
case valorN:
declaraçãoN; ou {blocoN}
break;
default:
declaraçãoDefault; ou {blocoDefault}
}
Exemplo 29: Comando switch empregado como “filtro” para diversos números:
#include <stdio.h>
#include <stdlib.h>
main() {
int num;
printf ("Digite um numero: ");
scanf ("%d",&num);
switch(num)
{
case 1:
printf("Numero 1\n");
break;
case 2:
printf("Numero 2\n");
break;
case 3:
case 4:
printf("Numero 3 ou 4\n");
break;
default:
printf("Numero diferente de 1, 2 e 3\n");
}
return 0;
}
27
8.3-O comando for:
É uma estrutura de repetição controlada. Serve para repetir um comando ou
um bloco de comandos. O seu formato é:
Exemplo 30: Utiliza um comando de repetição for para exibir os números inteiros de 1
até 10:
Resultado da execução:
É um loop ou laço que não tem fim, a falta da condição é considerada como
verdadeira e o comando ou o bloco de comandos será executado indefinidamente.
28
Exemplo 31: Loop infinito interrompido ao se pressionar a tecla ‘A’ ou a tecla ‘a’:
29
Exemplo 33: Uso do while: Exibindo números de 1 a 10.
Exemplo 34: Loop infinito com while. Observe que neste exemplo o aprisionamento
da execução no loop é interrompido pelo comando break, quando a condição c==’A’
ou c==’a’ é fornecida.
Exemplo 35: Loop infinito com while. A saída do loop depende da mudança do valor
da variável x, que ocorre após a tecla A ser pressionada.
30
8.5-O comando do-while:
O comando do-while é utilizado para a implementação de loops. Neste caso, a
verificação da condição é feita sempre após a execução do(s) comando(s) inseridos
no loop, ou seja, pelo menos uma vez o comando ou bloco de comandos é
executado. Sua sintaxe é:
do{
comando1;
comando2;
⁞
comandoN;
} while (condição);
Exemplo 37: Um loop infinito com do-while. O programa só termina quando a tecla
ESC é presionada. Qualquer outra tecla pressionada é mostrada na tela.
31
8.6-O comando break:
Serve para interromper uma iteração (ou repetição: comandos for, while e do-
while) e também serve para separar (interromper) os “cases” do comando switch.
32
Resultado da execução do exemplo 39:
33
Glossário
Assember (ou Montador Assembly): Nome do programa que serve para “montar”
(transformar o código assembly em linguagem de máquina) um programa escrito em
linguagem assembly.
34