一、ADT的定义
ADT Score
Data
英语成绩表中数据元素的类型为结构体。
数据项中“姓名”为字符数组;
“学号”为字符数组;
“英语成绩”为浮点型。
Operation
InitScore
前置条件:英语成绩表不存在
输入:无
功能:英语成绩表初始化
输出:无
后置条件:一个空的英语成绩表
DestScore
前置条件:英语成绩表已存在
输入:无
功能:销毁英语成绩表
输出:无
后置条件:释放英语成绩表所占用的存储空间
Input
前置条件:英语成绩表已存在
输入:单个学生的姓名、学号、英语成绩
功能:输入学生信息
输出:无
后置条件:添加一个新的学生信息到表末
Get
前置条件:英语成绩表已存在
输入:元素的序号i
功能:按位查找,在英语成绩表中查找序号为i的学生信息
输出:如果序号合法,返回序号为i的元素值,否则抛出异常
后置条件:线性表不变
LocateName
前置条件:英语成绩表已存在
输入:姓名x
功能:按值查找,在英语成绩表中查找姓名等于x的元素
输出:如果查找成功,返回元素x在表中的序号,否则返回0
后置条件:英语成绩表不变
LocateNum
前置条件:英语成绩表已存在
输入:学号x
功能:按值查找,在英语成绩表中查找学号等于x的元素
输出:如果查找成功,返回元素x在表中的序号,否则返回0
后置条件:英语成绩表不变
LocateScore
前置条件:英语成绩表已存在
输入:英语成绩x
功能:按值查找,在英语成绩表中查找英语成绩等于x的元素
输出:如果查找成功,返回元素x在表中的序号,否则返回0
后置条件:英语成绩表不变
Delete
前置条件:英语成绩表已存在
输入:删除位置i
功能:删除操作,删除英语成绩表中德第i个元素
输出:若删除成功,无动作,否则抛出异常
后置条件:若删除成功,表中减少了一个元素
PrintList
前置条件:英语成绩表已存在
输入:无
功能:遍历操作,按序号依次输出英语成绩表中的元素
输出:英语成绩表的各个数据元素
后置条件:英语成绩表不变
endADT
二、数据类型的定义
struct Escore //定义结构体存放学生信息
{
string name;
string num;
float score;
};
class ScoreSeq
{
public:
ScoreSeq(){ length = 0; } //无参构造函数,创建一个空表
ScoreSeq(Escore a[], int n); //有参构造函数
~ScoreSeq(){} //析构函数
void Input(Escore x); //在表末输入学生信息
Escore Get(int i); //返回第i个学生信息
void Delete(int i); //删除第i个学生信息
int LocateName(string x); //按姓名返回学生序号
int LocateNum(string x); //按学号返回学生序号
int LocateScore(float x); //按分数返回学生序号
void PrintList(); //按序号依次输出各元素
private:
Escore data[MaxSize]; //存放学生信息的数组
int length; //线性表的长度
};
三、C++代码段
头文件ScoreSeq.h
#include <string> //引入字符串处理学生姓名和学号
#ifndef ScoreSeq_H //避免重复包含ScoreSeq.h头文件
#define ScoreSeq_H
const int MaxSize = 10; //指定顺序表元素的最大值
struct Escore //定义结构体存放学生信息
{
string name;
string num;
float score;
};
class ScoreSeq
{
public:
ScoreSeq(){ length = 0; } //无参构造函数,创建一个空表
ScoreSeq(Escore a[], int n); //有参构造函数
~ScoreSeq(){} //析构函数
void Input(Escore x); //在表末输入学生信息
Escore Get(int i); //返回第i个学生信息
void Delete(int i); //删除第i个学生信息
int LocateName(string x); //按姓名返回学生序号
int LocateNum(string x); //按学号返回学生序号
int LocateScore(float x); //按分数返回学生序号
void PrintList(); //按序号依次输出各元素
private:
Escore data[MaxSize]; //存放学生信息的数组
int length; //线性表的长度
};
#endif
源码文件ScoreSeq.cpp
#include <iostream>
using namespace std;
#include "ScoreSeq.h"
ScoreSeq::ScoreSeq(Escore a[],int n)
{
if (n > MaxSize)throw"参数非法";
for (int i = 0; i < n; i++)
{
data[i].name = a[i].name;
data[i].num = a[i].num;
data[i].score = a[i].score;
}
length = n;
}
// 输入学生信息
void ScoreSeq::Input(Escore x)
{
if (length == MaxSize)
throw"英语成绩表已满";
else
{
data[length].name = x.name;
data[length].num = x.num;
data[length].score = x.score;
length++;
}
}
// 查找序号为i的学生信息
Escore ScoreSeq::Get(int i)
{
if (i<1 && i>length) throw"查找位置非法";
else return data[i-1];
}
// 查找姓名等于x的元素
int ScoreSeq::LocateName(string x)
{
for (int i = 0; i < length; i++)
if (data[i].name == x)return i + 1;
return 0;
}
// 查找学号等于x的元素
int ScoreSeq::LocateNum(string x)
{
for (int i = 0; i < length; i++)
if (data[i].num == x)return i + 1;
return 0;
}
// 查找英语成绩等于x的元素
int ScoreSeq::LocateScore(float x)
{
for (int i = 0; i < length; i++)
if (data[i].score == x)return i + 1;
return 0;
}
// 删除元素
void ScoreSeq::Delete(int i)
{
if (length == 0)throw"下溢";
if (i<1 || i>length)throw"位置非法";
for (int j = i; j < length; j++)
{
data[j - 1].name = data[j].name;
data[j - 1].num = data[j].num;
data[j - 1].score = data[j].score;
}
length--;
}
// 按序号依次输出英语成绩表中的元素
void ScoreSeq::PrintList()
{
for (int i = 0; i < length; i++)
cout << "学生姓名:" << data[i].name << " 学号:" << data[i].num << " 英语成绩:" << data[i].score << endl;
}
源码文件ScoreSeq_main.cpp
#include <iostream>
using namespace std;
#include "ScoreSeq.h"
void main()
{
Escore a[3],temp;
int i;
a[0].name = "Zhangsan";
a[0].num = "201311672299";
a[0].score = 99;
a[1].name = "Lisi";
a[1].num = "201311672298";
a[1].score = 98;
a[2].name = "Wangwu";
a[2].num = "201311672297";
a[2].score = 97;
ScoreSeq L(a, 3); //使用有参构造函数初始化一个长度为3的英语成绩表
cout << "执行输入操作前英语成绩表为:" << endl;
L.PrintList();
cout << "请输入学生的姓名 学号 英语成绩" << endl; //输入操作
cin >> temp.name >> temp.num >> temp.score;
L.Input(temp);
cout << "执行输入操作后英语成绩表为:" << endl; //验证输入操作
L.PrintList();
cout << "请输入需要查找的学生的姓名:" << endl; //按值查找
cin >> temp.name;
cout << "该学生的序号为:" << L.LocateName(temp.name) << endl;
cout << "请输入需要查找学生的学号" << endl;
cin >> temp.num;
cout << "该学生的序号为:" << L.LocateNum(temp.num) << endl;
cout << "请输入需要查找学生的成绩" << endl;
cin >> temp.score;
cout << "该学生的序号为:" << L.LocateScore(temp.score) << endl;
cout << "请输入需要查找的学生的序号" << endl; //按位查找
cin >> i;
cout << "该生的姓名:" << L.Get(i).name << " 该生的学号:" << L.Get(i).num << " 该生的英语成绩:" << L.Get(i).score << endl;
cout << "请输入需要删除的学生信息的序号" << endl; //删除操作
cin >> i;
cout << "删除前的成绩表为" << endl; //验证删除操作
L.PrintList();
L.Delete(i);
cout << "删除后的成绩表为" << endl;
L.PrintList();
}
四、运行结果