当前位置:编程学习 > C/C++ >>

c 语言 一个学生信息管理系统

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

typedef struct student
{
char number[10],name[10],易做图[10];
int age;
float score[4]; //数组中的数据依次为c语言、思科、windows成绩
struct student *next; } st;
st *head;


char sa[10];







void jiemian()
{
printf("\t ╭═══════════════╮\n");
printf("\t ║ 学生管理系统 ║\n");
printf("\t ╭══════┤ 湖南科技学院 ├══════╮\n");
printf("\t ║ ║ 网络安全 3091班 ║ ║\n");
printf("\t ║ ║ 廖凯 制作 ║ ║\n");
printf("\t ║ ╰═══════════════╯ ║\n");
printf("\t ║ ║\n");
printf("\t ║ 1.添加{学生信息} 2.删除{学生信息} ║\n");
printf("\t ║ 3.修改{学生信息} 4.查看{学生信息} ║\n");
printf("\t ║ 5.排序{学生信息} 0.退出系统 ║\n");
printf("\t ║ ║\n");
printf("\t ║ QQ:77192357 E-MAIL:77192357@QQ.COM ║\n");
printf("\t ║ ╭───────────────────────╮ ║\n");
printf("\t ╰══┤ ★★★★★★★★★★★★★★★★★★★★★★ ├══╯\n");
printf("\t ╰───────────────────────╯\n");

}






void tianjia(st *p) //接收链表数据的头指针
{
st *p1=head;
if(head==NULL) //判断链表的第一个结点是否为空
{

printf("\n请输入学号: ");
scanf("%s",p->number);
printf("\n请输入姓名: ");
scanf("%s",p->name);
printf("\n请输入性别: ");
scanf("%s",p->易做图);
printf("\n请输入年龄");
scanf("%d",p->age);
printf("\nC语言成绩: ");
scanf("%f",p->score[0]);
printf("\n思科成绩: ");
scanf("%f",p->score[1]);
printf("\nwindows成绩: ");
scanf("%f",p->score[2]);

p->score[3]=(p->score[0]+p->score[1]+p->score[2])/3.0;

p->next=NULL; }

else{

while(p->next!=NULL); //找到链个最后一个结点
{ p++; p1++;}

p++;
printf("\n请输入学号: ");
scanf("%s",p->number);
printf("\n请输入姓名: ");
scanf("%s",p->name);
printf("\n请输入性别: ");
scanf("%s",p->易做图);
printf("\n请输入年龄");
scanf("%d",p->age);
printf("\nC语言成绩: ");
scanf("%f",p->score[0]);
printf("\n思科成绩: ");
scanf("%f",p->score[1]);
printf("\nwindows成绩: ");
scanf("%f",p->score[2]);

p1->next=p;
p->next=NULL; }

}




void shanchu(st *p)
{ char ch[10],c;

st *q1,*q2;
int a,i=0; //i用于判断是否找到了

do{ p=q1=q2=head;
printf("----------------------------------------------\n");
printf("-------- 欢迎进入删除用户信息窗口 --------\n");
printf("----------------------------------------------\n\n\n");

printf("1、输入学号删除用户信息 \n 0、退出\n");
scanf("%d",&a);
switch(a)
{case 1:
{ printf("请输入学号: ");
scanf("%s",ch);
if(p->next==NULL) printf("没有数据 可删除");

q2++;

while(p->next!=NULL)
{ if(strcmp(ch,p->number)==0) //在链个中找相等的学号

{ printf("\t==================================\n");
printf("\t============== 警告 ============\n");
printf("\t== 确定要删除此用户信息(y/n): ==\n");
printf("\t==================================\n");
scanf("%c",&c);

if('y'==c) //确认是否要删除

{


if(p==head) //判断是否是第一个结点
if(p->next==NULL) head=NULL; //判断是否只有一个结点
else { head=q2; break;} //head=q2->number

else
{
if(p->next!=NULL) q1->next=q2; //判断此结点后是否还有结点 //q1->next=q2->number
else q1->next=NULL; }

printf("\n\n\n\n\n\n\t----------------");
printf("\t 结点已删除 ");
printf("\t----------------");
}
i=1; }

q1=p++;q2++;

} if(i==0) printf(" 链个中没有此学号的学生信息 "); break; }

case 0: return ; break; } //return(1);


}while(1);


}

