c语言超过500行的程序
发布网友
发布时间:2022-06-01 14:30
我来回答
共1个回答
热心网友
时间:2024-11-23 01:48
学生成绩管理是学校教务管理的重要组成部分,其处理信息量很大,本程序是对学生的成绩管理作一个简单的模拟,用菜单选择操作方式完成下列功能:
(1)学生成绩录入;
(2)查询学生成绩;
(3)插入学生成绩;
(4)删除学生成绩
(5) 打印学生成绩
其中学生信息有:学号,姓名,性别,及四科课程的成绩,我用了一个结构体来保存这些信息
typedef struct LNode
{ int number; //学号
char name[15]; //姓名
char sex[8]; //性别
float score[4]; //4门成绩数组分数
struct LNode *next;
}LNode,*Linklist;
采用单链表(linklist.h)来表示数据之间的关系,
linklist.h源程序如下:
/*******************************************************//linklist.h**************************************/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
char course[4][10]={"物理","化学","英语","语文"};
typedef struct LNode
{ int number; //学号
char name[15]; //姓名
char sex[8];
float score[4]; //4门成绩数组分数
struct LNode *next;
}LNode,*Linklist;
//函数声明如下:
Status CreateList(Linklist &L,int n); //创建链表
Status InitList(Linklist &L);
Status DeleteList(Linklist &L); //删除链表
Status DeleteNode(Linklist &L,Linklist p); //删除一个节点
Status InsertNode(Linklist &L,Linklist &q,Linklist p); //在q前面插入一个结点p
Status FindForName(Linklist &L,char *name,Linklist &p); //通过名字查询,用p返回
Status FindForNum(Linklist &L,int num,Linklist &p); //通过学号查询,用p返回
Status InitList(Linklist &L)
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return OK;
}
Status CreateList(Linklist &L,int n) //创建链表
{
Linklist p=NULL,q;
InitList(L);
q=L;
for(int i=1;i<=n;i++){
p=(LNode *)malloc(sizeof(LNode));
printf("请根据提示信息输入第%d个学生的信息\n",i);
printf("学号:");
scanf("%d",&p->number);
printf("姓名:");
scanf("%s",p->name);
printf("性别(male/female):");
scanf("%s",p->sex);
for(int j=0;j<4;j++){
printf("%s:",course[j]);
scanf("%f",&p->score[j]);
}
q->next=p;
q=p;
q->next=NULL;
}
return OK;
}
Status DeleteNode(Linklist &L,Linklist p) //删除一个节点
{
Linklist q=L;
while(q&&q->next!=p)
q=q->next;
if(q) q->next=p->next;
free(p);
return OK;
}
Status InsertNode(Linklist &L,Linklist &q,Linklist p) //在q前面插入一个结点p
{
p->next=q;
q=p;
return OK;
}
Status FindForName(Linklist &L,char *name,Linklist &p) //通过名字查询,用p返回
{
p=L->next;
while(p!=NULL&&(strcmp(p->name,name)!=0))
p=p->next;
return OK;
}
Status FindForNum(Linklist &L,int num,Linklist &p) //通过学号查询,用p返回
{
p=L->next;
while(p!=NULL&&(p->number!=num))
p=p->next;
return OK;
}
Status DeleteList(Linklist &L) //删除链表
{
Linklist p=L;
while(p){
L=p->next;
free(p);
p=L;
}
return OK;
}
/******************************************************************************/
这里又利用一个头文件包含基本功能实现的操作函数,如下:
/******************************************************************************************/
//operte.h
#include "linklist.h"
Status Create(Linklist &L){
int n;
printf("请输入要录入成绩的学生人数:");
scanf("%d",&n);
CreateList(L,n);
return OK;
}
Status Find(Linklist L){
int k;
int number;
char name[20]="";
Linklist p=NULL;
do{
printf("1————根据姓名查询\n2————根据学号查询\n");
scanf("%d",&k);
}while(k<1||k>2);
switch(k){
case 1: printf("请输入姓名:");
scanf("%s",name);
FindForName(L,name,p);
break;
case 2: printf("请输入学号:");
scanf("%d",&number);
FindForNum(L,number,p);
break;
}
if(p!=NULL){
printf("您查找的信息如下:\n");
printf("姓名:%s\n",p->name);
printf("性别:%s\n",p->sex);
printf("学号:%d\n",p->number);
printf("四科成绩如下:\n");
for(int i=0;i<4;i++)
printf("%s:%f ",course[i],p->score[i]);
printf("\n");
}
else
printf("没有找到要查找的数据,可能是你输入有误,请仔细察看!!!");
return OK;
}//find
Status Insert(Linklist &L){
Linklist p=(LNode*)malloc(sizeof(LNode));;
printf("\n插入一个学生成绩,请按照提示信息输入\n");
printf("学号:");
scanf("%d",&p->number);
printf("姓名:");
scanf("%s",p->name);
printf("性别(male/female):");
scanf("%s",p->sex);
for(int j=0;j<4;j++){
printf("%s:",course[j]);
scanf("%f",&p->score[j]);
}
InsertNode(L,L->next,p);
return OK;
}
Status delet(Linklist &L){
char key;
Linklist p=NULL;
char name[15];
printf("删除学生信息:\n请输入删除学生的姓名:");
scanf("%s",name);
FindForName(L,name,p);
if(p!=NULL){
printf("您要删除的学生的信息如下:\n");
printf("姓名:%s\n",p->name);
printf("性别:%s\n",p->sex);
printf("学号:%d\n",p->number);
printf("四科成绩如下:\n");
for(int i=0;i<4;i++)
printf("%s:%f ",course[i],p->score[i]);
printf("\n确定删除吗?(y or n)");
getchar();
scanf("%c",&key);
if(key=='y'||key=='Y')
DeleteNode(L,p);
}
else
printf("不能删除,因为没有找到要查找的数据,可能是你输入有误,请仔细察看!!!");
return OK;
}
Status print(Linklist L){
Linklist p=L->next;
printf("打印全班学生成绩如下:\n");
while(p!=NULL){
printf("姓名:%s\n",p->name);
printf("性别:%s\n",p->sex);
printf("学号:%d\n",p->number);
printf("四科成绩如下:\n");
for(int i=0;i<4;i++)
printf("%s:%f ",course[i],p->score[i]);
printf("\n");
p=p->next;
}//while
return OK;
}
主函数如下:
/**************************************************************************/
//Std_ScoreManage.c
#include"operate.h"
int main()
{
Linklist L;
int k; //控制循环的标志
Create(L);
while(1)
{
printf("*******************************************************************\n\n");
printf(" -----------------------------------\n");
printf(" | 学生成绩管理 |\n");
printf(" |__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|\n");
printf(" | 1. 查询成绩 |\n");
printf(" | 2. 插入成绩 |\n");
printf(" | 3. 删除成绩 |\n");
printf(" | 4. 输出所有学生成绩 |\n");
printf(" | 0. 退出程序 |\n");
printf(" ------------------------------------\n");
printf(" 请输入你的选择: ");
scanf("%d",&k);
switch(k)
{
case 1: Find(L); break;
case 2: Insert(L);break;
case 3: delet(L);break;
case 4: print(L);break;
case 0: DeleteList(L); return TRUE;
default: printf("选择错误,重新开始!\n");
}
} //while
return TRUE;
}