Ordenação com bubble sort e gravar dados em um arquivo em C

1. Ordenação com bubble sort e gravar dados em um arquivo em C

Fernando
bellun

(usa Outra)

Enviado em 27/09/2015 - 00:45h

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;
}






  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts