重庆邮电大学软件专业技术基础实验报告(耿道渠)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《软件技术基础》实验报告
实验名称:顺序表的操作
班级学号姓名
第9 周星期 2 、5,6 节成绩
一、实验目的:
1、掌握顺序表结构的实现方式;
2、掌握顺序表常用算法的实现;
3、熟悉利用顺序表解决问题的一般思路;
4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验内容:
1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。
要求实现菜单、初始化、添加、删除和显示等功能。
三、实验结果:
四、实验中遇到的问题及解决方法:
第一次编写C++,感觉力不从心,回去多看看PPT。
五、实验心得体会:
对顺序表的一些常用语句不熟悉,对顺序表的整体思路理解不深刻以后要加强练习
附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
#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 *);
void find(TEL *);
void show(TEL *);
int main(void)
{
int choose;
TEL List[MAXSIZE];
while(1)
{
cout << "***************************欢迎来到XXX电话本系统*********************" << endl;
cout << "1.初始化并建立" <<endl;
cout << "2.删除" <<endl;
cout << "3.查找" <<endl;
cout << "4.显示全部" << endl <<endl;
cin >> choose;
system("cls");
while( choose < 1 || choose > 4)
{
cout << "输入错误,数字1-4,请重新输入!" << endl;
cin >> choose;
system("cls");
}
switch(choose)
{
case 1: shuaxin(List); break;
case 2: delet(List); break;
case 3: find(List); break;
case 4: show(List); break;
}
//system("cls");
}
return 0;
}
void shuaxin(TEL * list)
{
int i,j;
for(i = 0; i < MAXSIZE; i++)
{
list[i].id = i + 1;
list[i].home_phone = "none";
list[i].name = "none";
list[i].student_number = "none";
list[i].tel = "none";
system("cls");
cout << "初始化成功,现在开始建表:" << endl;
cout << "请输入需要建立的电话个数:(小于" << MAXSIZE << ")"
<<endl;
cin >> num;
while( num < 1 || num > MAXSIZE )
{
system("cls");
cout << "输入错误,请重新输入" << endl;
cin >> num;
}
system("cls");
cout << "请依次输入学生的学号,姓名,移动电话,家庭电话" << endl;
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;
if(num == (j - 1) )
{
system("cls");
cout << "建立表完毕!" << endl;
}
}
void delet(TEL * list)
{
int j,i = 0;
cout << "请输入你需要删除的序号" << endl;
cin >> j;
while( j < 0 || j > num)
{
cout << "输入错误,请重新输入" << endl;
cin >> j;
}
while(list[i].id != j)
i++;
for(j = i; j < num - 1; j++)
{
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 = "none";
list[j].name = "none";
list[j].student_number = "none";
list[j].tel = "none";
num--;
system("cls");
cout << "删除完毕" << endl;
}
void find(TEL * list)
{
string telnum;
int i,key = 0;
cout << "请输入你需要查找的电话号码" << endl;
cin >> telnum;
system("cls");
for(i = 0; i < MAXSIZE; i++)
{
if(telnum == list[i].tel || telnum == list[i].home_phone)
{
if(key == 0)
cout << "依次学号姓名移动电话家庭电话" << endl;
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 << "未找到此电话号码" << endl;
}
void show(TEL * list)
{
int i;
cout << "现在有" << num << "个电话号码" << endl;
cout << "依次学号姓名移动电话家庭电话" << endl;
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 << "输出完毕" << endl;
}
《软件技术基础》实验报告
实验名称:链表的操作(一)
班级学号姓名
第10 周星期 2 、5,6 节成绩
一、实验目的:
1、掌握单链表结构的实现方式;
2、掌握单链表常用算法的实现。
二、实验内容:
1、设计一个链表,要求编程实现如下任务:
(1)建立一个链表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定值的结点(指定值通过键盘输入),再依次显示删除后的链表中的数据元素。
(3)查找指定值的结点(指定数据由键盘输入),若找到则显示查找成功,若没有找到则显示查找失败。
(4) 在第i个节点(i由键盘输入,i=0表示插入的结点作为第1个结点)之后插入一个元素为x的节点。
三、实验结果:
四、实验中遇到的问题及解决方法:
编写过程中经常把C语言和C++的语句形式搞混乱,课后认真了解了C++后得以解决。
五、实验心得体会:
对单链表的实现方式和常用算法掌握不足,对C++部分基本概念不熟悉,需课后补强
附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
struct LNode
{
int data;
struct LNode *next;
};
LNode *find(LNode *head,int x)
{
LNode *p=head->next;
while(p!=NULL && p->data!=x)
p=p->next;
return p;
}
void Insert(LNode *head,int i,int x)
{
if(i<1)
cout<<"不存在第"<<i<<"个位置";
else
{
LNode *p=head;
int k=0;
while(p!=NULL && k<i-1)
{
p=p->next;
k++;
}
if(p==NULL)
cout<<i<<"超出链表最大可插入位置"<<endl;
else
{
LNode *s=new LNode;
s->data=x;
s->next=p->next;
p->next=s;
}
}
}
void Delete(LNode *head,int i)
{
if(i<1)
cout<<"不存在第"<<i<<"个元素";
else
{
LNode *p=head;
LNode *q;
int k=0;
while(p!=NULL && k<i)
{
q=p;
p=p->next;
k++;
}
if(p==NULL)
cout<<i<<"超出链表长度"<<endl;
else
{
q->next=p->next;
delete p;
}
}
}
void main()
{
LNode *head,*p;
head=new LNode;
head->next=NULL;
int i,x,y;
cout<<"请输入5个数,每个书中间空一格:"<<endl;
for(i=1;i<=5;i++)
{
cin>>x;
Insert(head,i,x);
}
i=0;
cout<<"请输入需要删除的节点(1~5):"<<endl; cin>>i;
Delete(head,i);
cout<<"删除的节点"<<i<<"后输出为:"<<endl; p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
cout<<"请输入需要查找的指定值的结点:"; cin>>x;
if(find(head,x)!=NULL)
cout<<"查找成功"<<endl;
else
cout<<"查找失败"<<endl;
cout<<endl;
i=0;
x=0;
cout<<"请输入在i节点及元素x"<<endl; cin>>i>>x;
Insert(head,i,x);
cout<<"显示:"<<endl;
p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
《软件技术基础》实验报告
实验名称:链表的操作(二)
班级学号姓名
第11 周星期 2 、5,6 节成绩
一、实验目的:
1、熟悉利用线性链表解决问题的一般思路;
2、参照给定的链表的程序样例,验证给出的链表的常见算法,了解单链表结构的优点和不足。
二、实验内容:
1、使用链表实现一个电话本的管理程序,电话本中的每条记录包括姓名和电话两项。
要求实现菜单管理、记录的添加、删除和显示等功能。
三、实验结果:
四、实验中遇到的问题及解决方法:
对查找名字、查找号码等功能掌握不清,问老师和同学后基本清楚
五、实验心得体会:
体会到了C++的神奇与精彩,但是自己还不能实现这种神奇,达到这种精彩,但是增强了自身兴趣
附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define LEN sizeof(TEL)
#define SIZE sizeof(Size)
int n = 0;
typedef struct tel
{
char name[10];
long num;
struct tel * next;
}TEL;
typedef struct tel_size
{
char name[10];
long num;
}Size;
TEL * search(void);//从文件读取
TEL * insert(TEL *head);//插入
TEL * del(TEL * head);//删除
void showall(TEL * head);//输出到屏幕void find_name(TEL * head);//通过名字查找
void find_number(TEL * head);//通过号码查找
TEL * revise(TEL * head);
void sav(TEL * head);//储存
int main(void)
{
TEL * head = NULL;
int choose;
printf("welcome to this telphone number system\n");
head = search();
printf("1.insert\n"); //选择显示界面printf("2.del\n");
printf("3.showall\n");
printf("4.find_name\n");
printf("5.find_number\n");
printf("6.revise\n");
printf("7.save\n");
printf("8.end\n");
do //选择项
{
printf("please choose your choose:\n");
scanf("%d",&choose);
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("input wrong!\n");
printf("\n");
}
}while(1);
return 0;
}
TEL * search(void)//寻找文件是否存在函数
{
FILE * fp;
TEL * head = NULL;
TEL * p2,* p1;
p1 = p2 = (TEL *)malloc(LEN);
if( ( fp = fopen("TELnumber.txt","a+") ) == NULL)//打开或者新建文件{
printf("cant open file!\n");
exit(0);
}
fseek(fp,0L,0);//文件指针倒回到开头
while(!feof(fp))
{
if( fread(p1,SIZE,1,fp) != 1 )//需要防止读出错误情况
break;
if(head == NULL)
head = p1;
else p2->next = 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("please input a name and number:\n");
scanf("%s %ld",p0->name,&p0->num);
p1 = head;
p2 = p1;
if(head == NULL)
{
p0->next = NULL;
}else
{
while( strcmp(p0->name,p1->name) > 0 && p1->next != NULL)//比较字符串,找到应该插入位置
{
p2 = p1;
p1 = p1->next;
}
if( strcmp(p0->name,p1->name) <= 0 )//比较字符串,插入新号码
{
p2->next = p0;
p0->next = p1;
}else
{
p1->next = p0;
p0->next = NULL;
}
}
n++;
}
TEL * del(TEL * head)//删除函数
{
TEL * p1, * p2;
p1 = head;
long dele;
printf("please input what number do you want to del:\n");//输入删除的电话号码
scanf("%ld",&dele);
if(head == NULL)
printf("NULL list!\n");//空表情况
else
{
while(dele != p1->num && p1 != NULL)//找到位置
{
p2 = p1;
p1 = p1->next;
}
}
if(dele == p1->num)
{
if(dele == head->num)//删除在头部情况
head = head->next;
else p2->next = p1->next; //输出删除的数据并用链表架空
printf("dele this person'number:\n");
printf("%10s %15ld",p1->name,p1->num);
n--;
}else printf("cant find this person!\n");//没找到情况
return head;
}
void showall(TEL * head)//打印函数
{
int i = 0;
TEL * p;
p = head;
if(head == NULL)
printf("NULL list!\n");//空表情况
else
{
printf("there is %d number:\n",n);
printf(" name number \n");
do
{
i++;
printf("%d. %10s %15ld\n",i,p->name,p->num);
p = p->next;
}while(p != NULL);
}
}
void find_name(TEL * head)//以名字方式寻找号码
{
TEL * p;
int dis = 0;
char f_name[20];
p = head;
printf("please input a name:\n");//输入名字
scanf("%s",f_name);
if(head == NULL)
printf("NULL list!\n");//空表情况
else
{
do
{
if(strcmp(p->name,f_name) == 0)//只要找到同名均输出
{
dis = 1;
printf("find this person:\n");
printf("%s %15ld\n",p->name,p->num);
}
p = p->next;
}while(p != NULL);
}
if(dis == 0)
printf("cant find this person!\n");
}
void find_number(TEL * head)//以号码方式寻找号码
{
TEL * p;
long f_num;
int dis = 0;//dis作为判定是否找到变量
p = head;
printf("please input a number\n");//输入号码scanf("%ld",&f_num);
if(head == NULL)
printf("NULL list!\n");//空表情况
else
{
do
{
if(f_num == p->num)
{
dis = 1;
break;
}
else p = p->next;
}while(p != NULL);
}
if(dis == 1)
{
printf("find this person:\n");
printf("%s %15ld\n",p->name,p->num);
}
else printf("cant find this person!\n");
}
TEL * revise(TEL * head)//修改函数
{
TEL * p = head;
int choose,num,i;
printf("please choose which do you want to revise,input the number\n");
//find_name(TEL * head);
scanf("%d",&num);
for(i = 2; i <= num; i++)
p = p->next;
printf("1.revise name\n");
printf("2.revise telephone number\n");
scanf(" %d",&choose);
switch(choose)
{
case 1:{
printf("please input new name\n");
scanf("%s",p->name);
break;
}
case 2:{
printf("please input new telephone number\n");
scanf("%ld",&p->num);
break;
}
}
return head;
}
void sav(TEL * head)//储存函数
{
FILE * fp;
TEL * p;
if( ( fp = fopen("TELnumber.txt","a+") ) == NULL)//打开或者新建文件{
printf("cant open file!\n");
exit(0);
}
p = head;
while(p != NULL)
{
if( fwrite(p,SIZE,1,fp) == 1 )
p = p->next;
else
{
printf("save wrong!\n");
exit(0);
}
}
fclose(fp);
}
《软件技术基础》实验报告
实验名称:栈的操作
班级学号姓名
第 1 2 周星期 2 、5,6 节成绩
一、实验目的:
掌握栈的的定义和运算,了解栈的应用。
二、实验内容:
1、堆栈的测试和应用。
要求:
设计一个主函数实现对顺序堆栈代码进行测试。
测试方法为:依次把数据元素1,3,5,7,9入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
三、实验结果:
四、实验中遇到的问题及解决方法:
问题不是太多,但是编写过程还是比较艰辛。
五、实验心得体会:
栈在本书中比较重要,要多多理解书本知识,多问老师,多实践。
附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)
#include <iostream>
#include <stdlib.h>
#define MAX_SIZE 30
using namespace std;
struct SqStack
{
int *data;
int top;
int stacksize;
};
int InitStack(SqStack *,int);
void push(SqStack *,int);
void del(SqStack *);
int main(void)
{
int choose,size;
int in,i;
SqStack p;
cout << "welcome!" << endl;
cout << "请输入长度:" << endl;
cin >> size;
while(InitStack(&p,size))
{
cout << "请输入长度:" << endl;
cin >> size;
}
system("cls");
while(1)
{
cout <<
"**********************************************************" << endl;
cout << "1.入栈" << endl;
cout << "2.出栈" << endl;
cout << "3.栈内情况" << endl;
cout << "4.清空栈" << endl;
cout << "0.退出" << endl;
cout << "请输入选项" << endl;
cout <<
"**********************************************************" << endl;
cin >> choose;
while(choose < 0 || choose > 4)
{
cout << "请输入一个0-4的常数" << endl;
cin >> choose;
}
system("cls");
switch(choose)
{
case 1: cout << "输入一个整数" << endl;
cin >> in;
push(&p,in);break;
case 2: del(&p);
break;
case 3: cout << "栈底" << endl;
for(i = 0; i <= p.top; i++)
cout << p.data[i] << endl;
break;
case 4: while(p.top > -1)
{
cout << p.data[p.top] << endl;
p.top--;
}
break;
case 0: return 0; break;
}
}
return 0;
}
int InitStack(SqStack *s,int size)
{
if(size > 0 && size <= MAX_SIZE)
{
s->stacksize = size;
s->top = -1;
s->data = new int[size];
return 0;
}else cout << "初始化长度错误" << endl;
return 1;
}
void push(SqStack *s,int x)
{
if(s->top < s->stacksize - 1)
{
s->top++;
s->data[s->top] = x;
}else cout << "栈满" << endl;
}
void del(SqStack *s)
{
int x;
if(s->top > -1)
{
x = s->data[s->top];
s->top--;
cout << "出栈数为:" << x << endl;
}else cout << "栈空" << endl;
}
《软件技术基础》实验报告
实验名称:队列的操作
班级学号姓名
第13 周星期 2 、5,6 节成绩
一、实验目的:
掌握队列的定义及其运算,了解队列的应用。
二、实验内容:
1、队列测试和应用。
要求:
设计一个主函数对循环队列代码进行测试。
测试方法为:依次把数据元素2,4,6,8,10入队,然后出队中的数据元素并在屏幕上显示。
三、实验结果:
四、实验中遇到的问题及解决方法:
队列的方式和栈的方式既有不同也有相同,没有分好两者的编写方式,看书后了解清楚了。
五、实验心得体会:
队列和栈有些相似,可以在两者之间找相同点,互相总结。
附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)
#include <iostream>
#include <stdlib.h>
using namespace std;
struct QNode
{
int data;
struct QNode *next;
};
struct LinkQueue
{
struct QNode *front;
struct QNode *rear;
};
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 <<
"**********************************************************" << endl;
cout << " 欢迎来到XXX" << endl;
cout << " 1.入队" << endl;
cout << " 2.出队" << endl;
cout << " 3.队列长度" << endl;
cout << " 0.退出" << endl;
cout << "请选择:" << endl;
cout <<
"**********************************************************" << endl;
cin >> choose;
while(choose > 3 || choose < 0)
{
cout << "输入错误,请输入0-3" << endl;
cin >> choose;
}
switch(choose)
{
case 1: system("cls");
cout << "请输入一个数" << endl;
cin >> x;
EnQueue(Q,x); break;
case 2: system("cls");
DeQueue(Q);
break;
case 3: system("cls");
x = Queuelenth(Q);
cout << "队列长度为" << x << endl;
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++;
p = p->next;
}
return len;
}
void EnQueue(LinkQueue &Q,int x) {
QNode *q;
if(Q.rear->next == Q.front)
cout << "队列已满" << endl;
else
{
q = new QNode;
q->next = NULL;
q->data = x;
Q.rear->next = q;
Q.rear = q;
}
}
void DeQueue(LinkQueue &Q) {
int e;
if(Q.front == Q.rear)
cout << "队列为空" << endl;
else
{
Q.front = Q.front->next;
e = Q.front->data;
cout << "出队数为" << e << endl;
}
}
《软件技术基础》实验报告
实验名称:二叉树的生成和遍历
班级学号姓名
第14 周星期 2 、5,6 节成绩
一、实验目的:
1、熟悉二叉树节点的定义和生成方式;
2、熟悉二叉树链式结构的生成方式;
3、掌握二叉树遍历算法的实现。
二、实验内容:
1.设计实现二叉树的建立及遍历算法,要求:
(1)编写创建二叉链式存储结构的二叉树程序并输出。
(2)编写递归实现二叉树的先序、中序、后序遍历算法。
(3)编写主函数测试以上二叉树的创建和遍历函数。
2. 假设二叉树采用链式存储结构进行存储,编写程序实现二叉树的所有叶子结点的统计并输出统计个数。
三、实验结果:
四、实验中遇到的问题及解决方法:
对二叉树的查找顺序经常搞错,多看书理解后逐渐错误率降低。
五、实验心得体会:
二叉树的遍历在本书算一个难点,调试过程中经常出错,要对着课本一句句的编写,前方依旧很艰难
附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 200
typedef char datatype;
typedef struct node{
datatype data;
struct node *lchild,*rchild;。