Comandos de Controle de Programa em C

Post on 09-Jun-2015

1.148 views 1 download

description

Comandos de Controle de Programa em C

Transcript of Comandos de Controle de Programa em C

Programação de Computadores

Aula 2

09/08/2012

Profª Ms. Engª Elaine Cecília Gatto

Unidade 2: Comandos de Controle de Programa

Curso de Bacharelado em Engenharia de Computação

Universidade do Sagrado Coraçã – USC

Bauru/SP

Termos Importantes

• Código-fonte: é o texto de um programa que um usário pode ler. É a entrada para o compilador C.

• Código-Objeto: é a tradução do código-fonte de um programa em código de máquina. É a entrada para o linkeditor.

• Linkeditor: é um programa que combina as funções da biblioteca C padrão com o código-fonte que você escreveu gerando um executável.

• Biblioteca: é um arquivo contendo as funções padrão que podem ser utilizadas pelo seu programa.

• Tempo de compilação: são os eventos que ocorrem enquanto o seu programa está sendo compilado. Um erro de sintaxe é uma ocorrência em tempo de compilação.

• Tempo de execução: são os eventos que ocorrem enquanto o seu programa está sendo executado.

2

Variáveis

• Variáveis locais: uma variável local é aquela que é declarada dentro de uma função e só pode ser utilizada naquele “local” do seu código-fonte.

• Variáveis globais: uma variável global é aquela que é declarada fora de funções e podem ser utilizadas por qualquer “parte” do seu código-fonte. Uma variável global guarda o valor armazenado por ela, durante toda a execução do programa.

3

Modificadores de tipo de acesso

• const: é uma variável que não pode ser modificada, possui um valor fixado.

• volatile: uma variável desse tipo pode ser alterada de maneira não explicitamente especificada no programa. Exemplo: hora e data do sistema. A variável que armazena o valor do sistema é alterada pelo sistema operacional e não por você.

4

• Variáveis globais static: funcionam como variáveis globais dentro de um módulo. São variáveis globais que não são e, nem podem ser, conhecidas em outros módulos. Isto é útil quando queremos isolar pedaços de um programa para evitar mudanças acidentais em variáveis globais.

• Variáveis locais static: são variáveis cujo valor é mantido de uma chamada da função para a outra.

5

Especificadores de tipo de classe de armazenamento

Especificadores de tipo de classe de armazenamento • extern: define variáveis que serão usadas em um arquivo

apesar de terem sido declaradas em outro. Podemos ter programas de milhares de linhas. Estes podem ser divididos em vários arquivos (módulos) que serão compilados separadamente. Digamos que para um programa grande tenhamos duas variáveis globais e estas variáveis são declaradas normalmente em um dos arquivos (módulos) do programa. Num outro arquivo (módulo) do programa temos uma rotina que deve usar as variáveis globais. Então nesse caso devemos usar extern para que esses módulos possam encontrar as variáveis.

6

Arquivo 1 (módulo 1)

int x, y;

char ch;

main(void) {

.

.

.

}

funcao_1( ) {

x = 123;

}

Arquivo 2 (módulo 2)

extern int x, y;

extern char ch;

funcao_2(void) {

x = y/10;

}

funcao_3( ) {

y = 10;

} 7

Especificadores de tipo de classe de armazenamento

• register: o computador tem a memória principal e os registradores da CPU. As variáveis e o programa são armazenados na memória. Register diz ao compilador que a variável em questão deve ser armazenada em um registrador da CPU ao invés de uma posição da memória. Usado apenas para variáveis locais e parâmetros formais de uma função.

8

Especificadores de tipo de classe de armazenamento

Parâmetros formais

• Normalmente uma função utiliza argumentos que, na verdade são variáveis. Essas variáveis são utilizadas dentro da função e são passadas como parâmetros para a função.

funcao(argumentos ou parâmetros formais) { }

exemplo:

int contador( numero ) {

numero = numero + 1;

return 0;

}

9

Código de formatação da função scanf()

Código Função Exemplo

%c Ler um único caracter scanf(“%c”, ‘a’);

%d Ler um inteiro decimal scanf(“%d”, 20);

%e Ler um número em notação científica

scanf(“%e”, &num);

%f Ler um número em ponto flutuante

scanf(“%f”, 25.6);

%o Ler um inteiro octal scanf(“%o”, 012);

%s Ler uma série de caracteres scanf(“%s”, ‘abcdeteste’);

