xxiv curso de especialização em teleinformática e redes de...

60
TEL45 - Linguagem C e MATLAB C parte 1 abr.2014 XXIV Curso de Especialização em Teleinformática e Redes de Computadores www.teleinfo.ct.utfpr.edu.br Prof. Gustavo B. Borba/Prof. Humberto R. Gamba

Upload: lamkhue

Post on 28-Dec-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

TEL45 - Linguagem C e MATLAB

C parte 1

abr.2014

XXIV Curso de Especialização em Teleinformática e Redes de Computadores

www.teleinfo.ct.utfpr.edu.br

Prof. Gustavo B. Borba/Prof. Humberto R. Gamba

2

Para quem pretende programar

ou atua na área técnica ◦ :-)

Para quem não pretende programar ◦ Entender melhor o mundo: computadores estão em

todos os lugares e precisam de programas.

◦ Raciocinar para resolver problemas: análise e síntese.

Para passar instruções precisas ao computador (programa), é necessário ter uma idéia muito clara de como resolver o problema.

3

Linguagens diferentes

“Some estes

dois números”

01001100101...

Alto nível

Baixo nível

4

5

6

7 Stephen Prata, C Primer Plus, 5th Ed.

• Native compiler

• Cross-compiler

8

1. Sintaxe pelo menos até o ponto em que o compilador não

reclama mais...

2. Significado que o compilador atribui àquilo que você escreve.

3. Estilo adequado para a liguagem.

É a “arte” de escrever programas claros e eficientes.

9

Analogia

◦ Um prédio com a infra-estrutura pronta: portas, janelas, instalação elétrica, escritório com linhas de telefone.

◦ Este prédio pode ser equipado para torna-se uma fábrica de parafusos ou de sorvete.

IDE

Meu projeto

Exemplos - Borland Builder - Microsoft Visual Studio - Qt - Dev C++ - Code::Blocks

10 Stephen Prata, C Primer Plus, 5th Ed.

11

# indica que a linha é tratada pelo pré-processador.

include é uma diretiva para o pré-processador.

stdio.h é um header file ANSI-C. É necessário para usar a função printf( ) e as outras funções que estão nesta biblioteca.

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

#include <stdio.h>

Pq já não é incluído automaticamente?

12

É a função principal.

Funções são os blocos básicos de um programa C.

Um programa C sempre inicia executando a função chamada main( ).

int é o tipo de dado que main( ) retorna.

void indica que a função main( ) não recebe nenhuma informação.

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

int main(void)

13

As chaves delimitam a função. { início da função } fim da função /*comentário*/

//comentário

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

int main(void)

{

...

}

14

É uma declaração. Declara que: 1) nesta função há uma variável

chamada num. 2) num é uma variável do tipo int. int é um exemplo de tipo de dado.

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

int num;

15

É uma atribuição.

A declaração int num; reserva espaço na memória para a variável num.

A atribuição num = 1; armazena o valor 1 neste espaço de memória.

= é um operador de atribuição.

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

num = 1;

16

Os parênteses indicam que printf é o nome de uma função. O que está dentro dos parênteses é a informação recebida

pela função. Isto é chamado de argumento da função. printf( ) escreve na tela o que está entre as aspas. Para chamar ou invocar uma função: Colocar o nome da função e os argumentos desejados dentro

dos parênteses.

Stephen Prata, C Primer Plus, 5th Ed.

