Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Toda a resolução não é única e pode não ser, digamos o mais eficiente/efetivo, por isso não pensem que com isto tirariam 20 pois eu próprio dúvido
- //1 se nao for possivel usar o string usem o char * que está em comentários
- //a
- class Veiculo
- {
- std::string matricula; //char *matricula
- std::string marca; //char *marca
- public:
- Veiculo()
- {
- matricula=""; //matricula = NULL;
- marca=""; //marca = NULL;
- }
- Veiculo(std::string mat, std::string mar) //Veiculo(char *mat, char *mar)
- {
- matricula = mat;
- marca = mar;
- }
- ~Veiculo() {}
- //b
- string GetMarca()
- {
- return marca;
- }
- string GetMatricula()
- {
- return matricula;
- }
- bool operator==(Veiculo &V)
- {
- return (matricula == V.GetMatricula() && marca == V.GetMarca()); //return (!strcmp(matricula,V.GetMatricula()) && !strcmp(marca,V.GetMarca()));
- }
- };
- //c
- //Pressupostos: Veiculo::SetMat(string mat); < muda a matricula do Veiculo;
- //Veiculo::SetMarca(string mar); < muda a marca do Veiculo;
- #include <string>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- void main()
- {
- int nv;
- cout << "Insira o número total de veiculos: " << endl;
- cin >> nv;
- Veiculo *V = new Veiculo[nv];
- string buff="";
- for(int i=0; i<nv; i++)
- {
- cout << "Insira a matricula do veiculo " << i << ": " << endl;
- cin >> buff;
- V[i].SetMat(buff);
- cout << "Insira a marca do veiculo " << i << ": " << endl;
- cin >> buff;
- V[i].SetMar(buff);
- }
- int iguais=0;
- for(int i=0; i<nv-1; i++)
- for(int n=i+1; n<nv; n++)
- if(V[i]==V[n])
- iguais++;
- cout << "Existem " << iguais << " Veiculos iguais." << endl;
- delete[] V;
- }
- //2
- Lista<ArvBin<Veiculo>> LAV;
- //3
- //a NOTA: Veiculo2 = Veiculo
- //http://i.imgur.com/PgpJIjZ.jpg
- //b
- // "Maxima Altitude" > Veiculo_Aéreo
- // "Potencia do Motor" > Veiculo
- // "Comprimento minimo da pista de descolagem" > Avião
- //4
- //Pressupostos:
- //template class NO<T> que é um nó de uma lista Lista<T>
- //data members:
- // T *info;
- // NO<T> *prox;
- //construtor do NO:
- // NO<T>(T *A = NULL, NO<T> *p = NULL); < altera o info para A e prox para p
- //funções do NO:
- // T *GetInfo(); < retorna info
- // NO<T> *GetProx(); < retorna prox
- // void SetProx(NO<T> *p); < muda o prox para p
- // void SetInfo(T *i); < muda info para i
- //data members da lista:
- // int nel; < numero de elementos da lista
- // NO<T> *inicio; < NO do inicio da lista
- void Lista<T>::InsereApos(T *A, T *B)
- {
- NO<T> *p=inicio;
- while(p)
- {
- if(p==B)
- {
- NO<T> *novo = new NO<T>(A);
- p->SetProx(novo);
- novo->SetProx(p->GetProx());
- nel++;
- return;
- }
- }
- p = new NO<T>(A);
- nel++;
- }
- //5
- void Lista<T>::Inverter()
- {
- NO<T> *n = inicio, *ant = NULL, *aux;
- while(n)
- {
- aux = n->GetProx();
- n->SetProx(ant);
- ant = n;
- n=aux;
- }
- }
- //6
- //data members da arvore:
- // Arvore<T> *esq;
- // Arvore<T> *dir;
- // T* info;
- int Arvore<T>::Contar(T *A)
- {
- if(info == A) //se for igual a A
- {
- if(esq && dir) //se for igual a A e tiver esquerda e direita
- return 1+esq.Contar(A)+dir.Contar(A);
- if(esq) //se for igual a A e tiver esquerda
- return 1+esq.Contar(A);
- if(dir)//se for igual a A e tiver direita
- return 1+dir.Contar(A);
- return 1; //se nao tiver esquerda nem direita
- }
- if(esq && dir) //se for igual a A e tiver esquerda e direita
- return esq.Contar(A)+dir.Contar(A);
- if(esq) //se for igual a A e tiver esquerda
- return esq.Contar(A);
- if(dir)//se for igual a A e tiver direita
- return dir.Contar(A);
- return 0; //se nao tiver esquerda nem direita
- }
- //7
- //sendo V um só ponteiro ao inseri-lo em 2 listas essas listas iram ter um elemento "em comum" (com o mesmo endereço)
- //o perigo é que se formos a eliminar a informação desse ponteiro numa das listas também é removido na outra e isso pode levar a erros nas listas
- //porque o ponteiro passa a apontar para NULL, ou seja deixa de conter a informação e os restantes elementos nao são alterados
- //uma solução: L1.Inserir(new Veiculo()); L2.Inserir(new Veiculo());
- //8
- //Polimorfismo é usar usar uma class base numa outra class, por exemplo criar uma class Linha com a class ponto por base.
- //Isto faz com que a "nova" class tenha um ponteiro para a class base, ou seja, essa class pode aceder às variaveis/funçoes da class base que não sejam "private" ("public"/"protected")
- //deste modo pode-se criar variáveis e/ou funções gerais para todas as classes que tenham por base uma outra class, e usar as cariáveis comums.
- //exemplo:
- class pessoa
- {
- protected:
- int NIF;
- public:
- pessoa(int n=0)
- {
- NIF = n;
- }
- ~pessoa();
- void SetNIF(int n)
- {
- NIF = n;
- }
- };
- class professor : public pessoa
- {
- string disciplina;
- public:
- professor()
- {
- NIF = 12345678;
- disciplina = "Matemática";
- }
- };
- class aluno : public pessoa
- {
- int nota;
- public:
- aluno()
- {
- NIF = 12345679;
- nota = 20;
- }
- };
- //9
- int Arvore<T>::ContarNT()
- {
- if(esq && dir) //se tiver no esquerdo e direito
- return esq.ContarNT() + dir.ContarNT();
- if(!esq && !dir) //se nao tiver no esquerdo nem direito
- return 1;
- if(esq) //se houver no esquerdo (não há direito)
- return esq.ContarNT();
- return dir.ContarNT();
- }
- //10
- void Arvore<T>::ColocarLista(Lista<T> *L)
- {
- if(esq)
- esq.ColocarLista(L);
- if(dir)
- dir.ColocarLista(L);
- NO<T> *aux = L->GetInicio();
- L->SetInicio(info);
- L->GetInicio()->SetProx(aux);
- }
Advertisement
Add Comment
Please, Sign In to add comment