%x Ler um número hexadecimal scanf(“%x”, 0x80);

%u Ler um decimal sem sinal scanf(“%u”, &num);

%l Ler um inteiro long scanf(“%l”, &num); 10

Operador de endereço (&)

• A memória do seu computador é dividida em bytes

• Estes bytes são numerados de 0 até o limite da memória da sua máquina.

• Estes números são chamados de endereços de bytes.

• Um endereçoo e o nome que o computador usa para identificar a variável.

• Toda variável ocupa uma certa localização na memória.

• Seu endereço é o do primeiro byte ocupado por ela.

• Um inteiro ocupa 2 bytes.

• Suponha uma variável n do tipo inteira.

• Suponha que tenha atribuido a ela o valor 2.

• Quando n for referenciada devolverá o valor 2.

11

Operador de endereço (&)

• Se você referenciar n precedido de & - &n – então será devolvido o endereço do primeiro byte onde n está armazenada.

• Exemplo:

main() {

int num;

num = 2;

printf(“ \n Valor=%d, endereco=%u”, num, &num);

}

12

Função getche() e getch()

• getche(): Lê o caracter do teclado e permite que já seja impresso na tela, diferente de scanf() em que é necessário apertar enter.

• getch(): lê o caracter do teclado e não permite que seja impresso na tela.

• Ambas não aceitam argumentos e devolvem o caracter lido para a função que a chamou.

13

Função getche() e getch()

#include <stdio.h>

#include <stdlib.h>

main()

{

char ch;

printf("\n Digite algum caracter: ");

ch = getche();

printf(" \n A tecla digitada e: %c ", ch , " \n ");

system("PAUSE");

}

14

Função getche() e getch()

#include <stdio.h>

#include <stdlib.h>

main()

{

char ch;

printf("\n Digite algum caracter: ");

ch = getch();

printf(" \n A tecla digitada e: %c ", ch , " \n ");

printf(" e a sua sucessora ASCII e: %c ", ch+1, " \n ");

system("PAUSE");

}

15

Função getchar()

• A função getchar() lê um caracter e retorna um inteiro que é ou o código do caracter, ou o valor -1 que corresponde a fim de arquivo.

#include <stdio.h>

#include <stdlib.h>

main()

{

int c;

c=getchar();

printf("%d",c);

system("PAUSE");

}

16

Função putchar()

• É o complemento de getchar().

• Aceita um argumento cujo valor será impresso.

#include <stdio.h>

#include <stdlib.h>

main()

{

int c;

c=getchar();

putchar(c);

system("PAUSE");

} 17

Incremento

#include <stdio.h>

#include <stdlib.h>

main()

{

int num=0;

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

printf(" \n %d ++num", ++num);

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

printf(" \n %d ++num", ++num);

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

system("PAUSE");

} 18

Incremento

#include <stdio.h>

#include <stdlib.h>

main()

{

int num=0;

printf(" \n %d num: ", num);

printf(" \n %d num++: ", num++);

printf(" \n %d num: ", num);

printf(" \n %d num++: ", num++);

printf(" \n %d num: ", num);

system("PAUSE");

} 19

Decremento

#include <stdio.h>

#include <stdlib.h>

main()

{

int num=10;

printf(" \n %d num: ", num);

printf(" \n %d --num: ", --num);

printf(" \n %d num: ", num);

printf(" \n %d --num: ", --num);

printf(" \n %d num: ", num);

system("PAUSE");

} 20

Decremento

#include <stdio.h>

#include <stdlib.h>

main()

{

int num=10;

printf(" \n %d num: ", num);

printf(" \n %d num--: ", num--);

printf(" \n %d num: ", num);

printf(" \n %d num--: ", num--);

printf(" \n %d num: ", num);

system("PAUSE");

} 21

sizeof

• É um operador em tempo de compilação unário.

• Retorna o tamanho, em bytes, da variável ou especificador de tipo, em parênteses, que ele precede.

• Devemos usá-lo para garantir portabilidade.

22

sizeof

#include <stdio.h>

#include <stdlib.h>

main()

