Issuu on Google+

E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

9. Exercícios e Testes 9.1. Engenharia de Processamento Digital II – Teste 1 de 7 1. Desenhar o fluxograma do seguinte código: float *vet = new float [2000]; for (int i=0;i<2000;i++){ vet[i] = 100*sin (2*M_PI*60/i); if(vet[i] >80) { vet[i] = 80; } else { if(vet[i] <=-80){ vet[i] = -80; } } } delete [] vet;

189


L

U

I

S

F

E

R

N

A

N

D

E

O

S

P

I

N

O

S

A

C

O

C

I

A

N

Início da rotina

Alocar 2000 posições float para o vetor vet

i = 0;

S i>2000?

Desalocar memória do vetor vet

Continuação do P rograma

N

vet[i] = 100*sin (2*M_P I*60/i);

N vet[i]>=80?

N vet[i]<=-80?

S

S

vet[i] = 80

vet[i] = -80

i ++

2. Corrigir as seguintes declarações (se for o caso): Int x; int x; float double; unsigned int temp = 5; float temperatura = -5.0; temp += temperatura;

void main (void){ M * pM, Dado; pM = &Dado; pM->freal ++= 5.4; } struct M{ float freal; float fimag;

double é uma palavra reservada e não pode ser o nome de variável. temp é uma variável unsigned int e temperatura é do tipo float. A codificação é diferente para as duas variáveis. A variável temperatura tem valor negativo e será atribuído a um inteiro sem sinal. O valor final de temp é desconhecido e dependerá da implementação do compilador. Aqui é criada uma instância da estrutura M antes dela ter sido declarada e, portanto no início ela ainda é desconhecida pelo compilador. Para arrumar este código coloque a definição da estrutura antes da função main.

190


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

} 3. Quais são os paradigmas da programação orientada a objetos? Assinalar a alternativa correta. a. Abstração, Classes, Herança, Encapsulamento.

b. Encapsulamento, Polimorfismo, Herança, Abstração. c. Abstração, Polimorfismo, Objetos, Encapsulamento d. Hierarquias, Polimorfismo, Objetos, Encapsulamento. e. Alternativas a e c estão corretas.

4. Responder com verdadeiro ou falso as seguintes declarações: Um objeto possui um estado, comportamento e identidade. V Um objeto é uma matriz para criar classes. Um objeto define em um F único local, propriedades comuns a todas as instâncias desse objeto. (Uma classe é uma matriz para criar objetos. Uma classe define em um único local, propriedades comuns a todas as instâncias dessa classe.) Uma estrutura é um tipo composto de dados. V Uma classe representa um conjunto de objetos que apresentam uma V estrutura e comportamento comum

191


L

U

I

F

S

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

9.2. Engenharia de Processamento Digital II – Teste 2 de 7 5. Desenhar no verso da folha um fluxograma de um algoritmo que implemente um semáforo de três cores com a seguinte temporização: 0 a 5 segundos: verde 5 a 7 segundos: amarelo 7 a 12 segundos: vermelho OnT imer

i++

N i<=5?

S

N

N

i<=7?

i<=12?

S

S

Liga Verde - Desliga Vermelho - Desliga Amarelo

i = 0

Liga Amarelo Desliga Vermelho Desliga Verde

Liga Vermelho Desliga Verde Desliga Amarelo

Continua o programa

6. Responder com verdadeiro ou falso as seguintes declarações: Timer1->Interval é uma propriedade do objeto Timer1. V Form1->Close( ) é um método do objeto TForm1.

V

Application é um objeto de classe TApplication.

V

VCL é a biblioteca de funções virtuais da Microsoft

F

(VCL é a biblioteca de funções visuais da Borland) A instrução Button1->Enabled = false; faz com que um botão

V

