Sei sulla pagina 1di 66

Engenharia da

Computao

Microcontroladores
e DSP
Introduo a Linguagem C
Prof. Dr. Geovani Rodrigo Scolaro
geovani.scolaro@unoesc.edu.br

Apresentao

Introduo a linguagem C,
tipos de dados, variveis,
estruturas de seleo, laos,
funes, vetores, matrizes,
estruturas de dados, etc.
Introduo a Linguagem C

Expresses
Uma expresso uma combinao de constantes, variveis e
operadores que depois de avaliadas resultam num valor.
Variveis
As variveis representam um espao de memria do computador que
armazenam um determinado tipo de dado. Na linguagem C/C++ todas
as variveis devem ser explicitamente declaradas e inicializadas.
Para se declarar uma varivel devem ser especificados seu tipo e
nome. O nome da varivel serve de referncia dentro do programa ao
dado armazenado no espao de memria da varivel. J o tipo da
varivel serve para indicar a natureza do dado que ser armazenado.
Ex: int temperatura = 0;
tipo inteiro (32 bits).
Introduo a Linguagem C

//Declarao da varivel temperatura do

Expresses
Tipos bsicos
A

linguagem

C/C++

oferece

alguns

tipos

bsicos

para

armazenamento de dados.
Para armazenar valores inteiros existem quatro tipos bsicos:
Tipo

Tamanho

Representatividade

char

1 byte (8 bits)

256 valores (-128 a 127)

unsigned char
short int

1 byte (8 bits)
2 bytes (16 bits)

256 valores (0 a 255)


65.535 valores (-32.768 a 32.767)

unsigned short int 2 bytes (16 bits) 65.535 valores (0 a 65.535)


long

int

bytes

(32

bits)

4.294.967.295

valores

(0

4.294.967.295)
unsigned long int

4 bytes (32 bits)

valores entre -2.147.483.648 a

2.147.483.647
Int

4.294.967.295)
Introduo a Linguagem C

bytes

(32

bits)

4.294.967.295

valores