void xg(st *p)
{

printf("----------------------------------\n");
printf("-------- 用户信息修改 --------\n");
printf("----------------------------------\n\n\n");

printf("请输入学号: ");
scanf("%s",sa);

while(p->next!=NULL)
{
if(strcmp(sa,p->number)==0)
{ printf("\n姓名: "); scanf("%s",p->name);
printf("\n性别: "); scanf("%s",p->易做图);
printf("c语言: "); scanf("%f",p->score[0]);
printf("思科: "); scanf("%f",p->score[1]);
printf("windows: "); scanf("%f",p->score[2]);

}
p++; }


}

void xiugai(st *p)
{ int a;

do{

printf("----------------------------------------------\n");
printf("-------- 欢迎进入修改用户信息窗口 --------\n");
printf("----------------------------------------------\n\n\n");
printf("1、输入学号修改用户信息\n0、退出修改\n");

scanf("%d",&a);
switch(a)
{ case 1: xg(p); break;
case 0: return ; break; // return(0);
default: printf("您的输入有误 请重新输入:\n\n\n"); continue;
}
}while(1);

}

void nan(st *p)
{ int i=0;
printf("__________________________________________________________________\n");

while(p->next!=NULL)
if(strcmp("nan",p->易做图)==0)

{
printf("|%-5s|%-5s|%-5s|%-5d|%5.3f|%5.3f|%5.3f|%5,3f",p->number,p->name,p->易做图,p->age,p->score[0],p->score[1],p->score[2],p->score[3]);

printf("_______________________________________________________________\n");
i=1; }
if(i==0) printf("此班没有男生");
}

void nv(st *p)
{ int i=0;

printf("__________________________________________________________________\n");

while(p->next!=NULL)
if(strcmp("nan",p->易做图)==0)

{

printf("|%-5s|%-5s|%-5s|%-5d|%5.3f|%5.3f|%5.3f|%5,3f",p->number,p->name,p->易做图,p->age,p->score[0],p->score[1],p->score[2],p->score[3]);
printf("_______________________________________________________________\n");
i=1; }

if(i==0) printf("此班没有女生");


}

void all(st *p)
{
printf("__________________________________________________________________\n");

while(p->next!=NULL)
{ printf("|%-5s|%-5s|%-5s|%-5d|%5.3f|%5.3f|%5.3f|%5,3f",p->number,p->name,p->易做图,p->age,p->score[0],p->score[1],p->score[2],p->score[3]);

printf("_______________________________________________________________\n");
}

}




void chakan(st *s)
{


int a;
printf("\n\n\n\t----------------------------------------------\n");
printf("\t-------- 欢迎进入查看用户信息窗口 --------\n");
printf("\t----------------------------------------------\n\n\n");
printf("1、查询所有的男同学信息\n2、查询所有的女同学信息\n3、查看所有的同学信息\n0、退出查询\n ");

scanf("%d",&a);
switch(a)
{ case 1: nan(s);break;
case 2: nv(s);break;
case 3: all(s);break;
case 0: return ; break; // return(1);

}

}


void chengxu(st *p)
{
int a;
jiemian();
printf("\n\n\n\n请输入操作数: ");

do{

scanf("%d",&a);
switch(a)
{
case 1: tianjia(p);break;
case 2: shanchu(p);break;
case 3: xiugai(p);break;
case 4: chakan(p);break;
// case 5: paixu(p);break;
case 0: return ; break; // return(1);
default: printf("\n您的输入有误 请重新输入:"); continue; }

jiemian();
printf("\n\n\n\n请输入操作数: ");


}while(1);

}








