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. 2
• Tempo de execução: são os eventos que ocorrem enquanto o
seu programa está sendo executado.
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
Especificadores de tipo de classe de
armazenamento
• 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
• 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
Especificadores de tipo de classe de
armazenamento
Arquivo 1 (módulo 1) Arquivo 2 (módulo 2)
int x, y; extern int x, y;
char ch; extern char ch;
main(void) { funcao_2(void) {
. x = y/10;
. }
. funcao_3( ) {
} y = 10;
funcao_1( ) { }
x = 123; 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
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 scanf(“%e”, &num);
científica
%f Ler um número em ponto scanf(“%f”, 25.6);
flutuante
%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);
10
%l Ler um inteiro long scanf(“%l”, &num);
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. 11
• Quando n for referenciada devolverá o valor 2.
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");
} 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> printf("Tamanho do a : %dn", sizeof(a));
printf("Tamanho do b : %dn", sizeof(b));
main()
printf("Tamanho do c : %dn", sizeof(c));
{ printf("Tamanho do d : %dn", sizeof(d));
int a; printf("Tamanho do e : %dn", sizeof(e));
short int b; printf("Tamanho do f : %dn", sizeof(f));
long int c; printf("Tamanho do g : %dn", sizeof(g));
printf("Tamanho do h : %dn", sizeof(h));
unsigned int d;
printf("Tamanho do i : %dn", sizeof(i));
unsigned short int e; printf("Tamanho do j : %dn", sizeof(j));
unsigned long int f; system("PAUSE");
float g; }
double h;
long double i;
23
char j;
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 ) if ( condição )
{ {
Bloco de Bloco 1;
comandos; }
} else
{
if ( condição ) Bloco 2;
else comandos; }
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 ) { • Comando de seleção
múltipla.
case constante1
• Testa sucessivamente o
comandos; valor de uma expressão
break; contra uma lista de
case constante2 constantes inteiras ou
de caractere.
comandos;
• Quando o valor
break; coincide, os comandos
default: associados àquela
constante são
comandos; 29
executados
}
Switch – chaveamento
#include <stdio.h> switch(ch) {
#include <stdlib.h> case '1':
main() printf("Esta e a opcao 1
{ n");
char ch; break;
case '2':
printf("1. Testando a opcao 1 printf("Esta e a opcao 2
n"); n");
printf("2. Testando a opcao 2 break;
n"); case '3':
printf("3. Testando a opcao 3 printf("Esta e a opcao 3
n"); n");
break;
ch=getchar(); default:
printf("nenhuma
opcao selecionada");
} 30
system("PAUSE");
}
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++;
} 37
system("PAUSE");
}
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
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. 40
• Funções do tipo void não tem return, pois são funções que
não retornam nenhum valor.
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;
. 41
.
rótulo;
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);
} 54
}
system("PAUSE");
}
Mais exemplos
• Pegar os livros da bibliografia básica e testar os exemplos dos
capítulos.
55