Upload
tadeu-ficagna
View
217
Download
3
Embed Size (px)
DESCRIPTION
Microcontroladores
Citation preview
Engenharia da Computação
Prof. Dr. Geovani Rodrigo [email protected]
Microcontroladores e DSPIntrodução a Linguagem C
Apresentação
Introdução a Linguagem C
Introdução a linguagem C, tipos de
dados, variáveis, estruturas de seleção,
laços, funções, vetores, matrizes,
estruturas de dados, etc.
Expressões
Introdução a Linguagem C
Uma expressão é uma combinação de constantes, variáveis e operadores que depois
de avaliadas resultam num valor.
Variáveis
As variáveis representam um espaço de memória do computador que armazenam um
determinado tipo de dado. Na linguagem C/C++ todas as variáveis devem ser
explicitamente declaradas e inicializadas.
Para se declarar uma variável devem ser especificados seu tipo e nome. O nome da
variável serve de referência dentro do programa ao dado armazenado no espaço de
memória da variável. Já o tipo da variável serve para indicar a natureza do dado que será
armazenado.
Ex: int temperatura = 0; //Declaração da variável temperatura do tipo inteiro (32 bits).
Expressões
Introdução a Linguagem C
Tipos básicos
A linguagem C/C++ oferece alguns tipos básicos para armazenamento de dados.
Para armazenar valores inteiros existem quatro tipos básicos:
Tipo Tamanho Representatividade
char 1 byte (8 bits) 256 valores (-128 a 127)
unsigned char 1 byte (8 bits) 256 valores (0 a 255)
short int 2 bytes (16 bits) 65.535 valores (-32.768 a 32.767)
unsigned short int 2 bytes (16 bits) 65.535 valores (0 a 65.535)
long int 4 bytes (32 bits) 4.294.967.295 valores (0 a 4.294.967.295)
unsigned long int 4 bytes (32 bits) valores entre -2.147.483.648 a 2.147.483.647
Int 4 bytes (32 bits) 4.294.967.295 valores (0 a 4.294.967.295)
unsigned long int 4 bytes (32 bits) valores entre -2.147.483.648 a 2.147.483.647
Expressões
Introdução a Linguagem C
Para armazenar números reais (ponto flutuante) existem dois tipos básicos:
Tipo Tamanho Representatividade
float 4 byte (32 bits)
double 8 bytes (64 bits) (maior precisão)
Declaração de Variáveis
Para armazenar um determinado dado em memória, deve-se reservar um espaço de
memória correspondente ao tipo de dado. Quando se declara uma variável o espaço de
memória reservado é associado ao nome de variável que declaramos.
Exemplos:
char a; //declara uma variável do tipo char.
int b; //declara uma variável do tipo int.
float c; //declara uma variável do tipo float.
a = 5; //armazena o valor 5 em a.
Expressões
Introdução a Linguagem C
A linguagem C/C++ permite declarar variáveis do mesmo tipo juntas.
Exemplo:
int a, b; //declaração das variáveis a e b do tipo int.
A linguagem também permite que as variáveis sejam inicializadas no momento da
declaração.
Exemplo:
int a = 5, int b = 10; //declaração e inicialização de variáveis.
float c = 6.8;
Variáveis com valores indefinidos
Um dos erros mais comuns de programação é a utilização de variáveis que ainda não
foram inicializadas e atribuídos valores a elas. Quando se declara a variável existe um valor
desconhecido dentro do espaço reservado no momento da declaração.
Expressões
Introdução a Linguagem C
Caso a variável seja utilizada irá apresentar erros no decorrer da execução do
programa. O fragmento de código a seguir contem um erro, pois a variável b possui um
valor indefinido armazenado em seu espaço de memória, gerando um erro.
Exemplo:
int a, b, c;
a = 2;
c = a + b; //Erro pois em b há lixo de memória.
Operadores Aritméticos
Em C/C++ existem os operadores aritméticos de adição ( + ), subtração ( - ),
multiplicação ( * ), divisão ( / ) e módulo ( % ).
Devemos ter cuidado na operação de divisão em precisão inteira e precisão real. A
expressão 5/2 resulta no valor 2, pois a precisão inteira trunca a parte funcionária. Já a
expressão 5.0/2.0 resulta em 2.5 devido a precisão real (float ou double).
Expressões
Introdução a Linguagem C
Utilização com valores inteiros.
Exemplo 1:
int a, b, c;
a = 3;
b = 2;
c = a - b; //A variável c armazenará o valor 1;
Utilização com valores reais.
Exemplo 2:
float a, b, c;
a = 3.0;
b = 2.0;
c = a / b; //A variável c armazenará o valor 1.5;
Expressões
Introdução a Linguagem C
Os operadores ( * ), ( / ) e ( % ) têm precedência maior que os operadores ( + ) e ( - ).
Exemplo:
a + b * c / d
Executa-se primeiro a multiplicação, seguida da divisão e da soma.
Exemplo:
(a + b) * c / d //Utilizando parênteses inverte-se a ordem de avaliação da expressão.
Operadores de atribuição
Uma atribuição é uma expressão cujo valor resultante corresponde ao valor atribuído.
Assim da mesma forma que a expressão 5 + 3 resulta no valor 8, a atribuição a = 5 é uma
expressão que resulta no valor 5 (armazenada na variável a). Esse tratamento das
atribuições permite escrever comandos do tipo:
Exemplo:
y = x = 5; //Portanto x e y recebem o valor 5.
Expressões
Introdução a Linguagem C
Em C/C++ podemos utilizar operadores de atribuição compostos.
Exemplo:
i = i + 1;
Ou ainda de forma mais compacta utilizando o operador composto +=.
Exemplo:
i += 1;
Existem ainda os operadores compostos -=, *=, /=.
Exemplo:
j -= 2; que equivale a j = j - 2;
j *= 2; que equivale a j = j * 2;
j /= 2; que equivale a j = j / 2;
Operadores de incremento e decremento
A linguagem C/C++ apresenta ainda dois operadores não convencionais que servem
Expressões
Introdução a Linguagem C
para incrementar ( ++ ) e decrementar ( -- ) uma unidade nos valores armazenados nas
variáveis. Se n é uma variável que armazena um valor qualquer, o comando
n++;
incrementa em uma unidade o valor de n e o comando
n--;
decrementa em uma unidade o valor de n.
Exemplo 1:
n = 5;
x = n++; //o valor da variável x é 6.
Exemplo 2:
n = 5;
x = n--; //o valor da variável x é 4.
Exemplo 3:
a = a + 1; a +=1; a++; ++a; //São equivalentes.
Expressões
Introdução a Linguagem C
Operadores Relacionais e Lógicos
Operadores relacionais são utilizados na comparação entre dois valores. São eles:
< menor que
> maior que
<= menor ou igual que
>= maior ou igual que
== igual a
!= diferente de
O resultado produzido através da comparação de dois valores utilizando os operadores
relacionais é ZERO (FALSE) ou UM (TRUE).
Exemplo:
if (a == 5)
{ }
Expressões
Introdução a Linguagem C
Operadores Relacionais e Lógicos
Os operadores lógicos combinam expressões booleanas. Exemplos de operadores:
&& operador binário E (AND)
|| operador binário OU (OR)
! operador unário de NEGAÇÃO (NOT)
Os operadores relacionais e lógicos normalmente são utilizados em tomadas de
decisões e podemos utilizá-los também para atribuir valores a variáveis.
Exemplo:
int a, b;
int c = 23;
int d = c + 4;
a = (c < 20) || (d > c); //verdadeiro, variável a recebe 1 (0 OR 1 = 1).
b = (c < 20) && (d > c); //falso, variável b recebe 0 (0 AND 1 = 0).
Expressões
Introdução a Linguagem C
Operador sizeof
Outro operador presente na linguagem C/C++ é o sizeof, resulta no número de bytes
de um determinado tipo.
Exemplo:
int a = sizeof ( float ); // o tipo float reserva 4 bytes de espaço em memória.
Armazena o valor 4 na variável a, pois um float ocupa 4 bytes de memória. Também
pode ser utilizado na verificação do espaço utilizado por variáveis.
Exemplo:
short int a; // o tipo short int ocupa 2 bytes de espaço em memória.
int b = sizeof ( a ); // variável b recebe o valor 2;
Expressões
Introdução a Linguagem C
Entrada e Saída Básicas
Na linguagem C/C++ não há comandos de entrada e saída de dados, existem funções
para tal fim.
Tais funções de entrada e saída estão dentro de uma biblioteca padrão, a qual sempre
deve estar no início de cada programa.
#include <stdio.h>
Exemplo:
#include <stdio.h> //Biblioteca contendo as funções de entrada e saída.
int main (void)
{
}
Expressões
Introdução a Linguagem C
Função printf
A função printf possibilita a saída de valores (constantes, variáveis e resultados de
expressões) conforme um determinado formato.
Utilização:
printf ( formato, valores );
onde:
formato %c especifica um char
%d especifica um int
%u especifica um unsigned int
%f especifica um double (ou float)
%e especifica um double (ou float) no formato científico
%g especifica um double (ou float) mais apropriado (%f ou %e)
%s especifica uma cadeia de caracteres
valores constantes, variáveis e resultados de expressões
Expressões
Introdução a Linguagem C
Exemplos:
printf ( "%d %g \n", 33, 5.3);
Saída na tela:
33 5.3
printf ( "Inteiro = %d Real = %g \n", 33, 5.3);
Saída na tela:
Inteiro = 33 Real = 5.3
printf ("Curso de Introdução a Linguagem C\n");
Saída na tela:
Curso de Introdução a Linguagem C
Expressões
Introdução a Linguagem C
Alguns formatos de saída utilizados:
\n caractere de nova linha
\t caractere de tabulação
\r caractere de retrocesso
\" imprime o caractere "
\\ imprime o caractere \
%% imprime o caractere %
É possível também especificar o tamanho dos campos (exemplo anterior):
%d %4d
%f %7.2f
3 3
5 . 3 0
4
2
7
Expressões
Introdução a Linguagem C
Função scanf
A função scanf permite capturar valores fornecidos via teclado pelo usuário do
programa e os armazena em variáveis dentro do programa.
Utilização:
Scanf ( formato, endereços );
onde:
formato %c especifica um char
%d especifica um int
%u especifica um unsigned int
%f, %e, %g especifica um float
%lf, %le, %lg especifica um double
%s especifica uma cadeia de caracteres
endereços endereço das variáveis
Expressões
Introdução a Linguagem C
Exemplos:
int n;
scanf ( "%d", &n);
O valor digitado pelo usuário será armazenado na variável n.
int n, m;
scanf ( "%d %d", &n, &m);
Os valores digitados pelo usuário serão armazenados nas variáveis n e m,
respectivamente.
Expressões
Introdução a Linguagem C
Exercício: Converter altura em metros para pés (ft) e polegadas (pol).#include <stdio.h>
int main (void){
int f; //número de pés.float p; //número de polegadas.float h; //altura em metros.
//Captura altura em metros.printf("Digite a ltura em metros"); scanf("%f", &h);
//Calcula altura em pés e polegadas.h = 100 * h; //converte para centímetros.f = (int) (h / 30.48); //calcula o número de pés.p = (h – f * 30.48) / 2.54); //calcula número de polegadas do restante.
//Exibe altura convertida.printf("Altura: %dft %.lfpol\n", f, p);
return 0;}
Controle de Fluxo
Introdução a Linguagem C
A linguagem C/C++ disponibiliza alguns mecanismos para o controle de fluxo de dados
dentro dos programas codificados, como: tomadas de decisão, laços, interrupções com
break e continue e seleção.
Tomadas de Decisão
O comando if é o comando básico para codificar tomadas de em C.
Exemplo:
if ( expressao )
{
bloco de comandos 1
. . .
}
ou
Controle de Fluxo
Introdução a Linguagem C
if ( expressao )
{
bloco de comandos 1
. . .
}
else //caso contrário...
{
bloco de comandos 2
. . .
}
Neste exemplo se a condição de avaliação da expressão for diferente de zero, o bloco
de comandos 1 será executado. Caso contrário, se a condição de avaliação da expressão for
igual a zero, o bloco de comandos 2 será executado.
Controle de Fluxo
Introdução a Linguagem C
Exemplo de Código: Verificar se um número é par ou impar.
#include <stdio.h>
int main (void){
int a;
printf("Digite um número inteiro: ");scanf("%d ", &a);
if (a % 2 == 0){
printf("O número fornecido é par!\n");}else{
printf("O número fornecido é impar!\n");}
}
Controle de Fluxo
Introdução a Linguagem C
Construções com Laços
A linguagem C disponibiliza vários mecanismos para a realização de laços interativos
utilizando o comando while( ), do – while( ) e for( ).
Utilização do comando while( ):
while ( expressao )
{
bloco de comandos
}
Exemplo:
int i = 0;
while ( i <= 100) //O programa irá executar até que a i seja igual a 100.
{
i++;
}
Controle de Fluxo
Introdução a Linguagem C
Utilização do comando do - while( ):
do
{
bloco de comandos
. . .
} while ( expressao );
Exemplo:
int i = 0;
do
{
i++;
} while ( i <= 100) //O programa irá executar até que a i seja igual a 100.
Controle de Fluxo
Introdução a Linguagem C
Utilização do comando for( ):
for (expressao_inicial; expressao_booleana; expressao_incremental)
{
bloco de comandos
}
onde:
expressao_inicial: é a condição de início do laço. Ex: i = 0.
expressao_booleana: é a condição de parada do laço. Ex: i<= 100.
expressao_incremental: é a condição de incremento do laço. Ex: i++, i += 2, etc.
Exemplo:
for (int i = 0; i < 100; i++)
{
bloco de comandos
}
Controle de Fluxo
Introdução a Linguagem C
Interrupções com break e continue
A linguagem C oferece duas formas de interrupção antecipada de um determinado
laço. O comando break interrompe e termina a execução do laço. Já o comando continue
interrompe momentaneamente a execução do laço e segue para a próxima iteração.
Exemplo com break:int i = 0;
for (i = 0; i < 15; i++){
if (i == 5){
break;}printf("%d", i);
}
printf("fim\n");
Saída do programa:0 1 2 3 4 fim
Controle de Fluxo
Introdução a Linguagem C
Exemplo com continue:int i = 0;
for (i = 0; i < 15; i++){
if (i == 5){
continue;}printf("%d", i);
}
printf("fim\n");
Saída do programa:0 1 2 3 4 6 7 8 9 10 11 12 13 14 fim
Observe que o número 5 não foi impresso...
Controle de Fluxo
Introdução a Linguagem C
Comando de Seleção switch
A linguagem C disponibiliza um outro comando para a seleção de um elemento dentre
um conjunto de casos possíveis (tipos aceitos char e int).
Exemplo:
int expressao = 0;switch( expressao){
case op1: //comandos executados se expressao == op1.bloco de comandos
break;
case op2: //comandos executados se expressao == opn.bloco de comandos
break;
default: //executados se expressao for diferentes de todas as opções.bloco de comandos
break;}
Funções
Introdução a Linguagem C
Definição de funções
No desenvolvimento de programas estruturados, é preferível dividir tarefas
computacionais complexas em tarefas menores e utilizar seus resultados parciais,
compondo o resultado final. Na linguagem C utilizamos funções para codificar tarefas
específicas. Essa estratégia de codificação beneficia a resolução de problemas específicos,
do que codificar uma única função maior que resolva o problema como um todo.
A forma geral para a definição de funções em C é:
tipo_de_retorno nome_da_função ( lista de parâmetros)
{
bloco de comandos
return ( valores );
}
Funções
Introdução a Linguagem C
onde:
tipo_de_retorno void (sem retorno)
char ou unsigned char
int ou unsigned int
float ou double
nome_da_função soma ou outro qualquer
valores variáveis do mesmo tipo de retorno ou valores inteiros.
Exemplo:
double soma (double valor1, double valor2) //função para somar dois valores.
{
double resultado = valor1 + valor2;
return (resultado); //retorno do valor calculado para o programa.
}
Funções
Introdução a Linguagem C
Ponteiro de Variáveis
Uma função normalmente retorna um tipo de valor para a atribuição ou outra função
que a requisitou. No entanto, uma função apenas retorna um determinado valor. Muitas
vezes necessitamos retornar mais que um valor para a função que a requisitou e isso não
pode ser feito de uma forma explícita de retorno. Dessa forma, devemos utilizar ponteiros.
Exemplo 1: Retorno de apenas um valor pela função.#include <stdio.h>
int soma( int a, int b ){
int c = a + b;return c;
}
int main (void){
int s = soma(3, 5); //Forma explícita de retorno de valores.printf("soma = %d\n", s);return 0;
}
Funções
Introdução a Linguagem C
Exemplo 2: Retorno de mais valores pela mesma função.#include <stdio.h>
void somaprod( int a, int b, int *p, int *q ){
*p = a + b; // o conteúdo armazenado no ponteiro p será alterado.*q = a * b; // o conteúdo armazenado no ponteiro q será alterado.
}
int main (void){
int s, p;
somaprod(3, 5, &s, &p); printf("soma = %d Produto = %d \n", s, p);
return 0;}
Funções
Introdução a Linguagem C
Variáveis do Tipo Ponteiro
A linguagem C permite o armazenamento e a manipulação de valores de endereços de
memória. Os ponteiros permitem armazenar endereços de memória em que existam
valores do tipo correspondente armazenados. Caso seja declarada uma variável do tipo
inteiro, reserva-se um espaço de memória para armazenar dados inteiros de 4 bytes. Da
mesma forma que são reservados espaços de memória para o armazenamento de valores
inteiros, pode-se declarar variáveis para armazenar valores de endereços de memória em
que existam valores inteiros armazenados. A declaração de ponteiros é feita da mesma
forma que a declaração de uma variável normal. No entanto, o tipo da declaração é
precedida pelo caractere *.
Exemplo:
int a; //Declaração de uma variável do tipo inteiro (armazena valores inteiros).
int *p; //Declaração de um ponteiro do tipo inteiro (armazena endereços de memória
que contém valores inteiros).
Representação da utilização e manipulação de dados por ponteiros.
Funções
/* Variável do tipo inteiro */
int a;
/* Variável do ponteiro p/ inteiro */
int *p; 112
108
104
p
a
-
-
Pilha de Execução
Introdução a Linguagem C
//variável a recebe o valor 5
a = 5;
112
108
104
p
a
-
5
Pilha de Execução
Funções
Introdução a Linguagem C
Representação da utilização e manipulação de dados por ponteiros.
/* variável p recebe o endereço de a(diz-se que p aponta para a) */
p = &a;
112
108
104
p
a
104
5
Pilha de Execução
Funções
Introdução a Linguagem C
Representação da utilização e manipulação de dados por ponteiros.
/* conteúdo de p recebe o valor 6 */
*p = 6;
112
108
104
p
a
104
6
Pilha de Execução
Funções
Introdução a Linguagem C
Representação da utilização e manipulação de dados por ponteiros.
Basicamente, o ponteiro "aponta" para uma
posição de memória do mesmo tipo
guardando o seu respectivo endereço.
104
Ponteiro declarado p
Variável declarada a
104
6
Pilha de Execução
Funções
Introdução a Linguagem C
Representação da utilização e manipulação de dados por ponteiros.
Funções
Introdução a Linguagem C
Variáveis Globais
As variáveis globais são variáveis declaradas fora do corpo das funções, sendo visível a
todas as funções subsequentes. As variáveis globais existem mesmo depois que uma
determinada função termina sua execução, pois não são armazenadas na pilha de
execução.
Exemplo:#include <stdio.h>
int x, y; //Variáveis Globais.
int main (void){
bloco de comandos}
Funções
Introdução a Linguagem C
Diretivas
Na linguagem C existem diretivas que definem os arquivos de bibliotecas que são
utilizadas pelo compilador e definem rótulos para determinadas ocorrências.
Exemplo:#include <stdio.h>
#define PI 3.14159F
float area (float r){
float a = PI * r * r;return a;
}
int main (void){
bloco de comandos}
Vetores
Introdução a Linguagem C
Para realizar a estruturação de um conjunto de dados, de uma forma simples, é por
meio de vetores. A definição de vetores em C é feita da seguinte forma:
int v[10]; //Declaração de um vetor com 10 posições de 4 bytes (40 bytes)
Essa forma de declaração diz que v é um vetor de inteiros dimensionado para o
armazenamento de 10 elementos inteiros, com um tamanho de 4 bytes.
Para acessar cada elemento do vetor é necessária a indexação da variável v,
começando em 0 a n-1, onde n é o tamanho total do vetor.
v[0] acesso ao primeiro elemento do vetor v
v[1] acesso ao segundo elemento do vetor v
...
v[9] acesso ao último elemento do vetor v
v[10] acesso de violação de acesso ao espaço de memória
Vetores
Introdução a Linguagem C
Exemplo: Declarar um vetor de 10 posições do tipo inteiro.
int v[10] = {5, 8, 3, 9, 6, 3, 7, 1, 2, 4};
5 3 9 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
v 8 6 7 13 2 4
Acessar o segundo elemento do vetor: v[1]
int a = 0;
a = v[1];
A variável a recebeu o valor 8 da posição [1] do vetor v. Do mesmo jeito que
recebemos o valor, podemos alterar o valor dessa posição apenas atribuindo um
novo valor à v[1], escrevendo um código da seguinte maneira: V[1] = 10;
Vetores
Introdução a Linguagem C
Representação do vetor v com 10 posições
Podemos indexar (acessar as informações) da posição [0] a [9], o que totaliza 10
posições. Caso seja feito o acesso da posição [10] obteremos um erro de invasão de
memória.
Exemplo: 144
104v[0]
v[1]
v[2]
v[9]
v[3]
v[4]
v[5]
v[6]
v[7]
v[8]
v[10] Invasão de memória
Vetores
Introdução a Linguagem C
Exemplo: Cálculo da média e da variância de 10 elementos reais#include <stdio.h>
int main (void){
float v[10]; //declara vetor com 10 elementosfloat med, var; //variáveis para a média e variânciaint i; //variável utilizada para índice de vetor
for (i = 0; i < 10; i++) //leitura dos valores{
scanf("%f", &v[i]); //leitura de cada elemento do vetor}
med = 0.0f; //inicializa med com zerofor (i = 0; i < 10; i++){ med = med + v[i]; //acumula soma dos elementos}med = med / 10; //calcula a média
Vetores
Introdução a Linguagem C
var = 0.0f; //inicializa com zerofor (i = 0; i < 10; i++){ var = var + (v[i] - med) * (v[i] - med); //acumula valores}var = var / 10; //calculo da variância
//exibição do resultadoprintf("Media = %f Variancia = %f \n", med, var);
}
Vetores
Introdução a Linguagem C
Passagem de Vetores para Funções
Quando passamos um vetor para uma função estamos passando o endereço da
primeira posição do vetor. A função deve conter um parâmetro do tipo ponteiro para
poder armazenar esse valor. Se for passado um vetor de int, a função deve conter um
parâmetro do tipo int *, capaz de armazenar endereços de inteiros.
Exemplo:void imprime (int n, float *v ){
for (int i = 0; i < n; i++){ printf ("Valor da posicao %d = %7.2f", i, v[ i ]);}
}
Utilização no programa:float v[10] = {5.0, 8.0, 3.0, 9.0, 6.0, 3.0, 7.0, 1.0, 2.0, 4.0};
imprime (10, v);
Vetores
Introdução a Linguagem C
Outra opção de uso:
Caso o tamanho de vetor seja conhecido pode ser utilizada esta forma, no entanto, não
é a forma mais utilizada.Exemplo:void imprime (float v[10]){
int i = 0;
for (i = 0; i < 10; i++){ printf ("Valor da posicao %d = %7.2f", i, v[ i ]);}
}
Utilização no programa:float v[10] = {5.0, 8.0, 3.0, 9.0, 6.0, 3.0, 7.0, 1.0, 2.0, 4.0};
imprime (v);
Vetores
Introdução a Linguagem C
Exemplo: Cálculo da média passando o vetor como parâmetro para a função.#include <stdio.h>
float media (int n, float *v ){
int i = 0;float s = 0.0f;
for (i = 0; i < n; i++){ s += v[ i ];}return (s/n);
}
int main (void){
float med = 0.0f;float vetor[5] = { 5, 10, 15, 20, 25};
med = media(5, vetor); printf("Media = %5.2f \n", med);return (0);
}
Matrizes
Introdução a Linguagem C
Basicamente, matrizes são conjuntos de dados bi ou multidimensionais. As matrizes
seguem o mesmo princípio dos vetores, no entanto, apresentam mais que uma dimensão.
Exemplo: Declarar um vetor de 4 posições do tipo inteiro.
int v[4] = {5, 8, 3, 9};
Acessar o segundo elemento do vetor: v[1] = 8;
Exemplo: Declarar uma matriz 2x4 do tipo inteiro.
int m[2][4] = { {5, 8, 3, 9}, {6, 3, 7, 1} };
Acessar o segundo elemento da primeira linha: m[0][1] = 8;6 3 7 1
[0] [1] [2] [3]
m5 3 9[0]
[1]
8
5 3 9 [0] [1] [2] [3]
v [0] 8
Matrizes
Introdução a Linguagem C
Quando declaramos a matriz é reservado um espaço de memória necessário para
armazenar os 8 elementos da matriz, que são armazenados de maneira contínua, linha a
linha. Para acessar os elementos da matriz é necessária indexação dupla (i x j).
132
1045
8
3
9
6
3
7
1
int m[2][4] = { {5, 8, 3, 9} ,
{6, 3, 7, 1} };
6 3 7 1 [0] [1] [2] [3]
m5 3 9[0]
[1]
8
j
i
m[0][1]
Alocação dos elementos de uma matriz
Matrizes
Introdução a Linguagem C
Passando Matrizes para Funções
Passar uma matriz para uma função a forma mais fácil de realizar esta tarefa seria
definir a matriz de forma estática (tamanhos definidos), uma vez que sabemos de antemão
as dimensões a serem utilizadas.
Exemplo:#include <stdio.h>#include <stdlib.h>
int mat[2][4] = { {5, 8, 3, 9} , {6, 3, 7, 1} };
void imprime (int m[2][4]){ int i = 0, j = 0;
for (i = 0; i < 2; i++) for (j = 0; j < 4; j++) printf ("Valor da linha x coluna [%d,%d] = %d\n", i, j, m[ i ][ j ]);}
int main (void){ imprime(mat);}
Cadeia de Caracteres
Introdução a Linguagem C
Caracteres
A linguagem C não disponibiliza um tipo caractere e sim códigos numéricos
representados internamente na memória do computador, através da utilização do tipo char
de 1 byte, 8 bits, representando assim 256 valores distintos.
A correspondência entre os caracteres e seus códigos numéricos é feita utilizando uma
tabela de códigos conhecida como tabela ASCII:
Exemplo:int main (void){ char c = 97;
printf ("Decimal: %d Caractere: %c\n", c, c);}
Saída da Tela:
Decimal: 97 Caractere: a
Cadeia de Caracteres
Introdução a Linguagem C
Exemplo2:int main (void){ char c = ‘a’;
printf ("Decimal: %d Caractere: %c\n", c, c);}
Saída da Tela:
Decimal: 97 Caractere: a
Códigos ASCII de alguns caracteres que podem ser impressos e de controle.
40 ( ) * + , - . / 0 10 1 2 3 4 5 6 7 8 9
50 2 3 4 5 6 7 8 9 : ;60 < = > ? @ A B C D E70 F G H I J K L M N O80 P Q R S T U V W X Y90 Z
0 nul caracter nulo789
1013
127
bel campainhabs backspaceht tabnl newlinecr carriage return
del delete
Cadeia de Caracteres
Introdução a Linguagem C
Leitura de Caracteres
A captura de caracteres simples via teclado é feito utilizando a função scanf, e como
formato "%c", colocando-se um & na frente da variável que armazenará o caractere.
Exemplo:
int main (void)
{
char a;
//scanf("%c", &a);
scanf(" %c", &a); //Suprime espaços em branco;
printf ("Caractere: %c\n", a);
}
Cadeia de Caracteres (strings)
As strings são representadas por vetores do tipo char, as quais devem ser terminadas
obrigatoriamente pelo caractere nulo (‘\0’).
Cadeia de Caracteres
Introdução a Linguagem C
Para armazenar uma cadeia de caracteres devemos reservar uma posição adicional
para o caractere de fim de cadeia. Ao utilizar o comando printf para imprimir a cadeia de
caracteres usamos o formato %s e será impresso caractere a caractere até encontrar o
finalizador da cadeia de caracteres ‘\0’.Exemplo 1:int main (void){
char cidade [4];
cidade [0] = ‘R’;cidade [1] = ‘i’;cidade [2] = ‘o’;cidade [3] = ‘\0’;
printf ("Cidade: %s", cidade);
return 0;}
Cadeia de Caracteres
Introdução a Linguagem C
Exemplo 2:Sem especificar o tamanho da string com o caractere nulo explícito.int main (void){
char cidade [ ] = { ‘R’ , ‘i’ , ‘o’ , ‘\0’ );
printf ("Cidade: %s", cidade);
return 0;}
Exemplo 3:Sem especificar o tamanho da string com o caractere nulo implícito.int main (void){
char cidade [ ] = "Rio";
printf ("Cidade: %s", cidade);
return 0;}
Cadeia de Caracteres
Introdução a Linguagem C
Leitura de Cadeia de Caracteres
A captura de cadeias de string via teclado é feito da seguinte forma:
Exemplo:
int main (void)
{
char cidade [81];
scanf(" %s", &cidade);
scanf(" %[^\n]", &cidade); //Leitura de caracteres até encontrar ‘ \n ’.
scanf(" %80[^\n]", &cidade); //leitura de no máximo 80 caracteres.
printf ("Cidade: %s\n", cidade);
}
O formato %[...] caracteres aceitos na leitura e (^) é negação.
Caracteres aceitos para digitação: "%[aeiou]“.
Caracteres aceitos até que seja encontrada (pressionada) a tecla enter: "%[^\n]“.
Cadeia de Caracteres
Introdução a Linguagem C
Funções que Manipulam Cadeia de Caracteres
Exemplo 1:
void imprime (char *s)
{
printf ("%s\n“, s);
}
Exemplo 2:
int comprimento (char *s)
{
int n = 0; //contador.
for (int i = 0; s[ i ] != ‘\0’; i ++)
n++;
return n;
}
Cadeia de Caracteres
Introdução a Linguagem C
Vetor de Cadeia de Caracteres
Para representar um vetor onde cada elemento é uma cadeia de caracteres, devemos
implementar um vetor bidimensional (matriz) para armazená-los.
Exemplo:
char alunos [50][80];
Nessa declaração o vetor alunos[ i ] acessa a cadeia de caracteres do (i + 1) ésimo aluno
da lista. Já ao utilizar alunos[ i ][ j ] acessa a (j + 1) ésima letra do nome do (i + 1) ésimo
aluno da lista.
void imprime (int n, char alunos[ ][80]){
for (int i = 0; i < n; i++){ printf ( "%s\n", alunos[ i ];}
}
Tipos Estruturados
Introdução a Linguagem C
A linguagem C permite estruturar dados complexos, gerando informações compostas
por diversos campos através de tipos estruturados.
Tipo Estrutura
Em C, podemos definir um tipo de dado cujos campos são compostos de vários valores
de tipos mais simples. Imaginemos um ponto do plano cartesiano, representado por suas
coordenadas x e y, contendo valores reais. Sem uma estrutura, teríamos que representar
cada coordenada por dois pontos independentes.
float x;
float y;
Podemos definir uma estrutura ponto com os dois campos que representam o ponto.
struct ponto { float x; float y;} ;
Tipos Estruturados
Introdução a Linguagem C
Exemplo:#include <stdio.h>
struct ponto { float x; float y;} ;
int main (void){ struct ponto p; printf("Digite as coordenadas do ponto (x , y): "); scanf("%f %f", &p.x, &p.y ); printf("O ponto fornecido foi: (%.2f, %.2f)\n", p.x, p.y); return 0;}
Tipos Estruturados
Introdução a Linguagem C
Definição de novos tipos de dados
Podemos criar outros tipos de dados na linguagem C, utilizando o comando typedef.
Exemplo:
typedef float Real;
typedef unsigned char Uchar;
Exemplo para Microcontroladores
Introdução a Linguagem C
#include <xc.h>
// Configuração dos Fuses do Microcontrolador.#define _XTAL_FREQ 20000000 // Cristal de 20 Mhz.#pragma config FOSC = HS // Oscillator Selection.#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled).#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled).#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled).#pragma config LVP = OFF // Low-Voltage Programming Enable bit.#pragma config CPD = OFF // Data EE Memory Code Protection bit.#pragma config CP = OFF // Flash Program Memory Code Protection bit.
void main(void){ TRISB = 0b00000000; // Configura todos os pinos do PORTB como saídas. PORTB = 0b00000000; // Inicializa todos os pinos do PORTB em nivel logico 0.
while(1) //Laço Principal. {
RB0 = 1; // Pino RB0 do PORTB ativado em nivel logico 1.__delay_ms(1000); // Função de delay em milissegundos (1s = 1000ms).
RB0 = 0; // Pino RB0 do PORTB desativado em nivel logico 0. __delay_ms(1000); // Função de delay em milissegundos (1s = 1000ms).
}}
Exercícios
Introdução a Linguagem C
1) Fazer um LED piscar, ficando aceso por 1 segundo e apagado por 1 segundo.
2) Fazer dois LED piscarem de forma alternada, (LED1 aceso/LED 2 apagado – LED1
apagado/LED 2 aceso), com um tempo de 0,5 segundo.
3) Acender um LED ao pressionar um botão, sendo apagado após soltar o botão.
4) A partir do exercício 2, utilizar um botão para fazer com que os LEDs pisquem de
forma alternada e ao pressionar novamente este botão, os leds se apagarão.
5) A partir de três LEDs posicionados no barramento do microcontrolador, a cada
aperto do botão, cada LEDs acenderá individualmente em um sentido.
6) A partir de três LEDs posicionados no barramento do microcontrolador, a cada
aperto do botão, o PIC deverá gerar uma sequencia binária de 000 a 111, ou seja, 0 = 000,
1 = 001, 2 = 010, e assim por diante até 111.
7) A partir de três LEDs posicionados no barramento do microcontrolador, a cada
aperto do botão, LEDs deverão ser ativados, ligando um de cada vez para um lado e após
todos terem sido ativados, movimentar para o outro lado.