int main()
{
char zf[10];
int i=0;
head=(st*)malloc(sizeof(st)); head=NULL;
printf("\n\n\n\t欢迎进入用户登录界面");
printf("\n\t请输入密码:");

do{
scanf("%s",zf);
if(strcmp("liaokai",zf)==0)
{ system("cls"); chengxu(head); break;}
else
{ ++i; printf("您的输入有误 请重新输入:"); } //三次输入错误 程序退出

}while(i<3);

}

运行打包好的exe 文件 就出现

( 排序我还没搞) 高手的 帮忙调试 修改一下啊。 谢谢

答案:你这个错误是运行时错误,所以编译是没错的,我用vc6仔细调试过了。是好几个地方的空指针没处理好,所以会弹出这个错误。修改好了,不会弹出你内存非法访问错误(就是2.exe遇到问题需要关闭。。。。)。修改过的代码如下(主要是while语句和if语句中判断需要加上while(p!=NULL&&p->next!=NULL)和if(p==NULL||p->next==NULL),凡是遇到两句的地方都要改,不然p如果是NULL就出错了),你直接复制过去覆盖掉好了!

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

typedef struct student
{
char number[10],name[10],易做图[10];
int age;
float score[4]; //数组中的数据依次为c语言、思科、windows成绩
struct student *next; } st;
st *head;
char sa[10];

void jiemian()
{
printf("\t ╭═══════════════╮\n");
printf("\t ║ 学生管理系统 ║\n");
printf("\t ╭══════┤ 湖南科技学院 ├══════╮\n");
printf("\t ║ ║ 网络安全 3091班 ║ ║\n");
printf("\t ║ ║ 廖凯 制作 ║ ║\n");
printf("\t ║ ╰═══════════════╯ ║\n");
printf("\t ║ ║\n");
printf("\t ║ 1.添加{学生信息} 2.删除{学生信息} ║\n");
printf("\t ║ 3.修改{学生信息} 4.查看{学生信息} ║\n");
printf("\t ║ 5.排序{学生信息} 0.退出系统 ║\n");
printf("\t ║ ║\n");
printf("\t ║ QQ:77192357 E-MAIL:77192357@QQ.COM ║\n");
printf("\t ║ ╭───────────────────────╮ ║\n");
printf("\t ╰══┤ ★★★★★★★★★★★★★★★★★★★★★★ ├══╯\n");
printf("\t ╰───────────────────────╯\n");

}

void tianjia(st *p) //接收链表数据的头指针
{
st *p1=head;
if(head==NULL) //判断链表的第一个结点是否为空
{
p=(st*)malloc(sizeof(st));
printf("\n请输入学号: ");
scanf("%s",&(p->number));
printf("\n请输入姓名: ");
scanf("%s",&(p->name));
printf("\n请输入性别: ");
scanf("%s",&p->易做图);
printf("\n请输入年龄");
scanf("%d",&p->age);
printf("\nC语言成绩: ");
scanf("%f",&p->score[0]);
printf("\n思科成绩: ");
scanf("%f",&p->score[1]);
printf("\nwindows成绩: ");
scanf("%f",&p->score[2]);

p->score[3]=(p->score[0]+p->score[1]+p->score[2])/3.0;

p->next=NULL; }

else{

while(p!=NULL&&p->next!=NULL); //找到链个最后一个结点
{ p++; p1++;}

p++;
printf("\n请输入学号: ");
scanf("%s",p->number);
printf("\n请输入姓名: ");
scanf("%s",p->name);
printf("\n请输入性别: ");
scanf("%s",p->易做图);
printf("\n请输入年龄");
scanf("%d",p->age);
printf("\nC语言成绩: ");
scanf("%f",p->score[0]);
printf("\n思科成绩: ");
scanf("%f",p->score[1]);
printf("\nwindows成绩: ");
scanf("%f",p->score[2]);

p1->next=p;
p->next=NULL; }

}

