0

我需要从键盘获得一个输入,再获得三个输入并在这三个上调用一个函数。(清理不必要的代码)头文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct aluno
{
char nUsp[8];
char nome[30];
char ano[5];
};
typedef struct aluno aluno;

struct disciplina
{
char nomeDisciplina[30];
char professor[30];
char codigo[8];
};
typedef struct disciplina disciplina;

void ordernaAluno(FILE *alunos, int n);
void ordenaDisciplina(FILE *disciplinas, int m);
void ordenaMatricula(FILE *matriculas, int o);
int buscaAluno(aluno *al, FILE *fp, int n);
int buscaDisciplina(disciplina *disc, FILE *fp, int n);
int cadastrarAluno(aluno *al, FILE *alunos, int n);
void dumpAluno(FILE *alunos, int n);
int cadastrarDisciplina(disciplina *disc, FILE *disciplinas, int m);
void dumpDisciplina(FILE *disciplinas, int m);
int matricular(FILE *alunos, FILE *disciplinas, FILE *matricula, aluno *al, disciplina *disc, int n, int m, int o);
void dumpMatricula(FILE *matriculas, int o);

和主文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "T1.h"

//-------------------------------------------------------------------------------------    ------------------------------------------------------
void ordernaAluno(FILE *alunos, int n)
{
int i, j;
aluno aux[2];
rewind(alunos);
//inicio bubble sort do arquivo
for(i=0; i<=n; i++) //primeiro elemento
{

    for(j=0; j<=n-1; j++) //proximo elemento
    {
        fseek(alunos, j*sizeof(aluno),SEEK_SET);//vai ate a posicao inicial do aluno 1
        fread(&aux[0],sizeof(aluno),1,alunos);//le o aluno 1
        fseek(alunos,(i+1)*sizeof(aluno),SEEK_SET);//vai ate a posicao inicial do aluno 2
        fread(&aux[1],sizeof(aluno),1,alunos);//le o aluno 2
        if(strcmp(aux[0].nUsp,aux[1].nUsp) > 0)//compara o nUsp dos dois alunos
        {
            //se o nUsp do aluno 1 for maior que do aluno 2, troca os alunos
            fseek(alunos, j*sizeof(aluno),SEEK_SET);//vai ate a posicao inicial do aluno 1
            fwrite(&aux[1],sizeof(aluno),1,alunos);//escreve o aluno 2
            fseek(alunos,(i+1)*sizeof(aluno),SEEK_SET);//vai ate a posicao inicial do aluno 2
            fwrite(&aux[0],sizeof(aluno),1,alunos);//escreve o aluno 1
        }
    }
    }
}
//-------------------------------------------------------------------------------------------------------------------------------------------

void ordenaDisciplina(FILE *disciplinas, int m)
{
int i, j;
disciplina aux[2];

rewind(disciplinas);
//inicio bubble sort do arquivo
for(i=0; i<=m; i++)//primeiro elemento
{
    for(j=0; j<=m-1; j++)//proximo elemento
    {
        fseek(disciplinas, j*sizeof(disciplina),SEEK_SET);//vai ate a posicao inicial da disciplina 1
        fread(&aux[0],sizeof(disciplina),1,disciplinas);//le a a disciplina 1
        fseek(disciplinas,(i+1)*sizeof(disciplina),SEEK_SET);//vai ate a posicao inicial da disciplina 2
        fread(&aux[1],sizeof(disciplina),1,disciplinas);//le a disciplina 2
        if(strcmp(aux[0].codigo,aux[1].codigo) > 0)//compara os codigos das disciplinas
        {
            //se o codigo da disciplina 1 for maior que o da disciplina 2, troca as disciplinas
            fseek(disciplinas, j*sizeof(disciplina),SEEK_SET);//vai ate a posicao inicial da disciplina 1
            fwrite(&aux[1],sizeof(disciplina),1,disciplinas);//escreve a disciplina 2
            fseek(disciplinas,(i+1)*sizeof(disciplina),SEEK_SET);//vai ate a posicao inicial da disciplina 2
            fwrite(&aux[0],sizeof(disciplina),1,disciplinas);//escreve a disciplina 1
        }
    }
}
}

//-------------------------------------------------------------------------------------------------------------------------------------------

