xxiv curso de especialização em teleinformática e redes de...
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.
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
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 <<
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