(0

Expresses
Para armazenar nmeros reais (ponto flutuante) existem dois tipos
bsicos:
Tipo

Tamanho

Representatividade

float

4 byte (32 bits)

double

8 bytes (64 bits)

(maior preciso)

Declarao de Variveis
Para armazenar um determinado dado em memria, deve-se reservar
um espao de memria correspondente ao tipo de dado. Quando se
declara uma varivel o espao de memria reservado associado ao
nome de varivel que declaramos.
Exemplos:
char a; //declara uma varivel do tipo char.
int b;

//declara uma varivel do tipo int.

float c; //declara uma varivel do tipo float.

Introduo a Linguagem C

Expresses
A linguagem C/C++ permite declarar variveis do mesmo tipo juntas.
Exemplo:
int a, b;

//declarao das variveis a e b do tipo int.

A linguagem tambm permite que as variveis sejam inicializadas no


momento da declarao.
Exemplo:
int a = 5, int b = 10; //declarao e inicializao de variveis.
float c = 6.8;
Variveis com valores indefinidos
Um dos erros mais comuns de programao a utilizao de
variveis que ainda no foram inicializadas e atribudos valores a elas.
Quando se declara a varivel existe um valor desconhecido dentro do
espao reservado no momento da declarao.

Introduo a Linguagem C

Expresses
Caso a varivel seja utilizada ir apresentar erros no decorrer da
execuo do programa. O fragmento de cdigo a seguir contem um erro,
pois a varivel b possui um valor indefinido armazenado em seu espao
de memria, gerando um erro.
Exemplo:
int a, b, c;
a = 2;
c = a + b;

//Erro pois em b h lixo de memria.

Operadores Aritmticos
Em C/C++ existem os operadores aritmticos de adio ( + ),
subtrao ( - ), multiplicao ( * ), diviso ( / ) e mdulo ( % ).
Devemos ter cuidado na operao de diviso em preciso inteira e
preciso real. A expresso 5/2 resulta no valor 2, pois a preciso inteira
trunca a parte funcionria. J a expresso 5.0/2.0 resulta em 2.5 devido a

Introduo a Linguagem C

Expresses
Utilizao com valores inteiros.
Exemplo 1:
int a, b, c;
a = 3;
b = 2;
c = a - b;

//A varivel c armazenar o valor 1;

Utilizao com valores reais.


Exemplo 2:
float a, b, c;
a = 3.0;
b = 2.0;
c = a / b;

Introduo a Linguagem C

//A varivel c armazenar o valor 1.5;

Expresses
Os operadores ( * ), ( / ) e ( % ) tm precedncia maior que os
operadores ( + ) e ( - ).
Exemplo:
a+b*c/d
Executa-se primeiro a multiplicao, seguida da diviso e da soma.
Exemplo:
(a + b) * c / d

//Utilizando parnteses inverte-se a ordem de

avaliao da expresso.
Operadores de atribuio
Uma atribuio uma expresso cujo valor resultante corresponde ao
valor atribudo. Assim da mesma forma que a expresso 5 + 3 resulta no
valor 8,

a atribuio a = 5 uma expresso que resulta no valor 5

(armazenada na varivel a). Esse tratamento das atribuies permite


escrever comandos do tipo:

Introduo a Linguagem C

Expresses
Em C/C++ podemos utilizar operadores de atribuio 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

Introduo a Linguagem C

C/C++

apresenta

ainda

dois

operadores

no

Expresses
para incrementar ( ++ ) e decrementar ( -- ) uma unidade nos valores
armazenados nas variveis. Se n uma varivel 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 varivel x 6.

Exemplo 2:
n = 5;
x = n--; //o valor da varivel x 4.
Exemplo 3:
a = a + 1;

a +=1;

Introduo a Linguagem C

a++;

++a;

//So equivalentes.

Expresses
Operadores Relacionais e Lgicos
Operadores relacionais so utilizados na comparao entre dois
valores. So eles:
<

menor que

>

maior que

<= menor ou igual que


>= maior ou igual que
== igual a
!=

diferente de

O resultado produzido atravs da comparao de dois valores


utilizando os operadores relacionais ZERO (FALSE) ou UM (TRUE).
Exemplo:
if (a == 5)
{ }

Introduo a Linguagem C

Expresses
Operadores Relacionais e Lgicos
Os operadores lgicos combinam expresses booleanas. Exemplos de
operadores:
&& operador binrio E (AND)
||

operador binrio OU (OR)

!operador unrio de NEGAO (NOT)


Os operadores relacionais e lgicos normalmente so utilizados em
tomadas de decises e podemos utiliz-los tambm para atribuir valores
a variveis.
Exemplo:
int a, b;
int c = 23;
int d = c + 4;
a = (c < 20)

||

Introduo a Linguagem C

(d > c);

//verdadeiro, varivel a recebe 1 (0

Expresses
Operador sizeof
Outro operador presente na linguagem C/C++ o sizeof, resulta no
nmero de bytes de um determinado tipo.
Exemplo:
int a = sizeof ( float );

// o tipo float reserva 4 bytes de espao em

memria.
Armazena o valor 4 na varivel a, pois um float ocupa 4 bytes de
memria. Tambm pode ser utilizado na verificao do espao utilizado
por variveis.
Exemplo:
short int a;

// o tipo short int ocupa 2 bytes de espao em

memria.
int b = sizeof ( a );
Introduo a Linguagem C

// varivel b recebe o valor 2;

Expresses
Entrada e Sada Bsicas
Na linguagem C/C++ no h comandos de entrada e sada de dados,
existem funes para tal fim.
Tais funes de entrada e sada esto dentro de uma biblioteca
padro, a qual sempre deve estar no incio de cada programa.
#include <stdio.h>
Exemplo:
#include <stdio.h> //Biblioteca contendo as funes de entrada e
sada.
int main (void)
{
}

Introduo a Linguagem C

Expresses
Funo printf
A funo printf possibilita a sada de valores (constantes, variveis e
resultados de expresses) conforme um determinado formato.
Utilizao:
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 cientfico
%g especifica um double (ou float) mais apropriado (%f ou %e)
%s especifica uma cadeia de caracteres
valores

constantes, variveis e resultados de expresses

Introduo a Linguagem C

Expresses
Exemplos:
printf ( "%d %g \n", 33, 5.3);
Sada na tela:
33 5.3
printf ( "Inteiro = %d

Real = %g \n", 33, 5.3);

Sada na tela:
Inteiro = 33

Real = 5.3

printf ("Curso de Introduo a Linguagem C\n");


Sada na tela:
Curso de Introduo a Linguagem C

Introduo a Linguagem C

Expresses
Alguns formatos de sada utilizados:
\n

caractere de nova linha

\t

caractere de tabulao

\r

caractere de retrocesso

\"

imprime o caractere "

\\

imprime o caractere \

%% imprime o caractere %
possvel tambm especificar o tamanho dos campos (exemplo
anterior):
%d %4d

4
5

%f %7.2f

2
7

Introduo a Linguagem C

Expresses
Funo scanf
A funo scanf permite capturar valores fornecidos via teclado pelo
usurio do programa e os armazena em variveis dentro do programa.
Utilizao:
Scanf ( formato, endereos );
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


endereos

Introduo a Linguagem C

endereo das variveis

Expresses
Exemplos:
int n;
scanf ( "%d", &n);
O valor digitado pelo usurio ser armazenado na varivel n.
int n, m;
scanf ( "%d %d", &n, &m);
Os valores digitados pelo usurio sero armazenados nas variveis n
e m, respectivamente.

Introduo a Linguagem C

Expresses
Exerccio: Converter altura em metros para ps (ft) e polegadas
(pol).
#include <stdio.h>
int main
{
int f;
float p;
float h;

(void)
//nmero de ps.
//nmero de polegadas.
//altura em metros.

//Captura altura em metros.


printf("Digite a ltura em metros");
scanf("%f", &h);
//Calcula altura em ps e polegadas.
h = 100 * h;
//converte para centmetros.
f = (int) (h / 30.48);
//calcula o nmero de ps.
p = (h f * 30.48) / 2.54); //calcula nmero de polegadas do restante.
//Exibe altura convertida.
printf("Altura: %dft %.lfpol\n", f, p);
return 0;
}

Introduo a Linguagem C

Controle de Fluxo
A linguagem C/C++ disponibiliza alguns mecanismos para o controle
de fluxo de dados dentro dos programas codificados, como: tomadas de
deciso, laos, interrupes com break e continue e seleo.
Tomadas de Deciso
O comando if o comando bsico para codificar tomadas de em C.
Exemplo:
if ( expressao )
{
bloco de comandos 1
...
}
ou
Introduo a Linguagem C

Controle de Fluxo
if ( expressao )
{
bloco de comandos 1
...
}
else //caso contrrio...
{
bloco de comandos 2
...
}
Neste exemplo se a condio de avaliao da expresso for diferente
de zero, o bloco de comandos 1 ser executado. Caso contrrio, se a
condio de avaliao da expresso for igual a zero, o bloco de
comandos 2 ser executado.

Introduo a Linguagem C

Controle de Fluxo
Exemplo de Cdigo: Verificar se um nmero par ou impar.
#include <stdio.h>
int main (void)
{
int a;
printf("Digite um nmero inteiro: ");
scanf("%d ", &a);
if (a % 2 == 0)
{
printf("O nmero fornecido par!\n");
}
else
{
printf("O nmero fornecido impar!\n");
}
}

Introduo a Linguagem C

Controle de Fluxo
Construes com Laos
A linguagem C disponibiliza vrios mecanismos para a realizao de
laos interativos utilizando o comando while( ), do while( ) e for( ).
Utilizao do comando while( ):
while ( expressao )
{
bloco de comandos
}
Exemplo:
int i = 0;
while ( i <= 100)
100.
{
i++;
}

Introduo a Linguagem C

//O programa ir executar at que a i seja igual a

Controle de Fluxo
Utilizao 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.
Introduo a Linguagem C

Controle de Fluxo
Utilizao do comando for( ):
for

(expressao_inicial;

expressao_booleana;

expressao_incremental)
{
bloco de comandos
}
onde:
expressao_inicial: a condio de incio do lao. Ex: i = 0.
expressao_booleana: a condio de parada do lao. Ex: i<= 100.
expressao_incremental: a condio de incremento do lao. Ex:
i++, i += 2, etc.
Exemplo:
for (int i = 0; i < 100; i++)
{
bloco de comandos

Introduo a Linguagem C

Controle de Fluxo
Interrupes com break e continue
A linguagem C oferece duas formas de interrupo antecipada de um
determinado lao. O comando break interrompe e termina a execuo do
lao. J o comando continue interrompe momentaneamente a execuo
do lao e segue para a prxima iterao.
Exemplo com break:
int i = 0;
for (i = 0; i < 15; i++)
{
if (i == 5)
{
break;
}
printf("%d", i);
}
printf("fim\n");

Sada do programa:
0 1 2 3 4 fim

Introduo a Linguagem C

Controle de Fluxo
Exemplo com continue:
int i = 0;
for (i = 0; i < 15; i++)
{
if (i == 5)
{
continue;
}
printf("%d", i);
}
printf("fim\n");
Sada do programa:
0 1 2 3 4 6 7 8 9 10 11 12 13 14 fim
Observe que o nmero 5 no foi impresso...

Introduo a Linguagem C

Controle de Fluxo
Comando de Seleo switch
A linguagem C disponibiliza um outro comando para a seleo de um
elemento dentre um conjunto de casos possveis (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
opes.
bloco de comandos
break;
Introduo
a Linguagem C

Funes
Definio de funes
No desenvolvimento de programas estruturados, prefervel dividir
tarefas computacionais complexas em tarefas menores e utilizar seus
resultados parciais, compondo o resultado final. Na linguagem C
utilizamos funes para codificar tarefas especficas. Essa estratgia de
codificao beneficia a resoluo de problemas especficos, do que
codificar uma nica funo maior que resolva o problema como um todo.
A forma geral para a definio de funes em C :
tipo_de_retorno nome_da_funo ( lista de parmetros)
{
bloco de comandos
return ( valores );
}

Introduo a Linguagem C

Funes
onde:
tipo_de_retorno

void (sem retorno)

char ou unsigned char


int ou unsigned int
float ou double
nome_da_funo soma ou outro qualquer
valores

variveis do mesmo tipo de retorno ou valores

inteiros.
Exemplo:
double soma (double valor1, double valor2) //funo para somar dois
valores.
{
double resultado = valor1 + valor2;
return (resultado); //retorno do valor calculado para o programa.

Introduo a Linguagem C

Funes
Ponteiro de Variveis
Uma funo normalmente retorna um tipo de valor para a atribuio
ou outra funo que a requisitou. No entanto, uma funo apenas
retorna um determinado valor. Muitas vezes necessitamos retornar mais
que um valor para a funo que a requisitou e isso no pode ser feito de
uma forma explcita de retorno. Dessa forma, devemos utilizar ponteiros.
Exemplo 1: Retorno de apenas um valor pela funo.
#include <stdio.h>
int soma( int a, int b )
{
int c = a + b;
return c;
}
int main (void)
{
int s = soma(3, 5);
//Forma explcita de retorno de valores.
printf("soma = %d\n", s);
return 0;
}
Introduo
a Linguagem C

Funes
Exemplo 2: Retorno de mais valores pela mesma funo.
#include <stdio.h>
void somaprod( int a, int b, int *p, int *q )
{
*p = a + b; // o contedo armazenado no ponteiro p ser alterado.
*q = a * b; // o contedo 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;
}

Introduo a Linguagem C

Funes
Variveis do Tipo Ponteiro
A linguagem C permite o armazenamento e a manipulao de valores
de endereos de memria. Os ponteiros permitem armazenar endereos
de

memria

em

que

existam

valores

do

tipo

correspondente

armazenados. Caso seja declarada uma varivel do tipo inteiro, reservase um espao de memria para armazenar dados inteiros de 4 bytes. Da
mesma forma que so reservados espaos de memria para o
armazenamento de valores inteiros, pode-se declarar variveis para
armazenar valores de endereos de memria em que existam valores
inteiros armazenados. A declarao de ponteiros feita da mesma forma
que a declarao de uma varivel normal. No entanto, o tipo da
declarao precedida pelo caractere *.
Exemplo:
int a;

//Declarao de uma varivel do tipo inteiro (armazena

valores inteiros).

Introduo a Linguagem C

Funes
Representao da utilizao e manipulao de dados por ponteiros.

Pilha de Execuo
/* Varivel do tipo inteiro */
int a;
/* Varivel do ponteiro p/ inteiro */
112

int *p;

Introduo a Linguagem C

108

104

Funes
Representao da utilizao e manipulao de dados por ponteiros.

Pilha de Execuo
//varivel a recebe o valor 5
a = 5;

112

Introduo a Linguagem C

108

104

Funes
Representao da utilizao e manipulao de dados por ponteiros.

Pilha de Execuo
/* varivel p recebe o endereo de a
(diz-se que p aponta para a) */
p = &a;

112

Introduo a Linguagem C

104

108

104

Funes
Representao da utilizao e manipulao de dados por ponteiros.

Pilha de Execuo
/* contedo de p recebe o valor 6 */
*p = 6;

112

Introduo a Linguagem C

104

108

104

Funes
Representao da utilizao e manipulao de dados por ponteiros.

Pilha de Execuo

Basicamente, o ponteiro "aponta"


para uma posio de memria do
mesmo tipo guardando o seu
respectivo endereo.

Introduo a Linguagem C

Ponteiro declarado p

104

Varivel declarada a

104

Funes
Variveis Globais
As variveis globais so variveis declaradas fora do corpo das
funes, sendo visvel a todas as funes subsequentes. As variveis
globais existem mesmo depois que uma determinada funo termina sua
execuo, pois no so armazenadas na pilha de execuo.
Exemplo:
#include <stdio.h>
int x, y; //Variveis Globais.
int main (void)
{
bloco de comandos
}

Introduo a Linguagem C

Funes
Diretivas
Na linguagem C existem diretivas que definem os arquivos de
bibliotecas que so utilizadas pelo compilador e definem rtulos para
determinadas ocorrncias.
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
}
Introduo a Linguagem C

Vetores
Para realizar a estruturao de um conjunto de dados, de uma forma
simples, por meio de vetores. A definio de vetores em C feita da
seguinte forma:
int v[10];

//Declarao de um vetor com 10 posies de 4 bytes

(40 bytes)
Essa forma de declarao 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 necessria a indexao da
varivel v, comeando 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
...

Introduo a Linguagem C

Vetores
Exemplo: Declarar um vetor de 10 posies do tipo inteiro.
int v[10] = {5, 8, 3, 9, 6, 3, 7, 1, 2, 4};

[0]
[7]

[1]
[8]

[2]
[9]

[3]

[4]

[5]

[6]

Acessar o segundo elemento do vetor: v[1]


int a = 0;
a = v[1];
A varivel a recebeu o valor 8 da posio [1] do vetor v. Do
mesmo jeito que recebemos o valor, podemos alterar o valor
dessa

posio

apenas

atribuindo

um

novo

valor

escrevendo um cdigo da seguinte maneira: V[1] = 10;


Introduo a Linguagem C

v[1],

Vetores
Representao do vetor v com 10 posies
Podemos indexar (acessar as informaes) da posio [0] a [9], o que
totaliza 10 posies. Caso seja feito o acesso da posio [10] obteremos
um erro de invaso de memria.
Exemplo:

v[10]Invaso de memria144
v[9]
v[8]
v[7]
v[6]
v[5]
v[4]
v[3]
v[2]
v[1]
v[0]

Introduo a Linguagem C

104

Vetores
Exemplo: Clculo da mdia e da varincia de 10 elementos reais
#include <stdio.h>
int main (void)
{
float v[10];
//declara vetor com 10 elementos
float med, var; //variveis para a mdia e varincia
int i;
//varivel 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 zero
for (i = 0; i < 10; i++)
{
med = med + v[i]; //acumula soma dos elementos
}
med = med / 10;
//calcula a mdia
Introduo a Linguagem C

Vetores
var = 0.0f;
//inicializa com zero
for (i = 0; i < 10; i++)
{
var = var + (v[i] - med) * (v[i] - med);
}
var = var / 10;
//calculo da varincia

//acumula valores

//exibio do resultado
printf("Media = %f
Variancia = %f \n", med, var);
}

Introduo a Linguagem C

Vetores
Passagem de Vetores para Funes
Quando

passamos

um

vetor

para

uma

funo

estamos

passando o endereo da primeira posio do vetor. A funo deve


conter um parmetro do tipo ponteiro para poder armazenar esse valor.
Se for passado um vetor de int, a funo deve conter um parmetro do
tipo int *, capaz de armazenar endereos 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 ]);
}
}
Utilizao 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);