{

int a;

short int b;

long int c;

unsigned int d;

unsigned short int e;

unsigned long int f;

float g;

double h;

long double i;

char j;

printf("Tamanho do a : %d\n", sizeof(a));

printf("Tamanho do b : %d\n", sizeof(b));

printf("Tamanho do c : %d\n", sizeof(c));

printf("Tamanho do d : %d\n", sizeof(d));

printf("Tamanho do e : %d\n", sizeof(e));

printf("Tamanho do f : %d\n", sizeof(f));

printf("Tamanho do g : %d\n", sizeof(g));

printf("Tamanho do h : %d\n", sizeof(h));

printf("Tamanho do i : %d\n", sizeof(i));

printf("Tamanho do j : %d\n", sizeof(j));

system("PAUSE");

}

23

Comandos de controle de programa

• Seleção: if e switch (condicional)

• Iteração: while, for e do-while (laço)

• Desvio: break, continue, goto e return (salto)

• Rótulo: case, default e label

• Um valor verdadeiro em C pode ser um número positivo ou negativo – é qualquer valor diferente de zero.

24

IF – SE

if ( condição )

{

Bloco de comandos;

}

if ( condição )

else comandos;

if ( condição )

{

Bloco 1;

}

else

{

Bloco 2;

}

25

IF – SE

if ( condição) {

else if ( condição ) { }

else if ( condição ) { }

.

.

else { }

}

26

IF – SE

#include <stdio.h> #include <stdlib.h> main() { int num1; int num2; printf("Digite dois números \n"); scanf(" %d %d", &num1, &num2); if(num1 > num2){ printf("O numero num1 e maior que num2"); printf("\n"); } else { printf("O numero num1 e menor que num2"); printf("\n"); } system("PAUSE"); }

27

IF – SE

#include <stdio.h>

#include <stdlib.h>

main()

{

int a, b;

printf("Digite dois numeros \n");

scanf("%d %d", &a, &b);

if(b) printf("resultado: %d \n", a/b);

else printf("não pode dividir por zero \n");

system("PAUSE");

} 28

Switch – chaveamento

switch( expressão ) {

case constante1

comandos;

break;

case constante2

comandos;

break;

default:

comandos;

}

• Comando de seleção múltipla.

• Testa sucessivamente o valor de uma expressão contra uma lista de constantes inteiras ou de caractere.

• Quando o valor coincide, os comandos associados àquela constante são executados

29

Switch – chaveamento #include <stdio.h> #include <stdlib.h> main() { char ch; printf("1. Testando a opcao 1 \n"); printf("2. Testando a opcao 2 \n"); printf("3. Testando a opcao 3 \n"); ch=getchar();

switch(ch) { case '1': printf("Esta e a opcao 1 \n"); break; case '2': printf("Esta e a opcao 2 \n"); break; case '3': printf("Esta e a opcao 3 \n"); break; default: printf("nenhuma opcao selecionada"); } system("PAUSE"); }

30

Switch – chaveamento

• Switch avalia a expressão entre parenteses, após a palavra switch, e compara seu valor com os rótulos dos casos.

• A expressão entre parenteses deve ser de valor inteiro ou caractere.

• O comando break causa uma saída imediata do switch.

• Se break é omitido, a execução continua pelos próximos comandos case até que o fim do switch seja encontrado.

31

For – para

for ( inicialização; condição; incremento ) comando;

OU

for ( inicialização; condição; incremento )

{

comando;

}

32

For – para

• É útil quando queremos repetir algo um número fixo de vezes.

• inicialização: instrução de atribuição, executada uma única vez antes do laço ser iniciado. [ x = 0 ]

• condição: instrução que controla o laço. Avalia como verdadeira ou falsa toda vez que o laço for iniciado ou reiniciado. Se verdadeira, o corpo do laço é executado. Quando falsa, o laço é terminado. [ x > 5 ]

• incremento: instrução executada toda vez após a execução do corpo do laço. [ x++ ]

33

For – para

#include <stdio.h>

#include <stdlib.h>

main()

{

int conta;

for(conta=0; conta<10; conta++)

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

system("PAUSE");

}

34

For – para

#include <stdio.h>

#include <stdlib.h>

main()

{

int conta, numero;

printf("Digite um numero inteiro \n");

scanf("%d", &numero);

for(conta=0; conta<numero; conta++)

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

system("PAUSE");

} 35

While – enquanto

while ( condicao ) comando;

• O laço se repete quando a condição for verdadeira. Quando a condição for falsa, o controle do programa passa para a linha após o código do laço.

• Seu uso é apropriado em situações em que o laço pode ser terminado inesperadamente por condições desenvolvidas dentro do laço

36

While – enquanto

#include <stdio.h>

#include <stdlib.h>

main()

