0% acharam este documento útil (0 voto)
7 visualizações51 páginas

CeMatlab SLIDES Aula3

O documento é uma aula sobre programação em C, abordando a estrutura de um programa, tipos de dados, operadores, controle de fluxo e loops. Exemplos práticos são fornecidos para ilustrar o uso de estruturas condicionais como if e switch, além de loops como for, while e do-while. O material é parte de um curso de especialização em Teleinformática e Redes de Computadores.

Enviado por

Rafael Cordeiro
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
7 visualizações51 páginas

CeMatlab SLIDES Aula3

O documento é uma aula sobre programação em C, abordando a estrutura de um programa, tipos de dados, operadores, controle de fluxo e loops. Exemplos práticos são fornecidos para ilustrar o uso de estruturas condicionais como if e switch, além de loops como for, while e do-while. O material é parte de um curso de especialização em Teleinformática e Redes de Computadores.

Enviado por

Rafael Cordeiro
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 51

XXI Curso de Especialização em

Teleinformática e Redes de Computadores


www.teleinfo.ct.utfpr.edu.br

Linguagem C e MATLAB
Aula 03
07/abr/2011

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


Refresh
` Estrutura de um programa C
◦ #include<>, main(), declaração de variáveis
` Tipos de dados
◦ char (1B), int (4B), short (2B), long (4B), float
(4B), double (8B), qualificador unsigned
` Operadores
◦ Atribuição =
◦ Aritméticos +, -, /, *, %
◦ Aritméticos de atribuição +=, -=, *=, /=, ++, --
◦ Relacionais ==, !=, <, >, <=, >=
◦ Lógicos &&, ||, !
◦ Ternário epx?expT:expF
◦ Bitwise &, |, ^, ~, >>, <<

2
Refresh
` printf( ), scanf( ), sizeof( ),
getch( )
◦ Chamada de função, formatos de
impressão, leitura formatada, operador &
` if
` while
` IDE

3
Controle de fluxo e loop
` controle de fluxo = tomada de decisão
` loop = repetição
` Usados junto de expressões relacionais
(comparações).
` Exemplos do uso de operadores relacionais:

1. 2.
while (num < 6) while (ch != ‘s’)
{ {
printf(“O numero é baixo.\n”); count++;
scanf(“%d”, &num); scanf(“%c”, &ch);
} }

4
Stephen Prata, C Primer Plus, 5th Ed.
Prog01 true e false
#include <stdio.h>
#include <conio.h>

int main(void)
{
int true_val, false_val;

true_val = (10 > 2); /* value of a true relationship */


false_val = (10 == 2); /* value of a false relationship */

printf("true = %d; false = %d \n", true_val, false_val);

getch();

return 0;
}

Imprime:
true = 1; false = 0

5
Stephen Prata, C Primer Plus, 5th Ed.
Prog02 true
#include <stdio.h>
#include <conio.h>

int main(void)
{
int n = 3;

while (n)
printf("%2d is true\n", n--);
printf("%2d is false\n", n);

n = -3;
while (n)
printf("%2d is true\n", n++);
printf("%2d is false\n", n);

getch();

return 0;
}

6
Stephen Prata, C Primer Plus, 5th Ed.
Prog02 true Imprime:
3 is true
2 is true
#include <stdio.h> Pós-decremento: 1 is true
#include <conio.h> primeiro utiliza o 0 is false
valor e depois faz -3 is true
int main(void) o decremento. -2 is true
{
int n = 3; -1 is true
0 is false
while (n)
printf("%2d is true\n", n--);
printf("%2d is false\n", n);

n = -3; Em C:
while (n)
printf("%2d is true\n", n++); • Diferente de 0 é
printf("%2d is false\n", n); considerado true.
getch();
• Apenas o 0 é
return 0; reconhecido como falso.
}

7
Stephen Prata, C Primer Plus, 5th Ed.
Controle de
if fluxo e loop

Forma 1 if(expressão){
A instrução é executada se a
instrução
}
expressão for verdadeira

if(expressão){ Se expressão for verdadeira, a


Forma 2 instrução1 instrução1 é executada.
} Caso contrário, a instrução2 é
else{ executada.
instrução2
}

if(expressão1){ Se expressão for verdadeira, a


Forma 2 instrução1 instrução1 é executada.
} Se a expressão1 for falsa mas a
else if (expressão2){ expressão2 for verdadeira, a
instrução2 e é executada.
instrução2 Caso contrário, se ambas
} expressões forem falsas, a
else{ instrução3 é executada.
instrução3
}
8
Stephen Prata, C Primer Plus, 5th Ed.
while
Controle de
fluxo e loop
while(expressão){ A instrução é executada enquato
instrução expressão for verdadeira
}

Estrutura

Um ciclo é
chamado de
iteração

OBS. while é um entry-condition loop: a


decisão de entrar no loop é feita antes
da entrada. Então, há a possibilidade do
loop nunca ser executado.
9
Stephen Prata, C Primer Plus, 5th Ed.
Controle de
Prog03 Saída do loop fluxo e loop

A decisão de sair ou continuar no loop só acontece quando


a condição é avaliada.

#include <stdio.h>
#include <conio.h>

int main(void)
{
int n = 5;

while (n < 7)
{
printf(“n = %d\n”, n);
n++;
printf(“Agora n = %d\n”, n);
}
printf(“Saiu do loop.\n”);

getch();

return 0;
}

10
Stephen Prata, C Primer Plus, 5th Ed.
Controle de
Prog03 Saída do loop fluxo e loop

A decisão de sair ou continuar no loop só acontece quando


a condição é avaliada.

#include <stdio.h> Imprime:


#include <conio.h>
n = 5
int main(void) Agora n = 6
{ n = 6
int n = 5; Agora n = 7
Saiu do loop.
while (n < 7)
{
printf(“n = %d\n”, n);
n++;
Não imprimiu n = 7
printf(“Agora n = %d\n”, n); porque avaliou a
} condição, o
printf(“Saiu do loop.\n”);
resultado foi falso
getch(); então saiu do loop.

return 0;
}

11
Stephen Prata, C Primer Plus, 5th Ed.
for Controle de
fluxo e loop
for (inicialização ; teste ; atualização){
instrução
}
for(count=1; count<=number; count++)
printf(“Be my Valentine!\n”); 1. A inicialização é
feita apenas uma vez,
1. Estrutura na entrada do loop.

2. A condição teste é
avaliada a cada
2. 3. potencial iteração.
Quando a condição
for falsa o loop é
terminado.

3. A atualização é
executada ao final de
cada iteração.

OBS. for é um entry-condition loop.

12
Stephen Prata, C Primer Plus, 5th Ed.
Controle de

for fluxo e loop

Exemplo

#include <stdio.h>
#include <conio.h> Imprime:
int main(void) n n^2
{ 1 1
int num; 2 4
printf(" n n^2\n");
3 9
4 16
for (num = 1; num <= 6; num++) 5 25
printf("%5d %5d\n", num, num*num); 6 36

printf(“\n Ao sair num=%d", num); Ao sair num=7


getch();

return 0;
}

13
Stephen Prata, C Primer Plus, 5th Ed.
Controle de

for fluxo e loop

Variações

1. Decrementar ao invés de incrementar

for (cont = 5; cont > 0; cont--)

2. Contar em outras quantidades ao invés de 1 em 1

for (cont = 0; cont <= 100; cont += 10)

3. Testar outra condição ao invés do número de iterações

for (num = 1; num*num <= 36; num++)


Faz o mesmo que o exemplo do slide anterior.

14
Stephen Prata, C Primer Plus, 5th Ed.
Controle de

for fluxo e loop

Variações

4. Omitir parâmetros. Os ; são obrigatórios.


Ex: Soma os inteiros de 1 a 10: i=1;
i=1; soma = 0;
soma = 0; for ( ; i <= 10 ; )
for ( ; i <= 10 ; i++) {
soma += i; soma += i;
i++;
}

5. O primeiro parâmetro não precisa ser um inicialização.


Ex: Só sai do loop quando o usuário entra o número 6:
int n = 0;
for (printf(“Vai digitando numeros!\n”) ; n != 6 ; )
scanf(“%d”, &n);

15
Stephen Prata, C Primer Plus, 5th Ed.
do while
Controle de
fluxo e loop

do{
A instrução é executada enquanto
instrução
expressão for verdadeira
}while(expressão);

Estrutura

OBS. do while é um exit-condition loop. A condição é


testada após a iteração do loop. O loop sempre é
executado pelo menos uma vez.

16
Stephen Prata, C Primer Plus, 5th Ed.
do while
Controle de
fluxo e loop

Exemplo

#include <stdio.h> Permanece no loop lendo a


entrada e só sai quando o
#include <conio.h>

int main(void) usuário digita 13.


{
int senha = 13;
int senhaIn;

do
{
printf("Entre a senha: ");
scanf("%d", &senhaIn);
} while (senha != senhaIn);

printf("Senha confere.\n");

getch();

return 0;
}

17
Stephen Prata, C Primer Plus, 5th Ed.
switch
Controle de
fluxo e loop

Usado para múltipla escolha.

switch (inteiroOUchar) Vai para o case


{ correspondente
case inteiroOUchar_1: //constante ao conteúdo do
instrução switch.
break //pula para o fim
case inteiroOUchar_2: //constante
instrução
break //pula para o fim
case inteiroOUchar_3: //constante
instrução
break //pula para o fim
default:
instrução
} //fim

18
Stephen Prata, C Primer Plus, 5th Ed.
switch
Controle de
fluxo e loop

Exemplo
switch(op)
{
#include <stdio.h> case 'a':
#include <conio.h> printf("a+b = %f\n", a+b);
break;
int main(void) case 's':
{ printf("a-b = %f\n", a-b);
float a, b; break;
char op; case 'm':
printf("a*b = %f\n", a*b);
printf("Entre a operacao: "); break;
scanf("%c", &op); case 'd':
printf("Entre o numero a: "); printf("a/b = %f\n", a/b);
scanf("%f", &a); break;
printf("Entre o numero b: "); default:
scanf("%f", &b); printf(“Op. invalida");
}

getch();

return 0;
}

19
switch
Controle de
fluxo e loop

Facilita a implementação de múltipla escolha.


Mas não elimina a necessidade do if-if else-if
pois o switch não avalia:

Float
Não é permitido, por exemplo:
float a;
switch(a)
{...

Expressão
Não é permitido, por exemplo:
int a;
switch(a)
{
case a>10:
...

20
Controle de
Prog04 Loops aninhados fluxo e loop

#include <stdio.h> Imprime todas


possibiliades do
#include <conio.h>

int main(void) resultado da soma


{
int cont=0, i, j, k, n=7; de 3 inteiros entre
1 e 7 ser igual a 7.
for (i=0; i<=n; i++)
for (j=0; j<=n; j++)
for (k=0; k<=n; k++)
if ( (i+j+k) == n )
{
cont++; Os loops são resolvidos a
printf("%d %d %d\n", i, j, k); partir do mais interno.
}
printf("cont = %d", c);

getch();

}
IDE
Step Over: F8
Add Watch: Ctrl+F5
21
break e continue
Controle de
fluxo e loop

Normalmente, após entrar em um loop, todas as instruções do


corpo do loop são executadas antes do próximo teste ser feito.

A instrução break permite A instrução continue permite


sair do loop: pular parte do loop:

22
Stephen Prata, C Primer Plus, 5th Ed.
Controle de
Prog05 break fluxo e loop

O que será
#include <stdio.h>
#include <conio.h>
impresso?
int main(void)
{
int count, loop=0;

for(int t=0; t<100; t++)


{
count = 1;
for(;;) Em loops
{ aninhados, sai
printf("%d", count);
count++;
apenas do loop
if(count==10) mais interno.
break;
}
loop++;
}
printf(" %d", loop);
getch();
return 0;
}

23
Controle de
Prog05 break fluxo e loop

#include <stdio.h>
Imprime
#include <conio.h>

int main(void) ‘123456789’ 100 vezes :


{
int count, loop=0;
123456789123456789123456
for(int t=0; t<100; t++) 789123456789123…12345678
{ 9123456789 100
count = 1;
for(;;)
{
printf("%d", count);
count++;
if(count==10)
break;
}
loop++;
}
printf(" %d", loop);
getch();
return 0;
}

24
Controle de
Prog06 continue fluxo e loop

O que será
#include <stdio.h>
#include <conio.h>
impresso?
int main(void)
{
for(int x=0; x<100; x++)
{
if(x%2)
continue;
printf("%d ", x); Interrompe o loop e
} devolve o controle
getch(); para o for.

return 0;
}

25
Controle de
Prog06 continue fluxo e loop

#include <stdio.h>
#include <conio.h>

int main(void)
{ Imprime
for(int x=0; x<100; x++) os números pares entre 0 e 99:
{
if(x%2)
continue; 0 2 4 6 8 … 98
printf("%d ", x);
}

getch();

return 0;
}

26
Funções
` 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.

