Buscar

PDS2- vpl1-2-3

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 10 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

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 6, do total de 10 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

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 9, do total de 10 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

Prévia do material em texto

PDS2 
VPL 1 – CONTAGEM DE LETRAS 
O objetivo desse VPL é praticar os comandos de entrada e saída específicos de C++ 
(cin, cout) e também a utilização do tipo string. Não utilize outros comando de 
entrada como o getline. 
Escreva um programa que lê como entrada apenas uma palavra. Em seguida, seu 
programa deve contar o número de ocorrências de cada letra presente na palavra. 
Por fim, deve-se imprimir a quantidade de vezes que uma determinada letra 
apareceu. Se uma letra não aparece na palavra, ela não deve ser impressa. Imprima 
as letras em ordem alfabética. 
Para facilitar, você pode assumir que as palavras sempre terão todas as letras 
minúsculas. Considere que os caracteres válidos são os presentes no intervalo “a” a 
“z”. 
Exemplos de entrada e saída: 
input = 
estudantes 
output = 
a 1 
d 1 
e 2 
n 1 
s 2 
t 2 
u 1 
input = 
abacaxi 
output = 
a 3 
b 1 
c 1 
i 1 
x 1 
Dicas: 
Dica 1: 
Teste o arquivo localmente. Para isso, sugerimos utilizar o seguinte comando: 
./executavel < entrada.txt 
O arquivo entrada.txt possui a palavra a ser utilizada como entrada. 
Dica 2: 
Utilize operações entre caracteres para facilitar. Exemplo: 
char caractere = 'c' 
int indice = caractere - 'a' 
O valor da variável índice será 2. 
#include<iostream> 
 
using namespace std; 
 
int main() { 
 string palavra; 
 cin >> palavra; 
 
 int ocorrencias[26]; 
 for (int i = 0, ie = 26; i < ie; i++) { 
 ocorrencias[i] = 0; 
 } 
 for (int ch: palavra) { 
 int asc_code = ch - 'a'; 
 ocorrencias[asc_code]++; 
 } 
 
 for (int i = 0, ie = 26; i < ie; i++) { 
 if (ocorrencias[i] != 0) { 
 char letra = 'a' + i; 
 cout << letra << " " << ocorrencias[i] << endl; 
 } 
 } 
 return 0; 
} 
 
 
VPL 2 – PONTEIROS 
Esse exercício foi desenhado para se praticar a manipulação de dados em memória 
considerando-se o uso de ponteiros. 
Deve-se preencher o corpo das funções com o código para realizar a tarefa descrita 
nas linhas. 
#include <iostream> 
#include <cstddef> 
#include <string> 
 
using namespace std; 
 
// 1) A funcao deve adicionar dez a uma variavel inteira 
 
void add10(int *n) { 
 
 *n+=10; 
} 
 
// 2) A funcao deve comparar dois endereços, retornando true se apontarem 
para a mesma posicao na memoria e false caso contrario 
 
bool compare_end(int *num1, int *num2) { 
 
 if (num1 == num2) { 
 return true; 
 } 
 else{ 
 return false; 
 } 
} 
 
// 3) A funcao deve comparar os valores armazenados em dois enderecos, 
retornando true se forem iguais e false caso contrario 
 
bool compare_val(int *num1, int *num2) { 
 
 if (*num1 == *num2) { 
 return true; 
 } 
 else{ 
 return false; 
 } 
} 
 
// 4) A funcao deve receber o ponteiro para um numero inteiro e retornar 
o ponteiro para um caracter 
 
char* cast_TO_char(int *n) { 
 
 char *c = NULL; 
 
 c = (char*) n; 
 return c; 
 
} 
 
// 5) A funcao deve imprimir todos os caracteres ate que o caracter ‘/0’ 
seja encontrado. 
// O parametro é um ponteiro para a primeira posicao do vetor de 
caracteres 
// A funcao deve adicionar uma quebra de linha '\n' apos exibir a 
cadeia de caracteres. 
 
void print_char(char *n) { //n é um vetor de caracteres 
 
 int i=0; 
 for(i=0; i<1; i++){ 
 cout<<n; 
 if(n[i]=='\0'){ 
 break; 
 } 
 cout<<"\n"; 
 } 
 
} 
 
// 6) A funcao deve imprimir uma string. 
// O parametro e a referencia para um string. 
// A funcao deve adicionar uma quebra de linha '\n' apos exibir a string. 
void print_string(string &str) { 
 
 cout << str << endl; 
} 
 
// 7) A funcao deve concatenar uma string (end) ao final de outra (begin) 
void concatenar_string(string &begin, string end) { 
 
 begin += end; 
} 
 