printf(“Eu sou um ");

printf();

17

\n é o caractere newline.

\n é um exemplo de uma escape sequence. Serve para representar caracteres difíceis ou impossíveis de digitar no programa.

Exemplos:

\t tabulação

\\ barra invertida

\’ apóstrofo

\” aspas

Stephen Prata, C Primer Plus, 5th Ed.

printf("computador.\n");

18

%d é um placeholder para indicar onde o conteúdo de num deve ser impresso.

% indica que uma variável será impressa d indica que esta variável deve ser impressa no

formato decimal inteiro. Exemplos: %c caractere %s string %f decimal com ponto flutuante

Stephen Prata, C Primer Plus, 5th Ed.

printf("Gosto do %d porque é o primeiro.\n", num);

19

O que este programa faz é somente escrever na tela:

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

Eu sou um computador.

Gosto do 1 porque é o primeiro.

20

É o valor que a função retorna.

O int em int main(void) significa que main( ) retorna um inteiro.

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

return 0

21

Implementar e executar.

Ver arquivo TEL45_Slides_IDEcb.pdf

Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

int main(void) /* um programinha */

{

int num; /* define uma variável num */

num = 1; /* atribui um valor para num */

printf(“Eu sou um "); /* chama a função printf() */

printf("computador.\n");

printf(“Gosto do %d porque é o primeiro.\n",num);

return 0;

}

22

São os nomes usados para fazer referência a variáveis e funções.

• o primeiro caractere deve ser letra ou sublinhado;

• deve ser sempre menor que 32 caracteres;

• letras maiúsculas e minúsculas são diferenciadas (case-sensitive);

• pode-se misturar letras maiúsculas e minúsculas;

• não é permitido o uso de espaços ou outros caracteres especiais.

O compilador utiliza o sublinhado na frente de variáveis especiais, portanto evita-se iniciar o nome de variáveis com sublinhado.

qqr $z]*

temp2 2temp

eixo_y eixo-y

coefRend coef rend

Exemplos: válido inválido

23

Tipo Tamanho em Bytes Faixa de valores

char 1 -128 a 127

unsigned char 1 0 a 255

int 4 -2.147.483.648 a 2.147.483.647

unsigned int 4 0 a 4.294.967.295

short 2 -32.768 a 32.767

unsigned short 2 0 a 65.535

long 4 -2.147.483.648 a 2.147.483.647

unsigned long 4 0 a 4.294.967.295

float 4 1.2E-38 a 3.4E+38

double 8 2.2E-308 a 1.8E+308

24

tipo nome_da_variável = constante;

Exemplos: char ch = ‘a’ ; int x = 67 ;

float valor = 45.896 ;

int i , j = 89 , k = m = 8 ;

char s1 , s2 = ‘a’ , g ;

char txt[ ] = “Isto é um string” ;

float a=b=c=45.78 , pi = 3.1416 ;

Seqüência de caracteres

Single quote ‘ ’ usado para atribuir um caractere a uma variável char

Double quotes “ ” usado para atribuir um string a um char do tipo array

25

printf()

Caractere de conversão

Como o argumento correspondente é impresso

%c como um caractere

%d, %i como um decimal inteiro

%u como um decimal inteiro sem sinal

%o como um inteiro octal sem sinal

%x, %X como um inteiro hexadecimal sem sinal

%e, %E como um decimal com ponto flutuante; ex, 7.123000e+00

%f como um decimal com ponto flutuante; ex, 7.123000

%g, %G no formato %e ou %f, dependendo do qual for menor

%s como um string

%p o argumento associado é um ponteiro a um void; o seu valor é impresso como hexadecimal

%n o argumento associado será um ponteiro onde é colocado o número de caracteres escritos até o momento

%% com o formato %%, o símbolo % é impresso

printf(“formatacao %s %d %f \n ”, “controlada”, 2000, 3.77);

Exemplo:

26

Nesse caso %6d especifica que a largura para impressão de a é igual a 6, justificado à direita.

int a = 1234;

printf(“%6d”, a);

Um número inteiro positivo pode especificar o tamanho do campo de impressão:

1 2 3 4

Para justificar à esquerda é usado um sinal negativo:

1 2 3 4

%-12d

Se o argumento a ser convertido for menor que o campo especificado, espaços em branco serão colocados na esquerda ou na direita, dependendo se o justificado for à direita ou à esquerda.

Caso o argumento seja maior que o especificado, o campo de impressão será estendido até o necessário, de acordo com o número de caracteres do argumento.

27

A precisão é indicada por um ponto seguido do número de casas.

float b = 100.012345;

printf ( “%8.4f ”, b ) ;

1 0 0 . 0 1 2 3

printf ( “%-12.4f ”, b ) ;

1 0 0 . 0 1 2 3

28

sizeof()

Fornece o tamanho do operando em bytes

int main()

{

char c = 'A';

unsigned short s = 65535;

unsigned int i = 0xffffffff;

double d = 3.141592;

printf( "c=%c\nO tipo de dado char tem %d bytes\n\n", c, sizeof(c) );

printf( "c=%d impresso com %%d\n\n", c );

printf( "s=%x\nO tipo de dado short tem %d bytes\n\n", s, sizeof(s) );

printf( "i=%u\nO tipo de dado int tem %d bytes\n\n", i, sizeof(i) );

printf( "pi\n%6.2f\nO tipo de dado double tem %d bytes\n\n", d, sizeof(d) );

return 0;

}

29

#include <stdio.h>

int scanf(“string_de_controle”, outros_argumentos)

string_de_controle contém os comandos de formatação. outros_argumentos é a lista de endereços das variáveis de armazenamento. Os endereços são obtidos com o operador &

Exemplo: int main()

{

int i;

printf("Entre com um int: ");

scanf("%d", &i);

printf("Vc digitou %d", i);

return 0;

}

30

Código Significado

%c Lê um único caractere

%d Lê um inteiro decimal

%i lê um inteiro decimal

%e lê um número de ponto flutuante

%f lê um número de ponto flutuante

%h lê um inteiro curto (short int)

%o lê um octal

%s lê um string

%x lê um hexadecimal

%p lê um ponteiro

%n recebe um inteiro igual ao número de caracteres lidos até o momento

31

#include <stdio.h>

#include <stdlib.h>

int main()

{

float salario;

printf("Entre o salario desejado:");

printf(" $_______\b\b\b\b\b\b\b"); //\b é backspace

scanf("%f", &salario);

printf("\n\t$%.2f por mes é %.2f por ano.", salario, salario*12.0);

printf("\rLegal!\n");

return 0;

}

Stephen Prata, C Primer Plus, 5th Ed.

32

Operadores são utilizados para manipular dados.

Os operadores realizam:

• cálculos; • comparação entre variáveis; • atribuição de valores; • etc...

Os operadores podem ser agrupados nas classes:

a) Operadores aritméticos b) Operadores relacionais c) Operadores lógicos d) Operadores de atribuição e) Operador de tamanho f) Operador bit-a-bit g) Operador ternário