tipoRetornado nomeFunc(parâmetros formais)


{
corpo de função
}

27
Stephen Prata, C Primer Plus, 5th Ed.
Prog07
Funções
Função void
#include <stdio.h>
#include <conio.h>
void starbar(void) //definição
#define NOME "XPTO 2000 LTDA" {
#define END "CURITIBA" int cnt;
#define L 40
for (cnt = 1; cnt<=L; cnt++)
void starbar(void); //protótipo printf("%c", '*');
printf("\n");
int main(int argc, char **argv) }
{
int cnt = 1;
void: vazio, sem efeito
starbar(); //chamada #define: instrução para o pré-processador
printf("%s %d\n", NOME, cnt++);
printf("%s %d\n", END, cnt); Variável cnt: escopos diferentes. “Um não
starbar(); //chamada tem nada a ver com o outro”.

IDE
getch();

return 0;
} Step Into: F7
Add Breakpoint: F5

28
Stephen Prata, C Primer Plus, 5th Ed.
Prog07
Funções
Função que recebe parâmetros

#include <stdio.h>
#include <conio.h>

#define NOME "XPTO 2000 LTDA"


#define END "CURITIBA"

void charbar(char, int); //protótipo void charbar(char ch, int n)//definição


{
int main(int argc, char **argv) int cnt;
{
charbar(‘#’,30); //chamada for (cnt = 1; cnt<=n; cnt++)
printf("%s\n", NOME); printf("%c", ch);
printf("%s\n", END); printf("\n");
charbar(‘-’,30); //chamada }

getch();

return 0;
}

29
Stephen Prata, C Primer Plus, 5th Ed.
Prog08
Funções
Função com return

#include <stdio.h>
#include <conio.h>

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

int main(int argc, char **argv)


{
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;
}

30
Stephen Prata, C Primer Plus, 5th Ed.
Prog09
Funções
Função com mais de um return
#include <stdio.h>
#include <conio.h>

Há um erro int par(int); //protótipo


neste prog! int main(int argc, char **argv)
{
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;
}
31
Ponteiros
Um ponteiro é um tipo de variável que armazena endereço de memória.

variável do tipo variável do tipo


int ponteiro para int

int i=5, *p;


Como o conteúdo de uma variável ponteiro é um endereço de memória e
esse endereço de memória contém o valor de uma outra variável
qualquer, pode-se fazer a analogia com uma seta direcionada ao
endereço da variável. Graficamente, pode-se imaginar um ponteiro da
seguinte forma:

i p
Endereço qualquer
5 de memória.

32
Ponteiros
Operador & (reference)
Permite referenciar um ponteiro a uma variável, isto é, fazer um
ponteiro apontar para uma variável.
Este procedimento também é chamado de inicialização do ponteiro.

a b p
int a, b, *p; ? ? ?
330 334 400 Endereços
de memória

a b p
a = b = 7; 7 7 ?
330 334 400

a b p
p = &a; 7 7 330
330 334 400

33
Ponteiros
Operador * (dereference)
Após inicializar o ponteiro - fazer o ponteiro apontar para uma variável -
pode-se agora usar o ponteiro para acessar o conteúdo desta variável.
Isto é feito através do operador *

int a, b, *p;
a = b = 7;
p = &a;
Imprime
printf(“*p = %d”, *p); *p = 7

Portanto:

O valor direto de p é uma posição de memória.


O valor de *p é o conteúdo do endereço de memória apontado por p.

34
Ponteiros
Atenção
Não acessar o conteúdo de um ponteiro que
ainda não foi inicializado.

int *pt; //um ponteiro não inicializado


*pt = 5; //isso não se faz!

35
Stephen Prata, C Primer Plus, 5th Ed.
Ponteiros
Prog10 Ponteiros
#include <stdio.h>
#include <conio.h>

int main(void)
{
int a=3, b=7, *p1=&b;
int n=5, x, y, *p2;
int z, *p3=&z;

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


*p1 = 2 * *p1 - a;
printf("b = %d\n", b); imprime b =
p2 = &n;
x = *p2;
printf("x = %d\n", x); imprime x =
y = *&n;
printf("y = %d\n", y); imprime y =
printf("entre um inteiro: ");
scanf("%d", p3);
printf("vc digitou %d", z);

getch();
return 0;
}
36
Arrays

` Um array é um conjunto de dados do mesmo tipo.


` Um array de uma dimensão é um vetor.

tipo nome[tamanho]; //declaração de um vetor

Exemplo
int pots[8];
` Os colchetes [] caracterizam pots como um vetor.
` pots é um vetor de 8 elementos do tipo int.
` O acesso a cada elemento do vetor é feito através do índice i da
seguinte forma: pots[i]
` O primeiro elemento é pots[0] e o último é pots[7]

37
Arrays
Inicialização de um array
float x[7] = {-1.1,0.2,33.0,4.4,5.05,0.0,7.7};
seqüência de valores separados por vírgula.

Resulta em: x[0] = -1.1


x[1] = 0.2
x[2] = 33.0
x[3] = 4.4
x[4] = 5.05
x[5] = 0.0
x[6] = 7.7

É possível omitir o número de elementos. O compilador


utiliza o número de elementos do inicializador:
float x[] = {-1.1,0.2,33.0,4.4,5.05,0.0,7.7};

38
Arrays
Prog11 Array
#include <stdio.h>
#include <conio.h>

#define MESES 12

int main(void)
{
int dias[MESES] = {31,28,31,30,31,30,31,31,30,31,30,31};
int i;

for (i = 0; i < MESES; i++)


printf("Mes %2d tem %d dias.\n", i+1, dias[i]);

getch();

return 0;
}

39
Arrays
Prog11 Array
Testando...
#include <stdio.h>
#include <conio.h>
O compilador não verifica
#define MESES 12 o limite do array.
int main(void)
{
int dias[MESES] = {31,28,31,30,31,30,31,31,30,31,30,31};
int i;

for (i = 0; i <= MESES; i++)


printf("Mes %2d tem %d dias.\n", i+1, dias[i]);

getch();

return 0;
}

40
Arrays e ponteiros
Um ponteiro é uma variável que recebe endereços como valores.

p a
int a=20,*p; ? 20
100

p a
p = &a; 100 20
100

printf(“%d %d”, *p, a); Imprime


20 20

41
Arrays e ponteiros
Um array é um endereço fixo e pode ser considerado como
ponteiro a um endereço fixo.

int a[5];

6
0

8
00

01

01
00

00
o1

o1

o1
o1

o1
a

reç

reç

reç
reç

reç
de

de

de
de

de
1000

en

en

en
en

en
7 8 11 16 23
0 1 2 3 4

No caso de um vetor: o conteúdo 1000 do ponteiro do


vetor a não pode ser alterado pelo programador.

42
Arrays e ponteiros
Ao declarar:
tipo nomeArray[tam]

1. O compilador calcula o número de bytes necessário para


armazenar este array:

tam x sizeof(tipo);

2. O compilador reserva esse espaço de memória.

3. O compilador cria um ponteiro com o nome nomeArray e


direciona-o para o primeiro elemento do array. Logo as
seguintes notações são equivalentes:

nomeArray[i] ↔ *(nomeArray + i)

43
Arrays e ponteiros
a
1000 a[0]
1004 a[1]
5 1008 a[2]
int a[tam]
a[2] = 5 1012

*(a+2) = 5 1016

1020
Internamente: tam x sifeof(int)
1024
*(1000 + 2 x sizeof(int)) = 5
1028

1000

….
Obs: O compilador sabe que deve
avançar 4 bytes pois a variável …
foi declarada como do tipo int
xxxx a[tam-1]

44
Arrays e
Aritmética de ponteiros ponteiros

Após a instrução p=a; (ou p=&a[0];) pode-se acessar todos os


elementos do vetor a através do ponteiro *p;

p = a; p = &a[0]; p = a + 1; p = &a[1]; p = a + 2; p = &a[2];

p a[] p a[] p a[]


300 300 300

304 304 304

308 308 308

45
Arrays e
Prog12 Ponteiros ponteiros

#include <stdio.h>
#include <conio.h>

#define N 4 p = a; → assinala a p o
endereço base do array, ou
seja, a[0];
int main(void)
{
int a[N] = {1,2,3,4}, *p;
int soma = 0;
p++; → os incrementos
for (p=a; p < &a[N]; p++)
sucessivos de p são
soma += *p;
equivalentes a
printf("soma = %d", soma); &a[0],&a[1],...,&a[N-1]
getch();

return 0;
}

46
Arrays e
Prog13 Ponteiros ponteiros

#include <stdio.h> Qual o valor de y ao


#include <conio.h>
final do programa?
int main(void)
{
int y, *p, x;

y = 0;
p = &y;
x = *p;
x = 4;
(*p)++;
x--;
(*p)+=x;

printf("y = %d", y);

getch();

return 0;
}

47
Strings
Uma string é uma seqüência de caracteres que
termina com o caractere nulo (‘\0’).

char s[] = “abc”;

char s[] = { ‘a’ , ‘b’ , ‘c’ , ‘\0’ } ;

a b c \0

48
Strings
Para ler uma string do
teclado pode-se usar a
função gets() definida
na biblioteca stdio.h.

char str;
gets(str);

A função gets( ) irá ler


caracteres até que seja
inserido um <enter>.

49
Strings
O caractere nulo (‘\0’) é interpretado
como o final da string.

50
gets(string) lê uma seqüência de caracteres do console e
armazena na variável string. A função gets troca o caracter
‘\n’ pelo caracter terminador de string ‘\0’

copia o 1º caractere da variável string para c

detecta o terminador de string ‘\0’


Caractere : ‘a’ ‘b’ ‘c’ ... ‘z’
if ((c >= 65)&&(c <= 90))
Valor ASCII: 97 98 99 ... 112
Caractere : ‘A’ ‘B’ ‘C’ ... ‘Z’
Valor ASCII: 65 66 67 ... 90
Caractere : ‘0’ ‘1’ ‘2’ ... ‘9’

51

Você também pode gostar