Introduo a Linguagem C

Vetores
Outra opo de uso:
Caso o tamanho de vetor seja conhecido pode ser utilizada esta
forma, no entanto, no 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 ]);
}
}
Utilizao 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);

Introduo a Linguagem C

Vetores
Exemplo: Clculo da mdia passando o vetor como parmetro para a
funo.
#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);
}
Introduo
a Linguagem C

Matrizes
Basicamente,

matrizes

so

conjuntos

de

dados

bi

ou

multidimensionais. As matrizes seguem o mesmo princpio dos vetores,


no entanto, apresentam mais que uma dimenso.
Exemplo: Declarar um vetor de 4 posies do tipo inteiro.
v

[0
]

[1
]

int v[4] = {5, 8, 3, 9};

[0]
[3]

[1]

[2]

Acessar o segundo elemento do vetor: v[1] = 8;

Exemplo: Declarar uma matriz 2x4 do tipo inteiro. [0


m
int m[2][4] = { {5, 8, 3, 9}, {6, 3, 7, 1} };

[0]
Acessar o segundo elemento da primeira linha: m[0][1] = 8; [3]

Introduo a Linguagem C

[1]

[2]

Matrizes
Quando declaramos a matriz reservado um espao de memria
necessrio para armazenar os 8 elementos da matriz, que so
armazenados de maneira contnua, linha a linha. Para acessar os
elementos da matriz necessria indexao dupla (i x j).
Alocao dos elementos de uma matriz

int m[2][4] = {

{5, 8, 3,

9} ,
{6, 3, 7,
1} };j
i
m

[0
]
[1
]

132

7
3
6

[0]
[3]

[1]

[2]

m[0][1]

8
5

Introduo a Linguagem C

104

Matrizes
Passando Matrizes para Funes
Passar uma matriz para uma funo a forma mais fcil de realizar
esta tarefa seria definir a matriz de forma esttica (tamanhos definidos),
uma vez que sabemos de antemo as dimenses 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);
}
Introduo a Linguagem C

