数据结构 第二章 线性表 英语成绩表的顺序表实现

一、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();
}

四、运行结果

运行结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值