Você está na página 1de 17

Programação I:

Problemas de Programação

Alexandre Romanelli

INSTITUTO FEDERAL DO ESPÍRITO SANTO

07 de junho de 2023
Primeiro problema de programação:
Conversão de decimal para algarismos romanos

Deve ser feito um programa de computador em linguagem C++ que leia da


entrada padrão um número decimal positivo e apresente, na saı́da padrão, a
representação em algarismos romanos do número lido. Deve ser usada a seguinte
notação para os valores em algarismos romanos:
1 I unidade simples;
2 V meia dezena;
3 X dezena;
4 L meia centena;
5 C centena;
6 D meio milhar;
7 M milhar.

Romanelli (IFES) Programação 07/06/2023 2 / 19


Primeiro problema de programação:
Conversão de decimal para algarismos romanos

Quantidade Unidade Dezena Centena Milhar


1 I X C M
2 II XX CC MM
3 III XXX CCC MMM
4 IV XL CD MMMM
5 V L D MMMMM
6 VI LX DC ···
7 VII LXX DCC
8 VIII LXXX DCCC
9 IX XC CM
Tabela 1: Codificação em algarismos romanos.

Romanelli (IFES) Programação 07/06/2023 3 / 19


Primeiro problema de programação:
Conversão de decimal para algarismos romanos

Exemplos:

Entrada: 598
Saı́da: DXCVIII

Entrada: 4929
Saı́da: MMMMCMXXIX

Entrada: 270
Saı́da: CCLXX

Romanelli (IFES) Programação 07/06/2023 4 / 19


Primeiro problema de programação:
Conversão de decimal para algarismos romanos

Método sugerido para solucionar o problema, após ler o número decimal N:


1 Identificar a quantidade Qm de milhares e escrever M na saı́da repetidamente
em quantidade de vezes igual a Qm .
2 Identificar a quantidade Qc de centenas e escrever na saı́da a sequência de
caracteres correspondente, conforme Tabela 1.
3 Identificar a quantidade Qd de dezenas e escrever na saı́da a sequência de
caracteres correspondente, conforme Tabela 1.
4 Identificar a quantidade Qu de unidades e escrever na saı́da a sequência de
caracteres correspondente, conforme Tabela 1.

É possı́vel fazer os passos 2, 3 e 4 usarem chamadas a uma função que escreve


valores com os caracteres dos algarismos parametrizados. Isto permite reduzir o
tamanho do código-fonte e torná-lo menos repetitivo.

Romanelli (IFES) Programação 07/06/2023 5 / 19


Segundo problema de programação:
Comparação lexicográfica

Deve ser feito um programa de computador em linguagem C++ que leia, da


entrada padrão, dois textos, t1 e t2 . Em seguida, o programa deve fazer a
comparação lexicográfica de t1 e t2 e escrever na saı́da:
1, se t1 > t2 ;
0, se t1 = t2 ;
−1, se t1 < t2 .

O programa deve implementar uma função compLexicografica(a, b) que retorne


os valores informados acima, conforme resultado da comparação lexicográfica.

Romanelli (IFES) Programação 07/06/2023 6 / 19


Segundo problema de programação:
Comparação lexicográfica
Dada a função compLexicografica(a, b):

A comparação lexicográfica entre duas cadeias de caracteres consiste em


comparar, repetidamente, os caracteres de cada posição de 0 até o último ı́ndice
de caractere da menor cadeia. Se em alguma posição i houver diferença entre os
caracteres, o resultado da comparação lexicográfica será:
1, se a[i] > b[i]; ou
-1, se a[i] < b[i].

Se as duas cadeias forem iguais até o final da menor, o resultado será:


1, se a.length() > b.length();
ou -1, se a.length() < b.length().

Se os tamanhos a.length() e b.length() forem iguais e os caracteres das mesmas


posições também, o resultado será 0.

Romanelli (IFES) Programação 07/06/2023 7 / 19


