Considere a seguinte estrutura:
struct pessoa{
int Matricula;
char Nome[30];
float Nota;
};
Faça uma função que dado um array de tamanho
dessa estrutura, ordene o array pelo campo escolhido pelo usuário.
struct pessoa{
int Matricula;
char Nome[30];
float Nota;
};
Passo 1
O enunciado pede uma função em C que receba um array de structs do tipo pessoa e um parâmetro indicando qual campo (Matrícula, Nome ou Nota) usar para ordenar esse array.
Passo 2
Para resolver isso, vamos criar uma função void ordenar(struct pessoa v[], int N, int opcao). O parâmetro opcao indica: 1‐Matricula, 2‐Nome, 3‐Nota. Além disso, vamos usar um algoritmo de ordenação simples (o nosso famoso selection sort) e a função strcmp para comparar strings.
Passo 3
Dentro da função, faremos dois loops aninhados de i=0 até N−2 e j=i+1 até N−1. Em cada iteração, comparamos v[i] e v[j] de acordo com opcao e trocamos de lugar se estiverem fora de ordem.
Para comparar: se opcao1, comparamos v[i].Matricula > v[j].Matricula; se opcao2, usamos strcmp(v[i].Nome, v[j].Nome)>0; se opcao==3, comparamos v[i].Nota > v[j].Nota.
Para comparar: se opcao1, comparamos v[i].Matricula > v[j].Matricula; se opcao2, usamos strcmp(v[i].Nome, v[j].Nome)>0; se opcao==3, comparamos v[i].Nota > v[j].Nota.
Passo 4
Quando a comparação indicar que os elementos estão fora de ordem, fazemos a troca completa dos structs usando uma variável auxiliar do tipo struct pessoa.
Com isso, ao final dos loops, o array estará ordenado segundo o campo escolhido. Só não esqueça de incluir <string.h> no topo para usar strcmp.
Com isso, ao final dos loops, o array estará ordenado segundo o campo escolhido. Só não esqueça de incluir <string.h> no topo para usar strcmp.
Resposta
#include <string.h>
struct pessoa{
int Matricula;
char Nome[30];
float Nota;
};
int Matricula;
char Nome[30];
float Nota;
};
void ordenar(struct pessoa v[], int N, int opcao) {
int i, j;
struct pessoa aux;
for (i = 0; i < N - 1; i++) {
for (j = i + 1; j < N; j++) {
int precisaTrocar = 0;
if (opcao == 1) {
if (v[i].Matricula > v[j].Matricula)
precisaTrocar = 1;
} else if (opcao == 2) {
if (strcmp(v[i].Nome, v[j].Nome) > 0)
precisaTrocar = 1;
} else if (opcao == 3) {
if (v[i].Nota > v[j].Nota)
precisaTrocar = 1;
}
if (precisaTrocar) {
aux = v[i];
v[i] = v[j];
v[j] = aux;
}
}
}
}
int i, j;
struct pessoa aux;
for (i = 0; i < N - 1; i++) {
for (j = i + 1; j < N; j++) {
int precisaTrocar = 0;
if (opcao == 1) {
if (v[i].Matricula > v[j].Matricula)
precisaTrocar = 1;
} else if (opcao == 2) {
if (strcmp(v[i].Nome, v[j].Nome) > 0)
precisaTrocar = 1;
} else if (opcao == 3) {
if (v[i].Nota > v[j].Nota)
precisaTrocar = 1;
}
if (precisaTrocar) {
aux = v[i];
v[i] = v[j];
v[j] = aux;
}
}
}
}