fique desabilitado. 7. Mostrar no código a seguir onde acontecerão erros na compilação. Descreva o motivo. class T{ private: int x; protected:

192


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

public: int y; __fastcall T(){}; __fastcall T(int xx){ x = xx; }; __fastcall ~T(); }; void main (void){ T T1(5); int x = T1->x; // Erro: Aqui deveria ser T1.x no entanto T1.x não é // visível pois foi definida como private. T1.y = x; ~T1(); // Erro: o destrutor não pode ser chamado diretamente no // código com uma função normal. Para fazer isso observe // o exemplo a seguir. }

Exemplo de chamada a um destrutor: { . . . X *p; . . . p–>X::~X(); . . .

// chamada correta de um destrutor

}

193


L

U

I

S

F

E

R

N

A

N

D

E

O

S

P

I

N

O

S

C

A

O

C

I

A

N

9.3. Engenharia de Processamento Digital II – Teste 3 de 7 8. Desenhar no verso da folha um fluxograma que implemente um acesso seqüencial de 8 leds da seguinte forma (somente um led fica acesso de cada vez): ..., L0, L1, L2, L3, L4, L5, L6, L7, L6, L5, L4, L3, L2, L1, L0, L1,... Evento OnT imer

bCresce = true?

N

static unsigned char ucLeds = 0x01

ucLeds >> 1 (ou ucLeds / 2)

L7

L6

L5

L4

L3

L2

L1

S static bool bCresce = true ucLeds << 1 (ou ucLeds * 2)

Envia ucLeds para a porta conectada aos Leds

Envia ucLeds para a porta conectada aos Leds

ucLeds == 0x01?

N

S ucLeds == 0x80?

N bCresce = true

S

bCresce = false

Continua o programa

9. Responder com verdadeiro ou falso as seguintes declarações: Polimorfismo é a capacidade de um operador executar a ação V apropriada dependendo do tipo do operando. Esta frase foi retirada do tutorial de C++ No programa da questão 3, a função ponto(float a,float b) é o construtor do objeto ponto.

194

V

L0


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

No programa da questão 3, a função void move(float dx,float dy) é o destrutor do objeto ponto. Os destrutores são definidos pelo mesmo nome da classe ou estrutura porém com um “~” na frente. Por exemplo: ~ponto() No programa da questão 3, as variáveis ponto.dx e ponto.dy são visíveis dentro da função main( ).

F

V

Elas são visíveis porque se trata de uma struct. Se fosse uma class não seriam visíveis e haveria erro de compilação. 10. Para a o programa a seguir identificar quais os valores das variáveis ap.x e ap.y no final do programa.

195


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

9.4. Engenharia de Processamento Digital II – Teste 4 de 7 11. É colocado um conversor DA na saída de dados da porta paralela (pinos 2 a 9 – D0 a D7). O conversor possui uma saída analógica com valor proporcional de 0 a +5V dependendo valor binário de entrada. Projete um algoritmo detalhado (fluxograma) que gere uma forma de onda senoidal, quadrada ou dente de serra na saída do conversor DA, com período (usando um timer) selecionado pelo usuário. OnT imer

i é o contador relativo de tempo em um ciclo t é o tempo real T é o período S

Onda quadrada?

i < T /2

N

N

S

Onda triangular?

paralela = i

S paralela = 0x00

paralela = 0xFF

N

S Onda senoidal?

paralela = 2.5 + 2.5*sin(2*M_P I*i/T )

N

t ++; i++;

S i == T

i = 0;

N

Fim da sub-rotina

12. char cDado = 5; cDado >>1;

Responder com verdadeiro ou falso as seguintes declarações: V

196


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

cDado <<1;

O valor de cDado é igual a 5 O valor de cDado não muda pois a instrução cDado << 1 não altera o valor da variável. Seria diferente se fosse colocado cDado = cDado >> 1; cDado = cDado << 1; Nesse caso cDado seria igual a 4. class CData{ public: unsigned int nibble:4; unsigned int out:4; }; union{ CData stData; unsigned int unDado; } Dado; void main (void){ Dado.stData.out = 0x04; printf(“0x%x”,Dado.unDado); }

V

O valor impresso será 0x40 int i = 9; void main (void){ unsigned int i = 6; printf("%d",::i); }

F

O valor impresso será 6 O valor impresso será 9, pois ::i referencia a variável global i do arquivo fonte. A variável i é diferente de main.i 13. Crie uma classe chamada COnda para criar objetos do tipo formas de onda que possua os seguintes atributos: número de dados, vetor de dados de tempo, amplitudes, derivada e integral (alocação dinâmica); e os seguintes métodos: construtor, destrutor, função de cálculo da derivada e da integral com retorno dos ponteiros para esses dados, somar e subtrair offset na forma de onda, cálculo do valor máximo, mínimo e médio. Todos os atributos devem ser private. class COnda{ public: float * fAmplitudes; // ponteiro para armazenar as amplitudes float * fTempos; // ponteiro para armazenar os tempos COnda(); // construtor ~COnda(); // destrutor private: unsigned int unNumDados; // número posições de vetor float * fDerivada; // ponteiro para armazenar as derivadas instantâneas float *fIntegral; // ponteiro para armazenar o valor da integral instantânea unsigned char ucTipo; // armazena o tipo de onda float * pfCalculaDerivada (void); // função que calcula a derivada e retorna um // ponteiro para os dados float * pfCalculaIntegral (void); // função que calcula a integral e retorna um // ponteiro para os dados void vOffset(); // função que soma ou subtrai um offset da forma de onda float fValorMaximo(); // retorna um float com o valor máximo float fValorMinimo(); // retorna um float com o valor mínimo float fValorMedio(); // retorna um float com o valor médio }; COnda::COnda(){ // colocar aqui o código para o construtor } COnda::~COnda(){ // colocar aqui o código para o destrutor } float * COnda::pfCalculaDerivada (void){

197


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

float * pResult; // colocar aqui o código que calcula a derivada return pResult; } float * COnda::pfCalculaIntegral (void){ float * pResult; // colocar aqui o código que calcula a integral return pResult; } void COnda::vOffset(){ // colocar aqui o código } float COnda::fValorMaximo(){ float fResult; // colocar aqui o código return fResult; } float COnda::fValorMinimo(){ float fResult; // colocar aqui o código return fResult; } float COnda::fValorMedio(){ float fResult; // colocar aqui o código return fResult; }

que soma ou subtrai um offset à forma de onda

que calcula o valor máximo

que calcula o valor mínimo

que calcula o valor médio

void main(void){ COnda minhaOnda; // colocar aqui o código do seu programa }

198


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

9.5. Engenharia de Processamento Digital II – Teste 5 de 7 14. Elaborar um fluxograma de transmissão e recepção serial de dois dispositivos que conversam no protocolo MODBUS RTU. Implemente as rotinas para a função READ INPUT REGISTERS que é dado pelo seguinte diálogo entre as estações mestre e escravo:

199


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

MEST RE: RECEP ÇÃO

MEST RE: T RANSMISSÃO

Início

Início

BuffT x[0] = endereço do escravo

BufferRX != 0?

N

S

BuffRx[j] = BufferRX

BuffT x[1] = função

BuffT x[2] = parte alta do endereço inicial

N j == 2?

S BuffT x[3] = parte baixa do endereço inicial

BuffRX[1] == 0x81?

BuffT x[4] = parte alta do número de pontos

S

S

N

N

j > (4 + 2 * BuffRx[2])?

BuffT x[5] = parte baixa do número de pontos

N j ++

S Calcular CRC

BuffT x[6] = CRC

N CRC está OK?

i = 0 S

N i < 7 ?

Carregar variáveis com os dados recebidos

S j= 0 Enviar BuffT x[i]

Retorna i++

Esperar resposta do escravo

200

Exibir descrição do erro

j> 3


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

I I

L

ESCRAVO: RECEP ÇÃO

N

Início

N

CRC está OK? BuffT x[0] = endereço do escravo

S

BufferRX != 0? S

N BuffRx[1] == 0x04?

BuffRx[j] = BufferRX

BuffT x[1] = 0x81

S

N

BuffT x[0] = endereço do escravo

BuffRX[0] == endereço?

BuffT x[2] = código de exceção Erro de CRC ou função

N

S BuffT x[3] = CRC S

j> 6

Calcular CRC

BuffT x[1] = função

N total de bytes = 4 j ++

BuffT x[2] = quantidade de bytes S

BuffT x[3] = dado 1 HI

i < total de bytes?

N

i = 0

BuffT x[4] = dado 1 LO Enviar BuffT x[i] BuffT x[5] = dado 2 HI i++ BuffT x[6] = dado 2 LO

...

BuffT x[n] = dado 2 HI

BuffT x[n] = dado 2 LO

total de bytes = 4 + 2*número de bytes

Retorna

15. Responder com verdadeiro ou falso as seguintes declarações: Na comunicação serial o START BIT é um bit usado para a F detecção de erros de transmissão. A comunicação paralela de dados é bem mais rápida que a V comunicação serial. A comunicação paralela, por ser mais rápida, é sempre melhor que a comunicação paralela. Esta questão foi anulada por ter erro de digitação. A

201


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

afirmação corrigida seria: A comunicação paralela, por ser mais rápida, é sempre melhor que a comunicação “serial”. A resposta correta seria F, pois a comunicação serial tem algumas vantagens sobre a paralela que podem pesar na definição de ser “melhor”. O frame na comunicação serial, após o start bit, continua com o bit mais significativo do dado transmitido. O mouse usa um sistema de comunicação paralelo de dados.

F

O teclado usa um sistema de comunicação de dados serial.

V

202

F


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

9.6. Engenharia de Processamento Digital II – Teste 6 de 7 - A 16. Avaliar as seguintes expressões 4*(7/4)-4*7/4 = -3 7*5/7-5*7/7 = 0 13/3/3*3-13*3/3/3 = -1 11/3*3-13/4*4 = -3

17. Considerando que todas as variáveis são inteiras, colocar os valores que serão impressos no Console. a=100;b=0; a=100;i=3;s=0; while(a){b+=a%2;a--;};cout<<b; while(i--){s+=a;a-=10;}cout<<s; 50 A=1;b=9;k=0; while(a++<b--)k++; cout<<k;

270 a=7; if(a<3)cout<<1; else if (a<7)cout<<2; else if(a<9)cout<<3; else cout<<4;

4

3 18. Desenhar um fluxograma e um programa que implemente a entrada de n números definidos pelo usuário e que calcule a soma dos valores divisíveis por cinco. Iníci o

Entra com o número

S número == 0?

Imprime soma

N N número% 5== 0?

Fim

S soma += número

#include <iostream.h>

203


L

U

I

F

S

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

//--------------------------------------------------------------------------int main(int argc, char* argv[]) { int soma = 0, numero; do{ cout << "Numero: "; cin >> numero; cout << endl; if (numero != 0){ if ((numero%5)==0) soma+=numero; } } while (numero); cout << "Soma dos divisíveis por 5: " << soma; return 0; } //--------------------------------------------------------------------------19. Completar os passos para a solução de um problema de processamento digital. a. Identificação do problema b. Determinar o que é requerido para a solução c. Representar a solução na forma de um diagrama lógico d. Executar o planejado e. Analisar a solução implementada f. Documentar os resultados 20.

Para cada questão, assinale a resposta correta: a. Um algoritmo pode ser definido como: i. Uma seqüência infinita e ordenada de ações que não conduzem à resolução de um problema; ii. Um conjunto de instruções destinadas a serem processadas num sistema informático; iii. Uma seqüência finita e ordenada de ações que conduzem à resolução de um problema; iv. Um programa de computador para resolver um problema. b. Como se pode definir programa de computador? i. Um programa de computador pode ser um algoritmo; ii. Um programa de computador pode ser definido simplesmente como um conjunto de instruções destinadas a serem processadas num sistema informático; iii. Um programa de computador pode ser definido como um conjunto de caracteres que é reconhecido pelo computador; iv. Um programa programação.

de

computador

204

é

uma

linguagem

de


E

N

G

E

21.

N

H

A

R

I

A

D

P

E

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

Complete as seguintes frases: a. Os números ____float_____ podem ser positivos, ___negativos_ ou ____zero______ e possuem sempre um componente decimal. b. Um objeto do tipo ____char______ consome apenas um Byte de memória e só armazena um caractere. c. Os objetos declarados como do tipo ______bool_____ só poderão assumir uma entre duas possibilidades (verdadeiro ou falso).

22. Quais dos seguintes identificadores de variáveis são corretos e quais são incorretos? a. Numero - Correto b. valor$ - Incorreto c. num2 - Correto d. val_7 - Correto e. 8letras - Incorreto f. parâmetro - Incorreto 23.

Indique o resultado de x para as seguintes expressões: a. x = (3 > 6);

x=0

b. x = (2 < -5)||(10 > 7);

x=1

c. x = (((10 / 2) % 5) > 5) && (3 < (2 % 2)); x = 0 d. x = !(-10 < 8);

x=0

e. x = (2 & 5) << 2;

x =0

24. Os operadores dividem-se em três tipos, assinale quais os tipos de operadores corretos: Operadores Reais

I

Operadores Lógicos

C

Operadores Numéricos

I

Operadores Relacionais

C

Operadores Operacionais

I

Operadores Aritméticos

C

25. Complete o seguinte quadro com alguns dos símbolos utilizados nos fluxogramas:

205


L

U

I

S

F

E

R

N

Símbolo

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

Significado

Exemplo

Processamento geral

em x = 3

Entrada/Saída

Início

Abrir *.xlt

Início/Fim processamento Conectores páginas

de

de

Fim outras

P ágina 3

Decisão condicional i>5?

206


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

9.7. Engenharia de Processamento Digital II – Teste 6 de 7 - B 1. Avaliar as seguintes expressões 5*(7/5)-5*7/5 = -2 9*5/7-6*7/7 = 0 13/2/2*2-13*2/2/2 = 0

11/2*2-13/5*5 = 0

2. Considerando que todas as variáveis são inteiras, colocar os valores que serão impressos no Console. a=80;b=0; a=100;i=3;s=0; while(a){b+=a%2;a--;};cout<<b; while(--i){s+=a;a-=10;}cout<<s; 40 a=1;b=9;k=0; while(++a<b--)k++; cout<<k;

190 a=6; if(a<3)cout<<1; else if (a<7)cout<<2; else if(a<9)cout<<3; else cout<<4;

4

2 3. Desenhar um fluxograma e um programa que implemente a entrada de n números definidos pelo usuário e que calcule a soma dos valores ímpares. Início

Entra com o número

número == 0?

S

Imprime soma

N

Fi m N número% 2!= 0? S

soma += número

207


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

#include <iostream.h> //--------------------------------------------------------------------------int main(int argc, char* argv[]) { int soma = 0, numero; do{ cout << "Numero: "; cin >> numero; cout << endl; if (numero != 0){ if ((numero%2)!=0) soma+=numero; } } while (numero); cout << "Soma dos divisíveis por 5: " << soma; return 0; } //--------------------------------------------------------------------------4. Completar os passos para a solução de um problema de processamento digital. a. Identificação do problema b. Determinar o que é requerido para a solução c. Representar a solução na forma de um diagrama lógico d. Executar o planejado e. Analisar a solução implementada f. Documentar os resultados

5. Para cada questão, assinale a resposta correta: a. Um algoritmo pode ser definido como: i. Uma seqüência finita e ordenada de ações que conduzem à resolução de um problema; ii. Uma seqüência infinita e ordenada de ações que não conduzem à resolução de um problema; iii. Um programa de computador para resolver um problema. iv. Um conjunto de instruções destinadas a serem processadas num sistema informático; b. Como se pode definir programa de computador? i. Um programa programação.

de

computador

é

uma

linguagem

de

ii. Um programa de computador pode ser um algoritmo; iii. Um programa de computador pode ser definido como um conjunto de caracteres que é reconhecido pelo computador; iv. Um programa de computador pode ser definido simplesmente como um conjunto de instruções destinadas a serem processadas num sistema informático;

208


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

6. Complete as seguintes frases: a. Um objeto do tipo _____char_________ consome apenas um Byte de memória e só armazena um caractere. b. Os números _____float_____ podem ser positivos, __negativos___ ou ____zero_______ e possuem sempre um componente decimal. c. Os objetos declarados como do tipo ____bool_______ só poderão assumir uma entre duas possibilidades (verdadeiro ou falso). 7. Quais dos seguintes identificadores de variáveis são corretos e quais são incorretos? a. val_7 - Correto b. numero - Correto c. parâmetro - Incorreto d. num2 - Correto e. valor$ - Incorreto f. 8letras - Incorreto 8. Indique o resultado de x para as seguintes expressões: a. x = (2 & 5) << 2; x=0 b. x = !(-10 < 8);

x=0

c. x = (2 < -5)||(10 > 7);

x=1

d. x = (3 > 6);

x=0

e. x = (((10 / 2) % 5) > 5) && (3 < (2 % 2));

x=0

9. Os operadores dividem-se em três tipos, assinale quais os tipos de operadores corretos: Operadores Aritméticos

C

Operadores Reais

I

Operadores Animais

I

Operadores Lógicos

C

Operadores Ocupacionais

I

Operadores Numéricos

I

10. Complete o seguinte quadro com alguns dos símbolos utilizados nos fluxogramas: Símbolo Significado Exemplo

209


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Decisão condicional x > 45?

Entrada/Saída Entrar X

Fim

Processamento geral

em

Início/Fim processamento

de

Continua acima

na

210

y = sin(x)

Início página


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

9.8. Engenharia de Processamento Digital II – Teste 6 de 7 - C 1. Avaliar as seguintes expressões 8*(7/8)-8*7/8 = -7 8*6/4-5*7/5 = 0 13/4/4*4-13*4/4/4 = -3

12/3*3-10/4*4 = 4

2. Considerando que todas as variáveis são inteiras, colocar os valores que serão impressos no Console. a=60;b=0; a=100;i=4;s=0; while(a){b+=a%2;a--;};cout<<b; while(i--){s+=a;a-=10;}cout<<s; 30 a=1;b=9;k=0; while(a++<--b)k++; cout<<k;

340 a=9; if(a<3)cout<<1; else if (a<7)cout<<2; else if(a<9)cout<<3; else cout<<4;

4

4 3. Desenhar um fluxograma e um programa que implemente a entrada de n números definidos pelo usuário e que calcule a soma dos valores que possuem como dígito menos significativo o número 3.

211


L

U

I

S

F

E

R

N

A

N

D

E

O

S

P

I

N

O

S

C

A

O

C

I

A

N

Início

Entra com o número

número == 0?

S

Imprime soma

N

Fim Converter para string

A última posição da string é '3'?

N

S

soma += número

#include <iostream.h> #include <vcl.h> //--------------------------------------------------------------------------int main(int argc, char* argv[]) { int soma = 0, numero; AnsiString ASNumero; char *cNumero; do{ cout << "Numero: "; cin >> numero; cout << endl; ASNumero = numero; cNumero = ASNumero.AnsiLastChar(); if (*cNumero == '3'){ soma+=numero; } } while (numero); cout << "Soma dos divisíveis por 5: " << soma; return 0; } //---------------------------------------------------------------------------

212


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

4. Completar os passos para a solução de um problema de processamento digital. a. Identificação do problema b. Determinar o que é requerido para a solução c. Representar a solução na forma de um diagrama lógico d. Executar o planejado e. Analisar a solução implementada f. Documentar os resultados

5. Para cada questão, assinale a resposta correta: a. Um algoritmo pode ser definido como: v. Uma seqüência infinita e ordenada de ações que não conduzem à resolução de um problema; vi. Um conjunto de instruções destinadas a serem processadas num sistema informático; vii. Uma seqüência finita e ordenada de ações que conduzem à resolução de um problema; viii. Um programa de computador para resolver um problema. b. Como se pode definir programa de computador? i. Um programa de computador pode ser um algoritmo; ii. Um programa de computador pode ser definido como um conjunto de caracteres que é reconhecido pelo computador; iii. Um programa programação.

de

computador

é

uma

linguagem

de

iv. Um programa de computador pode ser definido simplesmente como um conjunto de instruções destinadas a serem processadas num sistema informático; 6. Complete as seguintes frases: a. Os números ____float_____ podem ser positivos, __negativos__ ou _____zero_____ e possuem sempre um componente decimal. b. Um objeto do tipo ___char_______ consome apenas um Byte de memória e só armazena um caractere. c. Os objetos declarados como do tipo _____bool______ só poderão assumir uma entre duas possibilidades (verdadeiro ou falso). 7. Quais dos seguintes identificadores de variáveis são corretos e quais são incorretos? a. val_7 - Correto b. parâmetro - Incorreto c. numero - Correto

213


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

d. valor$ - Incorreto e. num2 - Correto f. 8letras - Incorreto 8. Indique o resultado de x para as seguintes expressões: a. x = (3 > 6); x=0 b. x = (2 & 5) << 2;

x=0

c. x = !(-10 < 8);

x=0

d. x = (2 < -5)||(10 > 7);

x=1

e. x = (((10 / 2) % 5) > 5) && (3 < (2 % 2));

x=0

9. Os operadores dividem-se em três tipos, assinale quais os tipos de operadores corretos: Operadores Numéricos

I

Operadores Lógicos

C

Operadores Aritméticos

C

Operadores Reais

I

Operadores Animais

I

Operadores Relacionais

C

10. Complete o seguinte quadro com alguns dos símbolos utilizados nos fluxogramas: Símbolo Significado Exemplo O disco está cheio

Mensagem Entrada/Saída

Entrar X

Processamento geral

214

em y = sin(x)


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

Subrotina

D

I

G

I

T

A

L

I I

Calcula Diferenças finitas

DecisĂŁo condicional x > 45?

215


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

9.9. Engenharia de Processamento Digital II – Teste 7 de 7 SOBRE C++ 1. Um programa sempre tem

Uma instrução cout. Uma função main.

Um laço. Uma expressão aritmética

2. Qual dos seguintes comandos não constrói uma iteração (i.e. laço)?

if.

while.

for.

do.

3. Em uma declaração while:



Se a expressão de teste for inicialmente false então a ação do bloco nunca será executada

A ação sempre será executada uma vez. Se o teste da expressão for inicialmente true então a ação do bloco será executada. Se a expressão de teste for inicialmente true então as ações do bloco serão executadas apenas uma vez

4. Uma função que não retorna nenhum valor possui o indicador de tipo:

int

main

void

extern

5. Uma variável tem escopo local se ela for:

declarada fora da função main declarada dentro de um bloco declarada pela diretiva include declarada duas vezes 6. Quantas vezes será executada a ação de saída de dados do laço a seguir? for(int i = 0; i < 10; i++)

216


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

for(int j = 0; j < 2; j++) for(int k = j; k < 2; k++) cout << "Quantas vezes?" << endl;

20

30

40

60

7. Um protótipo para uma função “F” que pega um valor de ponto flutuante de dupla precisão “x” como parâmetro e retorna o valor “a” do mesmo tipo é:

void F(float x; return float); double F(x);

float F(float x); double F(double x);

8. O que acontece no seguinte laço? for (int n = 1; n > 0; n = n*10) cout << " n is: " << n << endl;

O laço nunca termina e imprime valores de n cada vez maiores. O laço nunca termina e imprime o mesmo valor n uma e outra vez. O laço nunca termina e não imprime nada. O laço termina quando n dá overflow; alguns valores de n são impressos. 9. Quais os valores serão impressos (na ordem) pelo seguinte trecho de código? #include <iostream.h> int counter = 10; void f() { ++counter; } void g() { f(); f(); } int main() { f(); cout << counter << " "; g(); cout << counter << " "; return 0; }

10 10.

10 11

10 12

11 13

Suponha que um programa em C++ contenha a declaração "x = &y;".

Que combinação de declarações pode fazer desta ser uma declaração legal?

double double 11.

x; double y; x; double* y;

double* x; double  Nenhuma delas.

y;

Suponha que um programa em C contenha a declaração "*A = B;".

Qual é a descrição mais exata da operação desta declaração?

217


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

O ponteiro A igual a B. O ponteiro A é igual ao endereço de B. O endereço de A aponta para o valor corrente armazenado em B. O valor de A é substituído pelo valor de B. 12.

Qual das seguintes expressões em C++ é a correta avaliação da

tangente de um ângulo x?

tangent(x). tanh(x). 13.

tangent (x). tan(x).

O que imprime este programa?

#include <iostream.h> void special (int a, int b) { a = 10; b = 20; return; } int main () { int i = 1; int j = 2; special (i, j); cout << "i = " << i << " j = " << j << endl; return 0; }

i = 1 j = 2 i = 10 j = 22 14.

i = 10 j = 20 Nenhuma das alternativas acima.

Que valor de i é impresso pelo seguinte código?

int main( ){ int i, v[30]; for (int j=0; j < 30; j++) { v[j] = j; } i = 5; i = v[i++]; cout << "i = " << i << endl; }

5. 15.

6.

29.

30.

No seguinte segmento de código A, B, C e D são objetos bool. Quais

são valores de A, B, C e D para que o programa imprima “2”? if (A && B) if (!C || !D) cout << "1" << endl; else cout << "2" << endl; else cout << "3" << endl;

A: true B: true C: true D: true A: false B: true C: false D: true

A: false A: false 218

B: false C: false D: true B: false C: true D: true


E

N

G

16.

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

O seguinte segmento de código pode mostrar a soma dos inteiros

ímpares na faixa de 1 a n. O que deve ser colocado na expressão if para que esta tarefa seja corretamente executada? int Sum = 0; for(int i = 1; i <= n; ++i) { if(????) Sum = Sum + i; } cout << Sum << endl;

i%2 == 1 17.

i/2 == 0

i%2 == 0

n/2 == 0

O seguinte segmento de código compila. De qualquer forma,

provavelmente ele possui um erro de programação. Qual é o erro? if(i = ListSize) cout << "Tudo feito" << endl;

i foi declarada com tipo float. Valor de ListSize é indefinido. Valor de ListSize possui um valor inicial errado. "=" não é o operador correto de comparação. 18.

Uma função recursiva:

chama a si mesma. é uma função da biblioteca. 19.

não termina. é incluída como in-line no código executável.

Qual dos seguintes itens se refere a tipos declarados em tempo de

compilação?

Diretivas de pré-compilação Tipo static Alocação Dinâmica Tipo dynamic 20.

Considerar o seguinte programa em C++.

#include <iostream.h> class counter { private: int v; public: counter() {v = 0;} int count() {return v;} void incr_count(){v++;} }; void main(){ counter c1, c2; c1.incr_count(); c2.incr_count(); c2.incr_count();

219


L

U

I

F

S

E

R

N

A

N

D

O

E

S

cout << “\tc1 = " << cout << “\tc2 = " << cout << endl;

P

I

N

O

S

C

A

O

C

I

A

N

c1.count(); c2.count();

}

Para este programa a saída deverá ser:

c1 = 1 21.

c2 = 1

c1 = 2

c2 = 2

c1 = 1

c2 = 2

c1 = 2

c2 = 1

No programa acima o papel do código na linha após a palavra

“public” é:

Uma função sem argumentos que pode ser chamada para setar o valor de count para

0.

Um construtor, atribuindo automaticamente valores a objetos do tipo counter. É de fato um erro, já que a função counter() tem o mesmo nome que a classe. Nenhuma das alternativas acima. 22.

Assuma que “year” é uma variável inteira. Uma expressão booleana

que é verdadeira se e somente se o valor do ano estiver na faixa de 1900 a 1999 é:

 ((year == 1900) && (year == 1999))  ((year > 1900) && (year < 1999))

 ((year == 1900) || (year == 1999))  Nenhuma das alternativas.

SOBRE POO 23.

No modelo da programação orientada a objetos existem elementos

principais e secundários. Qual declaração a seguir é verdadeira?

Abstração, Encapsulamento e Persistência são os elementos principais. Hierarquia, Concorrência e Tipagem são os elementos principais. Abstração, Encapsulamento e Hierarquia são os elementos principais. Tipagem é o elemento principal. 24.

Qual dos seguintes itens não faz parte da POO?

Multitarefa Polimorfismo

Encapsular das informações Checagem de tipos 220


E

N

G

25.

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

A programação sem heranças:

é uma programação com tipos abstratos de dados não é orientada a objetos. pode ser orientada a objetos. nenhuma das alternativas acima. 26.

Qual dos seguintes termos pode ser relacionado com polimorfismo?

Alocação estática. Enlace dinâmico. 27.

Uso do tipo static. Alocação dinâmica.

A permissão de acesso a um objeto somente através das suas

funções membro enquanto mantém os seus detalhes privados é chamado de:

ocultar informações. modularidade 28.

O conceito de derivação de classes envolve:

herança. esconder dados. 29.

encapsulamento. herança encapsulamento. tipos abstratos de dados.

Qual das seguintes declarações é verdadeira em C++?

Um objeto pode ser uma classe. Uma classe pode ser um objeto Uma classe deve ter pelo menos uma função membro. Se o construtor de uma classe não for especificado será usado o construtor

default.

30.

Uma função membro:

é sempre public. pode ser public ou private.

é sempre private não pode ser definida. 221


L

U

I

31.

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

A Herança é uma forma de:

organizar dados. passar argumento para objetos de classes. adicionar características de classes existentes sem ter que re-escrevê-las. melhorar a proteção dos dados e o encapsulamento. 32.

Considerar o seguinte programa:

#include<iostream.h> class base { private: int x; public: void setx(int n) {x = n;} void showx() {cout << x;} }; class herdeira: public base{ int y; public: void sety(int n) {y = n;} void showy() {cout << y;} }; int main() { herdeira obj; obj.setx(10); obj.sety(23); obj.x = 12; obj.showx(); obj.showy(); return 0; }

O programa acima apresenta um erro. O erro é devido à linha de código:

obj.setx(10); 33.

obj.showx();

obj.x = 12;

Considerar o seguinte programa:

#include<iostream.h> class Rocket { private: int a, b; public: void setnum(int i, int j) {a = i; b = j;} void shownum() {cout << a << " " << b;} }; class Spaceship { private: int a, b; public: void setnum(int i, int j) {a = i; b = j;} void shownum() {cout << a << " " << b;} }; int main() { Rocket obj1; Spaceship obj2; obj1.setnum(3,4); obj2 = obj1; obj1.shownum(); obj2.shownum(); return 0;

222

Não há erro.


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

}

O programa acima apresenta um erro. A razão para este erro é:

duas classes não podem ter as mesmas variáveis. duas classes não podem ter métodos com nomes iguais. objetos de tipos diferentes não podem ser usados com o operador de atribuição. duas classes que executam as mesmas funções não podem ser usadas. Na POO os dados e funções comuns a todos os objetos de certo tipo são definidos em:

uma classe. 34.

um método.

uma variável.

uma função.

Considerar o seguinte segmento de programa:

#include<iostream.h> class A { public: A() {cout << ~A() {cout << }; class B: public A { public: B() {cout << ~B() {cout << }; int main() { B obj; return 0; }

"Construindo A ";} "Destruindo A ";}

