一、实验目的
1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。
2、巩固 C++相关的程序设计方法与技术。
3、学会使用顺序表解决实际问题。
二、实验内容
1、用C++编写完整程序。
2、建立两个的顺序表,一个表存放学生信息,另一个表存放学生成绩。表的长度都为n,有学生自己确定。
3、用类模板构造函数实现相关的操作:输出,插 入,删除,查找等功能。
三、实验步骤
依据实验内容分别说明实验程序中用到的数据类型的定义;
1. Score(stringa[], intb[], intn, intm):有参构造函数创建两个顺序表,一个为长度为n用以存放学生信息,一个长度为m用以存放学生成绩。
2. void Insert1(stringna, inti);找到第i个元素,在第i个位置插入学生na,利用for循环将i位置后的元素从最后一个开始往外挪位置;
3. void Insert(inten, inti);找到第i个元素,在第i个位置插入成绩en,利用for循环将i位置后的元素从最后一个开始往外挪位置;
4. int Get(stringna);:按值查询,通过for函数依次查询,最后返回元素序号;
5. int Locate(inti);:按位查询,运用数组特性,第i个元素储存在下标为i-1的位置;
6. int Delete(stringna):使用for循环与if函数查找与na相同的数据在数组的位置i,删除存放此学生姓名的数据data[i-1]与学生成绩数据data[i-1],利用for循环将i位置后的元素一个个往前挪;
7. Printlist():输出函数;
四、源代码
#include<iostream>
#include<string>
using namespace std;
class Score{
private:
string name;
int english;
int length1;
int length2;
string data1[10];
int data2[10];
public:
Score() {}
Score(string a[], int b[], int n, int m) {
if (n > 10)throw"参数非法";
for (int i = 0; i < n; i++) {
data1[i] = a[i];
length1 = n;
}
if (m > 10)throw"参数非法";
for (int j = 0; j < 10; j++) {
data2[j] = b[j];
length2 = m;
}
}
void Insert1(string na, int i);
void Insert(int en, int i);
int Get(string na);
int Locate(int i);
int Delete(string na);
void Printlist();
};
#include<string>
using namespace std;
class Score{
private:
string name;
int english;
int length1;
int length2;
string data1[10];
int data2[10];
public:
Score() {}
Score(string a[], int b[], int n, int m) {
if (n > 10)throw"参数非法";
for (int i = 0; i < n; i++) {
data1[i] = a[i];
length1 = n;
}
if (m > 10)throw"参数非法";
for (int j = 0; j < 10; j++) {
data2[j] = b[j];
length2 = m;
}
}
void Insert1(string na, int i);
void Insert(int en, int i);
int Get(string na);
int Locate(int i);
int Delete(string na);
void Printlist();
};
void Score::Insert1(string na, int i) {
if (length1 >= 10)throw"上溢";
if (i<1 || i>length1)throw"位置异常";
for (int j = length1; j >= i; j--) {
data1[j] = data1[j - 1];
data1[i] = na;
length1++;
}
}
void Score::Insert(int en, int i) {
if (length2 >= 10)throw"上溢";
if (i<1 || i>length2)throw"位置异常";
for (int j = length2; j >= i; j--) {
data2[j] = data2[j - 1];
data2[i] = en;
length1++;
}
}
int Score::Get(string na) {
for (int i = 0; i < length1; i++) {
if (data1[i] == na)
return data2[i + 1];
}
return 0;
}
if (length1 >= 10)throw"上溢";
if (i<1 || i>length1)throw"位置异常";
for (int j = length1; j >= i; j--) {
data1[j] = data1[j - 1];
data1[i] = na;
length1++;
}
}
void Score::Insert(int en, int i) {
if (length2 >= 10)throw"上溢";
if (i<1 || i>length2)throw"位置异常";
for (int j = length2; j >= i; j--) {
data2[j] = data2[j - 1];
data2[i] = en;
length1++;
}
}
int Score::Get(string na) {
for (int i = 0; i < length1; i++) {
if (data1[i] == na)
return data2[i + 1];
}
return 0;
}
int Score::Locate(int i) {
if (i<1 || i>length1)throw"位置异常";
return data2[i - 1];
}
if (i<1 || i>length1)throw"位置异常";
return data2[i - 1];
}
int Score::Delete(string na) {
if (length1 == 0)throw"下溢";
for (int i = 1; i <= length1; i++) {
if (data1[i - 1] == na) {
for (int j = i; j < length1; j++) {
data1[j - 1] = data1[j];
data2[j - 1] = data2[j];
length1--;
length2--;
}
}
}
}
if (length1 == 0)throw"下溢";
for (int i = 1; i <= length1; i++) {
if (data1[i - 1] == na) {
for (int j = i; j < length1; j++) {
data1[j - 1] = data1[j];
data2[j - 1] = data2[j];
length1--;
length2--;
}
}
}
}
void Score::Printlist() {
for (int i = 0; i < length1; i++)
if (i == 0)
cout << "[" << data1[i] << ":" << data2[i] << "," << endl;
else if (i == length1 - 1)
cout << data1[i] << "," << data2[i] << "]" << endl;
else
cout << data1[i] << ":" << data2[i] << "," << endl;
}
for (int i = 0; i < length1; i++)
if (i == 0)
cout << "[" << data1[i] << ":" << data2[i] << "," << endl;
else if (i == length1 - 1)
cout << data1[i] << "," << data2[i] << "]" << endl;
else
cout << data1[i] << ":" << data2[i] << "," << endl;
}
int main() {
string a[3] = { "keeva","佑镇","Daniel" };
int b[3] = { 99,89,87 };
Score K(a, b, 3, 3);
cout << "输入数据:" << endl;
K.Printlist();
cout << "--------------------------------------------------------------" << endl;
cout << "在第二个位置插入一名学生数据结构成绩:" << endl;
K.Insert1("kk", 2);
K.Insert(85, 2);
K.Printlist();
cout << "--------------------------------------------------------------" << endl;
cout << "查找佑镇的数据结构成绩:" << K.Get("佑镇") << endl;
cout << "--------------------------------------------------------------" << endl;
cout << "查找第一个学生数据结构成绩:" << K.Locate(1) << endl;
cout << "--------------------------------------------------------------" << endl;
cout << "删除kk的数据结构成绩:" << K.Delete("kk") << endl;
K.Printlist();
}
五、实验结果
六、总结与疑问
1、结果能输出,但会有额外的乱码?