// 8) A funcao deve uma alocar um array com 10 posicoes e 
// inicializa-las com o identificador da sua posição 
 
void aloca_array(int** arr) { 
 *arr = new int[10]; 
 for (int i = 0; i < 10; i++) { 
 (*arr)[i] = i; 
 } 
} 
 
// 9) A funcao deve exibir os valores armazenados em um array 
// Os valores devem ser separados por um espaco 
// Adicione uma quebra de linha após exibir os valores 
void exibe_array(int* arr) { 
 
 for(int i=0; i<10; i++){ 
 cout<< arr[i]<<" "; 
 } 
 cout<<endl; 
} 
 
// 10) A funcao deve adicionar o offset (pos) ao endereco (arr), 
// e retornar um ponteiro para a nova posicao 
int* retorna_addr_array_pos(int* arr, int pos) { 
 
 arr += pos; 
 return arr; 
} 
 
// 11) A funcao deve liberar a memória utilizada pelo array 
void libera_array(int* arr) { 
 
 free(arr); 
} 
 
int main(){ 
 int num1 = 10, num2 = 20, num3 = 10; 
 int num4 = 'a'; 
 
 add10(&num1); 
 cout << num1 << endl; 
 cout << compare_end(&num1, &num2) << endl; 
 cout << compare_val(&num1, &num2) << endl; 
 cout << compare_end(&num1, &num3) << endl; 
 cout << compare_val(&num1, &num2) << endl; 
 char *c = cast_TO_char(&num4); 
 printf("%c\n",c[0]); 
 //cout << "a" << endl; 
 
 char text[21] = "PDS II is the best!\0"; 
 print_char(text); 
 
 string text2 = "PDS II is great!"; 
 print_string(text2); 
 
 concatenar_string(text2, " It is really nice! =D"); 
 print_string(text2); 
 
 int *array; 
 aloca_array(&array); 
 int *p6 = retorna_addr_array_pos(array, 6); 
 *p6 = *p6 * *p6 * 3.1415; 
 cout << "Position 6: " << *p6 << " -> " << (p6 - array) << endl; 
 exibe_array(array); 
 libera_array(array); 
 
 return 0; 
} 
 
VPL 3- ORÇAMENTO FEDERAL 
Neste exercício, devemos implementar dois TADs para auxiliar na resolução do 
seguinte problema: Lisarb é um país que possui orçamento restrito, e diversas 
demandas sociais. Desta forma, seus representantes nos solicitaram construir um 
sistema para auxiliar na gestão dos recursos provenientes de impostos. Segundo a 
lei vigente, cinco categorias de gastos devem ser consideradas, sendo que cada 
uma delas receberá um percentual dos impostos arrecadados. 
As categorias possuem identificadores numéricos, sendo elas: 
• 0 - Saúde 
• 1 - Educação 
• 2 - Segurança 
• 3 - Previdência 
• 4 - Administração Pública 
Os percentuais recebidos por cada categoria devem ser os seguintes: 
• 0 - Saúde - 15% 
• 1 - Educação - 15% 
• 2 - Segurança - 20% 
• 3 - Previdência - 35% 
• 4 - Administração Pública - 15% 
Para realizar esta tarefa, devemos criar os tipos de dados Categoria e Orcamento. 
O TAD Categoria deve possuir um código (inteiro) e o valor que esta categoria de 
gasto possui em caixa (double). 
O TAD Orcamento deve conter as cinco categorias. 
Para manipular uma categoria, será preciso implementar os seguintes métodos: 
• Categoria 
void inicia_categoria(Categoria *categoria, int codigo_categoria, double valor_caixa): 
Inicializa um objeto categoria com seu código e o valor que ela deve ter em caixa 
para gastos com sua pasta. 
int codigo_categoria(Categoria *categoria): Recupera o código correspondente a 
uma categoria. 
double valor_caixa_categoria(Categoria *categoria): Recupera o valor em caixa de 
uma categoria. 
 
 
void adiciona_caixa_categoria(Categoria *categoria, double valor): Adiciona uma 
quantia ao caixa de uma categoria. 
void gasta_caixa_categoria(Categoria *categoria, double valor): Remove uma 
quantia ao caixa de uma categoria. 
• Orcamento 
void inicia_orcamento(Orcamento *orcamento, double impostos): Inicializa um 
objeto Orçamento, sendo que ele deve conter um objeto categoria para cada pasta. 
Recebe como parâmetro o valor monetário que deve ser atribuído a aquele 
orçamento. Este valor deve ser distribuído a cada categoria, nos percentuais 
descritos anteriormente. 
void gasto_categoria(Orcamento *orcamento,int codigo_categoria, double valor): 
Reduz o valor no caixa da categoria especificada. 
double saldo_categoria(Orcamento *orcamento, int codigo_categoria): Retorna o 
valor em caixa da categoria especificada. 
Categoria* recupera_categoria(Orcamento *orcamento, int codigo_categoria): 
Retorna o ponteiro para o objeto da categoria especificada. 
Importante: Uma categoria pode ter dívidas, ou seja, seu caixa pode ser menor que 
zero. 
 