void ordenaMatricula(FILE *matriculas, int o)
{
int i, j;
disciplina Daux[2];
aluno Aaux[2];

rewind(matriculas);
//inicio bubble sort do arquivo (ordena por nUsp)
for(i=0; i<=o; i++) //primeiro elemento
{
    for(j=0; j<=o-1; j++) //proximo elemento
    {
        fseek(matriculas, j*(sizeof(Aaux[0].nUsp)+sizeof(Daux[0].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 1
        fread(&Aaux[0].nUsp,sizeof(Aaux[0].nUsp),1,matriculas);//le o nUsp da matricula 1
        fread(&Daux[0].codigo,sizeof(Daux[0].codigo),1,matriculas);//le o codigo da matricula 1
        fseek(matriculas,(i+1)*(sizeof(Aaux[1].nUsp)+sizeof(Daux[1].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 2
        fread(&Aaux[1].nUsp,sizeof(Aaux[1].nUsp),1,matriculas);//le o nUsp da matricula 2
        fread(&Daux[1].codigo,sizeof(Daux[1].codigo),1,matriculas);//le o codigo da matricula 2
        if(strcmp(Aaux[0].nUsp,Aaux[1].nUsp) > 0)//compara os nUsps das matriculas
        {
            //se o nUsp da matricula 1 for maior que o da matricla 2, troca as matriculas
            fseek(matriculas, j*(sizeof(Aaux[0].nUsp)+sizeof(Daux[0].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 1
            fwrite(&Aaux[1].nUsp,sizeof(Aaux[1].nUsp),1,matriculas);//escreve o nUsp da matricula 2
            fwrite(&Daux[1].codigo,sizeof(Daux[1].codigo),1,matriculas);//escreve o codigo da matricula 2
            fseek(matriculas,(i+1)*(sizeof(Aaux[1].nUsp)+sizeof(Daux[1].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 2
            fwrite(&Aaux[0].nUsp,sizeof(Aaux[0].nUsp),1,matriculas);//escreve o nUsp da matricula 1
            fwrite(&Daux[0].codigo,sizeof(Daux[0].codigo),1,matriculas);//escreve o codigo da matricula 2
        }
    }
}

//inicio do bubble sort do arquivo (ordena os codigos das disciplinas)
for(i=0; i<=o; i++) //primeiro elemento
{
    for(j=0; j<=o-1; j++) //proximo elemento
    {
        fseek(matriculas, j*(sizeof(Aaux[0].nUsp)+sizeof(Daux[0].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 1
        fread(&Aaux[0].nUsp,sizeof(Aaux[0].nUsp),1,matriculas);//le o nUsp da matricula 1
        fread(&Daux[0].codigo,sizeof(Daux[0].codigo),1,matriculas);//le o codigo da matricula 1
        fseek(matriculas,(i+1)*(sizeof(Aaux[1].nUsp)+sizeof(Daux[1].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 2
        fread(&Aaux[1].nUsp,sizeof(Aaux[1].nUsp),1,matriculas);//le o nUsp da matricula 2
        fread(&Daux[1].codigo,sizeof(Daux[1].codigo),1,matriculas);//le o codigo da matricula 2
        if(strcmp(Aaux[0].nUsp,Aaux[1].nUsp) == 0)//compara os nUsps das matriculas
        {
            if(strcmp(Daux[0].codigo,Daux[1].codigo) > 0)
            {
                //se o codigo da matricula 1 for maior que o da matricula 2, troca as matriculas
                fseek(matriculas, j*(sizeof(Aaux[0].nUsp)+sizeof(Daux[0].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 1
                fwrite(&Aaux[1].nUsp,sizeof(Aaux[1].nUsp),1,matriculas);//escreve o nUsp da matricula 2
                fwrite(&Daux[1].codigo,sizeof(Daux[1].codigo),1,matriculas);//escreve o codigo da matricula 2
                fseek(matriculas,(i+1)*(sizeof(Aaux[1].nUsp)+sizeof(Daux[1].codigo)),SEEK_SET);//vai ate a posicao inicial da matricula 2
                fwrite(&Aaux[0].nUsp,sizeof(Aaux[0].nUsp),1,matriculas);//escreve o nUsp da matricula 1
                fwrite(&Daux[0].codigo,sizeof(Daux[0].codigo),1,matriculas);//escreve o codigo da matricula 2
            }
        }

    }
}
}

//-------------------------------------------------------------------------------------------------------------------------------------------

int buscaAluno(aluno *al, FILE *fp, int n)
{
int i;
aluno aux;

rewind(fp);

for(i=0; i<n; i++)//percorre o arquivo de 0 ate numero de alunos matriculados (n)
{
    fseek(fp, i*sizeof(aluno), SEEK_SET);//posiciona ponteiro para leitura do i-esimo aluno
    fread(&aux, sizeof(aluno), 1, fp);//le todos os dados do aluno
    if(strcmp(aux.nUsp,al->nUsp) == 0)//compara numero usp do aluno lido com do aluno buscado. enquanto os numeros nao forem iguais ou chegar a N alunos, continua buscas
    {
        return 1;//o aluno existe
    }
}
return -1; //nao existe o aluno buscado
}

//-------------------------------------------------------------------------------------------------------------------------------------------

int buscaDisciplina(disciplina *disc, FILE *fp, int n)
{
int i;
disciplina aux;

rewind(fp);

for(i=0; i<n; i++)//percorre o arquivo de 0 ate numero de disciplinas matriculadas (n)
{
    fseek(fp, i*sizeof(disciplina), SEEK_SET);//posiciona ponteiro para leitura da i-esima disciplina
    fread(&aux, sizeof(disciplina), 1, fp);//le todos os dados da disciplina
    if(strcmp(aux.codigo,disc->codigo) == 0)//compara codigo da disciplina lida com codigo da disciplina buscada. enquanto os codigos nao forem iguais ou chegar a N disciplinas, continua buscas
    {
        return 1;//a disciplina existe
    }
}
return -1;//nao existe a disciplina buscada
}

//-------------------------------------------------------------------------------------------------------------------------------------------

int cadastrarAluno(aluno *al, FILE *alunos, int n)//cadastra aluno al, e retorna quantidade de alunos cadastrados +1
{
rewind(alunos);

fseek(alunos, n*sizeof(aluno), SEEK_SET);//coloca o ponteiro na posicao do n-esimo aluno
fwrite(al, sizeof(aluno), 1, alunos);//escreve todas as informacoes do aluno na i-esima posicao

ordernaAluno(alunos, n);

return n+1;//retorna numero de alunos cadastrados +1
}

//-------------------------------------------------------------------------------------------------------------------------------------------

void dumpAluno(FILE *alunos, int n)
{
if(n==0) return NULL; //se nao ha alunos cadastrados, retorna NULL

aluno aux;
int i;

rewind(alunos);

for(i=0; i<n; i++)//percorre o arquivo de alunos de 0 ate n (numero de alunos cadastrados)
{
    fread(&aux,(sizeof(aluno)),1,alunos);//le o aluno
    printf("\%s - \%s - \%s\n",&aux.nUsp,&aux.nome,&aux.ano); //imprime dados do aluno
    //nao eh necessario mover o ponteiro para proximo elemento, pois apos a leitura o ponteiro ja esta no proximo elemento
}
}

//-------------------------------------------------------------------------------------------------------------------------------------------

int cadastrarDisciplina(disciplina *disc, FILE *disciplinas, int m)
{
rewind(disciplinas);

fseek(disciplinas, m*sizeof(disciplina), SEEK_SET);//coloca o ponteiro na posicao da m-esima disciplina
fwrite(disc, sizeof(disciplina), 1, disciplinas);//escreve todas as informacoes da disciplina na i-esima posicao
ordenaDisciplina(disciplinas,m);
return m+1;//retorna numero de disciplinas cadastradas +1
}

//-------------------------------------------------------------------------------------------------------------------------------------------

void dumpDisciplina(FILE *disciplinas, int m)
{
if(m==0) return NULL;//se nao ha disciplinas cadastradas, retorna NULL

disciplina aux;
int i;

rewind(disciplinas);

for(i=0; i<m; i++)//percorre o arquivo de disciplinas de 0 ate m (numero de disciplinas cadastradas)
{
    fread(&aux,(sizeof(disciplina)),1,disciplinas);//le a disciplina
    printf("\%s - \%s - \%s\n",&aux.codigo,&aux.nomeDisciplina,&aux.professor);//imprime dados da disciplina
    //nao eh necessario mover o ponteiro para proximo elemento, pois apos a leitura o ponteiro ja esta no proximo elemento
}
}

//-------------------------------------------------------------------------------------------------------------------------------------------

int matricular(FILE *alunos, FILE *disciplinas, FILE *matricula, aluno *al, disciplina *disc, int n, int m, int o)
{
if(buscaAluno(al,alunos,n)==-1) return o;//verifica se aluno 'al' existe no arquivo 'alunos' com 'n' alunos cadastrados.

if(buscaDisciplina(disc,disciplinas,m)==-1) return o;//verifica se aluno 'al' existe no arquivo 'alunos' com 'n' alunos cadastrados

fseek(matricula,o*(sizeof(al->nUsp)+sizeof(disc->codigo)),SEEK_SET);//posiciona ponteiro para escrita dos dados apos 'o' matriculas
fwrite(al->nUsp, sizeof(al->nUsp),1,matricula);//escreve nUsp do aluno
fwrite(disc->codigo,(sizeof(disc->codigo)),1,matricula);//escreve codigo da disciplina
fseek(matricula,o*(sizeof(al->nUsp)+sizeof(disc->codigo)),SEEK_SET);//posiciona ponteiro para leitura dos dados apos 'o' matriculas
fread(&al->nUsp, sizeof(al->nUsp),1,matricula);//le nUsp do aluno
fread(&disc->codigo, sizeof(disc->codigo),1,matricula);//le codigo da disciplina

ordenaMatricula(matricula, o);

return o+1;//retorna numero de matriculas + 1
}

//-------------------------------------------------------------------------------------------------------------------------------------------

void dumpMatricula(FILE *matriculas, int o)
{
if(o==0) return NULL;//se nao ha matriculas feitas, retorna NULL

char numeroUsp[8], codigoDisc[8];
int i, j;

rewind(matriculas);

for(i=0; i<o; i++)//percorre o arquivo matriculas de 0 ate o matriculas
{
    fread(numeroUsp,8*sizeof(char),1,matriculas);//le o numero usp da matricula
    fread(codigoDisc,8*sizeof(char),1,matriculas);//le o codigo da disciplina da matricula
    printf("\%-7s - \%-7s\n",numeroUsp,codigoDisc);//imprime os dados lidos
}
}

//-------------------------------------------------------------------------------------------------------------------------------------------

int main()
{
int n=0;
int m=0;
int o=0;
char aux[30];
aluno *al;
disciplina *disc;
disc = malloc(sizeof(disciplina));
al = malloc(sizeof(aluno));

FILE *alunos;
FILE *disciplinas;
FILE *matriculas;
alunos = fopen("alunos.bin", "w+b");
disciplinas = fopen("disciplinas.bin", "w+b");
matriculas = fopen("matriculas.txt", "w+");

do
{
    fgets(aux, 29, stdin);
    printf("aux: %s\n", aux);
    //fflush(stdin);
    if(strncmp(aux, "sair\n", 29)==0)
    {
        free(al);
        free(disc);
        fclose(alunos);
        fclose(disciplinas);
        fclose(matriculas);
        return EXIT_SUCCESS;
    }
    else if(strcmp(aux,"cadastar\0aluno")==0)
    {
        //printf("%s", aux);
        printf("entrou cadastrar aluno\n");
        //fflush(stdin);
        scanf("%s", al->nome);
        //fflush(stdin);
        scanf("%s", al->nUsp);
        //fflush(stdin);
        scanf("%s", al->ano);
        n=cadastrarAluno(al, alunos, n);
        printf("cadastrou aluno\n");
    }

    else if(strncmp(aux,"dump aluno\n", 29)==0)
    {
        printf("entrou dump aluno\n");
        dumpAluno(alunos, n);
        printf("dumpou aluno\n");
    }
    else if(strncmp(aux,"cadastrar disciplina\n", 29)==0)
    {
        printf("entrou cadastrar disciplina\n");
        //fflush(stdin);
        scanf("%s", disc->nomeDisciplina);
        printf("%s\n", disc->nomeDisciplina);
        //fflush(stdin);
        scanf("%s", disc->codigo);
        printf("%s\n", disc->codigo);
        //fflush(stdin);
        scanf("%s", disc->professor);
        printf("%s\n", disc->professor);
        //fflush(stdin);
        m=cadastrarDisciplina(disc, disciplinas,m);
        printf("cadastrou disciplina\n");
        printf("tentou get\n");

    }
    else if(strncmp(aux, "dump disciplina\n", 29)==0)
    {
        printf("entrou dump disciplina\n");
        dumpDisciplina(disciplinas, m);
        printf("dumpou disc\n");
    }

    else if(strncmp(aux, "matricular aluno\n", 29)==0)
    {
        printf("entrou matricular aluno\n");
        //fflush(stdin);
        scanf("%s", al->nUsp);
        //fflush(stdin);
        scanf("%s", disc->codigo);
        //fflush(stdin);
        o=matricular(alunos,disciplinas,matriculas,al,disc,n,m,o);
        printf("matriculou \n");
    }

    else if(strncmp(aux, "dump matricula\n", 29)==0)
    {
        printf("entrou dump matricula\n");
        dumpMatricula(matriculas,o);
        printf("dumpou matricula\n");
    }
}while(1);
}

输入已正确存储,但程序根本不会将aux与字符串进行比较(“sair”和“cadastrar disciplina”除外,不知道为什么)。即使它这样做了,它也会做它必须做的事情并退出程序,即使我所做的一切都没有返回任何内容(所有使用的函数都是无效的)。

4

2 回答 2

0

你还记得包含字符串库吗?

#include <string.h>
于 2013-03-28T20:35:06.053 回答
0

输入已正确存储,但程序根本不会将 aux 与字符串进行比较(“sair”和“cadastrar disciplina”除外,不知道为什么)。

如果你更换

    else if(strcmp(aux,"cadastar\0aluno")==0)

经过

    else if(strcmp(aux,"cadastar aluno\n")==0)

它有效 - 空格当然是空格,并且不要忘记换行符。

即使它这样做了,它也会做它必须做的事情并退出程序,即使我所做的一切都没有返回任何内容(所有使用的函数都是无效的)。

当然,“sair”因此而退出

        return EXIT_SUCCESS;

“地籍学科”没有退出。

于 2014-06-17T09:36:06.007 回答