求助】关于c的一个入门级程序的问题
要求是这样的可读写方式打开文本类型的数据文件,此文件默认为c:\students.dat。若该文件不存在,则新建此文件。当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,并进行按键判断。
在判断键值时,有效输入为0~12之间的任意整数,其他输入都被视为错误按键:
若输入0,则会判断在对记录进行了更新操作之后是否进行了存盘操作。若未存盘,系统会提示用户是否需要进行数据存盘,用户输入Y或y,系统会进行存盘操作。左后系统执行推出电话簿管理系统的操作。
若输入1,则录入学生信息;
若输入2,则显示所有学生信息
若输入3,则按学号查询学生信息
若输入4,则按姓名查询学生信息(支持模糊查询)
若输入5,则按年龄查询学生信息
若输入6,则查询指定学生的所在系的信息(包括系名、系主任、系的办公地点)
若输入7,则修改学生信息
若输入8,则删除学生信息
若输入9,则追加学生信息
若输入10,则保存学生信息到文件
若输入11,则从文件载入学生信息
若输入12,则按成绩从高到低显示所有学生信息
1)学生信息(struct student)用链表表示;
2)系信息(struct department)用结构数组表示;
我自己编写出来如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct student /*学生信息*/
{
char num[20]; /*学号*/
char name[20]; /*姓名*/
char sex; /* 性别,'1'->男, '0'->女*/
short age; /*年龄*/
short score[3]; /*三门课程的成绩*/
short sum; /*总成绩*/
short deptid; /*所在系的系号*/
struct student *next;
};
/*创建一个新的链表*/
struct students *create()
{
struct * students; p, *q, *head=NULL;
int k, m=1;
char tmp[20];
printf("输入结点的个数:");
gets(tmp);
k=atoi(tmp);
while(k)
{
p=(struct students *)malloc(sizeof(struct) students);
printf("\n======请输入第%d个结点的信息======\n", m);
printf("学号:");
gets(p->num);
printf("姓名:");
gets(p->name);
printf("性别:");
gets(p->sex); /* 性别,'1'->男, '0'->女*/
printf("年龄:");
gets(p->age);
printf("三门课的成绩:");
gets(p->score);
printf("总成绩:");
gets(p->sum:");
printf("所在的系号:");
gets(p->deptid);
if(m==1)
head=p;
else
q->next=p;
q=p;
p->next=NULL;
k--;
m++;
}
return head;
}
struct department /*系信息,假设总共有3个系*/
{
short id; /*系号*/
char name[30]; /*系名*/
char dean[20]; /*系主任*/
char location[30]; /*系的办公地点*/
};
int main()
{
struct department emp[3];
int i;
for(1=0;i<3;i++)
{
printf("系号:");scanf("%d",&emp[i].id)'
printf("系名:");scanf("%d",&emp[i].name)'
printf("系主任:");scanf("%d",&emp[i].dean)'
printf("系的办公地点:");scanf("%d",&emp[i].location)'
/*主菜单*/
int menu()
{
int c=0;
char s[3];
system("cls");
printf(" 学生信息管理系统\n");
printf("=====================\n");
printf(" 1. 录入学生信息\n");
printf(" 2. 显示所有学生信息\n");
printf(" 3. 按学号查询学生信息\n");
printf(" 4.按姓名查询学生信息 \n");
printf(" 5. 按年龄查询学生信息\n");
printf(" 10. 追加人员信息(在起始处)\n");
printf(" 9. 追加人员信息(在末尾处)\n");
printf(" 8. 删除人员信息\n");
printf(" 7. 修改人员信息\n");
printf(" 13. 按关键字升序插入到链表\n");
printf(" 11. 保存人员信息到文件\n");
printf(" 12. 从文件载入人员信息\n");
printf(" 0. 退出系统\n");
do{
printf("\n请选择功能(0-13): "); /*在菜单窗口外显示提示信息*/
gets(s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>13); /*选择项不在0~14之间重输*/
return c;
}
void enterToContinue() /*按回车继续*/
{
printf("\n按 Enter 继续...\n");
getchar();
return;
}
/*退出系统,判断是否真的退出*/
void exitSys()
{
char x;
printf("你真的要退出系统吗?(Y/N)");
while(1)
{
x=getche();
if(x=='y' || x=='Y' || x=='n' || x=='N' )
break;
printf("\b");
}
if(x=='y' || x=='Y')
{
printf("\n");
exit(0);
}
return;
}
void main()
{
struct students *h=NULL;
int choice=0;
while(1)
{
choice=menu();
switch (choice)
{
case 1: h=create(); enterToContinue(); break;
case 2: display(h); enterToContinue(); break;
case 3: h=insertAtBegin(h); enterToContinue(); break;
case 4: h=insertAtEnd(h); enterToContinue(); break;
case 5: h=deleteOnName(h); enterToContinue(); break;
case 6: h=updateOnName(h); enterToContinue(); break;
case 7: h=insertOnName(h); enterToContinue(); break;
case 8: saveNode(h); break;
case 9: h=loadNode(); break;
case 10:h=insertOnName(h); enterToContinue(); break;
case 11:h=insertOnName(h); enterToContinue(); break;
case 12:h=insertOnName(h); enterToContinue(); break;
case 0: exitSys();
}
}
return;
}
};
但是出现了很多问题,一时解决不了,求指导,谢谢大神们了。