Segundo problema de programação:
Comparação lexicográfica
Exemplos:
a = aabbd
b = aabbg
compLexicografica(a, b) = −1
b = aabbg
a = aabbd
compLexicografica(b, a) = 1
c = 4ha02d,kw
d = 4ha02d,kw
compLexicografica(c, d) = 0
e = 4ha02f,kw
d = 4ha02d,kw
compLexicografica(e, d) = 1
c = 4ha02d,kw
f = 4ha02d,kwv
compLexicografica(c, f ) = −1

Romanelli (IFES) Programação 07/06/2023 8 / 19


Terceiro problema de programação:
Busca em vetor de estruturas

Deve ser escrito um programa em C++ para fazer a seguinte sequência de


atividades:
1 Abrir um arquivo de texto com nome “alunos.txt” para leitura.
2 Ler do arquivo o número N de registros de alunos armazenados nele.
3 Criar um vetor de registros de aluno com tamanho N.
4 Repetir N vezes a leitura de um registro de aluno do arquivo. Isto consiste
em ler quatro linhas, sendo que a primeira contém a matrı́cula, a segunda
contém o nome completo, a terceira contém a data de nascimento e a quarta
contém o CPF.
Continua...

Romanelli (IFES) Programação 07/06/2023 9 / 19


Terceiro problema de programação:
Busca em vetor de estruturas

5 Em seguida, ler repetidamente um comando de busca em uma linha da


entrada padrão, que pode ser “M”, “N”, “D”, “C” e a string vazia, que têm
os seguintes significados:
▶ “M”: buscar por matrı́cula;
▶ “N”: buscar por nome;
▶ “D”: buscar por data de nascimento;
▶ “C”: buscar por CPF; e
▶ String vazia: encerrar o programa.
Se o comando de busca for diferente da string vazia, deve ser lida uma nova
linha da entrada padrão, que será usada como chave de busca. Se for
encontrado algum registro, entre os que foram lidos do arquivo, que contém a
chave de busca no campo indicado pelo comando de busca, este registro deve
ser exibido na saı́da padrão. Caso contrário, deve ser mostrado o texto “Nao
encontrado”.

Romanelli (IFES) Programação 07/06/2023 10 / 19


Terceiro problema de programação:
Busca em vetor de estruturas
O programa deve usar as seguintes declarações de estruturas:

struct Data {
int ano ;
int mes ;
int dia ;
};
struct Aluno {
std :: string matricula ;
std :: string nome ;
Data dataNascimento ;
unsigned long long int cpf ;
};

E a seguinte definição de tipo para melhor legibilidade de código adiante:

typedef Aluno * PAluno ;

Romanelli (IFES) Programação 07/06/2023 11 / 19


Terceiro problema de programação:
Busca em vetor de estruturas
As funções a seguir foram desenvolvidas em aulas e estão disponı́veis:

std :: string c o n v e r t e r D a t a P a r a S t r i n g ( Data d );

Data co nv e r t e r S t r i n g P a r a D a t a ( std :: string s );

void co ns u m i r Q u e b r a D e L i n h a ( std :: istream & entrada );

Aluno lerAl unoDeE ntrada ( std :: istream & entrada );

int lerArquivoAlunos ( PAluno & registros );

void e s c r e v e r A l u n o N a S a i d a P a d r a o ( Aluno a );

O corpo da função main também foi disponibilizado para download.

Romanelli (IFES) Programação 07/06/2023 12 / 19


As funções a seguir precisam ser desenvolvidas para solucionar o problema:

int compData ( Data d1 , Data d2 );

int compLexic ografi ca ( std :: string s1 , std :: string s2 );

int buscar Po rM at ri cu la ( std :: string chave ,


PAluno registros , int Nr );

int buscarPorNome ( std :: string chave ,


PAluno registros , int Nr );

int b us c a r P o r D a t a N a s c i m e n t o ( Data chave ,


PAluno registros , int Nr );

