Se entendi certo, esse código deve resolver o problema. O único caso que ele não testa é no caso de empate entre 1 ou mais nota, situação em que a primeira a ser avaliada será a pior.
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main () {
int notas[5][3];
int pioresNotas[5];
int quantidadeAlunos[3] = {};
// Inicializa notas com valores aleatórios entre 0 e 10
srand(time(NULL));
{
int i;
for(i = 0; i < 5; i++) {
int j;
for(j = 0; j < 3; j++) {
notas[i][j] = abs(rand()) % 11;
}
}
}
// Define quais as piores notas de cada aluno, e soma o número de alunos com pior nota em cada avaliação
{
// Determina qual a pior nota de cada aluno
{
int i;
for(i = 0; i < 5; i++) {
int j, index;
for(index = j = 0; j < 3; j++) {
// Se houver empate, permanece a atual
if(notas[i][j] < notas[i][index]) {
index = j;
}
}
pioresNotas[i] = index;
}
}
// Determina a somatória de alunos
{
int i;
for(i = 0; i < 5; i++) {
quantidadeAlunos[pioresNotas[i]]++;
}
}
}
return 0;
}
Exemplo de saída, para visualizar, crie um arquivo html e utilize o navegador.
<style>
table{
width: 50%;
margin: auto;
padding: 0;
border: solid black;
}
th{
color: white;
background: black;
}
td{
text-align: center;
}
tr:nth-child(even) {
background-color: gray;
}
</style>
<h2>Matriz de notas</h2>
<table>
<tr>
<th> Prova 1 </th>
<th> Prova 2 </th>
<th> Prova 3 </th>
</tr>
<tr>
<td> 8 </td>
<td> 8 </td>
<td> 1 </td>
</tr>
<tr>
<td> 0 </td>
<td> 1 </td>
<td> 7 </td>
</tr>
<tr>
<td> 7 </td>
<td> 1 </td>
<td> 0 </td>
</tr>
<tr>
<td> 1 </td>
<td> 6 </td>
<td> 4 </td>
</tr>
<tr>
<td> 0 </td>
<td> 1 </td>
<td> 5 </td>
</tr>
</table>
<h2>Resultados apurados</h2>
<table>
<tr>
<th> Prova 1 </th>
<th> Prova 2 </th>
<th> Prova 3 </th>
</tr>
<tr>
<td> 3 </td>
<td> 0 </td>
<td> 2 </td>
</tr>
</table>