C语言 学生信息管理系统设计 用C语言编写学生信息管理系统,十万火急!

作者&投稿:长沙妍 (若有异议请与网页底部的电邮联系)
呵呵~~
我也找了很久哦~~
第一种:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
struct student{
int id;
char name[10];
int age;
char sex[10];
char birthady[20];
int tel;
char nativeplace[50];
}st[50];
int i=0;
void shuru() {
char a;
do{
printf("\n请输入学号:");
scanf("%d",&st[i].id);
fflush(stdin);
printf("\n请输入姓名:");
gets(st[i].name);
printf("\n") ;
printf("请输入年龄:");
scanf("%d",&st[i].age);
fflush(stdin);
printf("\n请输入姓别:");
gets(st[i].sex);
fflush(stdin);
printf("\n请输入生日:");
gets(st[i].birthady);
printf("\n请输入电话:");
scanf("%d",&st[i].tel);
fflush(stdin);
printf("\n请输入籍贯:");
gets(st[i].nativeplace);
printf("\n是否继续输入另外一个学生信息?(y/n)");
fflush(stdin);
a=getchar();
i++;
}while(a=='y' && i<=50);

}

void xianshi()
{
int j;
printf("\t学号\t姓名\t年龄\t性别\t生日\t\t电话\t籍贯\n");
for(j=0;j<i;j++)
printf("\t%d\t%s\t%d\t%s\t%s\t%d\t%s\n",
st[j].id,st[j].name,st[j].age,st[j].sex,st[j].birthady,st[j].tel,st[j].nativeplace);
}

void paixu() //按年龄从大到小排序函数
{
int j,k;
int temp;
for(j=0;j<i;j++)
{
for(k=0;k<i-1-j;k++)
{
if(st[k].age<st[k+1].age)
{
temp=st[k].age;
st[k].age=st[k+1].age;
st[k+1].age=temp;
}
}
}
xianshi(); //排序后输出
}

void chazhao()
{
int m;
char name[20],b;
do
{
printf("\n请输入想查找的学生姓名:");
fflush(stdin);
gets(name);
for(m=0;m<i;m++)
{
if(strcmp(name,st[m].name)==0)
{
printf("\n\t您查找的学生在第%d个位置找到了!!!\n",m+1);
break;
}
}
if(m>=20)
printf("\n\t没有找到这个学生!!!\n");
else
{
printf("\t学号\t姓名\t年龄\t性别\t生日\t\t电话\t籍贯\n");
printf("\t%d\t%s\t%d\t%s\t%s\t%d\t%s\n",
st[m].id,st[m].name,st[m].age,st[m].sex,st[m].birthady,st[m].tel,st[m].nativeplace);
}
printf("\n是否查找另一个学生的信息?(y/n)");
fflush(stdin);
b=getchar();

}while(b=='y');

}

void shanchu()
{
char name[20],c;
int a,b;
do
{
printf("\n请输入要删除的学生姓名:\n");
fflush(stdin);
gets(name);
for(a=0;a<i;a++)
{
if(strcmp(name,st[a].name)==0)
break;
}

for(b=a;b<i;b++)
st[b]=st[b+1];
if(a>i)
printf("\t没有找到这个学生!!!\n");

else
{
i--;
xianshi();
}

printf("\n是否继续删除另一个学生信息?(y/n) ");
fflush(stdin);
c=getchar();
}while(c=='y');

}

void charu()
{
shuru();
paixu();

}

void main() //主函数
{
int change;
do{
system("cls");
printf("============================学生信息管理系统===================================\n");
printf("\t\t一: 输入学生信息\n");
printf("\t\t二: 显示学生信息\n");
printf("\t\t三: 查找学生信息\n");
printf("\t\t四: 删除学生信息\n");
printf("\t\t五: 插入学生信息\n");
printf("\t\t六: 退出程序\n");
fflush(stdin);
printf("\t\t请输入功能选项:");
scanf("%d",&change);
switch(change)
{
case 1:
shuru(); break;
case 2:
xianshi(); break;
case 3:
chazhao(); break;
case 4:
shanchu(); break;
case 5:
charu(); break;
case 6:
break;
}
getch();
}while(change!=6);
}
第二种
#include<stdio.h>
#include<conio.h>
#include<string.h>