#include<iostream> 
 
using namespace std; 
 
typedef struct Categoria{ 
 
 int codigo; 
 double valor; 
 
} Categoria; 
 
// Inicializa um objeto categoria com seu código e o valor que ela deve 
ter em caixa para gastos com sua pasta. 
void inicia_categoria(Categoria *categoria,int codigo_categoria, double 
valor_caixa) { 
 
 categoria->codigo = codigo_categoria; 
 categoria->valor = valor_caixa; 
 
} 
 
// Recupera o código correspondente a uma categoria. 
int codigo_categoria(Categoria *categoria) { 
 
 return categoria->codigo; 
 
} 
 
// Recupera o valor em caixa de uma categoria. 
double valor_caixa_categoria(Categoria *categoria){ 
 
 double caixa; 
 caixa = categoria->valor; 
 return caixa; 
 
} 
 
// Adiciona uma quantia ao caixa de uma categoria. 
void adiciona_caixa_categoria(Categoria *categoria, double valor) { 
 
 categoria->valor += valor; 
} 
 
// Remove uma quantia ao caixa de uma categoria. 
void gasta_caixa_categoria(Categoria *categoria, double valor) { 
 
 categoria->valor -= valor; 
} 
 
typedef struct Orcamento { 
 
 Categoria categorias[5]; 
 
} Orcamento; 
 
// Inicializa um objeto Orçamento, sendo que ele deve conter um objeto 
categoria para cada pasta. 
// Recebe como parâmetro o valor monetário que deve ser atribuído a 
aquele orçamento. 
// Este valor deve ser distribuído a cada categoria, nos percentuais 
descritos anteriormente. 
void inicia_orcamento(Orcamento *orcamento, double impostos) { 
 
 double valor_saude = 0.15 * impostos; 
 double valor_educacao = 0.15 * impostos; 
 double valor_seguranca = 0.2 * impostos; 
 double valor_previdencia = 0.35 * impostos; 
 double valor_administracao = 0.15 * impostos; 
 
 inicia_categoria(&orcamento->categorias[0], 0, valor_saude); 
 inicia_categoria(&orcamento->categorias[1], 1, valor_educacao); 
 inicia_categoria(&orcamento->categorias[2], 2, valor_seguranca); 
 inicia_categoria(&orcamento->categorias[3], 3, valor_previdencia); 
 inicia_categoria(&orcamento->categorias[4], 4, valor_administracao); 
} 
 
// Reduz o valor no caixa da categoria especificada. 
void gasto_categoria(Orcamento *orcamento, int codigo_categoria, double 
valor) { 
 
 gasta_caixa_categoria(&(orcamento->categorias[codigo_categoria]), 
valor); 
} 
 
// Retorna o valor em caixa da categoria especificada. 
double saldo_categoria(Orcamento *orcamento, int codigo_categoria) { 
 
 double saldo; 
 saldo= valor_caixa_categoria(&(orcamento-
>categorias[codigo_categoria])); 
 
 return saldo; 
} 
 
// Retorna o ponteiro para o objeto da categoria especificada. 
Categoria* recupera_categoria(Orcamento *orcamento, int codigo_categoria) 
{ 
 
 return &(orcamento->categorias[codigo_categoria]); 
} 
 
int main() { 
 Orcamento orcamento; 
 
 char test = 0; 
 while(cin >> test) { 
 switch (test) { 
 case 'o': { 
 double valor = 0; 
 cin >> valor; 
 inicia_orcamento(&orcamento, valor); 
 } 
 break; 
 case 'g': { 
 int categoria = 0; 
 double valor = 0; 
 cin >> categoria >> valor; 
 gasto_categoria(&orcamento, categoria, valor); 
 cout << categoria << ": " << saldo_categoria(&orcamento, categoria) 
<< endl; 
 } 
 break; 
 case 'p': { 
 for (int categoria = 0; categoria < 5; categoria++) { 
 cout << categoria << ": " << saldo_categoria(&orcamento, 
categoria) << endl; 
 } 
 } 
 break; 
 default: { 
 cout << "----------" << endl; 
 } break; 
 } 
 } 
 return 0; 
}

Continue navegando