int buscarPorCpf ( unsigned long long int chave ,


PAluno registros , int Nr );

Romanelli (IFES) Programação 07/06/2023 13 / 19


Terceiro problema de programação:
Busca em vetor de estruturas
Descrição das funções a serem implementadas:
A função compData recebe duas estruturas Data como parâmetro, d1 e d2.
Esta função deve comparar essas datas, retornando o valor 1 se d1 for mais
recente que d2, ou −1 se d1 for mais antiga que d2, ou 0 se as datas forem
iguais.
A função compLexicografica foi descrita como o segundo problema de
programação desta atividade.
A função buscarPorMatricula recebe uma string chave, um vetor de
estruturas Aluno chamado registros, e um inteiro Nr que indica o número
de elementos do vetor. Esta função deve percorrer sequencialmente o vetor
registros, comparando o atributo matrı́cula de cada elemento, ex.
registros[i].matricula, com o parâmetro chave através da função
compLexicografica. Se o atributo matrı́cula de algum elemento de
registros for igual à chave, deve ser retornado o ı́ndice deste elemento.
Caso contrário, deve ser retornado o valor −1.

Romanelli (IFES) Programação 07/06/2023 14 / 19


Descrição das funções a serem implementadas: (continuação)
A função buscarPorNome recebe uma string chave, um vetor de estruturas
Aluno chamado registros, e um inteiro Nr que indica o número de
elementos do vetor. Esta função deve percorrer sequencialmente o vetor
registros, comparando o atributo nome de cada elemento, ex.
registros[i].nome, com o parâmetro chave através da função
compLexicografica. Se o atributo nome de algum elemento de registros
for igual à chave, deve ser retornado o ı́ndice deste elemento. Se todos
forem diferentes, deve ser retornado o valor −1.
A função buscarPorDataNascimento recebe uma estrutura Data chamada
chave, um vetor de estruturas Aluno chamado registros, e um inteiro Nr
que indica o número de elementos do vetor. Esta função deve percorrer
sequencialmente o vetor registros, comparando o atributo data de
nascimento de cada elemento, ex. registros[i].dataNascimento, com o
parâmetro chave através da função compData. Se o atributo data de
nascimento de algum elemento de registros for igual à chave, deve ser
retornado o ı́ndice deste elemento. Senão, deve ser retornado o valor −1.

Romanelli (IFES) Programação 07/06/2023 15 / 19


Descrição das funções a serem implementadas: (continuação)
A função buscarPorCpf recebe um número inteiro positivo grande
(unsigned long long int) chamado chave, um vetor de estruturas Aluno
chamado registros, e um inteiro Nr que indica o número de elementos do
vetor. Esta função deve percorrer sequencialmente o vetor registros,
comparando o atributo CPF de cada elemento, ex. registros[i].cpf, com
o parâmetro chave através do operador relacional de igualdade ==. Se o
atributo CPF de algum elemento de registros for igual à chave, deve ser
retornado o ı́ndice deste elemento. Se for diferente de todos, deve ser
retornado o valor −1.

Romanelli (IFES) Programação 07/06/2023 16 / 19


Deve ser feito um programa de computador em linguagem C++ que faça o
seguinte:
1 Leia, da entrada padrão, um número inteiro N;
2 Leia, também da entrada padrão, N textos, sendo um por linha, e os
armazene em um array de strings, aqui chamado de R;
3 Na sequência, o programa entra em operação de busca, na qual deve ser lida
uma linha de texto P da entrada padrão e apresentado, na saı́da padrão, a
mensagem “Encontrado: ” seguida do texto que foi encontrado, caso P ∈ R,
ou a mensagem “Nao encontrado”, caso contrário.

A busca deve usar a função de comparação lexicográfica implementada no


segundo problema.

Romanelli (IFES) Programação 07/06/2023 17 / 19

Você também pode gostar