Buscar

AED-I-Lista-1

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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[]).

Outros materiais