Gestão de Cursos ...

Programação Estruturada 2005/06


Dada uma base de dados contendo informação sobre alunos e disciplinas de cursos duma faculdade, pretende-se consultá-la para:

As estruturas de dados que vão ser usadas pelo programa, obedecem à especificação seguinte.

 
typedef struct aluno {
  char *nome, codigo[MAX];
  int disc[MAX], nd;
} ALUNO;


typedef struct disciplina {
  char *nome;
  int ano;
} DISCIPLINA;


ALUNO Alunos[MAXALUNOS];
int NAlunos;

DISCIPLINA Disc[MAXDISC];
int NDisc;

Problemas

Escrever procedimentos para resolver cada um dos problemas indicados acima.

Para correr o programa, copie o código seguinte para o seu ficheiro. Note que não vai poder efectuar outras chamadas a funções da biblioteca string.h no programa (a única chamada será a de strcpy em ler_nome). Não terá que libertar a memória reservada dinamicamente.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXDISC 100
#define MAXALUNOS 1000
#define MAXNOME 100
#define MAX 11
#define LETRA(C) (((C) >= 'a'&& (C)<= 'z')|| ((C)>= 'A' && (C)<= 'Z'))

typedef struct aluno {
  char *nome, codigo[MAX];
  int disc[MAX], nd;
} ALUNO;

typedef struct disciplina {
  char *nome;
  int ano;
} DISCIPLINA;

ALUNO Alunos[MAXALUNOS];
int NAlunos;

DISCIPLINA Disc[MAXDISC];
int NDisc;

char *ler_nome(void);
void ler_dados(void);

char *ler_nome() 
{ int i=0;
  char aux[MAXNOME], c, *nome; 
  do c = getchar(); while (!LETRA(c));
  do {
    aux[i++] = c;
    c = getchar();
  } while (c != '\n');
  aux[i] = '\0';
  nome  = malloc(i+1);
  strcpy(nome,aux);
  return nome;
}

void ler_dados()
{ int i, j;
  scanf("%d",&NDisc);
  for(i=0; i<NDisc; i++) {
    Disc[i].nome = ler_nome();
    scanf("%d",&Disc[i].ano);
  }
  scanf("%d",&NAlunos);
  for(i=0; i<NAlunos; i++) {
    Alunos[i].nome = ler_nome();
    scanf("%s",Alunos[i].codigo);
    scanf("%d",&Alunos[i].nd);
    for (j=0; j<Alunos[i].nd; j++)
      scanf("%d",&Alunos[i].disc[j]);
  }
}



int main()
{
  /* ....completar se necessário ....  */

  ler_dados();  // criou a base de dados

  /* ....completar se necessário ....  */

  return 0;
}



Exemplo de Input para lerdados()

5
Programacao Imperativa
1
Calculo Infinitesimal I
1
Programacao Estruturada
1
Probabilidades e Estatistica 
2
Modelos de Computacao
2

6
Joao Diogo Silva
2001018001 1 2
Mariana Pinto Matias
2001018003 4 1 4 2 3 
Anabela Moreira
2004018014 3 1 3 2
Sonia Silva
1999018015 1 1
Manuel Pereira
2001019005 2 3 2
Carlos Santos
2004019007 3 1 2 3 




No exemplo anterior Programacao Imperativa é a disciplina 1 e Programacao Estruturada a disciplina 3. Note também que Programacao Imperativa será a primeira disciplina a ocorrer na estrutura de dados Disc, enquanto Programacao Estruturada será a terceira.
Os quatro primeiros dígitos dos códigos dos alunos representam o ano, os três seguintes o código do curso e os três últimos identificam o aluno.
O primeiro número que está a seguir ao código do aluno indica o número de disciplinas em que está inscrito. Os números seguintes identificam essas disciplinas.