重庆邮电大学-软件技术基础 实验报告(耿道渠)

更新时间:2024-04-21 23:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《软件技术基础》实验报告

实验名称:顺序表的操作

班 级 学 号 姓 名

第 9 周 星 期 2 、 5,6 节 成 绩

一、实验目的:

1、掌握顺序表结构的实现方式; 2、掌握顺序表常用算法的实现; 3、熟悉利用顺序表解决问题的一般思路;

4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。

二、实验内容:

1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务: (1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。

(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。

(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。

2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。要求实现菜单、初始化、添加、删除和显示等功能。

三、实验结果:

- 1 -

四、实验中遇到的问题及解决方法:

- 2 -

第一次编写C++,感觉力不从心,回去多看看PPT。

五、实验心得体会:

对顺序表的一些常用语句不熟悉,对顺序表的整体思路理解不深刻以后要加强练习

附:源程序(自行编写或修改的程序。若为修改程序请注明修改部分的功能,若为书上实例则可不附。) #include #include #include #include #define MAXSIZE 20 using namespace std; int num; typedef struct {

string student_number; string name; string tel;

string home_phone; int id; } TEL;

void shuaxin(TEL *); void delet(TEL *);

- 3 -

void find(TEL *); void show(TEL *); int main(void) {

int choose; TEL List[MAXSIZE]; while(1) {

cout << \欢迎来到XXX电话本系统*********************\cout << \初始化并建立\cout << \删除\cout << \查找\

cout << \显示全部\cin >> choose; system(\

while( choose < 1 || choose > 4) {

cout << \输入错误,数字1-4,请重新输入!\cin >> choose; system(\}

- 4 -

}

}

switch(choose) { }

//system(\

case 1: shuaxin(List); break; case 2: delet(List); break; case 3: find(List); break; case 4: show(List); break;

return 0;

void shuaxin(TEL * list) {

int i,j;

for(i = 0; i < MAXSIZE; i++) {

list[i].id = i + 1;

list[i].home_phone = \list[i].name = \

list[i].student_number = \list[i].tel = \

- 5 -

}

system(\

cout << \初始化成功,现在开始建表:\

cout << \请输入需要建立的电话个数:(小于\

<

cin >> num;

while( num < 1 || num > MAXSIZE ) { }

system(\

cout << \请依次输入学生的学号,姓名,移动电话,家庭电话\for(j = 1; j <= num; j++) {

cout << j << '.';

cin >> list[j - 1].student_number; cin >> list[j - 1].name; cin >> list[j - 1].tel;

cin >> list[j - 1].home_phone; cout << endl; system(\

cout << \输入错误,请重新输入\cin >> num;

- 6 -

}

}

if(num == (j - 1) ) { }

system(\

cout << \建立表完毕!\

void delet(TEL * list) {

int j,i = 0;

cout << \请输入你需要删除的序号\cin >> j;

while( j < 0 || j > num) { }

while(list[i].id != j)

i++;

cout << \输入错误,请重新输入\cin >> j;

for(j = i; j < num - 1; j++) {

- 7 -

}

}

list[j].name = list[j + 1].name; list[j].tel = list[j + 1].tel;

list[j].student_number = list[j + 1].student_number; list[j].home_phone = list[j + 1].home_phone;

list[j].home_phone = \list[j].name = \

list[j].student_number = \list[j].tel = \num--; system(\

cout << \删除完毕\

void find(TEL * list) {

string telnum; int i,key = 0;

cout << \请输入你需要查找的电话号码\cin >> telnum;

- 8 -

system(\

for(i = 0; i < MAXSIZE; i++) { if(telnum == list[i].tel || telnum == list[i].home_phone) { if(key == 0)

cout << \依次 学号 姓名 移动电话 庭电话 \

cout << list[i].id << '.';

cout << setw(12) << list[i].student_number; cout << setw(10) << list[i].name; cout << setw(14) << list[i].tel;

cout << setw(10) << list[i].home_phone; cout << endl; key = 1; }

}

if( key == 0) cout << \未找到此电话号码\

}

- 9 -

void show(TEL * list) {

int i;

cout << \现在有\个电话号码\

cout << \依次 学号 姓名 移动电话 家庭电话

\ for(i = 0; i < num; i++) { cout << list[i].id << '.';

cout << setw(12) << list[i].student_number; cout << setw(10) << list[i].name; cout << setw(14) << list[i].tel;

cout << setw(10) << list[i].home_phone; cout << endl;

}

cout << \输出完毕\

}

- 10 -

《软件技术基础》实验报告

实验名称:链表的操作(一)

班 级 学 号 姓 名

第 10 周 星 期 2 、 5,6 节 成 绩

一、实验目的:

1、掌握单链表结构的实现方式; 2、掌握单链表常用算法的实现。

二、实验内容:

1、设计一个链表,要求编程实现如下任务:

(1)建立一个链表,首先依次输人整数数据元素(个数根据需要键盘给定)。

(2)删除指定值的结点(指定值通过键盘输入),再依次显示删除后的链表中的数据元素。

(3)查找指定值的结点(指定数据由键盘输入),若找到则显示查找成功,若没有找到则显示查找失败。

(4) 在第i个节点(i由键盘输入,i=0表示插入的结点作为第1个结点)之后插入一个元素为x的节点。

三、实验结果:

四、实验中遇到的问题及解决方法:

- 11 -

编写过程中经常把C语言和C++的语句形式搞混乱,课后认真了

解了C++后得以解决。

五、实验心得体会:

对单链表的实现方式和常用算法掌握不足,对C++部分基本概念不熟悉,需课后补强

附:源程序(自行编写或修改的程序。若为修改程序请注明修改部分的功能,若为书上实例则可不附。) #include #include #include

struct LNode {

int data; };

LNode *find(LNode *head,int x) {

LNode *p=head->next;

while(p!=NULL && p->data!=x)

p=p->next; struct LNode *next;

- 12 -

}

return p;

void Insert(LNode *head,int i,int x) {

if(i<1)

cout<<\不存在第\个位置\

else {

LNode *p=head; int k=0;

while(p!=NULL && k

if(p==NULL)

cout<next; k++;

else {

LNode *s=new LNode;

s->data=x;

- 13 -

}

} }

s->next=p->next; p->next=s;

void Delete(LNode *head,int i) {

if(i<1)

cout<<\不存在第\个元素\

else {

LNode *p=head; LNode *q; int k=0;

while(p!=NULL && k

if(p==NULL)

p=p->next; k++;

- 14 -

}

cout<

else {

q->next=p->next; } }

delete p;

void main() {

LNode *head,*p;

head=new LNode; head->next=NULL; int i,x,y;

cout<<\请输入5个数,每个书中间空一格:\for(i=1;i<=5;i++) { } i=0;

cin>>x; Insert(head,i,x);

- 15 -

void find_number(TEL * head);//通过号码查找 TEL * revise(TEL * head); void sav(TEL * head);//储存

int main(void) {

printf(\head = search();

printf(\ //选择显示界面 printf(\printf(\printf(\printf(\printf(\printf(\printf(\

do //选择项 TEL * head = NULL; int choose;

- 21 -

}

{

printf(\scanf(\switch(choose) { }

case 1:head = insert(head);break; case 2:head = del(head);break; case 3:showall(head);break; case 4:find_name(head);break; case 5:find_number(head);break; case 6:head = revise(head);break; case 7:sav(head);break; case 8:return 0;

default:printf(\printf(\

}while(1);

return 0;

- 22 -

TEL * search(void)//寻找文件是否存在函数 {

if( ( fp = fopen(\打开或者新建文件 { }

fseek(fp,0L,0);//文件指针倒回到开头

while(!feof(fp)) {

if( fread(p1,SIZE,1,fp) != 1 )//需要防止读出错误情况

break;

printf(\exit(0); FILE * fp;

TEL * head = NULL; TEL * p2,* p1;

p1 = p2 = (TEL *)malloc(LEN);

if(head == NULL)

head = p1;

else p2->next = p1;

- 23 -

}

}

p2 = p1; n++;

p1 = (TEL *)malloc(LEN);

free(p1);

p2->next = NULL;

fclose(fp);

return head;

TEL * insert(TEL * head)//插入新号码函数 {

TEL * p0, * p1, * p2; p0 = (TEL *)malloc(LEN);

printf(\scanf(\p1 = head; p2 = p1;

if(head == NULL) {

- 24 -

head = p0; p0->next = NULL;

}else {

while( strcmp(p0->name,p1->name) > 0 && p1->next !=

NULL)//比较字符串,找到应该插入位置

} n++;

if( strcmp(p0->name,p1->name) <= 0 )//比较字符串,插入新号码 {

p2->next = p0; p0->next = p1;

{ }

p2 = p1; p1 = p1->next;

}else { }

p1->next = p0; p0->next = NULL;

- 25 -

}

return head;

TEL * del(TEL * head)//删除函数 {

TEL * p1, * p2; p1 = head; long dele;

printf(\输入删除

的电话号码

if(head == NULL)

printf(\空表情况 else { }

while(dele != p1->num && p1 != NULL)//找到位置 { }

p2 = p1; p1 = p1->next;

scanf(\

- 26 -

}

void showall(TEL * head)//打印函数 {

int i = 0; TEL * p; p = head; if(head == NULL)

printf(\空表情况 return head;

if(dele == p1->num) {

if(dele == head->num)//删除在头部情况

head = head->next;

else p2->next = p1->next; //输出删除的数据并用链表架空

printf(\printf(\n--;

}else printf(\没找到情况

- 27 -

}

else { }

printf(\ %d number:\\n\

printf(\ name number \\n\do {

i++;

printf(\ s ld\\n\p = p->next;

}while(p != NULL);

void find_name(TEL * head)//以名字方式寻找号码 {

TEL * p; int dis = 0; char f_name[20]; p = head;

printf(\输入名字 scanf(\if(head == NULL)

- 28 -

}

printf(\空表情况

else { }

do {

if(strcmp(p->name,f_name) == 0)//只要找到同名 均输出 { }

p = p->next;

dis = 1;

printf(\

printf(\

}while(p != NULL);

if(dis == 0)

printf(\

void find_number(TEL * head)//以号码方式寻找号码 {

TEL * p;

- 29 -

long f_num;

int dis = 0;//dis作为判定是否找到变量 p = head;

printf(\输入号码 scanf(\if(head == NULL)

printf(\空表情况

else { }

do {

if(f_num == p->num) { }

else p = p->next;

dis = 1; break;

}while(p != NULL);

if(dis == 1) {

- 30 -

}

}

printf(\

printf(\

else printf(\

TEL * revise(TEL * head)//修改函数 {

TEL * p = head; int choose,num,i;

printf(\

number\\n\

//find_name(TEL * head); scanf(\for(i = 2; i <= num; i++)

p = p->next;

printf(\

printf(\scanf(\switch(choose) { case 1:{

- 31 -

}

printf(\scanf(\break;

}

case 2:{ }

return head;

printf(\scanf(\break;

}

void sav(TEL * head)//储存函数 {

FILE * fp; TEL * p;

if( ( fp = fopen(\打开或者新建文件 { }

printf(\exit(0);

- 32 -

}

p = head; while(p != NULL) { }

fclose(fp);

if( fwrite(p,SIZE,1,fp) == 1 )

p = p->next;

else { }

printf(\exit(0);

- 33 -

《软件技术基础》实验报告

实验名称:栈的操作

班 级 学 号 姓 名

第 1 2 周 星 期 2 、 5,6 节 成 绩

一、实验目的:

掌握栈的的定义和运算,了解栈的应用。 二、实验内容:

1、堆栈的测试和应用。要求:

设计一个主函数实现对顺序堆栈代码进行测试。测试方法为:依次把数据元素1,3,5,7,9入栈,然后出栈堆栈中的数据元素并在屏幕上显示。 三、实验结果:

- 34 -

四、实验中遇到的问题及解决方法: 问题不是太多,但是编写过程还是比较艰辛。 五、实验心得体会:

栈在本书中比较重要,要多多理解书本知识,多问老师,多实践。

附:源程序(自行编写或修改的程序。若为修改程序请注明修改部分的功能,若为书上实例则可不附。) #include #include #define MAX_SIZE 30

- 35 -

using namespace std;

struct SqStack { };

int InitStack(SqStack *,int); void push(SqStack *,int); void del(SqStack *);

int main(void) {

int choose,size; int in,i; SqStack p;

cout << \cout << \请输入长度:\cin >> size;

while(InitStack(&p,size)) int *data; int top; int stacksize;

- 36 -

{ }

system(\

cout << \请输入长度:\cin >> size;

while(1) {

cout <<

\

cout << \入栈\cout << \出栈\cout << \栈内情况\cout << \清空栈\cout << \退出\cout << \请输入选项\cout <<

\

cin >> choose;

while(choose < 0 || choose > 4) {

cout << \请输入一个0-4的常数\

- 37 -

}

cin >> choose;

system(\switch(choose) { }

case 1: cout << \输入一个整数\

cin >> in;

push(&p,in);break;

case 2: del(&p);

break;

case 3: cout << \栈底\

for(i = 0; i <= p.top; i++)

cout << p.data[i] << endl;

break;

case 4: while(p.top > -1)

{ } break;

cout << p.data[p.top] << endl; p.top--;

case 0: return 0; break;

- 38 -

}

} return 0;

int InitStack(SqStack *s,int size) { }

void push(SqStack *s,int x) {

if(s->top < s->stacksize - 1) {

s->top++;

s->data[s->top] = x;

if(size > 0 && size <= MAX_SIZE) {

s->stacksize = size; s->top = -1;

s->data = new int[size]; return 0;

}else cout << \初始化长度错误\return 1;

- 39 -

}

}else cout << \栈满\

void del(SqStack *s) { }

int x;

if(s->top > -1) {

x = s->data[s->top]; s->top--;

cout << \出栈数为:\

}else cout << \栈空\

- 40 -

《软件技术基础》实验报告

实验名称:队列的操作

班 级 学 号 姓 名

第 13 周 星 期 2 、 5,6 节 成 绩

一、实验目的:

掌握队列的定义及其运算,了解队列的应用。

二、实验内容:

1、队列测试和应用。要求:

设计一个主函数对循环队列代码进行测试。测试方法为:依次把数据元素2,4,6,8,10入队,然后出队中的数据元素并在屏幕上显示。

三、实验结果:

- 41 -

- 42 -

四、实验中遇到的问题及解决方法:

队列的方式和栈的方式既有不同也有相同,没有分好两者的编写方式,看书后了解清楚了。 五、实验心得体会:

队列和栈有些相似,可以在两者之间找相同点,互相总结。

附:源程序(自行编写或修改的程序。若为修改程序请注明修改部分的功能,若为书上实例则可不附。) #include #include using namespace std;

struct QNode { };

struct LinkQueue {

struct QNode *front; struct QNode *rear; int data;

struct QNode *next;

- 43 -

};

void init(LinkQueue &Q); int Queuelenth(LinkQueue &Q); void EnQueue(LinkQueue &Q,int x); void DeQueue(LinkQueue &Q);

int main(void) {

LinkQueue Q; int choose,x,e; init(Q); while(1) {

cout <<

\

cout << \ 欢迎来到XXX\cout << \ 1.入队\cout << \ 2.出队\cout << \ 3.队列长度\cout << \ 0.退出\

- 44 -

cout << \请选择:\cout <<

\

switch(choose) {

case 1: system(\

cout << \请输入一个数\cin >> x;

EnQueue(Q,x); break;

cin >> choose;

while(choose > 3 || choose < 0) { }

cout << \输入错误,请输入0-3\cin >> choose;

case 2: system(\

DeQueue(Q); break;

case 3: system(\

x = Queuelenth(Q);

cout << \队列长度为\

- 45 -

break;

case 0: return 0;

}

}

return 0;

}

void init(LinkQueue &Q) { Q.front = new QNode; Q.front->next = NULL; Q.rear = Q.front;

}

int Queuelenth(LinkQueue &Q) { QNode * p = Q.front; int len = 0; while(p != Q.rear) {

len++;

- 46 -

}

}

p = p->next;

return len;

void EnQueue(LinkQueue &Q,int x) { }

void DeQueue(LinkQueue &Q) {

QNode *q;

if(Q.rear->next == Q.front)

cout << \队列已满\

else { }

q = new QNode; q->next = NULL; q->data = x; Q.rear->next = q; Q.rear = q;

- 47 -

}

int e;

if(Q.front == Q.rear)

cout << \队列为空\

else { }

Q.front = Q.front->next; e = Q.front->data;

cout << \出队数为\

- 48 -

《软件技术基础》实验报告

实验名称:二叉树的生成和遍历

班 级 学 号 姓 名

第 14 周 星 期 2 、 5,6 节 成 绩

一、实验目的:

1、熟悉二叉树节点的定义和生成方式; 2、熟悉二叉树链式结构的生成方式; 3、掌握二叉树遍历算法的实现。

二、实验内容:

1.设计实现二叉树的建立及遍历算法,要求:

(1)编写创建二叉链式存储结构的二叉树程序并输出。 (2)编写递归实现二叉树的先序、中序、后序遍历算法。 (3)编写主函数测试以上二叉树的创建和遍历函数。

2. 假设二叉树采用链式存储结构进行存储,编写程序实现二叉树的所有叶子结点的统计并输出统计个数。

三、实验结果:

- 49 -

四、实验中遇到的问题及解决方法:

对二叉树的查找顺序经常搞错,多看书理解后逐渐错误率降低。

五、实验心得体会:

二叉树的遍历在本书算一个难点,调试过程中经常出错,要对着课本一句句的编写,前方依旧很艰难

附:源程序(自行编写或修改的程序。若为修改程序请注明修改部分的功能,若为书上实例则可不附。) #include #include #include #include #define maxsize 200 typedef char datatype;

typedef struct node{

datatype data;

struct node *lchild,*rchild;

- 50 -

本文来源:https://www.bwwdw.com/article/tfop.html

Top