Cadeia de Caracteres
Caracteres
A linguagem C no disponibiliza um tipo caractere e sim cdigos
numricos representados internamente na memria do computador,
atravs da utilizao do tipo char de 1 byte, 8 bits, representando assim
256 valores distintos.
A correspondncia entre os caracteres e seus cdigos numricos
feita utilizando uma tabela de cdigos conhecida como tabela ASCII:
Exemplo:
int main (void)
{
char c = 97;
printf ("Decimal: %d Caractere: %c\n", c, c);
}
Sada da Tela:
Decimal: 97 Caractere: a

Introduo a Linguagem C

Cadeia de Caracteres
Exemplo2:
int main (void)
{
char c = a;
printf ("Decimal: %d Caractere: %c\n", c, c);
}
Sada da Tela:
Decimal: 97 Caractere: a
0 1 2
40 ( ) *
50 2 3 4
60 < = >
70 F G H
80 P Q R
90 Z
Cdigos ASCII

0
7
8
9
10
13
12
7
de alguns caracteres que podem

Introduo a Linguagem C

3 4
+ ,
5 6
? @
I J
S T

5
7
A
K
U

6 7 8 9
. / 0 1
8 9 : ;
B C D E
L M N O
V W X Y

controle.

nul caracter nulo


bel campainha
bs backspace
ht tab
nl newline
cr carriage return
del delete
ser impressos e de

