
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;
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com som ruim no Pipewire
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Como programar um sistema de controle para distribuições linux em c? (4)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)