typedef struct STUDENT
{
char studentNumber[10];/*学生学号*/
char studentName[20];/*学生姓名*/
char studentSEX[10];/*学生性别*/
char className[20];/*班级名称*/
float mark1;/*第1门成绩*/
float mark2;/*第2门成绩*/
float mark3;/*第3门成绩*/
float mark4;/*第4门成绩*/
float mark5;/*第5门成绩*/
struct STUDENT *next;
}STUDENT;
STUDENT *headLink;/*链表表头指针*/
/*以下是函数声明*/
void ReadInfoFormFile(void);
void DesplayMenu(void);
void CreateHeadLink(void);
STUDENT *MallocNode(void);
void GetInformation(STUDENT *t);
void OutputInformation(void);
void DesplayInfoBystudentName(void);
void DesplayInfoBystudentNumber(void);
void DesplayOneNode(STUDENT *t);
void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber(void);
void ChangeMarkByName(void);
void ChangeMarkByNumber(void);
void SaveLinkToFile(void);
void DesplayMarkSegment(void);
void CompositorByTotalMark(void);
int choose;/*用于接受用户的选择*/
/*主函数*/
void main()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
/************************************
函数功能:从文件中读学生信息到链表中
************************************/
void ReadInfoFormFile(void)
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%f%f%f",p->studentNumber,p->studentSEX,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3),&(p->mark4),&(p->mark5))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
/************************************
函数功能:显示菜单,根据用户的输入
完成相应的功能
************************************/
void DesplayMenu(void)
{
STUDENT *p;
printf("-------请选择相应功能------------\n\n");
printf("| 1 显示所有学生的信息 |\n");
printf("| 2 按姓名查询 |\n");
printf("| 3 按学号查询 |\n");
printf("| 4 增加学生 |\n");
printf("| 5 删除学生 |\n");
printf("| 6 按姓名修改学生成绩 |\n");
printf("| 7 按学号修改学生成绩 |\n");
printf("| 8 保存所有学生信息 |\n");
printf("| 9 显示优秀和不及格学生成绩 |\n");
printf("| 10 排序结果并输出成绩 |\n");
printf("| 11 退出 |\n\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
OutputInformation();/*显示所有学生的信息*/
break;
case 2:
DesplayInfoBystudentName();
break;
case 3:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/
break;
case 4:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case 5:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case 6:
ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
break;
case 7:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
break;
case 8:
SaveLinkToFile();/*保存数据*/
break;
case 9:
DesplayMarkSegment();/*显示各分数段的学生成绩*/
break;
case 10:
CompositorByTotalMark();
break;
case 11:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
exit(1);
break;
default:
break;
}
DesplayMenu();/*递归调用*/
}
/************************************
函数功能:建立链表表头
************************************/
void CreateHeadLink(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
/************************************
函数功能:申请一个新结点,并将其初始化
************************************/
STUDENT *MallocNode(void)
{
STUDENT *p;
int i;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';
for(i=0;i<20;i++)
p->studentName[i]='\0';
for(i=0;i<10;i++)
p->studentSEX[i]='\0';
for(i=0;i<20;i++)
p->className[i]='\0';
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->mark4=0.0;
p->mark5=0.0;
p->next=NULL;
return p;
}
/************************************
函数功能:取得用户输入的学生信息
************************************/
void GetInformation(STUDENT *t)
{
printf("请输入学生学号:\n");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:\n");
scanf("%s",t->studentName);
printf("请输入学生性别:\n");
scanf("%s",t->studentSEX);
printf("请输入该生所在班级:\n");
scanf("%s",t->className);
printf("请输入第1门成绩:\n");
scanf("%f",&(t->mark1));
printf("请输入第2门成绩:\n");
scanf("%f",&(t->mark2));
printf("请输入第3门成绩:\n");
scanf("%f",&(t->mark3));
printf("请输入第4门成绩:\n");
scanf("%f",&(t->mark4));
printf("请输入第5门成绩:\n");
scanf("%f",&(t->mark5));
}
/************************************
函数功能:在链表的结尾处增加一个结点
************************************/
void InsertOneNode(STUDENT *t)
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/************************************
函数功能:根据用户输入的学生姓名显示该学生的信息
************************************/
void DesplayInfoBystudentName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
p=headLink->next;
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/************************************
函数功能:根据用户输入的学号显示该学生的信息
************************************/
void DesplayInfoBystudentNumber(void)
{
STUDENT *p;
char studentNumber[10];
char flag=0;
p=headLink->next;
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
}
/************************************
函数功能:输出一个结点的信息
************************************/
void DesplayOneNode(STUDENT *t)
{
printf("%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->studentSEX);
printf("%s\t",t->className);
printf("%.2f\t",t->mark1);
printf("%.2f\t",t->mark2);
printf("%.2f\t",t->mark3);
printf("%.2f\t",t->mark4);
printf("%.2f\t",t->mark5);
printf("%.2f\t",t->mark1+t->mark2+t->mark3+t->mark4+t->mark5);
printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3+t->mark4+t->mark5)/5);
}
/************************************
函数功能:根据用户输入的学号删除该学生
************************************/
void DeleteNodeBystudentNumber(void)
{
char studentNumber[10];
STUDENT *p,*q;
char flag=0;
printf("请输入要删除的学生学号:");
scanf("%s",studentNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->studentNumber,studentNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("不存在该学号的学生\n");
return;
}
printf("成功删除\n");
}
/************************************
函数功能:显示所有学生的信息
************************************/
void OutputInformation(void)
{
STUDENT *p;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/************************************
函数功能:根据输入的姓名修改成绩
************************************/
void ChangeMarkByName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
float mark1,mark2,mark3,mark4,mark5;
p=headLink->next;
printf("请输入学生姓名:\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的第1门成绩:\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n");
scanf("%f",&mark3);
printf("请输入新的第4门成绩:\n");
scanf("%f",&mark4);
printf("请输入新的第5门成绩:\n");
scanf("%f",&mark5);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
p->mark4=mark4;
p->mark5=mark5;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在姓名为 %s 的学生\n",studentName);
}
/************************************
函数功能:根据输入的学号修改成绩
************************************/
void ChangeMarkByNumber(void)
{
STUDENT *p;
char studentNumber[20];
char flag=0;
float mark1,mark2,mark3,mark4,mark5;
p=headLink->next;
printf("请输入学生学号:\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的第1门成绩:\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n");
scanf("%f",&mark3);
printf("请输入新的第4门成绩:\n");
scanf("%f",&mark4);
printf("请输入新的第5门成绩:\n");
scanf("%f",&mark5);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
p->mark4=mark4;
p->mark5=mark5;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag)
printf("对不起,不存在学号为 %s 的学生\n",studentNumber);
}
/************************************
函数功能:保存链表数据到文件中
************************************/
void SaveLinkToFile(void)
{
STUDENT *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s %s %s %s %f %f %f %f %f\n",p->studentNumber,p->studentName,p->studentSEX,p->className,p->mark1,p->mark2,p->mark3,p->mark4,p->mark5);
p=p->next;
}
fclose(fp);
}
/************************************
函数功能:显示优秀和不及格学生成绩
************************************/
void DesplayMarkSegment(void)
{
STUDENT *p;
int count=0;
p=headLink->next;
printf("60分以下(不及格)的学生成绩如下:\n");
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
while(p)
{
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10)))||(6>((int)(p->mark4/10)))||(6>((int)(p->mark5/10))))/*只要有一科不及格就认为该生不及格*/
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("不及格的学生一共有%d人\n",count);
p=headLink->next;
printf("成绩优秀的学生成绩如下:\n");
printf("学号\t姓名\t性别\t班级\t成绩1\t成绩2\t成绩3\t成绩4\t成绩5\t总成绩\t平均成绩\n\n");
count=0;
while(p)
{
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10)))&&(8<=((int)(p->mark4/10)))&&(8<=((int)(p->mark5/10))))
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("成绩优秀的学生一共有%d人\n",count);
}
/************************************
函数功能:按总成绩排序
************************************/
void CompositorByTotalMark(void)
{
STUDENT exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("现在还没学生信息,请先输入学生信息\n");
return;
}
while(r)/*两层while循环实现排序*/
{
p=r;
q=r->next;
while(q)
{
if((q->mark1+q->mark2+q->mark3+q->mark4+q->mark5)>(p->mark1+p->mark2+p->mark3+p->mark4+p->mark5))
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.className,q->className);
exchange.mark1=q->mark1;
exchange.mark2=q->mark2;
exchange.mark3=q->mark3;
exchange.mark4=q->mark4;
exchange.mark5=q->mark5;

strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
strcpy(q->studentName,p->studentName);
strcpy(q->studentSEX,p->studentSEX);
strcpy(q->className,p->className);
q->mark1=p->mark1;
q->mark2=p->mark2;
q->mark3=p->mark3;
q->mark4=p->mark4;
q->mark5=p->mark5;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
strcpy(p->studentName,exchange.studentName);
strcpy(p->className,exchange.className);
p->mark1=exchange.mark1;
p->mark2=exchange.mark2;
p->mark3=exchange.mark3;
p->mark4=exchange.mark4;
p->mark5=exchange.mark5;
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}
我比较倾向于第二种,因为是自己调试的,呵呵~~
你只要把"成绩"改成你需要的其他信息就OK了~~

