数据结构实验报告—顺序表的基本操作—学生管理系统
作者:命运之光
专栏:数据结构数据结构实验报告直接用,学生管理系统(附所有源码)
顺序表的基本操作
实验环境:Visual C++
实验目的:1、掌握顺序表的定义;
2、掌握顺序表线性表的基本操作,如建立、查找、插入和删除等。
实验内容:
定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1)根据指定学生个数,逐个输入学生信息;
(2)逐个显示学生表中所有学生的相关信息;
(3)根据姓名进行查找,返回此学生的学号和成绩;
(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5)给定一个学生信息,插入到表中指定的位置;
(6)删除指定位置的学生记录;
(7)统计表中学生个数。
一、需求分析
程序的设计任务:定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1)根据指定学生个数,逐个输入学生信息;
(2)逐个显示学生表中所有学生的相关信息;
(3)根据姓名进行查找,返回此学生的学号和成绩;
(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5)给定一个学生信息,插入到表中指定的位置;
(6)删除指定位置的学生记录;
(7)统计表中学生个数。
模块划分:
(1)写第一个子函数input()完成输入学生信息操作;
(2)写第二个子函数output()完成逐个显示学生表中所有学生的相关信息操作;
(3)写第三个子函数findelem()完成根据姓名进行查找,返回此学生的学号和成绩操作;
(4)写第四个子函数findnum()完成根据指定的位置可返回相应的学生信息(学号,姓名,成绩)操作;
(5)写第五个子函数insertlist()完成给定一个学生信息,插入到表中指定的位置操作;
(6)写第六个子函数del()完成删除指定位置的学生记录操作;
(7)写第七个子函数Statistics()完成统计表中学生个数操作;
(8)写第八个子函数menu()来调用以上函数进行可视化的操作;
(9)写一个main()主函数,调用menu()函数来完成所有操作;
二、概要设计
1.定义一个结构体包含了学生的信息
typedef struct
{
char no[10];
char name[10];
int score;
}STU;
学生的抽象类型中包括
学生学号char no[10];
学生姓名char name[10];
学生成绩int score;
2.用结构体定义一个顺序表
typedef struct {
elemtype data[MaxLen];
int len;
}Stulist;
顺序表中开辟elemtype data[MaxLen]顺序表大小;
顺序表的长度int len;
3.主程序流程
int main()
{
s.len = 0;
menu();
return 0;
}
4.主程序中调用了menu()函数,在menu()中通过switch按钮函数实现了
switch (choice)
{
case 1:input();//录入学生信息
break;
case 2:output();//打印学生信息
break;
case 3:findelem();//按姓名查找学生信息
break;
case 4:findnum();//按位置查找学生信息
break;
case 5:insertlist();//插入学生信息
break;
case 6:del();//插入学生信息
break;
case 7:Statistics();//插入学生信息
break;
default: exit(8);
break;
}
各个函数的调用
三、详细设计
1.写第一个子函数input()完成输入学生信息操作;
void input()//输入学生信息
{
int i, n;
printf("请输入学生人数:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入第%d个学生信息:\n", i + 1);
printf("姓名:\n");
scanf("%s", s.data[i].name);
printf("学号:\n");
scanf("%s", s.data[i].no);
printf("成绩:\n");
scanf("%d", &s.data[i].score);
s.len++;
}
}
2.写第二个子函数output()完成逐个显示学生表中所有学生的相关信息操作;
void output()
{
int i;
printf("输出学生信息:\n");
for (i = 0; i < s.len; i++)
{
printf("姓名:%s\n",s.data[i].name);
printf("学号:%s\n", s.data[i].no);
printf("成绩:%d\n", s.data[i].score);
}
}
3.写第三个子函数findelem()完成根据姓名进行查找,返回此学生的学号和成绩操作;
void findelem()//查找
{
char nam[10];
int i;
printf("请输入查找学生的姓名:");
scanf("%s",nam);
for (int i = 0; i < s.len; i++)
{
if (strcmp(s.data[i].name, nam) == 0)
{
printf("该同学的学号是:%s", s.data[i].no);
printf("\n该同学的成绩是:%d\n", s.data[i].score);
s.len++;
}
}
}
4.写第四个子函数findnum()完成根据指定的位置可返回相应的学生信息(学号,姓名,成绩)操作;
void findnum()//按位置查找
{
int j;
printf("输入学生位置信息:");
scanf("%d", &j);
if (j == 0)
{
printf("输入错误请重新输入");
}
else
{
printf("姓名:%s\n", s.data[j - 1].name);
printf("学号:%s\n", s.data[j - 1].no);
printf("成绩:%d\n", s.data[j - 1].score);
}
}
5.写第五个子函数insertlist()完成给定一个学生信息,插入到表中指定的位置操作;
void insertlist()//学生信息的插入
{
int i, j, x;
printf("请输入插入学生的节点位置:");
scanf("%d", &i);
if (s.len == MaxLen)
{
printf("空间已满,无法插入\n");
}
while (i<1 || i>(s.len + 1))
{
printf("插入错误,请重新输入:");
scanf("%d", &i);
}
for (j = s.len - 1; j >= i - 1; j--)
{
s.data[j + 1] = s.data[j];
}
printf("请输入学生的信息:\n");
printf("姓名:");
scanf("%s", s.data[i - 1].name);
printf("学号:");
scanf("%s", s.data[i - 1].no);
printf("成绩:");
scanf("%d", &s.data[i - 1].score);
s.len++;
}
6.写第六个子函数del()完成删除指定位置的学生记录操作;
void del()//删除操作
{
int i,j;
printf("输入要删除的学生位置:");
scanf("%d", &i);
while (i<1 || i>s.len)
{
printf("删除错误,请重新输入:");
scanf("%d", &i);
}
for (j = i; j < s.len; j++)
{
s.data[j-1] = s.data[j];
}
s.len--;
printf("删除操作成功\n");
}
7.写第七个子函数Statistics()完成统计表中学生个数操作;
void Statistics()//统计表中学生个数
{
printf("表中学生个数为:%d人\n", s.len);
}
8.写第八个子函数menu()来调用以上函数进行可视化的操作;
void menu()
{
int choice = 1;
printf("\t\t--------------------------------------------\n");
printf("\t\t 学生信息管理系统 \n");
printf("\t\t--------------------------------------------\n");
printf(" \t\t* 1.录入学生信息 *\n");
printf(" \t\t* 2.打印学生信息 *\n");
printf(" \t\t* 3.按姓名查找学生信息 *\n");
printf(" \t\t* 4.按位置查找学生信息 *\n");
printf(" \t\t* 5.插入指定位置学生信息 *\n");
printf(" \t\t* 6.删除指定位置的学生记录 *\n");
printf(" \t\t* 7.统计表中学生个数 *\n");
printf(" \t\t* 8.退出系统 *\n");
printf("输入序号进行操作:");
while (1)
{
scanf("%d", &choice);
switch (choice)
{
case 1:input();//录入学生信息
break;
case 2:output();//打印学生信息
break;
case 3:findelem();//按姓名查找学生信息
break;
case 4:findnum();//按位置查找学生信息
break;
case 5:insertlist();//插入学生信息
break;
case 6:del();//插入学生信息
break;
case 7:Statistics();//插入学生信息
break;
default: exit(8);
break;
}
menu();
}
}
9.写一个main()主函数,调用menu()函数来完成所有操作;
int main()
{
s.len = 0;
menu();
return 0;
}
四、调试分析
调试测试数据:1、输入n个数,输入学生姓名,学号,成绩;2、输出顺序表;3、对顺序表数据进行查找;4、对顺序表按位置查找;5、插入指定位置学生信息;6、删除指定位置的学生记录;7、统计表中学生个数。
数据测试如下截图:
(1)输入n个数,输入学生姓名,学号,成绩
(2)输出顺序表
(3)对顺序表数据进行查找
(4)对顺序表按位置查找
(5)插入指定位置学生信息
(6)删除指定位置的学生记录
(7)统计表中学生个数
经验和心得体会:
在这次实验过程中,我知道了顺序表是按顺序储存的,用一堆数组来储存,虽然在实验过程中遇到了一些问题,这些问题有一个共同点就是反映出我对结构体掌握的并不是很好,在这次实验过程中让我更加明白了结构体的使用,收益不少。
五、测试结果
附录:源程序代码(带注释)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#define MaxLen 50//顺序表中最多元素个数
typedef struct
{
char no[10];
char name[10];
int score;
}STU;
typedef STU elemtype;
typedef struct {
elemtype data[MaxLen];
int len;
}Stulist;
Stulist s;
void input()//输入学生信息
{
int i, n;
printf("请输入学生人数:");
scanf_s("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入第%d个学生信息:\n", i + 1);
printf("姓名:\n");
scanf("%s", s.data[i].name);
printf("学号:\n");
scanf("%s", s.data[i].no);
printf("成绩:\n");
scanf("%d", &s.data[i].score);
s.len++;
}
system("pause");
system("cls");
}
void output()
{
int i;
printf("输出学生信息:\n");
for (i = 0; i < s.len; i++)
{
printf("姓名:%s\n",s.data[i].name);
printf("学号:%s\n", s.data[i].no);
printf("成绩:%d\n", s.data[i].score);
}
system("pause");
system("cls");
}
void findelem()//查找
{
char nam[10];
int i;
printf("请输入查找学生的姓名:");
scanf("%s",nam);
//cin >> nam;
for (int i = 0; i < s.len; i++)
{
if (strcmp(s.data[i].name, nam) == 0)
{
printf("该同学的学号是:%s", s.data[i].no);
printf("\n该同学的成绩是:%d\n", s.data[i].score);
s.len++;
}
}
system("pause");
system("cls");
}
void findnum()//按位置查找
{
int j;
printf("输入学生位置信息:");
scanf("%d", &j);
if (j == 0)
{
printf("输入错误请重新输入");
}
else
{
printf("姓名:%s\n", s.data[j - 1].name);
printf("学号:%s\n", s.data[j - 1].no);
printf("成绩:%d\n", s.data[j - 1].score);
}
system("pause");
system("cls");
}
void insertlist()//学生信息的插入
{
int i, j, x;
printf("请输入插入学生的节点位置:");
scanf("%d", &i);
if (s.len == MaxLen)
{
printf("空间已满,无法插入\n");
}
while (i<1 || i>(s.len + 1))
{
printf("插入错误,请重新输入:");
scanf("%d", &i);
}
for (j = s.len - 1; j >= i - 1; j--)
{
s.data[j + 1] = s.data[j];
}
printf("请输入学生的信息:\n");
printf("姓名:");
scanf("%s", s.data[i - 1].name);
printf("学号:");
scanf("%s", s.data[i - 1].no);
printf("成绩:");
scanf("%d", &s.data[i - 1].score);
s.len++;
system("pause");
system("cls");
}
void del()//删除操作
{
int i,j;
printf("输入要删除的学生位置:");
scanf("%d", &i);
while (i<1 || i>s.len)
{
printf("删除错误,请重新输入:");
scanf("%d", &i);
}
for (j = i; j < s.len; j++)
{
s.data[j-1] = s.data[j];
}
s.len--;
printf("删除操作成功\n");
system("pause");
system("cls");
}
void Statistics()//统计表中学生个数
{
printf("表中学生个数为:%d人\n", s.len);
system("pause");
system("cls");
}
void menu()
{
int choice = 1;
printf("\t\t--------------------------------------------\n");
printf("\t\t 学生信息管理系统 \n");
printf("\t\t--------------------------------------------\n");
printf(" \t\t* 1.录入学生信息 *\n");
printf(" \t\t* 2.打印学生信息 *\n");
printf(" \t\t* 3.按姓名查找学生信息 *\n");
printf(" \t\t* 4.按位置查找学生信息 *\n");
printf(" \t\t* 5.插入指定位置学生信息 *\n");
printf(" \t\t* 6.删除指定位置的学生记录 *\n");
printf(" \t\t* 7.统计表中学生个数 *\n");
printf(" \t\t* 8.退出系统 *\n");
printf("输入序号进行操作:");
while (1)
{
scanf("%d", &choice);
switch (choice)
{
case 1:input();//录入学生信息
break;
case 2:output();//打印学生信息
break;
case 3:findelem();//按姓名查找学生信息
break;
case 4:findnum();//按位置查找学生信息
break;
case 5:insertlist();//插入学生信息
break;
case 6:del();//插入学生信息
break;
case 7:Statistics();//插入学生信息
break;
default: exit(8);
break;
}
menu();
}
}
int main()
{
s.len = 0;
menu();
return 0;
}
适用于:
1、大一数据结构实验课实验报告——学生管理系统(C语言版)
2、大一C语言实践——学生管理系统目前已经大二了,大一写的实验报告分享给大家,有需要的自取哈