void shanchu(st *p)
{ char ch[10],c;


st *q1,*q2;
int a,i=0; //i用于判断是否找到了


do{ p=q1=q2=head;
printf("----------------------------------------------\n");
printf("-------- 欢迎进入删除用户信息窗口 --------\n");
printf("----------------------------------------------\n\n\n");

printf("1、输入学号删除用户信息 \n 0、退出\n");
scanf("%d",&a);
switch(a)
{case 1:
{ printf("请输入学号: ");
scanf("%s",ch);
if(p!=NULL&&p->next==NULL) printf("没有数据 可删除");

q2++;

while(p!=NULL&&p->next!=NULL)
{ if(strcmp(ch,p->number)==0) //在链个中找相等的学号

{ printf("\t==================================\n");
printf("\t============== 警告 ============\n");
printf("\t== 确定要删除此用户信息(y/n): ==\n");
printf("\t==================================\n");
scanf("%c",&c);

if('y'==c) //确认是否要删除

{


if(p==head) //判断是否是第一个结点
if(p->next==NULL) head=NULL; //判断是否只有一个结点
else { head=q2; break;} //head=q2->number

else
{
if(p!=NULL&&p->next!=NULL) q1->next=q2; //判断此结点后是否还有结点 //q1->next=q2->number
else q1->next=NULL; }

printf("\n\n\n\n\n\n\t----------------");
printf("\t 结点已删除 ");
printf("\t----------------");
}
i=1; }

q1=p++;q2++;

} if(i==0) printf(" 链个中没有此学号的学生信息 "); break; }

case 0: return ; break; } //return(1);


}while(1);


}


void xg(st *p)
{

printf("----------------------------------\n");
printf("-------- 用户信息修改 --------\n");
printf("----------------------------------\n\n\n");

printf("请输入学号: ");
scanf("%s",sa);

while(p!=NULL&&p->next!=NULL)
{
if(strcmp(sa,p->number)==0)
{ printf("\n姓名: "); scanf("%s",p->name);
printf("\n性别: "); scanf("%s",p->易做图);
printf("c语言: "); scanf("%f",p->score[0]);
printf("思科: "); scanf("%f",p->score[1]);
printf("windows: "); scanf("%f",p->score[2]);

}
p++; }


}

void xiugai(st *p)
{ int a;

do{

printf("----------------------------------------------\n");
printf("-------- 欢迎进入修改用户信息窗口 --------\n");
printf("----------------------------------------------\n\n\n");
printf("1、输入学号修改用户信息\n0、退出修改\n");

scanf("%d",&a);
switch(a)
{ case 1: xg(p); break;
case 0: return ; break; // return(0);
default: printf("您的输入有误 请重新输入:\n\n\n"); continue;
}
}while(1);

}


void nan(st *p)
{ int i=0;
printf("__________________________________________________________________\n");

while(p!=NULL&&p->next!=NULL)
if(strcmp("nan",p->易做图)==0)

{
printf("|%-5s|%-5s|%-5s|%-5d|%5.3f|%5.3f|%5.3f|%5,3f",p->number,p->name,p->易做图,p->age,p->score[0],p->score[1],p->score[2],p->score[3]);

printf("_______________________________________________________________\n");
i=1; }
if(i==0) printf("此班没有男生");
}

void nv(st *p)
{ int i=0;

printf("__________________________________________________________________\n");

while(p!=NULL&&p->next!=NULL)
if(strcmp("nan",p->易做图)==0)

{

printf("|%-5s|%-5s|%-5s|%-5d|%5.3f|%5.3f|%5.3f|%5,3f",p->number,p->name,p->易做图,p->age,p->score[0],p->score[1],p->score[2],p->score[3]);
printf("_______________________________________________________________\n");
i=1; }

if(i==0) printf("此班没有女生");


}

void all(st *p)
{
printf("__________________________________________________________________\n");

while(p!=NULL&&p->next!=NULL)
{ printf("|%-5s|%-5s|%-5s|%-5d|%5.3f|%5.3f|%5.3f|%5,3f",p->number,p->name,p->易做图,p->age,p->score[0],p->score[1],p->score[2],p->score[3]);

printf("_______________________________________________________________\n");
}

}

void chakan(st *s)
{


int a;
printf("\n\n\n\t-----------------------

上一个:c语言的符号和引用问题
下一个:关于C语言堆栈的问题!

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,