Quantcast
Channel: Últimos conteúdos
Viewing all articles
Browse latest Browse all 14190

Dúvida em ordenação bolha e arquivos

$
0
0

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;

}



 

 


Viewing all articles
Browse latest Browse all 14190