RESPOSTAS – LISTA 5
Considerando que a classe lista_05, apresentada abaixo, tenha sua definição e sua
implementação salvas em um arquivo separado chamado lista_05.cpp. Desse modo, a inclusão de
#include "lista_05.cpp" irá incluir o código salvo em lista_05.cpp no arquivo do programa ao qual a
inclusão foi realizada. Para que isto funcione, lista_05.cpp deve estar no mesmo diretório do
programa no qual a inclusão foi realizada. (isto irá poupar espaço para os exercícios que virão).
class lista_05 { private: int num01; protected: int num02; int num03; public: string nome;lista_05(void) { num01 = num02 = num03 = 0; }
lista_05 (int a, int b, int c) { num01 = a; num02 = b; num03 = c; } void set01(int a) { num01 = a; }
void set02(int a) { num02 = a; } void set03(int a) { num03 = a; } void imprime(void)
{
cout << "Nome: "<< nome; cout << " N01: " << num01; cout << " N02: " << num02;
cout << " N03: " << num03 << endl; }
friend lista_05 operator+(lista_05 var01, lista_05 var02) {
lista_05 temp; temp.nome = "SOMA";
temp.num01 = var01.num01 + var02.num01; temp.num02 = var01.num02 + var02.num02; temp.num03 = var01.num03 + var02.num03; return temp;
}
friend lista_05 operator+(int var01, lista_05 var02) {
lista_05 temp;
temp.nome = "SOMA int obj"; temp.num01 = var01 + var02.num01; temp.num02 = var01 + var02.num02; temp.num03 = var01 + var02.num03; return temp;
}
friend lista_05 operator+(lista_05 var01, int var02) {
lista_05 temp;
temp.nome = "SOMA obj int"; temp.num01 = var01.num01 + var02; temp.num02 = var01.num02 + var02;
[1]
Quais programas apresentarão algum erro ao serem compilados e porque? Se os
programas não possuírem erros, qual a saída apresentada na tela?
(a)
#include <iostream>using namespace std; #include "lista_05.cpp" int main(void) { lista_05 z; z.nome = "TESTE"; z.imprime(); system("PAUSE"); return 0; }
(b)
#include <iostream> using namespace std; #include "lista_05.cpp" int main(void) {lista_05 obj1(3, 4, 5), obj2(-1, 4, -3), obj3; obj3 = obj1+obj2; obj3.imprime(); system("PAUSE"); return 0; }
(c)
#include <iostream> using namespace std; #include "lista_05.cpp" int main(void) {lista_05 obj1(3, 4, 5), obj2(-1, 4, -3), obj3; obj3 = 10+obj2; obj1 = 10+obj3; obj1.imprime(); system("PAUSE"); return 0; }
(d)
#include <iostream>using namespace std;
#include "lista_05.cpp"
int main(void) {
lista_05 obj1(3, 4, 5), obj2(-1, 4, -3), obj3; obj3 = obj2+7.5; //atenção...
obj3.imprime(); system("PAUSE"); return 0;
}
(e)
#include <iostream>using namespace std;
#include "lista_05.cpp"
class teste : public lista_05
{ public: int num04; string nome2; void imprimeTeste(void) {
cout << "Nome: "<< nome; cout << " N01: " << num01; cout << " N02: " << num02; cout << " N03: " << num03; cout << "Num04: " << num04;
cout << " Mais um nome: " << nome2 << endl; }
};
int main(void) {
teste aux;
aux.nome2 = "Complicado"; aux.num04 = 10; aux.set01(20); aux.set02(15); aux.set03(5); aux.imprimeTeste();
system("PAUSE"); return 0;
(f)
#include <iostream>using namespace std;
#include "lista_05.cpp"
class teste : public lista_05
{ public: int num04; string nome2; void imprimeTeste(void) { imprime();
cout << "Num04: " << num04;
cout << " Mais um nome: " << nome2 << endl; }
}; int main(void) {
teste aux;
aux.nome2 = "Complicado"; aux.num04 = 10; aux.set01(20); aux.set02(15); aux.set03(5); aux.imprimeTeste();
system("PAUSE"); return 0;
[2]
Escreva uma função
que realiza a leitura dos atributos da classe lista_05. Necessariamente
a função deverá receber um parâmetro de referência para um objeto da classe lista_05.
#include <iostream>using namespace std; #include "lista_05.cpp"
void leMembros(lista_05 &aux); //a função recebe parâmetro de referência... int main(void) { lista_05 obj; leMembros(obj); obj.imprime(); system("PAUSE"); return 0; }
void leMembros(lista_05 &aux) {
int a;
cout << "Digite nome: ";
fflush(stdin); //limpa buffer da entrada padrão... getline(cin, aux.nome);
cout << "Digite numero 01: "; cin >> a;
aux.set01(a);
cout << "Digite numero 02: "; cin >> a;
aux.set02(a);
cout << "Digite numero 03: "; cin >> a;
aux.set03(a); }
[3]
Escreva uma função que salva um objeto da classe lista_05 em um arquivo de texto. Tanto
o nome do arquivo como o objeto a ser salvo devem ser passados para a função como
parâmetros
.
#include <iostream> using namespace std; #include "lista_05.cpp"
bool salva(string arq, lista_05 aux); int main(void)
{
lista_05 a(7, 5, 9);
if(salva("arquivo.txt", a)) cout << "FOI" << endl; else cout << "Nao FOI\n";
system("PAUSE"); return 0;
}
bool salva(string arq, lista_05 aux) {
ofstream fluxo(arq.data(), ios::out); if(fluxo.is_open())
{
fluxo << "Nome: "<< aux.nome;
fluxo << " N01: " << aux.get01();//é necessário inserir funções de acesso fluxo << " N02: " << aux.get02();
fluxo << " N03: " << aux.get03() << endl; fluxo.close();
return true; }
else return false; }
É possível definir a função como uma função amiga da classe (friend). Desse modo, a função teria
livre acesso aos membros privados da classe.
[4]
Sobrecarregue o operador > na classe. Porém, a operação deste operador para a classe
deve retornar a diferença da soma de todos os números dos operandos. Por exemplo, se o
objeto a possuir num01 = 10, num02 = 15 e num03 = -5 e outro objeto b possuir
num01 = 5, num02 = 5 e num03 = 2, a expressão a > b deve retornar a diferença
(10+15-5) – (5+5+2).
friend int operator>(lista_05 var01, lista_05 var02) { //implementada dentro da classe lista_05
int tmp;
tmp = var01.num01 + var01.num02 + var01.num03; tmp -= var02.num01 + var02.num02 + var02.num03; return tmp;
[5]
Escreva uma função que gere um número randômico inteiro positivo ou negativo (50% de
chance de ser positivo e 50% de chance de ser negativo) de 0 até o número passado como
parâmetro da função. Por exemplo, quando a função for chamada e o parâmetro passado
para a função for 10, a função deverá gerar um número randômico entre -10 e 10,
incluindo estes. (lembre-se de incluir a biblioteca
cstdlib
para utilizar a função
rand
).
[6]
Sobrecarregue a função do exercício anterior para que a mesma gere um número em
ponto flutuante. Ao invés de passar um inteiro, deve-se passar um número
float
para a
função. O funcionamento da função é idêntico à função desenvolvida no exercício anterior.
#include <iostream>#include <cstdlib> using namespace std;
int gera_pn(int max); //versão int
float gera_pn(float max); //versão float int main(void) { int i, n = 10; float n2 = 10; cout.precision(4); for(i = 0; i < 100; i++) { cout.width(8);
cout << gera_pn(n2); //chama versão float (pois n2 é float) cout.width(8);
cout << gera_pn(n); //chama versão int (pois n é int) }
system("PAUSE"); return 0;
}
int gera_pn(int max) {
int num;
num = rand()%(max+1); if(rand()%2) return -num; return num;
}
float gera_pn(float max) {
//essa função gera um numero 100x maior e divide o número por 100... //desse modo o numero resultante terá uma parte fracionária
float num;
num = (rand()%(100*(int)max + 1))/100.0; if(rand()%2) return -num;
return num; }
[7]
Crie uma classe base que represente um conversor CC-CC genérico operando com
modulação PWM. A classe deverá possuir como atributos a frequência de chaveamento do
interruptor, a razão cíclica, a potência nominal do conversor, o seu rendimento esperado e
a tensão de entrada. Crie métodos para: Obter a potência de saída; Obter a corrente de
entrada do conversor. Escreva um método para imprimir os dados básicos do conversor na
tela.
[8]
Derive da classe base uma classe que modele o comportamento de um conversor
redutor-elevador no modo de condução contínuo. A classe deve possuir os componentes
do conversor como atributos: Indutância, Capacitância e Carga. A classe deverá possuir
uma função para calcular a tensão de saída (Vo = Vi*(D/(1-D))), bem como para calcular a
corrente de saída (utilizando a potência de saída).
#include <iostream> using namespace std; class cc_converter { public: float razao; float frequencia; float potencia; float rendimento; float tensao_entrada;
float potSaida(void) { return potencia*rendimento; } float corEntrada(void) { return potencia/tensao_entrada; } void print(void)
{
cout << "Potencia de Entrada: " << potencia << endl; cout << "Rendimento: " << rendimento << endl; cout << "Potencia de Saida: " << potSaida() << endl; cout << "Frequencia: " << frequencia << endl; cout << "Razao ciclica: " << razao << endl;
cout << "Tensao de entrada: " << tensao_entrada << endl; cout << "Corrente de entrada: " << corEntrada() << endl; }
};
class buck_boost : public cc_converter { public: float L; float C; float R; float calcTensaoSaida(void) {
return tensao_entrada*(razao/(1-razao)); } float corSaida(void) { return potSaida()/calcTensaoSaida(); } }; int main(void) { buck_boost conv; conv.frequencia = 20000; conv.tensao_entrada = 10; conv.razao = 0.8;
cout << "Tensao de saida: " << conv.calcTensaoSaida() << endl; system("PAUSE");
return 0; }