Tenho 2 duvidas que são a seguinte, tenho q ordenar dados que estão e um vetor de tipo struct Dados utilizando o método bolha (eu sei que ele é uma bosta), e também não estou conseguindo fazer o seguinte : em determinado ponto do código apos uma série de leituras de dados de alunos de uma turma como por exemplo nome, matricula nota, media eu tenho q pegar esses dados que estão guardados no vetor struct Dados turma[qtdeAlunos] e separa-los em 2 arquivos, Arquivo 1 contendo alunos da letra 'A' a 'N ' e no outro de 'M' a 'Z'.
Segue o que eu consegui fazer até agora:
#include <stdio.h> #include <conio.h> #include <string.h> #define NOME_MAX 100 #define MAX_ALUNOS 120 #define MIN_ALUNOS 1 #define QTDE_NOTAS 2 #define NOTA_MIN 0 #define NOTA_MAX 10 ////////STRUCTS/////////////// struct Dados { char nome[NOME_MAX]; float notas[QTDE_NOTAS]; int matricula; float media; }; ///////////////////////////////////////////// /////////////////PROTÓTIPOS/////////////////// void leValidaTexto (char *texto, char *mensagemTitulo, int tamanho, int aux); int leValidaInt(char *titulo); int leValidaQuantidade(char *titulo,int min, int max); void cadastraAluno(struct Dados *turma,int qtdeAlunos); int leValidaMatricula(); float leValidaNotas(char *titulo, float valorMin, float valorMax); int verificaRepetido(struct Dados *turma, int qtdeAlunos); void armazenarDados(struct Dados *turma, char * nomeArquivo1, char * nomeArquivo2, int qtdeAlunos); /*void ordenaCadastro(struct Dados *turma, int qtdeAlunos);*/ ////////////////////////////////////////////// int main(void) { // Declaracoes char nomeArquivo1[NOME_MAX]; char nomeArquivo2[NOME_MAX]; int qtdeAlunos; //FILE *arquivo1; //FILE *arquivo2; FILE *erro; int aux; // Instrucoes qtdeAlunos=leValidaQuantidade("Informe a quantidade de alunos da turma:",MIN_ALUNOS, MAX_ALUNOS); struct Dados turma[qtdeAlunos]; erro=fopen("erro.txt","w"); fclose(erro); for ( aux = 0;aux<1;aux++) { leValidaTexto(nomeArquivo1,"Informe o nome do arquivo n 1 :",NOME_MAX, aux); leValidaTexto(nomeArquivo2,"Informe o nome do arquivo n 2 :",NOME_MAX, aux); }; if(strcmp(nomeArquivo1,nomeArquivo2)==0) { printf("Nomes iguais"); getch(); fopen("erro.txt","a"); fprintf(erro,"Nome dos arquivos iguais, impossibilitando a criacao."); fclose(erro); exit(0); }; //arquivo1=fopen(nomeArquivo1,"w"); //arquivo2=fopen(nomeArquivo2,"w"); cadastraAluno(&turma, qtdeAlunos); armazenarDados(turma, nomeArquivo1, nomeArquivo2, qtdeAlunos); /*ordenaCadastro(&turma,qtdeAlunos);*/ getch(); return 0; } //Objetivo: //Parametros: //Retorno: //Objetivo: ler e Validar um Nome //Parametros: endereço de titulo, endereco de msgErro, tamanho maximo e endereço de nome //Retorno: void leValidaTexto (char *texto, char *mensagemTitulo, int tamanho, int aux) { do{ printf("%s\n",mensagemTitulo); fflush(stdin); fgets(texto, tamanho, stdin); fflush(stdin); if(texto[strlen(texto)-1] == '\n') { texto[strlen(texto)-1] = '\0'; } if(strlen(texto) == 0) { system("cls"); printf("Nada foi informado\n"); getch(); } }while(strlen(texto) == 0); system("cls"); } //Objetivo:Ler e validar uma quantidade de alunos //Parametros:endereço do vetor titulo, quantidade minima e maxima de alunos. //Retorno: Quantidade de alunos válida int leValidaQuantidade(char *titulo,int min, int max) { int qtde; do{ qtde=leValidaInt(titulo); if(qtde<min||qtde>max) { printf("Quantidade de alunos, invalida, informe uma quantidade na faixa: [1]..[120]"); getch(); } system("cls"); }while(qtde<min||qtde>max); return qtde; } //Objetivo: ler e validar inteiro //Parametros: endereco de titulo //Retorno: inteiro validado int leValidaInt(char *titulo) { int ret; int nro; do { printf("%s\n",titulo); fflush(stdin); ret = scanf("%d",&nro); fflush(stdin); if(ret == 0 ) { printf("Campo destinado para numeros inteiros, informe novamente"); getch(); } system("cls"); }while(ret==0); return nro; } //Objetivo:Cadastrar os dados dos alunos da turma //Parametros:endereço de memória do vetor turma, quantidade de alunos //Retorno:sem retorno void cadastraAluno(struct Dados *turma,int qtdeAlunos) { int aux; int validacao; system("cls"); for(aux=0;aux<qtdeAlunos;aux++){ do { printf("Informe a matricula do aluno %d\n",aux+1); turma[aux].matricula=leValidaMatricula(); validacao = verificaRepetido(turma,aux); if(validacao == 1 ) { printf("Matricula repetido informe outra novamente\n"); getch(); system("cls"); } }while(validacao == 1); leValidaTexto(turma->nome,"Informe o nome do estudante n :",NOME_MAX,aux); turma[aux].notas[0]=leValidaNotas("Informe a nota 1:",NOTA_MIN,NOTA_MAX); turma[aux].notas[1]=leValidaNotas("Informe a nota 2:",NOTA_MIN,NOTA_MAX); turma[aux].media=(turma[aux].notas[0]+turma[aux].notas[1])/2; } } void armazenarDados(struct Dados *turma,char *nomeArquivo1, char *nomeArquivo2, int qtdeAlunos) { FILE * arquivo1; FILE * arquivo2; int aux; arquivo1 = fopen(nomeArquivo1, "w+b"); arquivo2 = fopen(nomeArquivo2, "w+b"); for(aux=0;aux<qtdeAlunos;aux++){ //if(turma[aux].nome[0]>=63 && turma[aux].nome[0]<=79) fprintf(arquivo1,"%d",turma[aux].matricula); fprintf(arquivo1,"%20.20s",turma[aux].nome); fprintf(arquivo1,"%20.2f",turma[aux].media); fclose(arquivo1); } } //Objetivo: Ordenar os elementos do vetor //Parametros: endereço do vetor matricula, quantidade de alunos //Retorno: /*void ordenaCadastro(struct Dados *turma, int qtdeAlunos) { int i; int j; //int auxMatricula; char auxNome[NOME_MAX]; int auxMedia; int resultado; for(i = qtdeAlunos-1; i >= 1; i--) { for(j = 0; j < i; j++) { if(strcmp(turma[j].nome, turma[i].nome) == -1) { strcpy(auxNome, turma[j].nome); strcpy(turma[j+1].nome, turma[j].nome); strcpy(turma[j+1].nome, auxNome); } } } for(resultado = 0; resultado < qtdeAlunos; resultado++) { printf("%s\n", turma[resultado].nome); } }*/ //Objetivo:Ler e validar uma matricula //Parametros: endereço do vetor matricula, endereço do vetor de titulo,contador //Retorno: int leValidaMatricula() { int matricula; do{ matricula=leValidaInt("Insira:"); }while(matricula<0||matricula>99999); return matricula; } //Objetivo: Verificar numero repetido em uma matriz //Parametros: endereço da matriz e o ultimo lido //Retorno: 1 se repetido 0 se não repetido int verificaRepetido(struct Dados *turma, int aux) { int cont; int flag = 0; for(cont = 0; cont < aux; cont++) { if(turma[aux].matricula == turma[cont].matricula) { flag = 1; break; } } return flag; } //Objetivo: ler e validar real //Parametros: endereco de titulo, endereco de mensagem de erro , valorMin e valor Max //Retorno: real validado float leValidaNotas(char *titulo, float valorMin, float valorMax) { int ret = 0; int flag; float nro; do { flag = 0; printf("%s\n",titulo); fflush(stdin); ret = scanf("%f",&nro); fflush(stdin); if(ret == 0 || nro < valorMin || nro > valorMax) { flag = 1; printf("ERRO, campo destinado para numeros"); getch(); } system("cls"); }while(flag == 1); return nro; }