❑ maior: ‘>’ ❑ maior ou igual: ‘>=’ ❑ menor: ‘<’ ❑ menor ou igual: ‘<=’ ❑ igualdade: ‘==’ ❑ diferença: ‘!=’
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Em C/C++, o teste condicional é realizado pela
instrução if:
if (teste) {
bloco de instruções caso
teste seja verdadeiro
} else {
bloco de instruções caso teste seja falso
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ O início e o fim do bloco de comandos a serem
executados são determinados pelo uso de chaves.
❑ Em C/C++, considera-se falso qualquer coisa
igual a ZERO (nulo) e verdadeiro qualquer coisa
diferente de ZERO (não nulo).
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Em C/C++, existe um teste condicional
simplificado chamado “comando ternário”.
❑ A sintaxe é:
(teste) ? resultado1 : resultado2;
❑ Se teste é verdadeiro, a instrução retorna o
resultado1.
❑ Senão, o comando retorna resultado2.
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Existe também a instrução de seleção de caso.
❑ Dependendo do conteúdo de uma variável inteira,
a instrução desvia para o caso correspondente.
❑ O comando é o switch:
switch (variável) {
case valor:
bloco de instruções
Programação em C/C++
◼
Mecanismos de Controle de Execução
switch(variável) { case valor1: bloco de instruções break; case valor2: bloco de instruções break; default:
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Pode haver quantos ‘cases’ forem necessários.
❑ O comando break faz com que a execução do
bloco se encerre.
❑ A ausência do break, faz com que a execução
invada outro case.
❑ Caso nenhuma das entradas corresponda ao
conteúdo de variável, a estrutura do switch possui
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Existem 3 comandos de repetição de
instrução/bloco de instruções: for, while e
do/while.
❑ A estrutura do comando for é:
for (var=valor; teste; incremento|decremento) {
bloco de instruções
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Exemplo:
for ( i=0; i<10; i=i+1 ) { bloco de instruções
}
for ( j=-1.0; j<1.0; j=j+1e-3 ) { bloco de instruções
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Exemplo:
for ( ; ; ) {
laço infinito
}
for ( i=10; i>=-10; i=i-2 ) { bloco de instruções
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ O comando while executa o bloco de instruções
enquanto o teste de execução for verdadeiro.
❑ Estrutura da instrução while
while (teste) {
bloco de instruções
}
❑ O comando break pode ser usado no bloco de
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ O comando do/while tem o mesmo
comportamento do comando while com a
diferença do teste estar no final do bloco de instruções.
❑ A estrutura do do/while é
do {
bloco de instruções
Programação em C/C++
◼
Mecanismos de Controle de Execução
❑ Vale a pena observar que as instruções while e
do/while realizam praticamente o mesmo
processo lógico.
❑ No entanto, como o teste de continuidade do
comando do/while é no final do bloco, mesmo que
o teste seja falso, pelo menos uma execução do bloco de instruções se realizará.
Programação em C/C++
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h>int main(void) {/* inicio */ /* numero aleatorio */
int eps;
/* variavel auxiliar */
int i;
srand(time(NULL));
/* funcao geradora de numeros
aleatorios inteiros: rand() */ /* a funcao rand() gera inteiro
for ( i=0; i<10; i++ ) { eps = rand();
if (eps<RAND_MAX/10) {
printf(“\teps=%5d menor que
RAND_MAX/10\n”,eps); } else if (eps<RAND_MAX/2) {
printf(“\teps=%5d menor que
RAND_MAX/2\n”,eps); } else {
printf(“\teps=%5d\n”,eps); } } return 0; } /* fim */ gcc –o ex exemplo1.c ./ex
Programação em C/C++
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h>int main(void) {
/* numero aleatorio */
float eps;
/* variavel auxiliar */
int i;
/* funcao geradora de numeros
aleatorios inteiros: rand() */ /* a funcao rand() gera inteiro
entre 0 e a constante RAND_MAX */
printf("RAND_MAX: %d\n",RAND_MAX);
/* a funcao srand gera semente para
for ( i=0; i<10; i++ ) {
eps = (float)rand()/RAND_MAX;
if (eps<0.1) {
printf("\teps=%5.3f menor que 0.1\n",eps);
} else if (eps<0.5) {
printf("\teps=%5.3f menor que 0.5\n",eps);
} else {
printf("\teps=%5.3f\n",eps); }
}
return 0; }
Programação em C/C++
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h>int main(void) {
/* numero aleatorio */ float eps; /* variavel auxiliar */ int i; /* variaveis contadoras */ int c1, c2, c3, n; /* semente geradora */ srand(time(NULL));
for ( i=0; i<n; i++ ) {
/* numero eps entre 0 e 1*/
eps = (float)rand()/RAND_MAX;
if (eps<0.1) { c1++; /* ++c1; */ } else if (eps<0.5) { c2++; /* ++c2; */ } else { c3++; /* ++c3; */ } } printf(“Prob(eps<0.1)=%5.3f\n", (float)c1/n); printf(“Prob(0.1<=eps<0.5)=%5.3f\n", (float)c2/n); printf(“Prob(0.5<=eps<1)=%5.3f\n", (float)c3/n);
Programação em C/C++
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h>int main(void) {
/* numero aleatorio */ float eps; /* variaveis auxiliares */ char f1, f2, f3; int i; /* variaveis contadoras */ int c1, c2, c3, n; float p1, p2, p3; /* semente geradora */ srand(time(NULL));
/* numero eps entre 0 e 1*/
eps = rand()*1.0/RAND_MAX; if (eps<0.1) { c1++; p1 = c1*1.0/n; } else if (eps<0.5) { c2++; p2 = c2*1.0/n; } else { c3++; p3 = c3*1.0/n; } f1 = (fabs(p1-0.1)>1e-3) ? 1 : 0; f2 = (fabs(p2-0.4)>1e-3) ? 1 : 0; f3 = (fabs(p3-0.5)>1e-3) ? 1 : 0; printf("Aguarde... (%d)\n",n); } while(f1 || f2 || f3);
printf("Total de eventos: %d\n",n); printf("P(eps<0.1)=%5.3f\n",p1);
Programação em C/C++
◼
Conversão de Tipo
❑ Quando um dado de um tipo é atribuído a uma
variável do mesmo tipo, não há conversão de tipo.
❑ Quando o dado e a variável são de tipos
diferentes, ocorrerá a conversão do tipo do dado para o tipo da variável.
❑ Numa operação aritmética, dados e variáveis de
Programação em C/C++
◼
Conversão de Tipo
❑ Exemplo:
◼ dados do tipo char com dados do tipo int são
convertidos para o tipo int.
◼ dados do tipo char e int com dados do tipo float são
convertidos para o tipo float.
◼ dados do tipo char, int e float com dados do tipo
Programação em C/C++
◼
Conversão de Tipo
❑ Uma forma de forçar a mudança do tipo de dado
é através do mecanismo de “typecasting”.
❑ Exemplo: float a; char b; int c; a = (float)b; b = (char)c;
Programação em C/C++
◼
Conversão de Tipo
❑ Conversão de tipo inteiro para tipo real envolve
apenas o acréscimo da parte fracionária nula.
❑ Conversão de tipo real para tipo inteiro envolve
truncamento da parte fracionária.
❑ O arredondamento de dados reais pode ser
obtido através das funções:
◼ floor(dado): arredonda para baixo ◼ ceil(dado): arredonda para cima
Programação em C/C++
◼
Tipos de Dados Abstratos
❑ Vetores (numéricos e literais)
❑ Matrizes
❑ Estruturas
❑ Enumerações ❑ Uniões
Programação em C/C++
◼
Vetores e Matrizes
❑ Um vetor é uma lista indexada de dados do
mesmo tipo.
❑ Pode-se construir vetores de qualquer tipo
acrescentando a dimensão do vetor (rank).
❑ Exemplo:
float a[15];
char nome[80];
Programação em C/C++
◼
Vetores e Matrizes
❑ Uma matriz é uma lista multiplamente indexada
de dados do mesmo tipo.
❑ Pode-se construir matrizes de qualquer tipo
acrescentando as dimensões da matriz (ranks).
❑ Exemplo:
float a[15][20]; /*15 linhas, 20 colunas */
char nome[2][80]; /*2 linhas, 80 colunas */
Programação em C/C++
◼
Vetores e Matrizes
❑ Uma forma interessante de olhar para a matriz
bidimensional é encará-la como um vetor (uma lista indexada) de vetores (de listas indexadas).
matriz 2D ↔ vetor de vetores
❑ Uma matriz N-dimensional é uma lista indexada
Programação em C/C++
◼
Vetores e Matrizes
❑ Um vídeo digital é uma sequência temporal de
imagens.
❑ Cada imagem é uma matriz 2D indexada pelo
tempo.
❑ Uma imagem é uma sequência de linhas.
❑ Cada linha é uma sequência de pixels.
❑ O vídeo é uma lista de sequências de linhas de
Programação em C/C++
◼
Vetores e Matrizes
❑ Uma vez definida a dimensão do vetor ou da
matriz, esta não pode ser mais alterada.
❑ A criação de vetores e matrizes sem dimensões
pré-definidas é possível, mas precisa da noção de
ponteiros.
❑ Os índices dos vetores e matrizes se iniciam com
Programação em C/C++
◼
Vetores de Caracteres: Strings
❑ Um vetor de caracteres é chamado de string.
❑ Uma string, para ser útil, é necessário inserir um
caractere especial chamado NULL (constante
literal ‘\0’).
❑ Esta constante é definida nos arquivo de
cabeçalho stdlib.h e string.h.
❑ O papel do NULL é marcar o final da sequência
Programação em C/C++
◼
Vetores de Caracteres: Strings
❑ Exemplo:
#include <string.h> #include <stdio.h> #include <stdlib.h> void main(void) {
char nome[50];
strcpy(nome,“Luis Fernando”); printf(“Meu nome eh: %s\n”,nome);
printf(“Tamanho declarado eh: %d\n”,sizeof(nome)); printf(“Tamanho usado eh : %d\n”,strlen(nome)); }
Programação em C/C++
◼
Vetores de Caracteres: Strings
❑ A função strcpy() copia o conteúdo de uma string
para outra.
❑ O operador de atribuição ‘=‘ não realiza esta
função.
❑ A função sizeof() retorna o comprimento
L u i s F e r n a n d o \0
Programação em C/C++
◼
Vetores de Caracteres: Strings
❑ Pode-se inicializar a string diretamente com seu
conteúdo.
❑ O tamanho é definido automaticamente.
❑ Exemplo:
#include <string.h> #include <stdio.h> #include <stdlib.h> void main(void) {
char nome[]={“Luis Fernando”};
Programação em C/C++
◼
Estrutura de Dados
❑ A linguagem C permite criar estruturas de dados
compostos.
❑ Funciona como um registro composto por vários
campos que podem ser de tipos distintos, inclusive outras estruturas.
❑ Uma nova estrutura funciona como um novo tipo.
❑ Depois de definida uma estrutura, variáveis
Programação em C/C++
◼
Estrutura de Dados
❑ Uma estrutura é definida através da instrução
struct identificador { };.
❑ No interior do escopo da instrução, declara-se as
variáveis que comporão a estrutura.
❑ Exemplo:
struct vet3d {
double x, y, z; /* campos da estrutura */
};
Programação em C/C++
◼
Estrutura de Dados
❑ Exemplo:
struct vet3d {
double x, y, z; /* campos da estrutura */
} v1, v2; /* variáveis do tipo struct vet3d */
❑ Uma estrutura de dado pode se tornar
formalmente um tipo através da instrução typedef.
Programação em C/C++
◼
Estrutura de Dados
❑ Exemplo:
typedef struct vet3d {
double x, y, z; /* campos da estrutura */
} vetor3D; /* tipo definido da estrutura */ vetor3D v1, v2;
❑ Neste caso, o identificador vet3d é opcional.
❑ Exemplo:
typedef struct {
Programação em C/C++
◼
Estrutura de Dados
❑ Para acessar um campo de uma estrutura, basta
referenciar a variável do tipo da estrutura seguida
do nome do campo separados por um ponto.
❑ Exemplo: vetor3D v1, v2; v1.x = 1; v1.y = v1.z = 0; v2.x = 0.92; v2.y = 1.34e-5;
Programação em C/C++
◼
Ponteiros
❑ Os ponteiros representam um mecanismo ímpar
na linguagem C.
❑ O ponteiro diz respeito ao endereço de uma
variável e não ao seu conteúdo.
❑ Quando um dado é declarado, ele reside na
memória em algum lugar.
❑ Este lugar é referenciado por seu endereço como
Programação em C/C++
◼
Ponteiros
❑ Quando uma variável é declarada, na linguagem
de alto nível, ela é identificada por um nome: o nome da variável.
❑ Quando o código é compilado, o identificador
passa a ser o endereço da variável.
❑ O programador vê as variáveis, o computador vê
o endereço das variáveis.
Programação em C/C++
◼
Ponteiros
❑ Quando o programador atribui um dado a uma
variável, o computador copia o dado no endereço da variável.
❑ A linguagem C permite o acesso aos endereços
das variáveis através dos ponteiros.
❑ Um ponteiro é uma variável que armazena
Programação em C/C++
◼
Ponteiros
❑ Se o programador modifica o conteúdo apontado
por um ponteiro, ele modifica o conteúdo de uma variável indiretamente.
❑ Um ponteiro é declarado definindo-se o tipo de
dado que ele aponta e seu nome precedido de ‘*’:
int *p; double *dptr; char *str; vetor3D *vptr;
Programação em C/C++
◼
Ponteiros
❑ Para acessar o dado apontado por um ponteiro,
basta colocar o operador conteúdo de memória ‘*’
na frente do ponteiro. Exemplo:
#include <stdio.h>
void main(void) {
unsigned dado = 10;
unsigned *dptr; /* ponteiro unsigned dptr */
dptr = &dado; /* recupera o endereco da variavel dado */
printf(“conteudo apontado por dptr: %d\n”,*dptr);
Programação em C/C++
◼
Ponteiros
❑ O ponteiro é uma variável como outra qualquer.
❑ A diferença é que seu conteúdo é um endereço.
❑ Os endereços de memória dependem da
arquitetura do computador.
❑ Computadores de 64 bits geram endereços de 64
bits, ou seja, são do tipo unsigned long int.
❑ Computadores de 32 bits geram endereços de 32
Programação em C/C++
◼
Ponteiros
❑ O endereço de memória pode ser impresso
usando o código de formatação ‘%p’.
#include <stdio.h>
void main(void) {
unsigned dado = 10;
unsigned *dptr; /* ponteiro unsigned dptr */
dptr = &dado; /* recupera o endereco da variavel dado */
printf(“dptr vale: %p\n”,dptr);
printf(“conteudo apontado por dptr: %d\n”,*dptr);
*dptr = 20; /* modifica indiretamente a variavel dado */