" Construindo B ";} " Destruindo B ";}

A saída do programa deverá ser:

 Construindo A Destruindo A Construindo B Destruindo B  Construindo A Construindo B Destruindo A D Destruindo B  Construindo A Construindo B Destruindo B Destruindo A  Construindo B Construindo A Destruindo A Destruindo B 35.

Uma variável declarada dentro de uma função membro:

não pode ter o mesmo nome que uma variável especificada como public. é parte do estado de um objeto. é alocada em tempo de compilação. Nenhuma das alternativas acima. 223


L

U

I

36.

F

S

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Para poder acessar dados de uma classe base a partir da função

membro de uma classe derivada, os dados da classe base devem ser:

public protected 37.

default public ou protected

Qual é a diferença entre private e protected?



Os membros privados não podem ser acessados pelas classes derivadas, entretanto os membros protected sim.



Os membros protected de uma classe base podem ser acessados de outras classes que incluem a classe base como friend, mas os membros privados não.

Os membros private e protected podem ser ambos acessados a partir da classe derivada.

Os membros protected não podem ser acessados pelas classes derivadas, mas os membros private sim.

38.

As classes com métodos que são criados mas não implementados são

chamadas de:

 classes virtuais.  classes abstratas. 39.

classes amigas (friend).  classes base.

Assumindo a classe com objetos obj1, obj2 e obj3. Para a declaração

obj3 = obj1 – obj2; funcionar corretamente, o operador sobrecarregado de subtração deve:

pegar dois argumentos. criar um objeto temporário. 40.

retornar um valor. ser declarado como protected.

Considerar o caso quando a palavra-chave de acesso (i.e. public,

protected ou private) não for especificada na declaração da classe base. Qual é o resultado do acesso default das variáveis e funções membro na classe derivada?

As variáveis são private e as funções membro são public. As variáveis e funções membro são public. 224


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

 As variáveis e funções membro são private. A classe base não irá compilar. 41.

Considerar o seguinte programa:

#include <iostream.h> class Gato { public: void show() {cout << “\nEsta é a classe Gato”;} }; class Peixe { public: void show() {cout << “\nEsta é a classe Peixe”;} }; class GatoPeixe: public Gato, public Peixe{ }; int main(){ GatoPeixe Obj; Obj.show(); return 0; }

Qual das seguintes declarações abaixo é verdadeira para o programa acima?

O programa irá compilar e executar. A classe GatoPeixe é indefinida. O programa resultará em erros de compilação porque a linha Obj.show(); é

ambígua.

Nenhuma das alternativas acima. 42.

Qual das seguintes declarações é verdadeira para o programa

