Вы находитесь на странице: 1из 32

Sistemas Embarcados

Prof. Adriano Cardoso


adrianosvc@ufsj.edu.br
Revisão: C 12 de março de 2019

Tipos de básicos de dados

Números inteiros. Ponto flutuante. Ponto flutuante de


precisão dupla.
int a; float x;
int b = 0; float pi = 3.1415927; double xx;
double dpi = 3.141592653589793;
a = b; x = 2*pi;
xx = 2*dpi;

Sistemas Embarcados Engenharia Mecatrônica 2


Revisão: C 12 de março de 2019

Tipos de básicos de dados

Caracteres. Vetores de caracteres - Vetor de inteiros.


strings.
char a,d; int a[] = {1,3,5,7,9};
char b = ’A’; char a[10]; int b[10];
char c = 66; char b[] = "palavra";
char c; b[0] = a[0]; /* b[0] <- 1 */
a = b; b[1] = a[1]; /* b[1] <- 3 */
d = c; b = a; /* JAMAIS */
c = b[7]; /* c <- 0 */

Caracteres são O último caracter de


números. uma string é sempre 0.

Sistemas Embarcados Engenharia Mecatrônica 3


Revisão: C 12 de março de 2019

Funções

Declaração: Exemplo:

tipo nome_da_funcao(tipo parametros) int soma(int a, int b)


{ {
conteúdo ... int c;
return ...;
} c = a + b;
return c;
}

Sistemas Embarcados Engenharia Mecatrônica 4


Revisão: C 12 de março de 2019

Funções

Declaração: Exemplo:

tipo nome_da_funcao(tipo parametros) int soma(int a, int b)


{ {
conteúdo ... int c;
return ...;
} c = a + b;
return c;
}

• Cada função deve realizar uma única tarefa.


• Funções devem retornar, salvo notáveis excessões.
• Parâmetros e retorno são tipos básicos.

Sistemas Embarcados Engenharia Mecatrônica 5


Revisão: C 12 de março de 2019

Funções

Dicas (do autor do LinuxKernelCodingStyle)

• Variáveis locais devem ter nomes curtos e auto-explicativos.


• Se uma função possui mais de oito variáveis é hora de repensá-la.
• Se uma função possui mais de 50 linhas, é hora de repensá-la.
• Se forem necessários mais de 3 nı́veis de identação, sua função precisa ser
repensada.

Sistemas Embarcados Engenharia Mecatrônica 6


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Problema:

1. Ler quatro parâmetros numéricos inteiros: valor inicial, valor final, passo e
uma variável booleana.
2. Gerar uma lista de números inteiros do valor inicial ao final com intervalo
determinado pela variável passo.
3. Separar os números pares dos ı́mpares e mostrar na tela somente os selecio-
nados pela variável booleana, da seguinte maneira:
• 1: mostra os ı́mpares;
• 0: mostra os pares.

Sistemas Embarcados Engenharia Mecatrônica 7


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Solução:

1. Função de entrada de dados.


2. Função geradora da lista de números.
3. Função classificadora: par e ı́mpar.
4. Função de saı́da dos dados.

Sistemas Embarcados Engenharia Mecatrônica 8


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Pseudo-algoritmo 1 - entrada de dados

1. Definição e declaração das variáveis: vi, vf, passo, sel, lista[100]


2. vi <- valor inicial
3. vf <- valor final
4. passo <- intervalo entre os valores
5. sel <- variável booleana
6. Executa função geradora de lista
7. Executa função de saı́da de dados
8. Retorna para o sistema operacional

Sistemas Embarcados Engenharia Mecatrônica 9


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Pseudo-algoritmo 2 - geração de sequência numérica

1. Definição e declaração das variáveis: i, j


2. Percorre i de vi até vf em passos de passo; incrementa j a cada atribuição.
3. lista[j] <- i
4. Retorna para a função chamadora

Sistemas Embarcados Engenharia Mecatrônica 10


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Pseudo-algoritmo 3 - testa se o número é par

1. Lê o i-ésimo elemento de lista: lista[i];


2. SE resto da divisão inteira de lista[i] por 2 é zero
• ENTÃO retorna 1
• SENÃO retorna 0

