main.c
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
#include <string.h>
#include <math.h>
#include "Header.h"
int main()
{
stStu stu[N];
int choice = 0; /*select and store menu item */
int arrayLength=0;
char stuName[20];
/*====验证用户的口令,直到正确为止====*/
while (!Login())
{
printf("用户名或者密码错误,请重新输入!\n");
}
//arrayLength=readFromFile(stu);
/*====根据用户的选择,执行相应的操作.====*/
while(1)
{
displayMenu();
printf("\n 请选择您的操作(1,2,3,4,5,0):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
arrayLength=inputInfo(stu,N);
printf("\n现有%d个学生信息\n",arrayLength);
break;
case 2:
if(arrayLength==0)
printf("系统中没有学生信息,请先初始化!\n\n");
else
outputInfo(stu,arrayLength);
break;
case 3:
printf("请输入欲查找的姓名:\n");
scanf("%s",stuName);
queryByName(stu,arrayLength,stuName);
break;
case 4:
sortScore(stu,arrayLength);
outputInfo(stu,arrayLength);
break;
case 5:
writeToFile(stu,arrayLength);
break;
case 6:
arrayLength=readFromFile(stu);
break;
case 0:
exit(0);
break;
}
}
return 0;
}
Header.h
#ifndef Header_h
#define Header_h
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10
#define FILENAME "student.txt"
struct Student
{
int number;
char name[20];
char sex;
char cl;
char major;
float overall;
};
typedef struct Student stStu;
struct User
{
char name[20];
char password[20];
};
typedef struct User stUser;
int Login();
void displayMenu();
int inputInfo(stStu student[],int length);
void outputInfo(stStu student[],int length);
void queryByName(stStu student[],int length,char name[]);
void sortScore(stStu student[],int length);
void writeToFile(stStu student[],int length);
int readFromFile(stStu student[]);
stUser* loadUserInfor(stUser *userInfor,char *filename);
void saveUserInfor(stUser userInfor,char *filename);
#endif /* Header_h */
Header.c
#include "Header.h"
/*******************************************************
功能:显示菜单
参数:无
返回值:无
*******************************************************/
void displayMenu()
{
printf("\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("+ 学生成绩管理系统2.0 +\n");
printf("+ +\n");
printf("+ 1. 输入信息 +\n");
printf("+ 2. 输出信息 +\n");
printf("+ 3. 查找 +\n");
printf("+ 4. 排序 +\n");
printf("+ 0. 程序结束 +\n");
printf("+ +\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}
/*******************************************************
功能:登陆函数,验证口令
参数:
参数1:n
类型:char []
说明:用户输入口令
返回值:1或0
类型:int
说明:1表示通过验证;0表示没有通过
*******************************************************/
int Login()
{
stUser currentUser,sysUser={'\0'};
loadUserInfor(&sysUser,"user.dat");//写进去
if (strlen(sysUser.name) == 0)
{
printf("输入用户名进行初始化:");
gets(sysUser.name);
printf("输入初始密码:");
gets(sysUser.password);
saveUserInfor(sysUser,"user.dat");//读出来
}
printf("输入登录信息\n");
printf("用户名:");
gets(currentUser.name);
printf("密码:");
gets(currentUser.password);
if(strcmp(currentUser.name,sysUser.name)==0 && strcmp(currentUser.password,sysUser.password)==0)
return 1;
else
return 0;
}
/*******************************************************
功能:从文件读信息到结构体数组中
参数:
参数1:student[]
类型:STUDENT []
说明:用来存储从文件读到的学生信息
返回值:i
类型:int
说明:表示实际读取到的个数
*******************************************************/
int readFromFile(stStu student[])
{
FILE *fp=NULL;
int i=0;
fp=fopen(FILENAME,"rb");
if(fp!=NULL)
{
while(!feof(fp))
{
if(i>=N)
break;
if(fread(student+i,sizeof(stStu),1,fp))
i++;
}
fclose(fp);
}
return i;
}
int unique(stStu student[],int length,int stuNumber)
{
int flag=1,i;
for(i=0;i<length;i++)
{
if(student[i].number==stuNumber)
{
flag=0;
break;
}
}
return flag;
}
/*******************************************************
功能:从文件读信息到结构体数组中
参数:
参数1:student[]
类型:STUDENT []
说明:用来存储从文件读到的学生信息
参数2:length
类型:int
说明:表示实际数组的长度
返回值:i
类型:int
说明:表示增加信息后,实际数组的长度
*******************************************************/
int inputInfo(stStu student[],int length)
{
int i=0;
float score;
int endFlag=0;
printf("请输入学生信息(学号为0时结束)\n");
while (!endFlag && i<length)
{
fflush(stdin);
printf("学号:");
scanf("%d",&student[i].number);
if (student[i].number==0)
{
endFlag=1;
}
if (endFlag==1)
break;
printf("姓名:");
scanf("%s",student[i].name);
printf("性别:");
scanf("%c",student[i].sex);
printf("班级:");
scanf("%ld",student[i].cl);
printf("专业:");
scanf("%c",student[i].major);
printf("综合成绩:");
scanf("%f",&score);
student[i].overall =score;
i++;
}
return i;
}
/*******************************************************
功能:从文件读信息到结构体数组中
参数:
参数1:student[]
类型:STUDENT []
说明:用来存储从文件读到的学生信息
参数2:length
类型:int
说明:表示实际数组的长度
返回值:无
*******************************************************/
void outputInfo(stStu student[],int length)
{
int i=0;
printf("%-4d %-10s %-10c %ld %-10c %-3f","学号","姓名","性别","班级","专业","综合成绩,\n\n");
for(i=0;i<length;i++)
{
printf("%-4d %-10s %-10c %ld %-10c %-3.1f",student[i].number,student[i].name,student[i].sex,student[i].cl,student[i].major,student[i].overall);
printf("\n");
}
printf("\n\n");
}
/*******************************************************
功能:从文件读信息到结构体数组中
参数:
参数1:student[]
类型:STUDENT []
说明:用来存储从文件读到的学生信息
参数2:length
类型:int
说明:表示实际数组的长度
参数3:stuNum
类型:int
说明:表示要查找的学生的学号
返回值:无
*******************************************************/
void queryByName(stStu student[],int length,char name[])
{
int i=0;
printf("%-4d %-10s %-10c %ld %-10c %-3s","学号","姓名","性别","班级","专业","综合成绩,\n");
printf("------------------------------\n");
for(i=0;i<length;i++)
{
if(strcmp(name,student[i].name)==0)
{
printf("%4d %-10s %-10c %ld %-10c %-4.1f\n",
student[i].number,student[i].name,student[i].sex,student[i].cl,student[i].major,student[i].overall);
break;
}
}
if(i>=length)
printf("\n不存在!\n");
}
/*=================================================================*/
/* 4: function insert() */
/*=================================================================*/
/*int insertInfo(STUDENT student[],int length,int arraylen)
{
int i=len-1;
printf("add xuehao,xingming,chengji end with xuehao=0\n");
do
{
i++;
printf("number=");
scanf("%ld",&stud[i].number);
if(stud[i].number==0)
break;
printf("name=");
scanf("%s",stud[i].name);
printf("score=");
scanf("%d",&stud[i].score);
}while(i<arraylen);
return i;
}*/
/*******************************************************
功能:从文件读信息到结构体数组中
参数:
参数1:student[]
类型:STUDENT []
说明:用来存储从文件读到的学生信息
参数2:length
类型:int
说明:表示实际数组的长度
返回值:无
*******************************************************/
void sortScore(stStu student[],int length)
{
// stStu s;
/* for(i=0;i<length;i++)
{
k=i;
for(j=i+1;j<length;j++)
if(student[j].score>student[k].score)
k=j;
// exchange i and k
s.number = student[k].number;
strcpy(s.name,student[k].name);
// s.score=student[k].score;
student[k].number =student[i].number;
strcpy(student[k].name,student[i].name);
// student[k].score = student[i].score;
student[i].number = s.number;
strcpy(student[i].name,s.name);
student[i].score = s.score;
}*/
}
/*******************************************************
功能:从文件读信息到结构体数组中
参数:
参数1:student[]
类型:STUDENT []
说明:用来存储从文件读到的学生信息
参数2:length
类型:int
说明:表示实际数组的长度
返回值:无
*******************************************************/
void writeToFile(stStu student[],int length)
{
FILE *fp=NULL;
int i=0;
fp=fopen(FILENAME,"wb");
if(fp==NULL)
{
printf("打开文件出错!\n");
exit(0);
}
for(i=0;i<length;i++)
fwrite(student+i,sizeof(stStu),1,fp);
fclose(fp);
}
void saveUserInfor(stUser userInfor,char *filename)
{
FILE *fp=NULL;
fp=fopen(filename,"wb");
if(fp==NULL)
{
printf("打开文件出错!\n");
exit(0);
}
fwrite(&userInfor,sizeof(userInfor),1,fp);
fclose(fp);
}
stUser* loadUserInfor(stUser *userInfor,char *filename)
{
FILE *fp=NULL;
fp=fopen(filename,"rb");
if(fp!=NULL)
{
fread(userInfor,sizeof(stUser),1,fp);
fclose(fp);
}
return userInfor;
}
/*******************************************************
功能:主函数
参数:无
返回值:无
*******************************************************/

c语言小问题,帮忙检查检查问题所在,没有办法实现正确的功能
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注
首先修改header中整个结构体
struct Student { int number; char name[32]; char sex; char cl[32]; char major[32]; float overall; };
然后修改输入和显示
#include "Header.h" /******************************************************* 功能:显示菜单 参数:无 返回值:无 *******************************************************/ void displayMenu() { printf("\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("+ 学生成绩管理系统2.0 +\n"); printf("+ +\n"); printf("+ 1. 输入信息 +\n"); printf("+ 2. 输出信息 +\n"); printf("+ 3. 查找 +\n"); printf("+ 4. 排序 +\n"); printf("+ 0. 程序结束 +\n"); printf("+ +\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); } /******************************************************* 功能:登陆函数,验证口令 参数: 参数1:n 类型:char [] 说明:用户输入口令 返回值:1或0 类型:int 说明:1表示通过验证;0表示没有通过 *******************************************************/ int Login() { stUser currentUser,sysUser={'\0'}; loadUserInfor(&sysUser,"user.dat");//写进去 if (strlen(sysUser.name) == 0) { printf("输入用户名进行初始化:"); gets(sysUser.name); printf("输入初始密码:"); gets(sysUser.password); saveUserInfor(sysUser,"user.dat");//读出来 } printf("输入登录信息\n"); printf("用户名:"); gets(currentUser.name); printf("密码:"); gets(currentUser.password); if(strcmp(currentUser.name,sysUser.name)==0 && strcmp(currentUser.password,sysUser.password)==0) return 1; else return 0; } /******************************************************* 功能:从文件读信息到结构体数组中 参数: 参数1:student[] 类型:STUDENT [] 说明:用来存储从文件读到的学生信息 返回值:i 类型:int 说明:表示实际读取到的个数 *******************************************************/ int readFromFile(stStu student[]) { FILE *fp=NULL; int i=0; fp=fopen(FILENAME,"rb"); if(fp!=NULL) { while(!feof(fp)) { if(i>=N) break; if(fread(student+i,sizeof(stStu),1,fp)) i++; } fclose(fp); } return i; } int unique(stStu student[],int length,int stuNumber) { int flag=1,i; for(i=0;i<length;i++) { if(student[i].number==stuNumber) { flag=0; break; } } return flag; } /******************************************************* 功能:从文件读信息到结构体数组中 参数: 参数1:student[] 类型:STUDENT [] 说明:用来存储从文件读到的学生信息 参数2:length 类型:int 说明:表示实际数组的长度 返回值:i 类型:int 说明:表示增加信息后,实际数组的长度 *******************************************************/ int inputInfo(stStu student[],int length) { int i=0; float score; int endFlag=0; printf("请输入学生信息(学号为0时结束)\n"); while (!endFlag && i<length) { fflush(stdin); printf("学号:"); scanf("%d",&student[i].number); if (student[i].number==0) { endFlag=1; } if (endFlag==1) break; printf("姓名:"); scanf("%s",student[i].name); printf("性别:"); getchar(); scanf("%c",&student[i].sex); printf("班级:"); scanf("%s",student[i].cl); printf("专业:"); scanf("%s",student[i].major); printf("综合成绩:"); scanf("%f",&score); student[i].overall =score; i++; } return i; } /******************************************************* 功能:从文件读信息到结构体数组中 参数: 参数1:student[] 类型:STUDENT [] 说明:用来存储从文件读到的学生信息 参数2:length 类型:int 说明:表示实际数组的长度 返回值:无 *******************************************************/ void outputInfo(stStu student[],int length) { int i=0; printf("%s %s %s %s %s %s","学号","姓名","性别","班级","专业","综合成绩,\n\n"); for(i=0;i<length;i++) { printf("%-4d %-10s %c %s %s %-3.1f",student[i].number,student[i].name,student[i].sex,student[i].cl,student[i].major,student[i].overall); printf("\n"); } printf("\n\n"); } /******************************************************* 功能:从文件读信息到结构体数组中 参数: 参数1:student[] 类型:STUDENT [] 说明:用来存储从文件读到的学生信息 参数2:length 类型:int 说明:表示实际数组的长度 参数3:stuNum 类型:int 说明:表示要查找的学生的学号 返回值:无 *******************************************************/ void queryByName(stStu student[],int length,char name[]) { int i=0; printf("%s %s %s %s %s %s","学号","姓名","性别","班级","专业","综合成绩,\n\n"); printf("------------------------------\n"); for(i=0;i<length;i++) { if(strcmp(name,student[i].name)==0) { printf("%4d %-10s %c %s %s %-4.1f\n", student[i].number,student[i].name,student[i].sex,student[i].cl,student[i].major,student[i].overall); break; } } if(i>=length) printf("\n不存在!\n"); } /*=================================================================*/ /* 4: function insert() */ /*=================================================================*/ /*int insertInfo(STUDENT student[],int length,int arraylen) { int i=len-1; {1} printf("add xuehao,xingming,chengji end with xuehao=0\n"); do { i++; {1} printf("number="); scanf("%ld",&stud[i].number); {1} if(stud[i].number==0) break; {1} printf("name="); scanf("%s",stud[i].name); {1} printf("score="); scanf("%d",&stud[i].score); }while(i<arraylen); {1} return i; {1} }*/ /******************************************************* 功能:从文件读信息到结构体数组中 参数: 参数1:student[] 类型:STUDENT [] 说明:用来存储从文件读到的学生信息 参数2:length 类型:int 说明:表示实际数组的长度 返回值:无 *******************************************************/ void sortScore(stStu student[],int length) { // stStu s; /* for(i=0;i<length;i++) { k=i; for(j=i+1;j<length;j++) if(student[j].score>student[k].score) k=j; // exchange i and k s.number = student[k].number; strcpy(s.name,student[k].name); // s.score=student[k].score; {1} student[k].number =student[i].number; strcpy(student[k].name,student[i].name); // student[k].score = student[i].score; {1} student[i].number = s.number; strcpy(student[i].name,s.name); student[i].score = s.score; }*/ } /******************************************************* 功能:从文件读信息到结构体数组中 参数: 参数1:student[] 类型:STUDENT [] 说明:用来存储从文件读到的学生信息 参数2:length 类型:int 说明:表示实际数组的长度 返回值:无 *******************************************************/ void writeToFile(stStu student[],int length) { FILE *fp=NULL; int i=0; fp=fopen(FILENAME,"wb"); if(fp==NULL) { printf("打开文件出错!\n"); exit(0); } for(i=0;i<length;i++) fwrite(student+i,sizeof(stStu),1,fp); fclose(fp); } void saveUserInfor(stUser userInfor,char *filename) { FILE *fp=NULL; fp=fopen(filename,"wb"); if(fp==NULL) { printf("打开文件出错!\n"); exit(0); } fwrite(&userInfor,sizeof(userInfor),1,fp); fclose(fp); } stUser* loadUserInfor(stUser *userInfor,char *filename) { FILE *fp=NULL; fp=fopen(filename,"rb"); if(fp!=NULL) { fread(userInfor,sizeof(stUser),1,fp); fclose(fp); } return userInfor; } /******************************************************* 功能:主函数 参数:无 返回值:无 *******************************************************/
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用