anterior?

O contexto aqui é herança múltipla de forma que o programa é válido. O programa não está correto e pode ser remediado re-escrevendo Obj.show()

como Obj.Gato::show() ou Obj.Peixe::show() na função main.

A única forma de contornar o erro (se houver) é renomear as funções.  Nenhuma das alternativas acima. 43.

Considerar o seguinte programa:

#include<iostream.h> class XYZ { private: int value; public: XYZ() {value = 0;} XYZ(int i = 0) {value = i;} };

225


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

int main() { XYZ obj; }

No programa acima:

Será invocado o construtor que não possui argumentos. Será invocado o construtor que possui um argumento. O compilador gerará um erro. Não será invocado nenhum dos construtores. 44.

Considerar o seguinte código:

class A { public: int x; A() {x = 0;} }; class B : public A { }; class C : public A { }; class D : public C, public B { }; int main () { D obj; }

Há um erro de pontuação. Duas classes não podem derivar da mesma classe base. Não são permitidas classes vazias. O programa é trivial, mas está correto.

226


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

10. Circuito RL - Tutorial Para o circuito RL da figura abaixo faça um programa em Builder C++ que mostre o gráfico da tensão de alimentação e da corrente elétrica no circuito. O programa deve permitir a inserção dos valores da resistência e de indutância. A fonte de alimentação é a rede elétrica em 220Vrms, e também deve ser desenhada. Usar como unidade de tempo de cálculo 1 ms e corrente i[t=0] = 0. Alocar dinamicamente a memória para dados para poder desenhar 4 ciclos da tensão de alimentação. A interface é definida a seguir.

