Você está na página 1de 3

DCC/ICEx/UFMG Gleison Mendonça e Luigi Soares

DCC 203 - Programação e Desenv. de Software I Terceira Prova - Turmas TA1 e TA2
2o semestre de 2022 06/12/2022

Estudante: Matrícula:

Instruções:
i. Este exame possui 3 página(s). Verifique se sua cópia do exame está completa.
ii. Esta prova é sem consulta: você não tem permissão para consultar o livro texto, suas notas de aula, a Internet,
seus colegas ou quaisquer outras pessoas ou fontes para concluir o exame.

iii. Se você acredita que alguma pergunta esteja subespecificada, anote as suposições que você teve que fazer para chegar
a sua resposta e justifique-as como parte de sua resposta à pergunta.
iv. Lembre-se de indentar o código de maneira apropriada e atente-se a organização, clareza e legibilidade do código!

Utilize o espaço a seguir, referente ao arquivo de cabeçalho abin.h, para a definição das estruturas solicitas na primeira
questão (se atente ao nome dos campos!). Note que o arquivo de cabeçalho já contém a declaração dos protótipos das
funções a serem implementadas nas questões posteriores.
abin.h abin.h (continuação)
1 #i f n d e f ABIN_H_ 14 char ∗ l e _ l i n h a ( FILE ∗p ) ;
2 #define ABIN_H_ 15 F u n c i o n a r i o l e _ f u n c i o n a r i o ( char ∗ l i n h a ) ;
3 #include <s t d i o . h> 16 Empregados ∗ le_empregados ( char ∗ a r q u i v o ) ;
4 #include <s t d b o o l . h> 17
5 typedef struct F u n c i o n a r i o { 18 // Retorna t r u e s e os ‘ k ‘ p r i m e i r o s
6 char ∗ m a t r i c u l a ; 19 // f u n c i o n a r i o s e s t a o ord enados em ordem
7 char ∗nome ; 20 // d e c r e s c e n t e ou f a l s e c a s o c o n t r a r i o .
8 unsigned short n u m _ e s p e c i a l i z a c o e s ; 21 b o o l ordenado ( Empregados e , int k ) ;
9 } Funcionario ; 22
10 23
11 typedef struct Empregados { 24
12 F u n c i o n a r i o ∗ empregados ; 25
13 int n ; 26
14 } Empregados ; 27 #endif

1. (3 pontos) A ABIN (Agência Brasileira de Inteligência) precisa processar um arquivo contendo seus funcionários,
para produzir uma lista com os mais qualificados. Cada linha deste arquivo armazena o registro de um empregado,
contendo sua matrícula, nome e quantidade de cursos de especialização. Segue, abaixo, um exemplo deste arquivo:

abin.txt
1 2 3 1 3 2 3 ; B i l l Gates ; 3
2 2 3 1 3 2 4 ; Paul A l l e n ; 2
3 2 3 1 3 2 5 ; Leryy Page ; 2

(a) (1,5 pontos) Criar a estrutura para armazenar um Funcionário. Sua estrutura deve conter os seguintes
campos: matricula (string), nome (string) e num_especializacoes (inteiro não negativo).
(b) (1,5 pontos) Criar a estrutura Empregados para guardar todos os funcionários da empresa. Sua estrutura
deve conter os seguintes campos: empregados (arranjo de Funcionario) e n (inteiro; número de funcionários).

2. (4 pontos) Crie uma função le_linha, seguindo o protótipo especificado no arquivo de cabeçalho (página 1), para
ler uma linha e retorná-la como uma string. Cada linha pode conter no máximo 150 caracteres. Dicas: lembre-se
de considerar o \0 e lembre-se de alocar a string dinamicamente.

1
abin.c
50 #define MAX_TAMANHO_LINHA 150
51 char ∗ l e _ l i n h a ( FILE ∗ f i l e ) {
52 char ∗ l i n h a = ( char ∗ ) m a l l o c ( (MAX_TAMANHO_LINHA + 1 ) ∗ s i z e o f ( char ) ) ;
53
54 // Se , por algum motivo a c o n t e c e r um erro ,
55 // nao r e t o r n a nenhum f u n c i o n a r i o
56 i f ( f g e t s ( l i n h a , MAX_TAMANHO_LINHA + 1 , f i l e ) == NULL) {
57 return NULL;
58 }
59
60 // Vamos t i r a r a q u e b r a de l i n h a , c a s o e x i s t a :
61 i f ( l i n h a [ s t r l e n ( l i n h a ) − 1 ] == ’ \n ’ ) {
62 l i n h a [ s t r l e n ( l i n h a ) − 1 ] = ’ \0 ’ ;
63 }
64
65 return l i n h a ;
66 }

3. (6 pontos) Complete a função le_funcionario a seguir, que recebe uma string que corresponde a uma linha do
arquivo, e retorna os dados armazenados em um objeto da estrutura Funcionario descrita acima.

