
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'.
#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;
}
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Instalar Linux em notebook Sony Vaio VPCEG13EB (13)
Vou destruir sua infância:) (7)
Interface gráfica com problema (0)