di (t ) + R ⋅ i (t ) = V (t ) dt onde di (t ) i[∆t + 1] − i[∆t ] = ∆t dt L

227


L

U

I

S

F

E

R

10.1.

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Tutorial

A metodologia de solução pode ser definida em cinco etapas principais: a identificação do problema, a definição da

interface, os fluxogramas, a

programação (algoritmos) e a documentação.

10.2. Etapa 1 – Definição do Problema Qual é o problema (?): Mostrar a corrente e a tensão do circuito RL para os parâmetros de R e L definidos pelo usuário.

10.3.

Etapa 2 - A Interface Visual

Determinar a interface (já feita na descrição do exercício). Para desenhar a interface abra o Builder C++ e usando a opção de menu File + New Application. A seguir usar a opção File + Save Project As... Procure uma pasta principal onde serão armazenados os seus projetos de software. Usar o ícone Create New Folder para criar uma nova pasta com o nome de RL.

Dentro da pasta RL salve os arquivos Unit1.cpp e altere o Project1.bpr para RL.bpr.

228


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

Nesta fase você terá todos os arquivos principais referentes a este projeto numa única pasta. O Form1 ainda estará vazio. A seguir deve começar a se inserir os objetos visuais da VCL necessários para a solução do problema. Começando pela criação de um objeto da classe TMainMenu da paleta Standard.

Clicar duas vezes no objeto TMainMenu para definir os menus Arquivo e Ajuda, de acordo com o exercício.

229


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

Pode-se escrever diretamente o texto que irá aparecer na parte principal do menu. A parte principal do menu são objetos da classe TMenuItem e a propriedade Caption é a que aparecerá.

A seguir insira dois objetos TEdit, quatro TLabel e dois TButton da paleta Standard. Da paleta Additional inserir um objeto TImage e um TChart.

230


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

Ainda na edição da interface visual, altere as seguintes propriedades iniciais dos objetos na barra Object Inspector: Label1->Caption: Resistência Label2->Caption: Indutância Label3->Caption: W Label3->Font->Name: Symbol Label3->Caption: H Button1->Caption: Calcular Button2->Caption: Apagar Edit1->Text: 0 Edit2->Text: 0 Form1->Caption: Circuito RL

231


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Para inserir uma imagem no objeto TImage, selecionar a propriedade Image1->Picture e clicar nas reticências (...), que abrirá a janela de inserção. Esta propriedade está associada a um objeto do tipo TBitmap.

O botão Load serve para carregar um objeto TBitmap de um arquivo gráfico (bmp, jpg, gif, etc.) e associá-lo objeto do tipo TImage.

232


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

A seguir prepararemos o objeto do tipo TChart. Este objeto funciona relacionado com objetos do tipo TSeries. Os objetos TChart servem para mostrar gráficos e os objetos TSeries para armazenar dados do tipo x-y que podem ser desenhados num gráfico TChart. Neste exercício devem ser mostrados os valores de tensão de alimentação e a corrente do circuito, portanto serão necessárias dois objetos do tipo TSeries. Para inserir os objetos clicar duas vezes o objeto do tipo TChart.

A seguir, selecione o botão Add… para inserir um objeto TSeries.

233


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Tirar a seleção do item 3D.

Selecionar Line e pressione o botão OK e voilá!

Proceda da mesma forma para inserir o segundo objeto do tipo TSeries.

234


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

Para alterar o tĂ­tulo do objeto TChart selecione a aba Titles.

Alterar o texto onde diz TChart para Circuito RL.

235


L

U

I

F

S

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Para finalizar esta etapa, pressionar o botão Close. Foi alterada a propriedade, e o fundo branco do objeto TBitmap passou a ter a mesma cor da janela. Alterar as seguintes propriedades dos objetos: Image1->Transparent: true Series1->Title: Tensão Series2->Title: Corrente Com isto a janela de interface visual está praticamente pronta.

Neste ponto a interface visual já está criada. Não se esqueça de salvar o seu trabalho usando a o ícone Save All (Shift+Ctrl+S). Neste exercício a interface visual já foi projetada. No caso em que se deva definir a interface, faça isto seguindo os seguintes preceitos: 1.

A interface visual deve ser o mais simples possível para o usuário. 13. A interface visual deve conter o menor número de elementos. 14. A interface visual deve esperar o menor número de entradas e oferecer o menor número de saídas (dentro do necessário, é claro). 15. A sua avó deve ser capaz de usar o programa.

O primeiro passo para a criação de uma janela é a definição de entradas e saídas visuais. Para este exemplo:

236


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

Entradas: Valores de resistência e indutância elétricas. Botões de comando: Calcular e Apagar. As entradas de menu não foram especificadas na definição do exercício. As entradas podem se dar por eventos tais como o clique do mouse ou a alteração do campo Edit. Saídas: Gráficos da tensão e corrente na fonte de alimentação no tempo.

10.4.

Etapa 3 – Fluxogramas