abin.c
1 #include " a b i n . h"
2 #include < s t d l i b . h>
3 F u n c i o n a r i o l e _ f u n c i o n a r i o ( char ∗ l i n h a ) {
4 F u n c i o n a r i o f ; int i ;
5 // Aloque , i n i c i a l m e n t e , e s p a c o para 1 c a r a c t e r e no nome e m a t r i c u l a :
6 f . m a t r i c u l a = ( char ∗ ) m a l l o c ( s i z e o f ( char ) ) ;
7 f . nome = ( char ∗ ) m a l l o c ( s i z e o f ( char ) ) ;
8 f . m a t r i c u l a [ 0 ] = ’ \0 ’ ; f . nome [ 0 ] = ’ \0 ’ ;
9 f o r ( i = 0 ; l i n h a [ i ] != ’ ; ’ ; i ++) { // Ate onde v a i a m a t r i c u l a ?
10 // Aumente o e s p a c o da m a t r i c u l a para c a b e r mais um c a r a c t e r e :
11 f . m a t r i c u l a = ( char ∗ ) r e a l l o c ( f . m a t r i c u l a , ( i + 2 ) ∗ s i z e o f ( char ) ) ;
12 f . matricula [ i ] = linha [ i ] ;
13 f . m a t r i c u l a [ i + 1 ] = ’ \0 ’ ;
14 }
15 // ‘ i ‘ s a i do l o o p a n t e r i o r como sendo o i n d i c e do d e l i m i t a d o r .
16 int j = 0 ;
17 f o r ( i = i + 1 ; l i n h a [ i ] != ’ ; ’ ; i ++, j ++) { // Ate onde v a i o nome?
18 // Aumente o e s p a c o do nome para c a b e r mais um c a r a c t e r e :
19 f . nome = ( char ∗ ) r e a l l o c ( f . nome , ( j + 2 ) ∗ s i z e o f ( char ) ) ;
20 f . nome [ j ] = l i n h a [ i ] ;
21 f . nome [ j + 1 ] = ’ \0 ’ ;
22 }
23 int mult = 1 ; f . n u m _ e s p e c i a l i z a c o e s = 0 ;
24 // ‘ i ‘ s a i do l o o p a n t e r i o r como sendo o i n d i c e do d e l i m i t a d o r .
25 f o r ( int j = s t r l e n ( l i n h a ) − 1 ; j > i ; j −−) {
26 f . n u m _ e s p e c i a l i z a c o e s += ( l i n h a [ j ] − ’ 0 ’ ) ∗ mult ; // Converta os c a r a c t e r e s
27 mult ∗= 1 0 ; // para i n t e i r o
28 }
29 return f ;
30 }

4. (6 pontos) Complete a função le_empregados a seguir, que recebe o nome de um arquivo, processa este arquivo,
e retorna um ponteiro para Empregrados (nulo em caso de erro) com todos os funcionários presentes no arquivo.

2
abin.c
31 Empregados ∗ le_empregados ( char ∗ a r q u i v o ) {
32 FILE ∗p = f o p e n ( a r q u i v o , " r " ) ; // Abra o a r q u i v o de t e x t o p/ l e i t u r a .
33 i f ( p == NULL) return NULL; // E s e a l g o e r r a d o a c o n t e c e r ?
34 // Aloque e s p a c o para UM v a l o r do t i p o Empregados .
35 Empregados ∗ e = ( Empregados ∗ ) m a l l o c ( s i z e o f ( Empregados ) ) ;
36 e−>empregados = NULL; // I n i c i a l m e n t e nao temos nenhum empregado .
37 e−>n = 0 ;
38 char ∗ l i n h a = l e _ l i n h a ( p ) ;
39 while ( l i n h a != NULL) {
40 Funcionario f = le_funcionario ( linha ) ;
41 // Abra e s p a c o no a r r a n j o ‘ empregados ‘ para um novo f u n c i o n a r i o :
42 e−>n = e−> n + 1 ;
43 int b y t e s = e−>n ∗ s i z e o f ( F u n c i o n a r i o ) ;
44 e−>empregados = ( F u n c i o n a r i o ∗ ) r e a l l o c ( e−>empregados , b y t e s ) ;
45 e−>empregados [ e−>n − 1 ] = f ;
46 linha = le_linha (p ) ;
47 }
48 f c l o s e ( p ) ; return e ; // Feche o a r q u i v o
49 }

5. (6 pontos) Crie uma função RECURSIVA chamada ordenado que recebe um parâmetro do tipo Empregados
e outro parâmetro inteiro k. Sua função deve retornar verdadeiro se os k primeiros empregados estão em ordem
decrescente, de acordo com o número de especializações. Você pode implementar funções auxiliares, que também
devem ser RECURSIVAS; isto é, nenhuma função pode conter laços como for, while ou do-while.

abin.c
67 b o o l ordenado ( Empregados e , int k ) {
68 i f ( k <= 1 ) { // Caso base , 0 ou 1 f u n c i o n a r i o s ==> t r i v i a l m e n t e ordenado
69 return t r u e ;
70 }
71
72 i f ( e . empregados [ k − 2 ] . num_esp < e . empregados [ k − 1 ] . num_esp ) {
73 return f a l s e ;
74 }
75
76 return ordenado ( e , k − 1 ) ;
77 }

Você também pode gostar