Problemas usando funções e ponteiros

Problema 1:

Escreva uma função que recebe um inteiro n > 0 e devolve o seu primeiro dígito, seu último dígito e altera o valor de n removendo seu primeiro e último dígitos. Exemplos:
valor inicial de nprimeiro dígitoúltimo dígitovalor final de n
732723
1473818473
1010101
78780
7770

Dizemos que um número natural n é palíndromo se lido da direita para a esquerda ou da esquerda para a direita é o mesmo número. Exemplos:

Escreva um programa que recebe um inteiro positivo n e verifica se n é palíndromo. Suponha que n não contém o dígito 0.

Solução:

#include <stdio.h>

void RemoveExtremos(int *n, int *pri, int *ult){
  int tn,pot = 1;
  tn = *n;
  while(tn >= 10){
    tn = tn/10;
    pot *= 10;
  }
  *pri = *n / pot;
  *ult = *n % 10;
  *n = *n % pot;
  *n = *n / 10;
}

int main(){
  int n,pri,ult,pal = 1;
  printf("Digite n: ");
  scanf("%d", &n);

  while(n > 0){
    RemoveExtremos(&n, &pri, &ult);
    if(pri != ult)
      pal = 0;
  }
  if(pal)
    printf("Palíndromo\n");
  else
    printf("Não é palíndromo\n");
  return 0;
}
  

Representação linearizada de uma matriz em um vetor

Uma matriz bidimensional Amxn (m linhas e n colunas) pode ser armazenada em um vetor com mxn elementos, conforme o seguinte esquema, onde as linhas da matriz são armazenadas consecutivamente no vetor:
matriz em vetor

O elemento na posição (i,j) da matriz pode ser acessado como o elemento na posição k do vetor, onde k = j + i * n;
O mapeamento inverso pode ser obtido usando j = k % n; e i = k / n;

Problemas usando funções e vetores

Problema 2:

Implemente uma função que calcula a média das notas em nativ atividades de um aluno presentes em um vetor notas_aluno[] do tipo float, usando o seguinte protótipo:
float media_aluno(float notas_aluno[], int nativ);

Dados dois valores inteiros nalunos e nativ, representando o número de alunos de uma classe e o número de atividades realizadas, faça um programa que lê as notas das atividades de todos alunos em um mesmo vetor (representação linearizada da matriz de notas, com uma linha para cada aluno). Na sequência, o programa deve calcular a média de cada aluno, utilizando a função anterior, e contar o número de alunos aprovados.

Solução:

#include <stdio.h>

#define LIM 500

float media_aluno(float notas_aluno[], int nativ){
  float soma = 0.0;
  int i;
  for(i = 0; i < nativ; i++){
    soma += notas_aluno[i];
  }
  return soma/nativ;
}


int main(){
  float notas[LIM], media;
  int nativ, nalunos;
  int i,j,k,cont_aprov = 0;
  printf("Numero de alunos: ");
  scanf("%d", &nalunos);
  printf("Numero de atividades: ");
  scanf("%d", &nativ);
		 
  if(nativ*nalunos > LIM)
    return 0;

  /*lendo as notas das atividades de todos alunos em um mesmo vetor*/
  for(i = 0; i < nalunos; i++){
    printf("Digite as notas do aluno #%d: ", i+1);
    for(j = 0; j < nativ; j++){
      k = j + i*nativ;
      scanf("%f", &notas[k]);
    }

  /*calculando a média de cada aluno, utilizando a função anterior*/
  for(i = 0; i < nalunos; i++){
    media = media_aluno(&notas[i*nativ], nativ);
    printf("media do aluno #%d: %f\n",i+1, media);
    if(media >= 5.0)
      cont_aprov++;
  }
  printf("Aprovados: %d\n", cont_aprov);
  
  return 0;
}