Kimossab

ED - Exame 2015

Jun 24th, 2015
570
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.66 KB | None | 0 0
  1. //PARTE I
  2. //a
  3. char *my_strrchr(char *str,char c)
  4. {
  5.     if(!str)
  6.         return NULL;
  7.     char *aux=NULL;
  8.     while(*str != '\0')
  9.     {
  10.         if(*str == c)
  11.             aux = str;
  12.         str++;
  13.     }
  14.     return aux;
  15. }
  16. //b
  17. int ContarPalavras(char *n_ficheiro, char *pal)
  18. {
  19.     int x = strlen(pal), tot=0;
  20.     char *pal_inv = (char*)malloc(sizeof(char)*x+1);
  21.     char *buf = (char*)malloc(sizeof(char)*150);
  22.     char *buffer = (char*)malloc(sizeof(char)*150);
  23.     FILE *f = fopen(n_ficheiro,"r");
  24.     if(!f)
  25.         return 0;
  26.     for(int i=0; i<x; i++)
  27.         pal_inv[x-i-1] = pal[i];
  28.     pal_inv[x] = '\0';
  29.  
  30.     while(fgets(buf,150,f))
  31.     {
  32.         buffer=buf;
  33.         buffer = strstr(buffer,pal);
  34.         while(buffer != NULL)
  35.         {
  36.             tot++;
  37.             buffer+=x;
  38.             buffer = strstr(buffer,pal);
  39.         }
  40.         buffer=buf;
  41.         buffer = strstr(buffer,pal_inv);
  42.         while(buffer != NULL)
  43.         {
  44.             tot++;
  45.             buffer+=x;
  46.             buffer = strstr(buffer,pal_inv);
  47.         }
  48.     }
  49.  
  50.     fclose(f);
  51.     return tot;
  52. }
  53. //PARTE II
  54. #define MAXNOTAS 20
  55. //a
  56. typedef struct dados
  57. {
  58.     int num;
  59.     char *nome_disciplina;
  60.     float nota;
  61. }DADOS;
  62. typedef struct listano
  63. {
  64.     DADOS *info;
  65.     struct listano *prox;
  66. }ListaNO;
  67. typedef struct lista
  68. {
  69.     ListaNO *Hash[MAXNOTAS];
  70.     int nel;
  71. }Hashing;
  72.  
  73. int FHashing(float nota)
  74. {
  75.     return (int)nota;
  76. }
  77.  
  78. //b
  79. void AddHashing(Hashing *H, int n_aluno, char *disciplina, float nota)
  80. {
  81.     int indice = FHashing(nota);
  82.     DADOS *Nal = (DADOS *)malloc(sizeof(DADOS));
  83.     Nal->nome_disciplina = (char *)malloc(sizeof(char) * strlen(disciplina)+1);
  84.     strcpy(Nal->nome_disciplina,disciplina);
  85.     Nal->nota = nota;
  86.     Nal->num = n_aluno;
  87.     ListaNO *novo = (ListaNO *)malloc(sizeof(ListaNO));
  88.     novo->info = Nal;
  89.     novo->prox = NULL;
  90.     ListaNO *ax = H->Hash[indice];
  91.  
  92.     if(!ax)
  93.     {
  94.         H->Hash[indice] = novo;
  95.         H->nel++;
  96.         return;
  97.     }
  98.    
  99.     while(ax->prox)
  100.         ax = ax->prox;
  101.     ax->prox = novo;
  102.     H->nel++;
  103. }
  104. //c
  105. float MediaAluno(Hashing *H, int n_aluno)
  106. {
  107.     float sum=0;
  108.     int count=0;
  109.     ListaNO *ax;
  110.     for(int i=0; i<MAXNOTAS; i++)
  111.     {
  112.         ax = H->Hash[i];
  113.         while(ax)
  114.         {
  115.             if(ax->info->num == n_aluno)
  116.             {
  117.                 sum+=ax->info->nota;
  118.                 count++;
  119.             }
  120.             ax = ax->prox;
  121.         }
  122.     }
  123.     if(count == 0)
  124.         return -1;
  125.     return sum/count;
  126. }
  127. //d
  128. int AprovadosNaDisciplina(Hashing *H, char *disciplina)
  129. {
  130.     int quant=0;
  131.     bool encontrada=false;
  132.     ListaNO *ax;
  133.  
  134.     for(int i=0; i<MAXNOTAS; i++)
  135.     {
  136.         ax = H->Hash[i];
  137.         while(ax)
  138.         {
  139.             if(stricmp(ax->info->nome_disciplina,disciplina) == 0)
  140.             {
  141.                 if(!encontrada)
  142.                     encontrada = true;
  143.                 if(i>=10)
  144.                     quant++;
  145.                 if(i<10 && encontrada)
  146.                 {
  147.                     i=10;
  148.                     break;
  149.                 }
  150.             }
  151.             ax = ax->prox;
  152.         }
  153.     }
  154.     if(!encontrada)
  155.         return -1;
  156.     return quant;
  157. }
  158.  
  159. //PARTE III
  160. typedef struct no
  161. {
  162.     ListaAlunos *Lista;
  163.     char *nome_disciplina;
  164.     struct no *esq, *dir;
  165. }NO;
  166. typedef struct arv_bin
  167. {
  168.     int NElementos;
  169.     NO *Ramo;
  170. }Arv_Bin;
  171. //a
  172. struct aux
  173. {
  174.     int nel;
  175.     char *c;
  176. };
  177. struct aux *ProcuraMaisAlunos(NO *n, struct aux *a = NULL)
  178. {
  179.     if(!a)
  180.     {
  181.         a = (struct aux *)malloc(sizeof(struct aux));
  182.         a->c = n->nome_disciplina;
  183.         a->nel = n->Lista->nelem;
  184.     }
  185.     else if(n->Lista->nelem > a->nel)
  186.     {
  187.         a->c = n->nome_disciplina;
  188.         a->nel = n->Lista->nelem;
  189.     }
  190.     if(n->esq)
  191.         a=ProcuraMaisAlunos(n->esq,a);
  192.     if(n->dir)
  193.         a=ProcuraMaisAlunos(n->dir,a);
  194.     return a;
  195. }
  196. char *MaisAlunos(Arv_Bin *A)
  197. {
  198.     struct aux *ax = ProcuraMaisAlunos(A->Ramo);
  199.     if(ax)
  200.         return ax->c;
  201.     return NULL;
  202. }
  203. //b
  204. //contar o numero de avaliaçoes? O numero de folhas é isso? Nao da para perceber bem
  205. int ContarAvalNO(NO *r, int count=0)
  206. {
  207.     count+=r->Lista->nelem;
  208.     if(r->esq)
  209.         count=ContarAvalNO(r->esq,count);
  210.     if(r->dir)
  211.         count=ContarAvalNO(r->dir,count);
  212.     return count;
  213. }
  214. int ContarAval(Arv_Bin *a)
  215. {
  216.     return ContarAvalNO(a->Ramo);
  217. }
  218. //c
  219. void MultiPonto(NO *n, float perc)
  220. {
  221.     ListaNO *ax = n->Lista->prim;
  222.     while(ax)
  223.     {
  224.         ax->info->nota *= perc;
  225.         ax = ax->prox;
  226.     }
  227.     if(n->esq)
  228.         MultiPonto(n->esq, perc);
  229.     if(n->dir)
  230.         MultiPonto(n->dir,perc);
  231. }
  232. void AumentarPonto(Arv_Bin *A, float perc)
  233. {
  234.     MultiPonto(A->Ramo,perc+1); //perc+1 para ser por exemplo 1.05 para fazer apenas a multiplicação
  235. }
  236. //d
  237. struct med
  238. {
  239.     float sum;
  240.     int quant;
  241. };
  242. struct med *Media(NO *n, int n_aluno, struct med *m = NULL)
  243. {
  244.     if(!m)
  245.     {
  246.         m = (struct med *)malloc(sizeof(struct med));
  247.         m->sum = 0;
  248.         m->quant = 0;
  249.     }
  250.     ListaNO *ax = n->Lista->prim;
  251.     while(ax)
  252.     {
  253.         if(ax->info->num == n_aluno)
  254.         {
  255.             m->sum+=ax->info->nota;
  256.             m->quant++;
  257.             break;
  258.         }
  259.         ax = ax->prox;
  260.     }
  261.     if(n->esq)
  262.         m=Media(n->esq, n_aluno,m);
  263.     if(n->dir)
  264.         m=Media(n->dir, n_aluno,m);
  265.     return m;
  266. }
  267. float MAluno(Arv_Bin *A, int n_aluno)
  268. {
  269.     struct med *ax = Media(A->Ramo,n_aluno);
  270.     if(ax->quant == 0)
  271.         return -1;
  272.     return ax->sum/ax->quant;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment