66
Engenharia da Computação Prof. Dr. Geovani Rodrigo Scolaro [email protected] Microcontroladores e DSP Introdução a Linguagem C

Aula 01 (Introdução a C)

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.