{

int num1, num2;

printf(" \n Digite um numero inteiro entre 0 e 10 \n");

scanf("%d", &num1);

while(num1<10){

printf(" \n enquanto num1 for menor que 10, imprima isto! %d", num1);

printf(" \n ");

num1++;

}

system("PAUSE");

}

37

Do-While

• Este laço verifica a condição no final do laço. Portanto, o laço do-while sempre será executado pelo menos uma vez. O laço do-while repete até que a condição se torne falsa.

do {

comandos;

}

while;

38

Do-While

#include <stdio.h>

#include <stdlib.h>

main()

{

int num;

do{

printf(" \n Digite um numero entre 0 e 51 \n ");

scanf("%d", &num);

}

while(num<=50);

system("PAUSE");

} 39

Return

• É usado para retornar um valor de uma função.

• É um comando de desvio.

• Faz com que a execução retorne ao ponto em que a chamada à função foi feita.

return expressão;

• A expressão é o valor da função

• Uma função pára de executar quando encontra o primeiro return.

• As chaves ( } ) funcionam como um return.

• Funções do tipo void não tem return, pois são funções que não retornam nenhum valor.

40

Goto – vá para

• Fornece compatibilidade com linguagens como BASIC e FORTRAN. Está em desuso.

• Pertence a uma classe à parte, a dos comandos de salto incondicional. O goto realiza um salto para um local especificado. Este local é determinado por um rótulo. Um rótulo, na linguagem C, é uma marca no programa. Você dá o nome que quiser a esta marca.

• O goto pode saltar para um rótulo que esteja mais à frente ou para trás no programa. Uma observação importante é que o rótulo e o goto devem estar dentro da mesma função.

goto rótulo;

.

.

rótulo;

41

Break

• Pode ser usado para terminar um case em um comando switch.

• Pode ser usado para forçar um término imediato de um laço.

• Quando break é encontrado dentro de um laço, o laço termina e o controle retorna para o comando seguinte.

• Pode ser usado no corpo de qualquer estrutura de laço.

42

Continue

• Força a próxima interação do laço e pula o código que estiver abaixo.

• While e do-while: faz com que o controle vá para o teste e depois continua o processo do laço

• For: primeiro executa o incremento do laço, depois faz o teste condicional e no fim continua o laço.

• Salta uma parte do programa, pula o código que estiver em seguida.

43

Exit()

• Força o término do programa inteiro.

• void exit(int codigo_de_retorno);

• O valor código_de_retorno e retornado ao processo chamador, que é normalmente o sistema operacional.

• O número zero é normalmente usado como código de retorno.

• Usado normalmente quando uma condição mandadatória para a execução do programa não é satisfeita.

44

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

int conta;

for(conta=0;conta<10;conta++);

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

system("PAUSE");

}

45

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

int conta;

for(conta=9;conta<10;conta--);

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

system("PAUSE");

}

46

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

int x,y

for(x=0, y=0; x+y < 100; x=x+1, y=y+1);

printf("%d \n", x+y);

system("PAUSE");

}

47

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

char ch;

for(ch='a'; ch<='z'; ch++);

printf("o valor ASCII de %c e %d \n ", ch, ch);

system("PAUSE");

}

48

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

char ch;

for(;(ch=getch())!='X';)

printf("%c", ch+1);

system("PAUSE");

}

49

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

for(;;printf("laco infinito \n"))

system("PAUSE");

}

50

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

char c;

for(;(c=getch())!='X';printf("%c",c+1))

system("PAUSE");

}

51

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

int conta, total;

for(conta=0, total=0; conta<10; conta++) {

total+=conta;

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

}

system("PAUSE");

} 52

Exemplos para testar no laboratório #include <stdio.h>

#include <stdlib.h>

main()

{

int conta, total;

for(conta=0, total=0; conta<10; conta++) {

total+=conta;

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

}

system("PAUSE");

} 53

Exemplos para testar no laboratório

#include <stdio.h> #include <stdlib.h> main() { int i, j, k; printf("\n"); for(k=0; k<=1; k++){ printf("\n"); for(i=1; i<5; i++) printf("Tabuada do %3d ", +i+4*k+1); printf("\n"); for(i=1; i<=9; i++){ for(j=2+4*k; j<=5+4*k; j++) printf("%3d x%3d = %3d ", j, i, j*i); } } system("PAUSE"); }

54

Mais exemplos

• Pegar os livros da bibliografia básica e testar os exemplos dos capítulos.

55