33

O operador atribuição “=” atribui a expressão na sua direita para a variável à sua esquerda:

x = 2000;

atribui o valor 2000 à variável de nome x. Toda expressão em C tem um valor: 5 + 2 tem valor 7, x = 3 tem valor 3. Isso permite escrever atribuições múltiplas: x = y = 3

A ação é executada da direita para a esquerda

34

adição + subtração - divisão / multiplicação * módulo % (resto da divisão inteira)

Os operadores + , - , / , * são definidos para os tipos: - inteiros; - caracteres; - reais (float, double).

O operador módulo (%) só é definido para inteiros.

35

O operador unário é utilizado para indicar a troca do sinal algébrico: x = -8;

x = -x;

resulta em x = 8.

36

operador descrição exemplo

== igualdade while(x == 10) {...}

!= desigualdade while(x != 10) {...}

< menor que while(x < 10) {...}

> maior que while(x > 10) {...}

<= menor ou igual while(x <= 10) {...}

>= maior ou igual while(x >= 10) {...}

Os operadores relacionais retornam um inteiro igual a: 1 se a relação for verdadeira 0 se a relação for falsa

37

Equacionamento do problema

00

1000

320

fahr

2120

celsius

0

32

0100

32212

celsius

fahr

)32(9

5 fahrcelsius

Faixa de conversão de 00 a 3000 com passos de 200

38

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

int main()

{

float ini=0, fim=300, inc=20;

float f=ini, c;

while(f <= fim)

{

c = (5.0/9.0)*(f-32.0);

printf("%4.0f %6.1f\n", f, c);

f = f+inc;

}

return 0;

}

39

#include <stdio.h>

#include <stdlib.h>

#define SEC_PER_MIN 60 // seconds in a minute

int main()

{

int sec, min, left;

printf("Convert seconds to minutes and seconds!\n");

printf("Enter the number of seconds (<=0 to quit):\n");

scanf("%d", &sec); // read number of seconds

while (sec > 0)

{

min = sec / SEC_PER_MIN; // truncated number of minutes

left = sec % SEC_PER_MIN; // number of seconds left over

printf("%d seconds is %d minutes, %d seconds.\n", sec, min, left);

printf("Enter next value (<=0 to quit):\n");

scanf("%d", &sec);

}

printf("Done!\n");

return 0;

}

Stephen Prata, C Primer Plus, 5th Ed.

40

AND ou E (operador de interseção) &&

OR ou OU (operador de união) | |

NOT ou NÃO (operador de negação) !

• Os operadores lógicos retornam 1 (um) para

verdadeiro e 0 (zero) para falso.

• Valores diferentes de zero são interpretados

como verdadeiros.

• A validação de uma expressão envolvendo

operadores lógicos é feita da esquerda para a

direita.

41

#include <stdio.h>

#include <stdlib.h>

int main()

{

int x = 10, y = 20;

int n, e, ou;

n = !(x>1);

printf("n = %d\n", n);

n = !(x>y);

printf("n = %d\n", n);

e = (x > 1) && (y > x) && (5 > 10);

printf("e = %d\n", e);

e = (x > 1) && (y > x) && (5 < 10);

printf("e = %d\n", e);

ou = (x > 1) || (y > x) || (5 > 10);

printf("ou = %d\n", ou);

ou = (x < 1) || (y < x) || (5 > 10);

printf("ou = %d\n", ou);

return 0;

}

n= imprime

n= imprime

e= imprime

e= imprime

ou= imprime

ou= imprime

42

=

+=

-=

*=

/=

++a; a = a + 1;

--a; a = a - 1;

a+=b; a = a + b;

a-=b; a = a - b;

a*=b; a = a * b;

a/=b; a = a / b;

Incremento: ++ Decremento: --

Pré-fixados (prefix mode)

a++; a = a + 1;

a--; a = a - 1;

Pós-fixados (postfix mode)

A operação de inc ou dec é realizada antes de usar o valor do operando

A operação de inc ou dec é realizada depois de usar o valor do operando

43 Herbert Schildt, C Completo e Total, 3a Ed.

#include <stdio.h>

#include <stdlib.h>

int main()

{

int x, y, a, b;

x = 10;

y = ++x;

printf(“x=%d y=%d\n”, x, y);

a = 10;

b = a++;

printf(“a=%d b=%d\n”, a, b);

return 0;

}

x= y= imprime

imprime a= b=

44

Forma 1 if(expressão)

instrução

A instrução é executada se a expressão for verdadeira.

Forma 2 if(expressão)

instrução1

else

instrução2

Se expressão for verdadeira, a instrução1 é executada. Caso contrário, a instrução2 é executada.

Forma 2 if(expressão1)

instrução1

else if (expressão2)

instrução2

else

instrução3

Se expressão for verdadeira, a instrução1 é executada. Se a expressão1 for falsa mas a expressão2 for verdadeira, a instrução2 e é executada. Caso contrário, se ambas expressões forem falsas, a instrução3 é executada.

45

Fazer um programa que classifica uma nota de 0 a 10 em ruim, regular, boa ou excelente. Critério:

[0...4) [4...6) [6...8) [8...10] ruim regular boa excelente

46

int main()

{

float n = 7.5;

if (n<4)

printf("ruim");

else if (n>=4 && n<6)

printf("regular");

else if (n>=6 && n<8)

printf("boa");

else

printf("excelente");

return 0;

}

[0...4) [4...6) [6...8) [8...10] ruim regular boa excelente

int main()

{

float n;

printf("Digite a nota: ");

while(scanf("%f", &n) == 1)

{

if(n>=8)

printf("excelente\n");

else if(n>=6)

printf("boa\n");

else if(n>=4)

printf("regular\n");

else

printf("ruim\n");

printf("Digite a proxima nota

(q para sair): ");

}

return 0;

}

Solução 1

Solução 2

47

O operador ternário trabalha com três expressões:

expressao1 ? expressao2 : expressao3 ;

Se a expressao1 é verdadeira, a expressão dois é avaliada e o

resultado é o valor da expressao2 como um todo.

Se a expressao1 for zero, isto é falso, a expressao3 é

avaliada, e será o resultado da expressão como um todo.

Por exemplo, o código:

x = ( y < z ) ? y : z ;

assinala a x o menor valor entre y e z.

48 Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

#include <stdlib.h>

#define COVERAGE 200 /* square feet per paint can */

int main()

{

int sq_feet;

int cans;

printf("Enter number of square feet to be painted (=0 to quit):\n");

scanf("%d", &sq_feet);

while (sq_feet > 0)

{

cans = sq_feet / COVERAGE;

cans += ((sq_feet % COVERAGE == 0)) ? 0 : 1;

printf("You need %d %s of paint.\n", cans, "cans");

printf("Enter next value (=0 to quit):\n");

scanf("%d", &sq_feet);

}

return 0;

}

Sempre imprime “cans”. Porém, quando é apenas uma, deveria imprimir “can”. Para solucionar, insira um operador ternário na linha indicada.

49 Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

#include <stdlib.h>

#define COVERAGE 200 /* square feet per paint can */

int main()

{

int sq_feet;

int cans;

printf("Enter number of square feet to be painted (=0 to quit):\n");

scanf("%d", &sq_feet);

while (sq_feet > 0)

{

cans = sq_feet / COVERAGE;

cans += ((sq_feet % COVERAGE == 0)) ? 0 : 1;

printf("You need %d %s of paint.\n", cans, cans == 1 ? "can" : "cans");

printf("Enter next value (=0 to quit):\n");

scanf("%d", &sq_feet);

}

return 0;

}

50

São válidos para char, int, short e long.

AND & OR | XOR ^ NOT ~

a b a & b a | b a ^ b

0 0 0 0 0

0 1 0 1 1

1 0 0 1 1

1 1 1 1 0

51

#include <stdio.h>

#include <stdlib.h>

int main()

{

unsigned char a, b, c, d;

a = 0x0F & 0x55;

printf("a = %x\n", a);

b = 0x0F | 0x55;

printf("b = %x\n", b);

c = 0x0F ^ 0x55;

printf("c = %x\n", c);

d = ~0x55;

printf("d = %x\n", d);

return 0;

}

52

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

int main()

{

int i, t, m;

while(scanf("%d", &i),i<1000)

{

printf("%5x h = ", i);

t = pow(2,27); m = 1;

while(t>0)

{

(i&t) ? printf("1") : printf("0");

t = t/2;

if(m/4 == 1)

{

printf(" ");

m=0;

}

m++;

}

printf("b\n");

}

return 0;

}

53

Ambos operadores de deslocamento trabalham com

expressões do tipo inteiras. A expressão:

exp1 << exp2

faz com que os bits da exp1 sejam deslocados para a

esquerda. O número de deslocamentos é dado pela exp2. Na

medida em que os bits são deslocados, o bit menos

significativo (mais da direita) é preenchido com 0.

Deslocamento para a direita >>

Deslocamento para a esquerda <<

54

55

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

int main()

{

int i, t, m;

while(scanf("%d", &i),i<1000)

{

printf("%5x h = ", i);

t = pow(2,27); m = 1;

while(t>0)

{

(i&t) ? printf("1") : printf("0");

t >>= 1; //t = t/2;

if(m/4 == 1)

{

printf(" ");

m=0;

}

m++;

}

printf("b\n");

}

return 0;

}

56

Uma função é um bloco de programa que realiza uma determinada tarefa.

Evita a repetição de código ◦ Se é necessário realizar uma tarefa várias vezes, basta

escrever uma função e utilizá-la todas as vezes. Pode-se também utilizá-la em outros programas.

Ajuda a organizar o programa ◦ Torna o programa mais modular e, com isso, mais fácil

de ler, modificar e depurar.

Stephen Prata, C Primer Plus, 5th Ed.

tipoRetornado nomeFunc(parâmetros formais)

{

corpo de função

}

57 Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

#include <conio.h>

#define NOME "XPTO 2000 LTDA"

#define END "CURITIBA"

#define L 40

void starbar(void); //protótipo

int main()

{

int cnt = 1;

starbar(); //chamada

printf("%s %d\n", NOME, cnt++);

printf("%s %d\n", END, cnt);

starbar(); //chamada

getch();

return 0;

}

void starbar(void) //definição

{

int cnt;

for (cnt = 1; cnt<=L; cnt++)

printf("%c", '*');

printf("\n");

}

void: vazio, sem efeito #define: instrução para o pré-processador Variável cnt: escopos diferentes. “Um não tem nada a ver com o outro”.

IDE Run to cursor: F4 Next line: F7 Step into: Shift+F7

Prog13 Função void

58 Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

#include <conio.h>

#define NOME "XPTO 2000 LTDA"

#define END "CURITIBA"

void charbar(char, int); //protótipo

int main()

{

charbar(‘#’,30); //chamada

printf("%s\n", NOME);

printf("%s\n", END);

charbar(‘-’,30); //chamada

getch();

return 0;

}

void charbar(char ch, int n)//definição

{

int cnt;

for (cnt = 1; cnt<=n; cnt++)

printf("%c", ch);

printf("\n");

}

Prog14 Função que recebe parâmetros

59 Stephen Prata, C Primer Plus, 5th Ed.

#include <stdio.h>

#include <conio.h>

int min(int, int); //protótipo

int main()

{

int x=5, y=3;

//chamada

printf("minimo = %d", min(x,y));

getch();

return 0;

}

int min(int a, int b) //definição

{

return a < b ? a : b;

}

Prog15 Função com return

60

#include <stdio.h>

#include <conio.h>

int par(int); //protótipo

int main()

{

int x=11;

if (par(x)) //chamada

printf("par");

else

printf("impar");

getch();

return 0;

}

int par(int x) //definição

{

if(!(a%2))

return 1;

else

return 0;

}

Prog16 Função com mais de um return

Há um erro neste prog!