Com o problema estabelecido e a interface visual bem definida, devem ser elaborados os fluxogramas de funcionamento do software. Os programas visuais precisam de eventos (interrupções) gerados pelo usuário ou pelo hardware. Por exemplo, para o evento do clique no botão Calcular: OnClick do botão Calcular

Limpar o gráfico

Valores de entrada válidos ?

N Mensagem de erro

S

Calcular o vetor de tensões

Calcular o vetor de correntes

Desenhar

Volta à interface principal

237


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

Neste nível de detalhamento existem ainda duas sub-rotinas para o cálculo das tensões e correntes do circuito que devem ser mais bem detalhados. Também aqui não foi detalhada a alocação dinâmica de memória e a posterior liberação do espaço após o seu uso. A seguir devemos definir as principais variáveis necessárias para o funcionamento do programa, além daquelas variáveis visuais que já foram inseridas. Precisa-se de vetores para as variáveis: tempo, tensão e corrente. O número de posições é definido no problema: 4 ciclos da rede elétrica a 60Hz com 1ms de resolução. Cada ciclo de 60Hz resulta num período de 16,66 ms. Podemos arredondar para 17 ms o que daria 17 posições de vetor para cada ciclo, resultando em 68 posições (17 x 4). O fluxograma para o cálculo das tensões de alimentação no tempo é: Calcular as tensões

Início

t= 0

N Fim da sub-rotina

t < 68

S tempo[t] = t/1000.0

t   v[t ] = 220 ⋅ 2 ⋅ sen 2 ⋅ π ⋅ 60 ⋅  1000  

t ++

Para o cálculo da corrente deve se estabelecer o algoritmo correto. Para o circuito RL pela Lei de Kirchhoff das tensões sabe-se que para valores finitos de L e incrementos infinitesimais de tempo dt:

238


E

N

G

E

N

L

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

di (t ) + R ⋅ i (t ) = v(t ) dt

Se porventura o valor de L for igual a zero:

R ⋅ i (t ) = v(t ) Nos sistemas computacionais discretos é inviável o uso de incrementos infinitesimais de tempo. No nosso problema o nosso dt se transforma num ∆t com valor igual a 1ms.

di (t ) A relação de derivada infinitesimal dt pode-se transformar usando uma

di (t ) i[t ] − i[t − 1] ≈ ∆t aproximação dt onde i[t] é o próximo valor da corrente a ser calculada. Para valores de L ≠ 0 usando um pouco de álgebra, pode-se definir os valores de i[t] da seguinte forma:

L

i[t ] − i[t − 1] + R ⋅ i[t ] = v[t ] ∆t

Dividindo tudo por L e multiplicando tudo por ∆t tem-se:

i[t ] − i[t − 1] +

R v[t ] ⋅ ∆t ⋅ i[t ] ⋅ ∆t = L L

Onde a variável a ser calculada é i[t]. O valor inicial i[t=0] é zero ampères. Isolando i[t] tem-se:

i[t ] +

R v[t ] ⋅ ∆t ⋅ i[t ] ⋅ ∆t = i[t − 1] + L L

Ou:

v[t ] ⋅ ∆t  R  i[t ]1 + ⋅ ∆t  = i[t − 1] + L L   Finalmente:

i[t ] =

v[t ] ⋅ ∆t L  R   1 + ⋅ ∆t  L  

i[t − 1] +

239


L

U

I

S

F

E

R

N

A

N

D

E

O

S

P

I

N

O

S

A

C

O

C

I

A

N

Este algoritmo pode ser usado somente no caso de L ≠ 0 H e qualquer valor de R inclusive 0Ω; No caso de L = 0 H (e R ≠ 0 Ω) o algoritmo de cálculo se resume a

i[t ] =

v[t ] R Calcular as correntes

Início

t=1

t < 68

S N L == 0 ?

i[t ] =

S

v[t ] ⋅ ∆t L R   1 + ⋅ ∆t  L  

i[t − 1] +

S R == 0 ?

Mensagem de Erro por curto-circuito

N

i[t ] =

v[t ] R

Fim da sub-rotina t ++

10.5.

Etapa 4 – A Programação

Com os fluxogramas bem desenvolvidos o próximo passo é a escolha da linguagem de programação e do compilador. A escolha deve levar em conta as habilidades do programador, a praticidade, disponibilidade, sistema operacional e plataforma de hardware.

240


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

No nosso caso escolheremos a linguagem C++ e o compilador Borland Builder C++ 5.0 para criar um programa que possa ser executado em uma máquina 80x86 com sistema operacional Microsoft Windows XP. Com estas escolhas podemos começar com a programação. O evento inicial pode ser definido como o evento OnClick do botão Calcular. Clicando duas vezes no botão no Form1 o Builder C++ inclui uma rotina de atendimento a esse evento. //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) {

} //---------------------------------------------------------------------------

Dentro desta função podemos colocar o código que calcula a tensão e a corrente, e ainda o desenho do gráfico. Para poder usar as funções matemáticas inclua uma linha com: #include <math.h> //--------------------------------------------------------------------------#include <vcl.h> #include <math.h> // inclui as funções da biblioteca de matemática. #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------------------

Altere a função do evento do Botão para o código feito de acordo com o fluxograma para o cálculo da tensão da fonte de alimentação: //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { float *fTensao = new float [68]; float *fCorrente = new float [68]; float *fTempo = new float [68]; // calcula as tensões e tempos for (unsigned int t = 0; t<68 ; t++){ fTempo[t] = t/1000.0; // armazena o tempo em ms fTensao[t]= 220.0 * sqrt(2.0) * sin(2*M_PI*60*fTempo[t]); Series1->AddXY(fTempo[t],fTensao[t],"",clRed); // Carrega a serie de // tensão e desenha } delete [] fTensao; delete [] fCorrente;

241


L

U

I

F

S

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

delete [] fTempo; } //---------------------------------------------------------------------------

Executando o programa aparecerá desenhada a onda da tensão.

A seguir o cálculo da corrente. Como se pode observar no fluxograma, a corrente depende dos valores de R e L. Deve se verificar se os valores colocados são válidos (números) ou zero. //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { float *fTensao = new float [68]; float *fCorrente = new float [68]; float *fTempo = new float [68]; float fResistencia, fIndutancia;

Series1->Clear(); Series2->Clear(); // calcula as tensões e tempos for (unsigned int t = 0; t<68 ; t++){ fTempo[t] = t/1000.0; // armazena o tempo em ms fTensao[t]= 220.0 * sqrt(2.0) * sin(2*M_PI*60*fTempo[t]); // Carrega a serie de tensão e desenha Series1->AddXY(fTempo[t],fTensao[t],"",clRed); }

try

// verifica se o valor colocado para R é um número.

{ fResistencia = Edit1->Text.ToDouble();

242


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

} catch(...) { MessageDlg("O valor de R deve ser numérico", mtError, TMsgDlgButtons() << mbOK, 0); delete [] fTensao; delete [] fCorrente; delete [] fTempo; return; }

try

// verifica se o valor colocado para L é um número.