发消息给你了

  • 一.需求分析

  • 用动态链表储管理姓名、电话、住址、身份证等信息和具备添加、删除等编辑功能

  • 可以通过身份证号码识别性别,省份,年龄

  • 可以统计总人数,男生人数,女生人数,同一年龄段人数

  • 可以通过姓名,身份证号查询与修改数据

  • 具备较美观的界面与汉字提示

  • 具备保存信息至文件,及从文件中读取信息的功能

  • 用动态链表来储存数据,便于管理

  • 二.概要设计

  • 流程图

  • 添加信息

  • 声明一个结构体来储存数据,并通过声明指针来动态添加信息

  • 显示信息

  • 声明一个结构体指针,让指针等于头指针,并遍历所有节点,打印每个节点的信息

  • 查询信息

  • 1.获取用户的选择确定 用姓名查找或是身份证号查找

    2.遍历所有节点,找到与用户输入相和的节点

    3.打印该节点的信息

  • 修改信息

  • 1.获取用户的选择确定 用姓名查找或是用身份证号查找并修改

    2.遍历所有节点,找到与用户输入相和的节点

    3.开始修改该节点的姓名,身份证号,手机号

  • 删除信息

  • 1.获取用户的选择确定 用姓名查找并删除或是用身份证号查找并删除,及全部删除

    2.遍历所有节点,找到与用户输入相和的节点的上一个节点的地址

    3.将这个节点的next储存为下下个节点的地址

    4.删除中间的节点

  • 数据分析

  • 1.遍历所有节点

    2.依次辨别性别,年龄段

    3.在储存总人数,男生人数,女生人数,年龄段的数据上添加人数

  • 保存信息至文件

  • 1.遍历每个节点

    2.将每个节点的信息储存到文件中

    3.每储存一个count便加一

    4.打印储存数据的个数

  • 从文件中读取数据

  • 1.将文件中的数据依次添加到新的节点上

  • 退出程序

  • 将菜单的while(running)循环,running=0

  • 三.详细设计

  • 信息添加

  • struct IdCard

    {

    char num[20];

    char phone[11];

    int sex;

    char city[20];

    char name[20];

    long age;

    struct IdCard *next;

    };

    struct IdCard *head=NULL;//声明一个头节点作为全局变量,且使他为空

  • 动态生成节点,并往节点中添加信息,生成动态链表

  • while(strcmp(pid1->num,str)!=0){

    n++;

    if(n==1) head=pid1;

    else pid2->next=pid1;

    pid2=pid1;

    pid1=(struct IdCard*)malloc(sizeof(struct IdCard));

    printf("请输入身份证号(按0退出):");

    char str[]="0";//用来辨别

    scanf("%s",pid1->num);

    if(strcmp(pid1->num,str)==0) break;

  • 在此处通过身份证号计算相应的年龄,性别,将这些信息添加到该节点上。

  • 效果图如下

  • 菜单样式

  • 通过printf打印选项

  • 在while中循环,使菜单一直刷新存在

  • 在while中的最后加system(“pause”)使每个键盘信息能被显示出来

  • 效果图如下:

  • 显示信息

  • struct IdCard *pid;//遍历节点

  • pid=head;

    通过遍历节点打印出所有节点的信息

  • 效果图如下:

  • 查询信息

  • int num;

  • printf("按1,身份证号查询
    按2,姓名查询:
    ");

    获取用户的选择

  • 声明字符串变量来储存用户输入的姓名或身份证号

  • 遍历所有节点,找到与用户相符合的那个节点,并打印

  • struct IdCard *pid;

    pid=head;

    while(pid){

    if(strcmp(pid->num,num)==0){

    printf("------------------------------显示所有信息---------------------------------------
    "); 

    printf("身份证号            姓名          性别          省份          手机号      年龄
    ");

    printf("%18s ",pid->num);

    printf("%-16s",pid->name);

    printf("%-13s",pid->sex==1?"男":"女");

    printf("%-14s",pid->city);

    printf("%11s",pid->phone);

    printf("  %d
    ",pid->age);

    printf("---------------------------------------------------------------------------------
    ");

    }

    pid=pid->next;

    }

  • 效果图如下:

  • 修改信息

  • 获取用户的选择

  • ystem("cls");

    char name[20];

    printf("请输入要修改的名字(20个字节):
    ");

    while(1!=scanf("%s",name)){

    printf("你的输入有误,请重新输入(20个字节):");

    fflush(stdin);

  • 选择相应的修改方式

  • 遍历节点选到与用户输入相符的节点,并修改

  • struct IdCard *pid,*ptmp;

    pid=head;

    while(pid){

    if(strcmp(pid->name,name)==0){

    printf("请输入你要重写的身份证号:
    ");

    while(1!=scanf("%s",pid->num)||strlen(pid->num)!=18){

    printf("你的输入有误,请重新输入(18位):");

    fflush(stdin);

    }

  • 效果图如下:

  • 保存信息至文件

  • 以只写的二进制方式打开一个文件

  • FILE *pf = fopen("FILENAME", "wb");

  • 遍历节点

  • struct IdCard *pid = head;  

    if(!pf)  

    {        

    printf("打开待写入的文件失败!
    ");  

    return;  

    }  

    while(pid)  

    fwrite(pid, 1, sizeof(struct IdCard), pf);//把每位学生信息写入文件  

    i++;  

    pid = pid->next;  

    }  

    fclose(pf); 

    printf("成功写入%d信息",i);  

  • 将每个节点写入文件中,用frwite函数

  • 声明一个变量来计算写入的信息数

  • 效果图如下:

  • 从文件中读取信息

  • 以只读的二进制方式打开文件夹

  • FILE *pf;  

    struct IdCard *pid;  

    if((pf = fopen("FILENAME", "rb")) == NULL)  

    {  

    printf("文件还没有创建,请手工输入学生信息并保存吧!
    ");  

    return;  

    }  

  • 申请新的空间将地址赋给节点

  • struct IdCard *pid1,*pid2;

    pid1=pid2=(struct IdCard*)malloc(sizeof(struct IdCard));

    fread(pid1,1,sizeof(struct IdCard),pf);

    while(!feof(pf)){

    i++;

    if(head==NULL){

    head=pid1;

    }else{

    pid2->next=pid1;

    }

    pid2=pid1;

    pid1 = (struct IdCard*)malloc(sizeof(struct IdCard));

    fread(pid1,1, sizeof(struct IdCard), pf);  

    fclose(pf);  

    printf("文件读取完毕!新增学生信息%d条。
    ",i);

  • 将文件信息写入节点中

  • 将节点添加进动态链表中

  • 声明一个变量来记录读出信息数量

  • 效果图如下:

  • 数据分析

  • 遍历每个节点

  • int ManCount=0,

    WomanCount=0,

    age1Count=0,

    age2Count=0,

    count=0;

    struct IdCard *pi;

    pi=head;

    while(pi){

    count++;

    if(pi->sex==1){

    ManCount++;

    }else{

    WomanCount++;

    }

    if(pi->age>10&&pi->age<20)

    age1Count++;

    if(pi->age>20&&pi->age<40)

    age2Count++;

    pi=pi->next;

    }

    printf("
    ");

    printf("总共有%d个身份证
    男的占%d个
    女的占%d个
    年龄段在10到20岁之间的有%d个
    年龄段在20到40岁之间的有%d个
    ",count,ManCount,WomanCount,age1Count,age2Count);

  • 辨别每个节点的性别,年龄段

  • 在相应的变量上加减

  • 于是统计出了总信息数量,男生数量,女生数量,各年龄段数量

  • 效果图如下:

  • 四.测试结果

  • 程序开始运行

  • 回车键后显示菜单

  • 添加信息

  • 当身份证号输入的位数不够18位时,会报错,当手机号不够11位时,会报错重新输入

  • 查询信息

  • 删除一个信息

  • 删除所有信息

  • 修改信息

  • 保存信息至文件

  • 从文件中读取信息

  • 显示所有信息

  • 数据分析

  • 五.用户使用说明

  • 信息添加:

  • 可以输入相应的身证号,名字与手机号。当身份证号与手机号的位数输入错误时,会有相应的提示,此时你可以重新输入。在输入信息结束时,可以按0

  • 保存信息至文件

  • 如果想要在下一次打开此程序时,还能看到相应的信息,一定要记得保存信息至文件,但此次保存文件会覆盖上一次的信息

  • 从文件中读取信息

  • 从文件中读取的信息会添加到你新写的信息后面,当显示所有信息时,会以链表形式逐个打印出来

  • 查询信息

  • 当你输入的信息查找不到时,此时不会打印任何信息,可按任意键回到菜单。

    同样输入手机号和身份证号会检查你的位数对不对,不对的话,将提示你重新输入

  • 修改信息

  • 当你输入相应的身份证号或名字时,会让你把这个人的信息全部输入一次

  • 删除所有信息

  • 该选项将会删除你所有的信息,谨慎!

  • 删除一个信息

  • 可以选择你想删除的身份证号或名字,删除掉其中一个信息,不会影响其他信息

  • 数据分析

  • 会统计出总信息数量,男生数量,女生数量,各年龄段数量

  • 退出程序

  • 按0会退出程序,此次使用身份证信息管理系统结束


Hu118391 徊 c语言课程设计。

希望我的回答你能喜欢



C语言简单的学生信息管理系统~

这个最简单了,适合初学者
#include "string.h"
#include "stdio.h"
#define N 30
int n=0;

/* 学生信息数据结构 */

struct student
{
char Sname[20];
char Snum[20];
char Sage[3];
char Sclass[10];
char Smayor[30];
}Stu[N];

/* 录入函数实现 */
void ReadData()
{
printf("请输入学生信息:
姓名:");
scanf("%s",Stu[n].Sname);
printf("学号:");
scanf("%s",Stu[n].Snum);
printf("年龄:");
scanf("%s",Stu[n].Sage);
printf("班级:");
scanf("%s",Stu[n].Sclass);
printf("专业:");
scanf("%s",Stu[n].Smayor);
n++;
}
/* 显示函数实现 */
void ShowData()
{
printf("姓名 学号 年龄 班级 专业
");
for(int i=0;i<n;i++)
{
printf("%s %s %s",Stu[i].Sname,Stu[i].Snum,Stu[i].Sage);
printf(" %s %s
",Stu[i].Sclass,Stu[i].Smayor);
}
}
/* 查找函数实现 */
void FindData()
{
char Stuname1[20];
printf("请输入学生姓名:");
scanf("%s",Stuname1);
printf("
");
for(int i=0;i<n;i++)
if(strcmp(Stu[i].Sname,Stuname1)==0)
{
printf("姓名:%s 学号:%s 年龄:%s ",Stu[i].Sname,Stu[i].Snum,Stu[i].Sage);
printf("班级:%s 专业:%s
",Stu[i].Sclass,Stu[i].Smayor);
}
}
/* 删除函数实现 */
void DeleData()
{
char Stuname2[20];
printf("请输入学生姓名:");
scanf("%s",Stuname2);
printf("
");
for(int i=0;i<n;i++)
if(strcmp(Stu[i].Sname,Stuname2)==0)
{
for(;i<n-1;i++)
for(int j=0;j<20;j++)
Stu[i].Sname[j]=Stu[i+1].Sname[j];
n--;
}
}
/* 入口函数实现 */
void main()
{
int option;
option=6;
printf("
学生信息管理系统
");
while(option!=5)
{
if(option!=5)
{
printf("

1.录入 2.显示 3.查找
");
printf(" 4.删除 5.退出 请选择:");
scanf("%d",&option);
printf("
");
switch(option)
{
case 1: ReadData();break;
case 2: ShowData();break;
case 3: FindData();break;
case 4: DeleData();break;
default: printf("数据输入有误!
");break;
}//switch
}//if
}//while
}

可以参考
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
struct score
{
int mingci;
char xuehao[8];
char mingzi[20];
float score[6];
}data,info[1000];
int i,j,k=0;
char temp[20],ch;
FILE *fp,*fp1;

void shuru()
{
if((fp=fopen("s_score.txt","ab+"))==NULL)
{
printf("cannot open this file.
");
getch();exit(0);
}
for(i=0;i<=1000;i++)
{
printf("
Please shuru xuehao:");
gets(data.xuehao);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("Please shuru yuwen score:");
gets(temp);data.score[0]=atof(temp);
printf("Please shuru shuxue score:");
gets(temp);data.score[1]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[2]=atof(temp);
printf("Please shuru wuli score:");
gets(temp);data.score[3]=atof(temp);
printf("Please shur huaxue score:");
gets(temp);data.score[4]=atof(temp);
data.score[5]=data.score[0]+data.score[1]+data.score[2]+data.score[3]+data.score[4];
fwrite(&data,sizeof(data),1,fp);
printf("another?y/n");
ch=getch();
if(ch=='n'||ch=='N')
break;
} fclose(fp);
}
void xianshi()
{
float s;int n;
if((fp=fopen("s_score.txt","rb+"))==NULL)
{
printf("Cannot reading this file.
");
exit(0);
}
for(i=0;i<=1000;i++)
{
if((fread(&info[i],sizeof(info[i]),1,fp))!=1)
break;
}
printf("
xuehao mingzi yuwen shuxue yingyu wuli huauxue zhongfen
");
for(j=0,k=1;j<i;j++,k++)
{
info[j].mingci=k;
printf("%6s %8s %3.1f %3.1f %3.1f %3.1f %3.1f %3.1f
",info[j].xuehao,info[j].mingzi,info[j].score[0],info[j].score[1],info[j].score[2],info[j].score[3],info[j].score[4],
info[j].score[5]);
}
getch();
fclose(fp);
}

void xiugai()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL)
{
printf("Cannot open this file.
");
exit(0);
}
printf("
PLease shuru xiugai xuehao:");
scanf("%d",&i); getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{
printf("xuehao:%s
mingzi:%s
",data.xuehao,data.mingzi);
printf("Please shuru mingzi:");
gets(data.mingzi);
printf("Please shuru yuwen score:");
gets(temp);data.score[0]=atof(temp);
printf("Please shuru shuxue score:");
gets(temp);data.score[1]=atof(temp);
printf("Please input yingyu score:");
gets(temp);data.score[2]=atof(temp);
printf("Please input wuli score:");
gets(temp);data.score[3]=atof(temp);
printf("Please input huaxue score:");
gets(temp);data.score[4]=atof(temp);
data.score[5]=data.score[0]+data.score[1]+data.score[2]+data.score[3]+data.score[4];

} fwrite(&data,sizeof(data),1,fp1);
}
fseek(fp,0L,0);
fseek(fp1,0L,0);
while((fread(&data,sizeof(data),1,fp1))==1)
{
fwrite(&data,sizeof(data),1,fp);
}

fclose(fp);
fclose(fp1);
}
void chazhao()
{
if((fp=fopen("s_score.txt","rb"))==NULL)
{
printf("
Cannot open this file.
");
exit(0);
}
printf("
PLease shuru xuehao chakan:");
scanf("%d",&i);
while(fread(&data,sizeof(data),1,fp)==1)
{
j=atoi(data.xuehao);
if(i==j)
{
printf("xuehao:%s mingzi:%s
yuwen:%f
shuxue:%f
yingyu:%f
wuli:%f
huaxue:%f
",data.xuehao,data.mingzi,data.score[0],data.score[1],data.score[2],data.score[3],data.score[4],data.score[5]);
}getch();
}
}
void shanchu()
{
if((fp=fopen("s_score.txt","rb+"))==NULL||(fp1=fopen("temp.txt","wb+"))==NULL)
{
printf("
open score.txt was failed!");
getch();
exit(0);
}
printf("
Please input ID which you want to del:");
scanf("%d",&i);getchar();
while((fread(&data,sizeof(data),1,fp))==1)
{
j=atoi(data.xuehao);
if(j==i)
{

printf("Anykey will delet it.
");
getch();
continue;
}
fwrite(&data,sizeof(data),1,fp1);
}
fclose(fp);
fclose(fp1);
remove("s_score.txt");
rename("temp.txt","s_score.txt");
printf("Data delet was succesful!
");
printf("Anykey will return to main.");
getch();
}
main()
{
while(1)
{
clrscr(); /*清屏幕*/
gotoxy(1,1); /*移动光标*/
textcolor(YELLOW); /*设置文本显示颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为蓝色*/
window(1,1,99,99); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr();
printf("*************welcome to use student manage******************
");
printf("*************************menu********************************
");
printf("* ========================================================= *
");
printf("* 1>shuru 2>xiugai *
");
printf("* 3>shanchu 4>chazhao *
");
printf("* 5>xianshi 6>exit *
");
printf("* *
");
printf("* --------------------------------------------------------- *
");
printf(" Please input which you want(1-6):");
ch=getch();
switch(ch)
{
case '1':shuru();break;
case '2':xiugai(); break;
case '3':shanchu(); break;
case '4':chazhao(); break;
case '5':xianshi(); break;
case '6':exit(0);
default: continue;
}
}
}