Sistemas Embarcados Engenharia Mecatrônica 11


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Pseudo-algoritmo 4 - saı́da de dados

1. Definição e declaração das variáveis: i


2. Percorre a lista de números
3. SE número é par E sel == 0
• ENTÃO mostra lista[i]
• SENÃO não mostra nada
4. SE número é ı́mpar E sel == 1
• ENTÃO mostra lista[i]
• SENÃO não mostra nada

Sistemas Embarcados Engenharia Mecatrônica 12


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Protótipos das funções:

1. int main(int argc, char **argv);


2. int gera lista(int vi, int vf, int passo, int *lista);
3. int par(int *lista, int i);
4. int saida(int *lista, int N, int sel);

Sistemas Embarcados Engenharia Mecatrônica 13


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Entrada de dados Função codificada

1. Definição e declaração das variáveis: int main(int argc, char **argv)


vi, vf, passo, sel, lista[100] {
2. vi <- valor inicial int vi, vf, passo, sel;
3. vf <- valor final int lista[100], n;
4. passo <- intervalo entre os valores
5. sel <- variável booleana vi = atoi(argv[1]);
6. Executa função geradora de lista vf = atoi(argv[2]);
7. Executa função de saı́da de dados passo = atoi(argv[3]);
8. Retorna para o sistema operacional sel = atoi(argv[4]);

n = gera_lista(vi,vf,passo,lista);
saida(lista,n,sel);
return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 14


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Geração de sequência numérica

1. Definição e declaração das variáveis: i, j


2. Percorre i de vi até vf em passos de passo; incrementa j a cada atribuição.
3. lista[j] <- i
4. Retorna para a função chamadora

Função codificada

int gera_lista(int vi, int vf, int passo, int *lista)


{
int i, j = 0;

for (i = vi; i < vf; i += passo) {


lista[j++] = i;
}
return j;
}

Sistemas Embarcados Engenharia Mecatrônica 15


Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Testa se o número é par

1. Definição e declaração das variáveis: i


2. Percorre a lista de números
3. SE resto da divisão inteira de lista[i] por 2 é zero
• ENTÃO retorna 1
• SENÃO retorna 0

Função codificada

int par(int *lista, int i)


{
if (lista[i] % 2) {
return 0;
} else {
return 1;
}
}
Sistemas Embarcados Engenharia Mecatrônica 16
Revisão: C 12 de março de 2019

Funções
Exemplo de fragmentação de tarefas
Saı́da de dados Função codificada

1. Definição e declaração das variáveis: int saida(int *lista, int N, int sel)
i {
2. Percorre a lista de números int i;
3. SE número é par E sel == 0 for (i = 0; i < N; i++) {
• ENTÃO mostra lista[i] if (par(lista, i) && !sel)
• SENÃO não mostra nada printf("%d\n", lista[i]);
4. SE número é ı́mpar E sel == 1 if(!par(lista, i) && sel)
• ENTÃO mostra lista[i] printf("%d\n", lista[i]);
• SENÃO não mostra nada }
return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 17


Revisão: C 12 de março de 2019

Constantes em C
Diretiva de compilação #define

#define CONSTANTE VALOR_DA_CONSTANTE


Exemplo - função de entrada de dados

#define MAX_LISTA 100


int main(int argc, char **argv)
{
int vi, vf, passo, sel;
int lista[MAX_LISTA], n;

vi = atoi(argv[1]);
vf = atoi(argv[2]);
passo = atoi(argv[3]);
sel = atoi(argv[4]);

n = gera_lista(vi,vf,passo,lista);
saida(lista,n,sel);
return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 18


Revisão: C 12 de março de 2019

Constantes em C
Diretiva de compilação #define
Macros

#define NOME_MACRO(paramentro) (DEFINICAO_DA_MACRO)

Exemplo - função alternativa de saı́da de dados

#define IMPAR(x) (x % 2)
int saida(int *lista, int N, int sel)
{
int i;
for (i = 0; i < N; i++) {
if (IMPAR(lista[i]) && sel)
printf("%d\n", lista[i]);
if(!IMPAR(lista[i]) && !sel)
printf("%d\n", lista[i]);
}
return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 19


Revisão: C 12 de março de 2019

Constantes em C
Diretiva de compilação #define e #undefine
#define DIRETIVA_2
#undefine DIRETIVA_1

#ifdef DIRETIVA_1
código a ser compilado ser a diretiva 1 for
verdadeira
#endif

#ifdef DIRETIVA_2
código alternativo para o caso da diretiva 2 ser
verdadeira
#endif

Sistemas Embarcados Engenharia Mecatrônica 20


Revisão: C 12 de março de 2019

Constantes em C
Diretiva de compilação: exemplo
Exemplo - função alternativa de saı́da de dados

#define IMPAR(x) (x % 2)
#ifdef MACRO_IMPAR
int saida(int *lista, int N, int sel)
{
int i;
for (i = 0; i < N; i++) {
if (IMPAR(lista[i]) && sel)
printf("%d\n", lista[i]);
if(!IMPAR(lista[i]) && !sel)
printf("%d\n", lista[i]);
}
return 0;
}
#endif

Sistemas Embarcados Engenharia Mecatrônica 21


Revisão: C 12 de março de 2019

typedef
Exemplo de utilização
Exemplo - função para exibição de vetores numéricos. Nesse caso, o vetor pode
ser de inteiros ou ponto flutuante.
int mostra_vetor(tipo *vetor, int n)
#define TIPO_FLOAT {
int i;
#ifdef TIPO_INT for (i = 0; i < n; i++) {
typedef int tipo
#endif #ifdef TIPO_INT
#ifdef TIPO_FLOAT printf("%d\n", vetor[i]);
typedef float tipo #endif
#endif
#ifdef TIPO_DOUBLE #ifdef TIPO_FLOAT
typedef double tipo printf("%f\n", vetor[i]);
#endif #endif

#ifdef TIPO_DOUBLE
printf("%le\n", vetor[i]);
#endif

}
return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 22


Revisão: C 12 de março de 2019

Exercı́cio
Escreva um programa que calcule as amostras de uma função trigonométrica (seno ou cosseno)
a partir dos seguintes parâmetros de entrada:

1. amplitude;
2. perı́odo;
3. fase inicial;
4. fase incremental;
5. seleção: ciclos ou pontos;
6. número de ciclos/pontos.

Os parâmetros amplitude, perı́odo e fase inicial definem a função trigonométrica. fase incremental
determina o incremento de fase entre amostras sucessivas. O parâmetro seleç~ ao determina o sig-
nificado do parâmetro seguinte. Deve ser do tipo string de caracteres e pode conter um dos
seguintes valores:

• "ciclos": o parâmetro seguinte é um ponto flutuante e define quantos ciclos (ou frações de
ciclos) serão calculados;
• "pontos": o parâmetro seguinte é um inteiro contendo o total de amostras calculadas.

Qualquer outra valor deve ser entendido como erro e não deve permitir a continuação do programa.

Depois de calculadas as amostras, estas deverão ser impressas no terminal. A precisão do ponto

flutuante (float ou double) deve ser definida no momento da compilação.

Sistemas Embarcados Engenharia Mecatrônica 23


Revisão: C 12 de março de 2019

Exercı́cio - solução
Funções: Protótipos:
1. entrada de parâmetros;
typedef ... tipo;
2. seleção de ciclos/pontos;
3. cálculo das amostras; int main(int argc, char **argv);
4. exibição do vetor.
int selecao(char **argv, tipo df);

int calculo(tipo *vetor, tipo a, tipo T, tipo fi,\


tipo df, int n);

int mostra_vetor(tipo *vetor, int n);

Sistemas Embarcados Engenharia Mecatrônica 24


Revisão: C 12 de março de 2019

Execı́cio - solução
Entrada de parâmetros
Pseudo-algoritmo

1. Definição e declaração das variáveis:


a, T, fi, df, sel, c, p, vetor[100]
2. a <- amplitude
3. T <- perı́odo
4. fi <- fase inicial
5. df <- fase incremental
6. sel <- variável texto
7. c <- número de ciclos
8. p <- número de pontos
9. Executa a função de seleção
10. Executa função de cálculo das amostras
11. Executa função de exibição das amostras
12. Retorna para o sistema operacional

Sistemas Embarcados Engenharia Mecatrônica 25


Revisão: C 12 de março de 2019

Execı́cio - solução
Entrada de parâmetros
Pseudo-algoritmo Função codificada

1. Definição e declaração das variáveis: #define N 100


a, T, fi, df, sel, c, p, vetor[100]
2. a <- amplitude int main(int argc, char **argv)
3. T <- perı́odo {
4. fi <- fase inicial
5. df <- fase incremental tipo a, T, fi, df, vetor[N];
6. sel <- variável texto int p;
7. p <- número de pontos ou
8. c <- número de ciclos a = atof(argv[1]);
9. Executa a função de seleção T = atof(argv[2]);
10. Executa função de cálculo das amostras fi = atof(argv[3]);
11. Executa função de exibição das amostras df = atof(argv[4]);
12. Retorna para o sistema operacional
p = selecao(argv,df);
calculo(vetor,a,T,fi,df,p);
mostra_vetor(vetor,p);

return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 26


Revisão: C 12 de março de 2019

Execı́cio - solução
Seleção
Pseudo-algoritmo

1. Definição e declaração das variáveis:


ppc = 2π/df , int np, tipo nc
2. se sel igual a ’ciclos’
nc <- número de ciclos
np = nc × ppc
3. se sel igual a ’pontos’
np <- número de pontos
4. se sel diferente de ’pontos’ E
sel diferente de ’ciclos’
np = -1
5. Retorna np

Sistemas Embarcados Engenharia Mecatrônica 27


Revisão: C 12 de março de 2019

Execı́cio - solução
Seleção
Pseudo-algoritmo Função codificada

1. Definição e declaração das variáveis: int selecao(char **argv, tipo df)


ppc = 2π/df , int np, tipo nc {
2. se sel igual a ’ciclos’ int np;
nc <- número de ciclos tipo nc, tmp;
np = nc × ppc
3. se sel igual a ’pontos’ if (strcmp(argv[5],"ciclos") == 0) {
np <- número de pontos nc = atof(argv[6]);
4. se sel diferente de ’pontos’ E tmp = 2*M_PI/df*nc;
sel diferente de ’ciclos’ np = (int) tmp + 1;
np = -1 } else {
5. Retorna np if (strcmp(argv[5],"pontos") == 0) {
np = atoi(argv[6]);
} else {
np = -1;
}
}
return np;
}

Sistemas Embarcados Engenharia Mecatrônica 28


Revisão: C 12 de março de 2019

Execı́cio - solução
Cálculo das amostras
Pseudo-algoritmo

1. Definição e declaração das variáveis:


i, w
2. para i começando em 0 até n-1
w = 2π/T + f i + i ∗ df
vetor[i] = A sin(w)
3. Retorna 0

Sistemas Embarcados Engenharia Mecatrônica 29


Revisão: C 12 de março de 2019

Execı́cio - solução
Cálculo das amostras
Pseudo-algoritmo Função codificada

1. Definição e declaração das variáveis: int calculo(tipo *vetor, tipo a, tipo T,\
i, w tipo fi, tipo df, tipo n)
2. para i começando em 0 até n-1 {
w = 2π/T + f i + i ∗ df tipo w;
vetor[i] = A sin(w) int i;
3. Retorna 0
for (i = 0; i < n; i++) {
w = 2*M_PI/T + fi + i*df;
vetor[i] = sin(w);
}

return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 30


Revisão: C 12 de março de 2019

Execı́cio - solução
Exibição do vetor

Problema já solucionado!

Sistemas Embarcados Engenharia Mecatrônica 31


Revisão: C 12 de março de 2019

Execı́cio - solução
Exibição do vetor
int mostra_vetor(tipo *vetor, int n)
{
int i;
for (i = 0; i < n; i++) {

#ifdef TIPO_INT
printf("%d\n", vetor[i]);
#endif

#ifdef TIPO_FLOAT
printf("%f\n", vetor[i]);
#endif

#ifdef TIPO_DOUBLE
printf("%le\n", vetor[i]);
#endif

}
return 0;
}

Sistemas Embarcados Engenharia Mecatrônica 32

Вам также может понравиться