{ fIndutancia = Edit2->Text.ToDouble(); } catch(...) { MessageDlg("O valor de L deve ser numérico", mtError, TMsgDlgButtons() << mbOK, 0); delete [] fTensao; delete [] fCorrente; delete [] fTempo; return; } // cálculo da corrente para L = 0 if(fIndutancia == 0){ // verifica se o valor de R é zero (com L = 0); if( (fResistencia < 0.001)){ MessageDlg("Curto-circuito", mtError, TMsgDlgButtons() << mbOK, 0); delete [] fTensao; delete [] fCorrente; delete [] fTempo; return; } // se o valor de R não for zero e L = 0; else{ for (unsigned int t = 0; t<68 ; t++){ fCorrente[t]= fTensao[t]/fResistencia; } } } // se o valor de L for diferente de zero...(independente do valor de R) else { fCorrente[0] = 0.0; fTempo[0] = 0.0; for (unsigned int t = 1; t<68 ; t++){ // observe que t começa em 1 e não em zero. fCorrente[t] = (fCorrente[t-1] + fTensao[t] * 0.001 / fIndutancia) / (1+(fResistencia/fIndutancia)*0.001);

243


L

U

I

F

S

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

} } // Desenha o gráfico da corrente for (unsigned int t = 0; t<68 ; t++){ // Carrega a serie de tensão e desenha Series2->AddXY(fTempo[t],fCorrente[t],"",clBlue); } delete [] fTensao; delete [] fCorrente; delete [] fTempo; } //---------------------------------------------------------------------------

Executando o programa acima temos:

No gráfico pode se observar que a corrente é sempre positiva. Isto é devido ao transitório que ocorre na hora do fechamento da chave.

10.6.

Exercícios

Coloque mais um objeto Edit que permita selecionar o ∆t (número de pontos). Colocar mais um objeto Edit que permita selecionar o tempo total do gráfico (número de pontos). Colocar um objeto RadioGroup (Standard) que permita plotar a corrente em [A] ou [mA].

244


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

Crie a opção Salvar no menu Arquivo e implemente as rotinas para salvar em formato texto usando o objeto SaveDialog (Dialogs). Salvar os pontos de tempo, tensão e corrente em três colunas. Crie a opção Abrir no menu Arquivo e implemente as rotinas para ler o arquivo no mesmo formato que foi salvo usando o objeto OpenDialog (Dialogs) e desenhar os gráficos. Criar a opção Imprimir no menu Arquivo e implementar a rotina de impressão. Colocar

um

objeto

RadioGroup

(Standard)

alimentação como uma onda senoidal ou quadrada.

245

que

permita

selecionar

a


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

C

A

O

C

I

A

N

11. Considerações Finais Os engenheiros devem analisar e resolver uma grande faixa de problemas técnicos. Alguns desses problemas podem ser simples e de única solução, enquanto que outros podem não ter solução conhecida requerendo de uma equipe de engenheiros de várias especialidades. Muitos dos problemas de engenharia podem não ter solução clara. A maioria dos problemas tem mais de uma solução, de forma que o programador deverá baseado na sua experiência tentar adquirir o conhecimento e o entendimento do problema para produzir a solução que resolve o problema de forma mais eficiente. A solução de problemas é uma arte na qual o engenheiro sintetiza a sua única solução. O foco desta disciplina é a de resolver problemas que fazem o melhor uso da programação de computadores.

246


E

N

G

E

N

H

A

R

I

A

D

E

P

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

12. Bibliografia Básica DEITEL, P. C++ How to Program (5th Edition): Prentice Hall, 2005. KAISER, R. C++ with Borland C++Builder: An Introduction to the ANSI/ISO Standard and Object-Oriented Windows Programming: Springer; 1 ed., 2004. COCIAN, L.F. – Manual da Linguagem C – Ed. Ulbra. Canoas, Brasil. 2004

Complementar MANZANO, J.A. C++: Programação de Computadores. São Paulo: Érica, 2003. MONTENEGRO, F. Orientação a objetos em c++ .Rio de Janeiro: Ciência Moderna, 1994. 394 p. KLANDER, L.; SANTOS, J.R. Programando em C/C++ "a bíblia" o melhor guia para a programação em C/C++ . São Paulo: Makron, 1999. 1012p.

247


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

13. Anexos - Notação Húngara A Notação húngara, criada por Charles Simonyi, visa a facilitar o reconhecimento do tipo de variável em um programa. O nome foi dado a partir de uma brincadeira comum entre aqueles primeiros a conhecer a notação e a achavam estranha, fazendo o seguinte comentário: "É tão estranho que até parece húngaro". Quando se confronta com a necessidade de dar um novo nome a uma variável em um programa, o programador deve tomar alguns cuidados no tomar esta decisão:  Nome mnemônico - é aquele que facilita a lembrança do significado pelo programador;  Nome sugestivo - é aquele em que outros podem ler o código;  Formato - é sempre visto como uma idéia estética, tendo sempre uma informação eficiente do programa teste;  Velocidade de decisão - não se pode perder muito tempo para ponderar um simples nome, pois não haverá tempo para editar e digitar nomes de variáveis longos.

A adoção deste critério de nomeação é bastante prática e intuitiva, sendo a idéia básica nomear todos os tipos de quantidades, visando-se a simplificar o entendimento do programa. Algumas vantagens deste método:  Os nomes em mnemônicos são utilizados num senso muito específico. Se alguém se lembrar da quantidade ou como os nomes foram contruídos através de outros tipos, o nome poderá ser lido facilmente.  Os nomes sugestivos são muito bons. É capaz de se mapear qualquer nome dentro do seu tipo, tendo as informações necessárias para construir sua interface e utilizar de maneira correta sua quantidade.  Os nomes devem ser consistentes, porque eles são construídos pelas mesmas regras.  A decisão por um nome deve ser mecânica e rápida.  As expressões nos programas devem ser sugestivas, facilitando a leitura e acompanhamento do programa.

Com o objetivo de fazer listas intuitivas de se ler, os programas baseados na plataforma Windows utilizam a Notação húngara para gerar estas listas. As regras para se utilizar a Notação húngara são:  Os tipos definidos e/ou criados devem aparecer em letras maiúsculas;  Constantes e "Macros" que vêm definidas em arquivos inclusos aparecem também em letras maiúsculas;  Funções e nomes estruturados começam com letras maiúsculas. Nenhuma marca abaixo são utilizadas para nomes, exceto para os casos que se encontrem nas duas regras anteriores;

248


E

N

G

E

N

H

A

R

I

A

D

P

E

R

O

C

E

S

S

A

M

E

N

T

O

D

I

G

I

T

A

L

I I

 Nomes de objetos começam com uma ou mais letras maiúsculas, indicando o tipo do objeto.

A tabela abaixo indica os tipos de indicadores mais utilizados na Notação húngara: Nome

Descrição

s

String

a

Array (matriz)

sz

String terminada em zero

h

handle (manipulador)

msg

Message

m_

Membro de uma classe

fn

Ponteiro para função

c

char (8 bits)

by

Byte - unsigned char (8 bits)

n

short ou int (inteiro)

b

Boolean (verdadeiro ou falso) - inteiro

f

float

d

double

u

Inteiro sem sinal

w

Word (sem sinal)

l

long int (32 bits)

p

Ponteiro

dw

unsigned long int (dword - 32 bits)

249


L

U

I

S

F

E

R

N

A

N

D

O

E

S

P

I

N

O

S

A

C

O

C

I

A

N

14. Anexos - Slides ENGENHARIA ELĂ&#x2030;TRICA

LAFUN - UFRGS - UFRGS LAFUN

Universidade Federal do Rio Grande do Sul

Eng. Eletr. Eletr. Prof. Luis Fernando Espinosa Cocian, ME cocian@terra.com.br direngeletrica@ulbra.br

250


09-Exercícios-C++BuilderV10