--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct {
+ int x;
+ int y;
+} Ponto;
+
+typedef struct {
+ Ponto se;
+ Ponto id;
+} Rectangulo;
+
+Ponto * lePontos(int n);
+void escrevePontos(Ponto * pontos, int n);
+Rectangulo * defineRectangulo(Ponto * pontos, int n);
+
+int main()
+{
+ Ponto *v;
+ Rectangulo *r;
+ int n;
+
+ scanf("%d", &n);
+ v = lePontos(n);
+
+ escrevePontos(v, n);
+
+ r = defineRectangulo(v, n);
+ printf("SE x:%d y:%d\n", r->se.x, r->se.y);
+ printf("ID x:%d y:%d\n", r->id.x, r->id.y);
+
+ free(v);
+ free(r);
+
+ return EXIT_SUCCESS;
+}
+
+
+Ponto * lePontos(int n)
+{
+ int i;
+ Ponto *v = malloc(sizeof(Ponto) * n);
+
+ for (i = 0; i < n; i++)
+ scanf("%d%d", &v[i].x, &v[i].y);
+
+ return v;
+}
+
+void escrevePontos(Ponto * pontos, int n)
+{
+ int i;
+
+ for (i = 0; i < n; i++)
+ printf("x:%d y:%d\n", pontos[i].x, pontos[i].y);
+}
+
+Rectangulo * defineRectangulo(Ponto * v, int n)
+{
+ int i;
+ Rectangulo * r = malloc(sizeof(Rectangulo));
+
+ r->se.x = r->id.x = v[0].x;
+ r->se.y = r->id.y = v[0].y;
+
+ for (i = 1; i < n; i++) {
+ if (v[i].x < r->se.x) r->se.x = v[i].x;
+ if (v[i].x > r->id.x) r->id.x = v[i].x;
+ if (v[i].y > r->se.y) r->se.y = v[i].y;
+ if (v[i].y < r->id.y) r->id.y = v[i].y;
+ }
+
+ return r;
+}
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define CODE_MAX_LEN 10
+#define MAX_NOTA 20
+
+typedef struct {
+ int num_aluno;
+ char* cod_disc;
+ int nota;
+} Inscricao;
+
+/* Lê um sequência de n inscrições do standard input e devolve um novo
+ * vector de inscrições de alunos em disciplinas. Assuma que o código
+ * de uma disciplina é uma sequência de letras e digitos com tamanho
+ * máximo de 10 caracteres.
+ */
+Inscricao* lerInscricoes(int n) {
+ Inscricao *v = NULL;
+ int i = 0;
+
+ v = malloc(sizeof(Inscricao) * n);
+
+ for (i = 0; i < n; i++) {
+ v[i].cod_disc = malloc(sizeof(char) * CODE_MAX_LEN);
+
+ scanf("%d", &v[i].num_aluno);
+ scanf("%s", v[i].cod_disc);
+ scanf("%d", &v[i].nota);
+ }
+
+ return v;
+}
+
+/* Dado um vector de inscrições de tamanho n devolve um novo vector de
+ * inteiros com a distribuição das notas de uma disciplina. Ou seja,
+ * na posição indice i do vector deverá conter o número de alunos que
+ * teve nota i à disciplina.
+ */
+int* distribuicaoNotas(Inscricao* ins, int n, char* disc) {
+ int *dist = NULL, i = 0;
+
+ dist = malloc(sizeof(int) * (MAX_NOTA + 1));
+ memset(dist, 0x0, sizeof(int) * (MAX_NOTA + 1));
+
+ for (i = 0; i < n; i++)
+ if (strcmp(ins[i].cod_disc, disc) == 0)
+ dist[ins[i].nota] ++;
+
+ return dist;
+}
+
+int main() {
+ Inscricao *inscs = NULL;
+ int n = 0, *dist = NULL, i = 0;
+ char disc[11];
+
+ printf("# inscricoes: ");
+ scanf("%d", &n);
+
+ printf("Inscricoes (numero de aluno, codigo da disciplina, e nota):\n");
+ inscs = lerInscricoes(n);
+
+ printf("Disciplina: ");
+ while (scanf("%s", disc) != EOF) {
+ dist = distribuicaoNotas(inscs, n, disc);
+ for (i = 0; i <= MAX_NOTA; i++)
+ printf("%2d\t%d\n", i, dist[i]);
+ free(dist);
+
+ printf("Disciplina: ");
+ }
+
+ for (i = 0; i < n; i++)
+ free(inscs[i].cod_disc);
+ free(inscs);
+
+ return EXIT_SUCCESS;
+}
+