Cadeia de Caracteres
Leitura de Caracteres
A captura de caracteres simples via teclado feito utilizando a funo
scanf, e como formato "%c", colocando-se um & na frente da varivel
que armazenar o caractere.
Exemplo:
int main (void)
{
char a;
//scanf("%c", &a);
scanf(" %c", &a);

//Suprime espaos em branco;

printf ("Caractere: %c\n", a);


}
Cadeia de Caracteres (strings)
As strings so representadas por vetores do tipo char, as quais devem
ser terminadas obrigatoriamente pelo caractere nulo (\0).

Introduo a Linguagem C

Cadeia de Caracteres
Para armazenar uma cadeia de caracteres devemos reservar uma
posio 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
cidade
cidade
cidade

[0]
[1]
[2]
[3]

=
=
=
=

R;
i;
o;
\0;

printf ("Cidade: %s", cidade);


return 0;
}
Introduo a Linguagem C

Cadeia de Caracteres
Exemplo 2:
Sem especificar o tamanho da string com o caractere nulo explcito.
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 implcito.
int main (void)
{
char cidade [ ] = "Rio";
printf ("Cidade: %s", cidade);
return 0;
}
Introduo a Linguagem C

Cadeia de Caracteres
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 mximo 80 caracteres.
printf ("Cidade: %s\n", cidade);
}
O formato %[...] caracteres aceitos na leitura e (^) negao.
Caracteres aceitos para digitao: "%[aeiou].
Caracteres aceitos at que seja encontrada (pressionada) a tecla

