Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Algoritmos e Estruturas de Dados I IBm1014 Departamento de Computação e Matemática 1º Semestre/2012 Prof. Dr. José Augusto Baranauskas 1ª Lista de Exercícios 1. O que é um registro? E um campo? Como um registro é declarado em C++? Como se tem acesso a um campo? 2. O que é um objeto? Quais as vantagens e desvantagens da utilização de objetos (class) ao invés de estruturas (struct) em C++? 3. O que são pré-condições? E pós-condições? Qual o objetivo de utilizá-las na definição de Tipos Abstratos de Dados (ADT)? 4. Defina pré- e pós-condições para um programa que: a) calcula a divisão de dois números inteiros; b) calcula a hipotenusa de um triângulo retângulo; c) calcula o logaritmo neperiano de um número real; d) calcula a média de um vetor de números reais; e) efetua a correção ortográfica de um texto; f) verifica se uma matriz é simétrica; g) inverte uma string, ou seja, o programa retorna uma outra string com o mesmo tamanho na qual o primeiro caractere de entrada é o último de saída e assim por diante. 5. O que o programa seguinte imprime? 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int count = 1; 7 while (count <= 10) 8 { cout << (count % 2 == 0 ? "****" : "++++++++") 9 << endl; 10 ++count; 11 } 12 return 0; 13 } 6. O que o programa seguinte imprime? 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int row = 10, column; 7 while (row >= 1) 8 { column = 1; 9 while (column <= 10) 10 { cout << (row % 2 == 0 ? "<" : ">"); 11 ++column; 12 } 13 --row; 14 cout << endl; 15 } 16 return 0; 17 } 7. Dado o seguinte programa: 1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 5 int main() 2 6 { float media; 7 8 media = 123.0; 9 cout << "Media = " << media << endl; 10 cout << "Media = " << setprecision(2) << media << endl; 11 cout << "Media = " << media << “ “ << setprecision(4) << media << "\n"; 12 cout << "Media = " << setprecision(5) << media << endl; 13 cout << "Media = " << media << "\n"; 14 cout << "Media = " << setprecision(6) 15 << setiosflags(ios::fixed | ios::showpoint) << media << endl; 16 17 media = 123.45678; 18 cout << setw(20) << "Media = " << media << endl; 19 cout << "Media = " << setprecision(2) << media << endl; 20 cout << "Media = " << media << “ “ << setprecision(4) << media << "\n"; 21 cout << "Media = " << setprecision(5) << media << endl; 22 cout << "Media = " << setw(5) << media << "\n"; 23 cout << "Media = " << setprecision(6) 24 << setiosflags(ios::fixed | ios::showpoint) << media << endl; 25 26 return 0; 27 } Basicamente, a chamada a setprecision(2) indica que o valor a ser impresso deve possuir dois dígitos de precisão, contando dígitos antes e após o ponto decimal. Para usar esse manipulador de stream parametrizado, o arquivo header iomanip deve ser incluído no programa. Já endl é um manipulador de stream não-parametrizado, não sendo necessário, portanto, incluir o arquivo header iomanip.h. O manipulador de stream parametrizado setiosflags(ios::fixed | ios::showpoint) possui duas opções: ios::fixed causa a impressão de números reais em ponto fixo, ao contrário da notação científica (ios::scientific); ios::showpoint força o aparecimento do ponto decimal e de zeros após o ponto decimal, mesmo que o número seja inteiro, por exemplo, 88.00. Sem essa última opção, o programa imprimiria 88 sem o ponto decimal e os zeros. Existe ainda o manipulador setw(n), que pode ser usado para imprimir o que segue ocupando o tamanho n, podendo se usado tanto para mensagens de texto (strings) como para números. Sabendo disso, qual a saída resultante do programa acima? 8. Qual a saída resultante da execução do seguinte programa? #include <iostream> using namespace std; int main() { int a, *aPtr; a = 7; aPtr = &a; cout << "Endereco de a = " << &a << "\nValor de aPtr = " << aPtr; cout << "\n\nValor de a = " << a << "\nValor de *aPtr = " << *aPtr; cout << "Mostrando que * e & são inversos entre si" << "\n&*aPtr = " << &*aPtr << "\n*&aPtr = " << *&aPtr << endl; return 0; } 9. Qual a saída resultante da execução do seguinte programa? #include <iostream> using namespace std; int main() { int *ptr,b=5; ptr = new int; cout << "Entre um inteiro"; cin >> *ptr; 3 cout << *ptr << "+" << b << "=" << *ptr + b << endl; return 0; } 10. O que o programa seguinte faz? #include <iostream> using namespace std; int main() { int i,*v,n; cout << "Entre um inteiro"; cin >> n; v = new int[n]; for(i=0;i<n;i++) { cout << "v[" << i << "]="; cin >> v[i]; } cout << "Valores lidos" << endl; for(i=0;i<n;i++) cout << "v[" << i << "]=" << v[i] << endl; delete [] v; return 0; } 11. Encontre o(s) erro(s) em cada um dos seguintes fragmentos de código e explique como corrigi-lo(s): a) Assuma a seguinte declaração na classe Time: void ~Time(int); b) O fragmento seguinte é uma definição parcial da classe Time: class Time { public: // declarações dos métodos private: int hour = 0; int minute = 0; int second = 0; }; c) Assuma a seguinte declaração da classe Funcionário: int Funcionário(string, string); 12. Modifique o objeto Time (visto em laboratório) para incluir o método Tick que incrementa o horário armazenado no objeto Time em um segundo. O objeto deve permanecer sempre em um estado consistente. Não esqueça de definir pré- e pós-condições. Escreva um programa que testa o novo método Tick em um loop que imprime no formato militar o horário em cada iteração, mostrando que o novo método funciona corretamente. Tenha certeza de testar os seguintes casos: a) incrementar para o próximo minuto; b) incrementar para a próxima hora; c) incrementar para o próximo dia. 13. Implemente todos os métodos do ADT Sacola. 14. Defina um Tipo Abstrato de Dados (ADT) Retângulo em C++ usando class. O ADT tem atributos altura e largura, com valores default 1. Ele possui métodos para calcular o perímetro e a área do retângulo; possui também os métodos set e get que atribuem e retornam valores para os atributos altura e largura, respectivamente. O método set deve verificar que tanto altura como largura são números reais entre 0.0 e 20.0. Defina pré- e pós-condições para cada método. 15. Crie um objeto Complexo para realizar operações aritméticas com números complexos. Escreva um driver (programa) para testar seu objeto. Números complexos têm a forma 4 parteReal + parteImaginária * i onde i é 1− . Utilize números reais para representar os dados privados do objeto. Forneça um construtor que permita um objeto da classe ser iniciado quando ele é declarado. Forneça métodos públicos para cada uma das seguintes operações: a) Adição de dois números Complexos. As respectivas partes reais e imaginárias são somadas; b) Subtração de dois números Complexos. A parte real do operando à direita é subtraída do operando à esquerda e a parte imaginária do operando à direita é subtraída da parte imaginária do operando à esquerda; c) Escrever números Complexos na forma (a, b) onde a é a parte real e b é a parte imaginária. 16. Defina um objeto C++ capaz de implementar o Jogo da Vida. Neste jogo há um tabuleiro (linhas e colunas) em que cada entrada possui um célula (viva ou não viva).O usuário fornece uma configuração inicial de células vivas. O programa deve imprimir uma seqüência da situação do tabuleiro, solicitando ao usuário se deve ou não prosseguir. A cada iteração, para cada célula do tabuleiro, se o número de vizinhos vivos for 0 ou 1 então a célula morre (de solidão); se o número de vizinhos vivos for 3 então a célula torna-se viva. Não esqueça de definir pré- e pós-condições para todos os métodos. 17. Verifique a ordem em que os objetos são criados e destruídos no programa seguinte: // CriarDestruir.h // Definicao da classe CriarDestruir #ifndef CRIARDESTRUIR_H #define CRIARDESTRUIR_H class CriarDestruir { public: CriarDestruir(int); // construtor ~CriarDestruir(); // destruidor private: int dado; }; #endif CRIARDESTRUIR_H // CriarDestruir.cpp // Metodos da classe CriarDestruir #include <iostream> #include "CriarDestruir.h" using namespace std; CriarDestruir::CriarDestruir(int valor) { dado = valor; cout << "Objeto " << dado << " construtor"; } CriarDestruir::~CriarDestruir() { cout << "Objeto " << dado << " destruidor" << endl; } // TestarCriarDestruir.cpp // Mostra a ordem na qual os construtores e destruidores sao chamados #include <iostream> #include "CriarDestruir.h" using namespace std; // variavel global CriarDestruir primeiro(1); 5 void criar(void) { CriarDestruir quarto(4); cout << " (local em criar)" << endl; CriarDestruir quinto(5); cout << " (local em criar)" << endl; } int main() { cout << " (global criado antes de main)" << endl; CriarDestruir segundo(2); cout << " (local em main)" << endl; criar(); CriarDestruir terceiro(3); cout << " (local em main)" << endl; return 0; } 18. Um laboratório é controlado a partir de um sistema de controle de acesso instalado na porta. Para abrir a porta é necessário que o usuário informe uma senha, composta por dígitos, no formato senha = d1d2d3...dmV, onde V é o dígito de verificação da senha (por exemplo, se senha = 5323, então d1=5, d2=3, d3=2 e V=3). O dígito V da senha é uma maneira de verificar se uma senha é válida; ele é calculado da seguinte forma: 7mod 1 = ∑ = m i idV onde A mod B indica o resto da divisão inteira de A por B. No caso, a senha 5323 é válida e a senha 72016 é inválida. Escreva uma função em C++ que testa a validade de uma senha, recebendo como parâmetros um vetor v de inteiros e o número n correspondente de elementos de v aos dígitos de uma senha de forma que v[0]=d1, vet[1]=d2,..., vet[n-1]=V), e retorne true se a senha for válida ou false caso contrário. A função deve ter o seguinte protótipo: bool PassworkOk(int n, int v[]).
Compartilhar