Introduo a Linguagem C

Cadeia de Caracteres
Funes 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;
}
Introduo a Linguagem C

Cadeia de Caracteres
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 declarao 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 ];
}
}
Introduo
a Linguagem C

Tipos Estruturados
A

linguagem C

informaes

permite estruturar dados complexos, gerando

compostas

por

diversos

campos

atravs

de

tipos

estruturados.
Tipo Estrutura
Em C, podemos definir um tipo de dado cujos campos so compostos
de vrios valores de tipos mais simples. Imaginemos um ponto do plano
cartesiano, representado por suas coordenadas x e y, contendo valores
reais. Sem uma estrutura, teramos 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.
structa ponto
{ C
Introduo
Linguagem

Tipos Estruturados
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;
}

Introduo a Linguagem C

Tipos Estruturados
Definio 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;

Introduo a Linguagem C

Exemplo para Microcontroladores


#include <xc.h>
// Configurao 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 sadas.
PORTB = 0b00000000; // Inicializa todos os pinos do PORTB em nivel logico 0.
while(1) //Lao Principal.
{
RB0 = 1;
// Pino RB0 do PORTB ativado em nivel logico 1.
__delay_ms(1000); // Funo de delay em milissegundos (1s = 1000ms).
RB0 = 0;
__delay_ms(1000);
}
}

Introduo a Linguagem C

// Pino RB0 do PORTB desativado em nivel logico 0.


// Funo de delay em milissegundos (1s = 1000ms).

Exerccios
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 boto, sendo apagado
aps soltar o boto.
4) A partir do exerccio 2, utilizar um boto para fazer com
que os LEDs pisquem de forma alternada e ao pressionar
novamente este boto, os leds se apagaro.
5)

partir

de

trs

LEDs

posicionados

no

barramento

do

microcontrolador, a cada aperto do boto, cada LEDs acender


individualmente em um sentido.
6)

partir

de

trs

LEDs

posicionados

no

barramento

do

microcontrolador, a cada aperto do boto, o PIC dever gerar uma

Introduo a Linguagem C

Potrebbero piacerti anche