第一篇:软件技术基础实验报告
《软件开发技术基础》
实验报告
学院:XX学院
班级:XX
姓名: XX
学号:XX
《软件开发技术基础》实验报告
实验名称:实验一 顺序表的操作
班 级 学 号 姓 名 第 周 星 期 节 成 绩
一、实验目的:
1、掌握顺序表结构的实现方式;
2、掌握顺序表常用算法的实现;
3、熟悉利用顺序表解决问题的一般思路;
4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验要求:
1、掌握顺序表的特点及常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:
(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。要求实现菜单、初始化、添加、删除和显示等功能。
四、程序要求:
1、采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过50个。
2、写出完整的程序并能调试运行。
五、实验结果:
1、顺序表的结果:
2、电话簿的结果:
六、实验中遇到的问题及解决方法:
1.在删除数据的时候如果有两个一样的数时要怎样解决? 解决方法:用while进行判断。
2.在删除操作中,删除函数中的l是指针,所以用->指向,而在主函数中l是结构体,用“.”。3.在查找的时候有一个返回值,而这个返回值是指针,所以在写查找函数的时候要把返回值类型写上。
七、实验心得体会:
一开始不知所措,首先应该有一个大的方向,把主程序编号,再逐步求精,落实到每一个函数的编写。对于c语言要熟练掌握,要熟悉循环等得操作,要熟练掌握顺序表中的插入,删除,查找,的基本函数。在此的基础上灵活使用。附:
1、顺序表的程序: #include
struct Seqlist {
};Seqlist *init(){
} void insert(Seqlist *p){
int num=0;printf(“请输入要键入的个数:”);scanf(“%d”,&num);if(num<1)printf(“键入的数据个数错误!n”);Seqlist *p;p=(Seqlist *)malloc(sizeof(Seqlist));p->length=0;return p;int data[MAXSIZE];int length;else {
printf(“键入数据为:n”);for(;num>0;num--){ p->length++;scanf(“%d”,p->data+p->length-1);
}
}
} if(p->length==MAXSIZE){
} printf(“数组已满n”);break;getchar();void deletee(Seqlist *p){
} int find(Seqlist *p){ int i=0;printf(“请输入要删除元素的位置:”);scanf(“%d”,&i);if(i<1||i>p->length)printf(“表中没有第%d个元素!n”,i);else {
} getchar();for(int j=i;j<=p->length-1;j++)p->data[j-1]=p->data[j];p->length--;
} int x;printf(“请输入要查找的数据:”);scanf(“%d”,&x);for(int i=0;i
length;i++){
} if(i>=p->length)printf(“数组中没有此数据!n”);if(p->data[i]==x){
} printf(“此数据位于第%d个位置n”,i+1);return i+1;getchar();return 0;void display(Seqlist *p){
} int main(void){ Seqlist *p;for(int i=0;i
length;i++)printf(“%-5d”,p->data[i]);putchar('n');getchar();
p=init();char flag;printf(“1-插入 2-删除 3-查找 4-显示 0-退出n”);while(1){
printf(“请输入操作:”);switch(flag=getchar()){ case '1':insert(p);putchar('n');break;case '2':deletee(p);printf(“删除后数据为:”);display(p);putchar('n');getchar();break;case '3':find(p);putchar('n');getchar();break;case '4':printf(“显示数据为:”);display(p);putchar('n');break;case '0':free(p);return 0;}
}
}
2、电话簿的程序: #include
string name;string phonenumber;string phone;contact *next;}CNT;class Phonebook { public:
Phonebook();CNT *Input();CNT *Turn_to_end();void Add();void Delete();void Showmenu();CNT *Find();void Show_item(CNT *p);void Display();void Modification();private: };
Phonebook::Phonebook(){ head=new CNT;CNT *head;
} head->next=NULL;void Phonebook::Show_item(CNT *p){ cout<<“|----姓名----|--电话号码--|-------------地址------------|”< } void Phonebook::Display(){ CNT *p;cout<<“|----姓名----|--电话号码--|-------------地址------------|”< } cout<<“|------------------------|”< CNT *Phonebook::Input(){ } CNT *Phonebook::Turn_to_end(){ } CNT *temp=head;while(temp->next!=NULL){ } cout<<“n”;return temp;temp=temp->next;CNT *temp;temp=new CNT;cout<<“请输入姓名:”;cin>>temp->name;cout<<“请输入手机号码:”;cin>>temp->phonenumber;cout<<“请输入固定电话:”;cin>>temp->phone;temp->next=NULL;cout<<“n”;return temp; void Phonebook::Add(){ } void Phonebook::Delete(){ CNT *p,*q;q=p=head;string data;cout<<“请输入要删除联系人的信息:”;cin>>data;for(p=p->next;p!=NULL&&p->name!=data&&p->phonenumber!=data&&p->phone!=data;CNT *temp,*p;temp=Input();p=Turn_to_end();p->next=temp;cout<<“n”;p=p->next) q=p;if(p!=NULL){ q->next=p->next;delete p; } } else cout<<“该信息不存在”< } CNT *Phonebook::Find(){ CNT *p=head;string data;cout<<“请输入要查找或要修改的联系人的信息:”;cin>>data;for(p=p->next;p!=NULL&&p->name!=data&&p->phonenumber!=data&&p->phone!=data;cout<<“ 电话簿”< if(p!=NULL)Show_item(p);else } cout<<“不存在该信息”< } int main(){ int select;Phonebook phbook;CNT *p;p=Find();if(p!=NULL){ } cout<<“n”;cout<<“请输入姓名:”;cin>>p->name;cout<<“请输入手机号码:”;cin>>p->phonenumber;cout<<“请输入固定电话:”;cin>>p->phone; phbook.Showmenu();while(1){ cout<<“n请输入要选择的操作(0~6):”;cin>>select;getchar();switch(select){ case 0: exit(0);break;case 1: phbook.Add();break;case 2: phbook.Display();break;case 3: phbook.Delete();break;case 4: phbook.Find();break;case 5: phbook.Modification();break; } } } return 0; 实验名称:实验二 链表的操作 (一)班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 1、掌握单链表结构的实现方式; 2、掌握单链表常用算法的实现。 二、实验要求: 1、掌握链表的特点及常见算法。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1、设计一个链表,要求编程实现如下任务: (1)建立一个链表,首先依次输人整数数据元素(个数根据需要键盘给定)。(2)删除指定值的结点(指定值通过键盘输入),再依次显示删除后的链表中的数据元素。 (3)查找指定值的结点(指定数据由键盘输入),若找到则显示查找成功,若没有找到则显示查找失败。 (4)在第i个节点(i由键盘输入,i=0表示插入的结点作为第1个结点)之后插入一个元素为x的节点。 四、程序要求: 1、采用链表实现,假设该链表的结点数在最坏情况下不会超过40个。 2、写出完整的程序并能调试运行。 五、实验结果: 六、实验中遇到的问题及解决方法: 问题:在查找数据时显示的是一样的? 解决方法:在查找函数前要标明返回值的类型lnode *find。 七、实验心得体会: 首先要把书上的关于单链表的定义理解,在这个的基础上使用它。单链表通过结点在数据后附加后继元素的指针信息,可以更灵活的添加,删除,查找,插入,元素。要清楚指针的指向。首先要定义一个头结点,并且指针域要为空。将各个操作分别编写函数,有利于分块使用而且可以多次使用。附: #include { cout<<“请输入数组的个数(小于50):”;cin>>leng;cout<<“请输入数据:”;for(int i=0;i } for(int j=i;j { if(a[i]==temp){ x=i+1;cout<<“你要查找的数是数组的第”< } } if(x==0)cout<<“数组中没有你要查找的数”;} 实验名称:实验三 链表的操作 (二)班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 1、熟悉利用线性链表解决问题的一般思路; 2、参照给定的链表的程序样例,验证给出的链表的常见算法,了解单链表结构的优点和不足。 二、实验要求: 1、熟练掌握链表的使用,并能运用其解决些常规问题。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1、使用链表实现一个电话本的管理程序,电话本中的每条记录包括姓名和电话两项。要求实现菜单、初始化、添加、删除和显示等功能。 四、程序要求: 1、采用链表实现,假设该链表的结点数在最坏情况下不会超过40个。 2、写出完整的程序并能调试运行。 五、实验结果: 六、实验中遇到的问题及解决方法: 1.实验结果版面不好看 解决方法:反复调试执行,每次都对自己不满意的地方进行一些改正。2.怎样比较name与s->name? 解决方法:用string.h中的strcmp函数。3.在传递数据时有问题? 解决方法:返回的值要注意数据类型,是指针还是整数等。 七、实验心得体会: 在应用中可以利用while实现选择,并根据选择用switch来完成选择。为了简化编程,结点插入操作可仅仅在头部进行。单链表的方法使添加操作更加简便。不需要事先分配结点空间,而是在需要时动态的申请,节省了空间。、附: #include void show_menu(){ puts(“1添加 2删除 3查找 4插入 5显示 0退出”);} void show_item(STU *p){ printf(“|编号| 学号 | 姓名 | 电话号码 |n”);printf(“|1 |%-12s|%-12s|%-12s|n”,p->stu_number,p->stu_name,p->stu_phone); } STU *init(){ STU *p;p=(STU *)malloc(sizeof(STU));p->next=NULL;return p;} void display(STU *head){ int i;STU *p;p=head->next;printf(“|编号| 学号 | 姓名 | 电话号码 |n”);for(i=1;p!=NULL;i++,p=p->next){ printf(“|%-4d|%-12s|%-12s|%-12s|n”,i,p->stu_number,p->stu_name,p->stu_phone);} } STU *turn_to_end(STU *head){ STU *p;for(p=head;p->next!=NULL;p=p->next);return p;} STU *putin(){ STU *temp;temp=(STU *)malloc(sizeof(STU));printf(“请输入姓名:”);gets(temp->stu_name);printf(“请输入学号:”);gets(temp->stu_number);printf(“请输入电话号码:”);gets(temp->stu_phone);temp->next=NULL;return temp;} void add(STU *head){ STU *temp,*p;p=head;temp=putin();p=turn_to_end(head);p->next=temp;} STU *find(STU *head,int i){ STU *p;if(i<1) puts(“输入错误”);else { for(p=head;p->next!=NULL&&i>0;i--,p=p->next); if(i>0) { puts(“不存在该结点”); return NULL; } } return p;} STU *find_stu(STU *head,char *data){ STU *p,*q;q=p=head;for(p=head->next;p!=NULL&&strcmp(p->stu_name,data)!=0&&strcmp(p->stu_number,data)!=0&&strcmp(p->stu_phone,data)!=0;p=p->next) q=p;if(p!=NULL) return q;else { puts(“不存在该信息”); return p;} } void delet(STU *head,char *data){ STU *p,*q;p=q=head;q=find_stu(head,data);if(q!=NULL){ p=q->next; q->next=p->next; free(p);} } void insert(STU *head,int i) { STU *p,*q,*temp;q=p=head;if(i<0) puts(“输入错误”);else if(i==0){ temp=putin(); temp->next=p->next; q->next=temp; } else if(find(head,i)!=NULL){ q=find(head,i); p=q->next; temp=putin(); q->next=temp; temp->next=p;} else return;} int main(void){ STU *head,*temp;int selct,node;char data[12];head=init();show_menu();while(1){ printf(“请选择操作:”); scanf(“%d”,&selct); getchar(); switch(selct) { case 1: add(head); putchar('n'); break; case 2: display(head); printf(“请输入要删除学生的学号、姓名或电话号码:”); } scanf(“%s”,data); getchar(); delet(head,data); display(head); putchar('n'); break;case 3: puts(“请输入要查找的数据”); scanf(“%s”,data); getchar(); if(temp=find_stu(head,data)) { show_item(temp->next); } else puts(“ 不存在该信息”); putchar('n'); break;case 4: puts(“请输入要插入结点的位置”); scanf(“%d”,&node); getchar(); insert(head,node); putchar('n'); break;case 5: display(head); putchar('n'); break;case 0: exit(0); break;} } return 0; 实验名称:实验四 栈的操作 班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 掌握栈的的定义和运算,了解栈的应用。 二、实验要求: 1、掌握栈的特点及常见算法。 2、参照给定的栈的程序样例,验证给出的栈的常见算法。 3、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1、堆栈的测试和应用。要求: 设计一个主函数实现对顺序堆栈代码进行测试。测试方法为:依次把数据元素1,3,5,7,9入栈,然后出栈堆栈中的数据元素并在屏幕上显示。 四、程序要求: 1、栈的长度自行确定。 2、重点理解栈的算法思想,能够根据实际情况选择合适的存储结构。 3、写出完整的程序并能调试通过。 五、实验结果: 六、实验中遇到的问题及解决方法: 七、实验心得体会: 栈是后进先出表,只允许在栈顶进行插入和删除。要掌握顺序栈初始化,出栈,入栈的基本程序,在理解得基础上加以运用。要清楚栈和单链表的区别。附: #include void Sqstack::push(){ int temp;if(top>=maxsize-1){ cout<<“堆栈已满”< cout<<“请输入要进栈数的值”< cin>>temp; top++; *(data+top)=temp;} } void Sqstack::pop(int &e){ if(top>-1){ e=*(data+top); top--; cout< cout<<“堆栈已空”;} cout< i=top; for(;i>=0;i--) cout<<*(data+i)<<“ ”;} else cout<<“空栈”;cout< void Sqstack::modify(){ int temp;cout<<“请输入栈的长度”< maxsize=temp;else cout<<“输入错误栈的长度必须>0”< int main(){ Sqstack test;int temp,select;cout<<“1.进栈 2.出栈 3.显示 4修改栈长度 0.退出”< cout<<“请选择操作:”; cin>>select; switch(select) { case 1: test.push(); break; case 2: test.pop(temp); break; case 3: test.display(); break; case 4: test.modify(); break; case 0: exit(0); break; default: cout<<“输入错误按任意键重新输入”< getch(); break; } } return 0;} 实验名称:实验五 队列的操作 班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 掌握队列的定义及其运算,了解队列的应用。 二、实验要求: 1、掌握队列的特点及常见算法。 2、参照给定的队列的程序样例,验证给出的队列的常见算法。 3、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1、队列测试和应用。要求: 设计一个主函数对循环队列代码进行测试。测试方法为:依次把数据元素2,4,6,8,10入队,然后出队中的数据元素并在屏幕上显示。 四、程序要求: 1、队列的长度由自行确定。 2、重点理解队列的算法思想,能够根据实际情况选择合适的存储结构。 3、写出完整的程序并能调试通过。 五、实验结果 六、实验中遇到的问题及解决方法: 七、实验心得体会: 队列是只允许在一端进行删除操作的线性表。在操作时会有假溢出的情况出现,可以将存放队列元素的数组守卫相接,形成循环队列。即:rear=(rear+1)%m;Front=(front+1)%m 附: #include typedef struct Temp { int data; struct Temp *next;}T;class Linksqueue { private: T *front,*rear;public: Linksqueue();void Enqueue();void Dequeue(T *);void display();}; Linksqueue::Linksqueue(){ front=rear=new(T);front->next=NULL;} void Linksqueue::Enqueue(){ T *temp;temp=new(T);cout<<“请输入入队元素的值:”< void Linksqueue::Dequeue(T *s){ T *temp;if(front->next!=NULL){ temp=front; front=front->next; *s=*front; cout<<“出队元素的值:n”< delete temp;} else cout<<“队列已空”< void Linksqueue::display(){ T *temp;if(front==rear) cout<<“空队”< cout<<“队列所有元素为 front-> ”; for(temp=front->next;temp->next!=NULL;temp=temp->next) { cout< } cout< cout<<“->rear”< int main(){ Linksqueue temp;T * a;a=new(T);int select;cout<<“1入队 2出队 3显示 0退出”< cout<<“请选择操作:”; cin>>select; switch(select) { case 1: temp.Enqueue(); break; case 2: temp.Dequeue(a); break; case 3: temp.display(); break; case 0: } exit(0); break;default: cout<<“输入错误按任意键重新输入”< getch(); break;} } return 0; 实验名称:实验六 二叉树的生成与遍历 班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 1、熟悉二叉树节点的定义和生成方式; 2、熟悉二叉树链式结构的生成方式; 3、掌握二叉树遍历算法的实现。 二、实验要求: 1、掌握二叉树的常见算法。 2、参照给定的二叉树的程序样例,验证给出的有关二叉树的常见算法,并实现有关的操作。 3、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1.设计实现二叉树的建立及遍历算法,要求: (1)编写创建二叉链式存储结构的二叉树程序并输出。(2)编写递归实现二叉树的先序、中序、后序遍历算法。 (3)编写主函数测试以上二叉树的创建和遍历函数。2.假设二叉树采用链式存储结构进行存储,编写程序实现二叉树的所有叶子结点的统计并输出统计个数。 四、实验结果: 五、实验中遇到的问题及解决方法: 调试的时候显示没有错误但是程序运行不出来? 在if语句中的相等要用“==”。要注意!! 六、实验心得体会: 二叉树的遍历有先序,中序,后序遍历。这三种遍历都是用递归的形式实现的。而二叉树的插入结点的算法与许多因素有关,我们要在理解二叉树结构的基础上根据需要来编写程序。我在实验中使用的二叉排序树可以作为静态查找表使用也可以作为动态查找表。附: #include front=1;rear=0;printf(“请输入二叉树的各节点,@表示虚节点,#表示节点:n”);scanf(“%c”,&ch);while(ch!='#'){ putchar(ch); s=NULL; if(ch!='@') { s=(bitree *)malloc(sizeof(bitree));s->data=ch; s->lchild=NULL; s->rchild=NULL; } rear++; Q[rear]=s; if(rear==1)root=s; else {if(s&&Q[front]) if(rear%2==0) Q[front]->lchild=s; else Q[front]->rchild=s; if(rear%2==1) front++; }scanf(“%c”,&ch);} return root;} void preorder(bitree *p){ if(p!=NULL){ printf(“%c”,p->data); preorder(p->lchild); preorder(p->rchild);} return;} void inorder(bitree *p){ if(p!=NULL){ inorder(p->lchild); printf(“%c”,p->data); inorder(p->rchild);} return;} void postorder(bitree *p){ if(p!=NULL){ postorder(p->lchild); postorder(p->rchild); printf(“%c”,p->data);} return;} int yzjd(bitree *t){ if(t==NULL)return(0);if(t->lchild==NULL&&t->rchild==NULL)return(1); return(yzjd(t->lchild)+yzjd(t->rchild));} void main(){ bitree *root;root=CREATREE(); printf(“n先序遍历结果如下:n”);preorder(root);printf(“n中序遍历结果如下:n”);inorder(root);printf(“n后序遍历结果如下:n”);postorder(root);printf(“n叶子节点的个数为:%dn”,yzjd(root)); printf(“n”);} 实验名称:实验七 查找算法实现 班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 掌握各种查找算法的特点,测试并验证查找常见算法。 二、实验要求: 1、参照各种查找算法程序样例,验证给出的查找常见算法。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1.建立有序表,采用折半查找实现某一已知的关键字的查找。 2.利用折半查找算法在一个有序表中插入一个元素,并保持表的有序性。 四、实验结果: 五、实验中遇到的问题及解决方法: 六、实验心得体会: 本实验使用的是折半法查找,优点是查找效率高,在编程的时候要设置low,high,mid,分别表示区间和中间位置的值。 附: #include }; Seqlist * init()int data[MAXSIZE];int length; { } void insert(Seqlist *p){ int num=0;printf(“请输入要键入的个数:n”);if(num<1){ } int temp;for(int i=1;i length;i++) for(int j=0;j length-i;j++) if(p->data[j]>p->data[j+1]){ } temp=p->data[j];p->data[j]=p->data[j+1];p->data[j+1]=temp;printf(“请输入数据:n”);for(;num>0;num--){ } p->length++;scanf(“%d”,p->data+p->length-1);if(p->length==MAXSIZE){ } printf(“数组已满n”);break;printf(“输入个数有误n”);else Seqlist *p;p=(Seqlist *)malloc(sizeof(Seqlist));p->length=0;return p;scanf(“%d”,&num); } getchar();int binsearch(Seqlist *p){ } void display(Seqlist *p){ } int main(void){ Seqlist *p;char flag;p=init();int i;for(i=0;i length;i++)printf(“%-5d”,p->data[i]);putchar('n');getchar();int low,high,mid,key;low=0;high=p->length-1;printf(“请输入要查找的数据:n”);scanf(“%d”,&key);getchar();while(low<=high){ } return 0;mid=(low+high)/2;if(key==p->data[mid]){ } else if(key data[mid])high=mid-1;else low=mid+1;printf(“此数据位于第%d位置n”,mid+1);return mid+1; } printf(“1-插入 2-折半法查找 3-显示 0-退出n”);while(1){ } return 0;printf(“请输入操作:”);switch(flag=getchar()){ case '1' : insert(p);break;case '2' : binsearch(p);break;case '3' : printf(“所有数据为:”);display(p);break;case '0' : free(p);return 0;} 实验名称:实验八 排序综合实验 班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 参照各种排序算法程序样例,验证给出的排序常见算法。 二、实验要求: 1、掌握各种排序算法的特点,测试并验证排序的常见算法。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 输入一组关键字序列分别实现下列排序,并将上述几种排序的算法编写成菜单,根据输入的数字不同执行对应的排序算法(任选两种排序方法实现)。 1、直接插入排序。 2、希尔排序。 3、冒泡排序。 4、直接选择排序。 5、快速排序。 6、堆排序。 7、归并排序。 8、基数排序。 四、实验结果: 五、实验中遇到的问题及解决方法: 怎样实现待排序数据长度从键盘输入? 解决方法:设置一个n,从键盘输入n的值。 六、实验心得体会: 排序的常用方法有直接插入排序,简单选择排序,冒泡排序,快速排序。我在实验中用了冒泡排序和快速排序,冒泡排序的程序比较简单容易理解而快速排序则比较复杂。快速排序要先划分序列然后建立在划分基础上进行排序,这个排序是由递归实现的。但是快速排序的优点是排序比较快。附: #include Seqlist * init(){ Seqlist *p;p=(Seqlist *)malloc(sizeof(Seqlist));p->length=0;return p;} void insert(Seqlist *p){ int num=0;printf(“请输入要键入的个数:n”);scanf(“%d”,&num);if(num<1) printf(“输入个数有误n”);else{ printf(“请输入数据:n”); for(;num>0;num--) { p->length++; scanf(“%d”,p->data+p->length-1); if(p->length==MAXSIZE) printf(“数组已满n”); } } getchar();} void bublesort(Seqlist *p){ int temp;for(int i=1;i length;i++) for(int j=0;j length-i;j++) if(p->data[j]>p->data[j+1]) { temp=p->data[j]; p->data[j]=p->data[j+1]; p->data[j+1]=temp; } } void insertsort(Seqlist *p){ int i,j,temp;for(i=1;i length;i++){ temp=p->data[i]; j=i; while(j>0&&temp data[j-1]) { p->data[j]=p->data[j-1]; j--; } p->data[j]=temp;} } void display(Seqlist *p){ int i;for(i=0;i length;i++) printf(“%-5d”,p->data[i]);putchar('n');getchar();} int main(void){ Seqlist *p,*q;char flag;p=init();q=(Seqlist *)malloc(sizeof(Seqlist));q->length=0;printf(“1-输入数据 2-直接插入排序 3-冒泡排序 4-显示 0-退出n”);while(1){ printf(“请输入操作:”); switch(flag=getchar()) { case '1' : insert(p);break; case '2' : *q=*p;insertsort(q);printf(“直接插入排序后的数据为:”);display(q);break; case '3' : *q=*p;bublesort(q);printf(“冒泡排序后的数据为:”);display(q);break; case '4' : printf(“原数据为:”);display(p);break; case '0' : free(p);return 0; } } return 0;} 计算机软件技术基础 实验报告 自动化0901班 郝万福 学号:20092395 实验1:线性表的排序与查找 目的: 掌握数据结构的基本概念、线性表的基本操作以及查找和排序方法的设计。内容: 键盘输入一组无序数据,添加到线性表中; 排序线性表并输出排序结果; 键盘输入一个数,并插入到排好序的线性表中(要求插入后的表仍为有序表),输出结果; 键盘输入一个数,并从线性表中删除相应的数据,输出结果。要求: 程序清单; 运行过程及运行结果。 实验代码: /* */ #include “stdafx.h” #include “iostream” #include // 程序实现有各种方法,这里给出一个实例。 // 定义一个线性表 const int nMaxSize = 15;// 最大值 int nLen = 0; // 定义操作 void LSort();void LOut();void LInsert(int n);void LDelete(int n); int main(){ // 输入数据并放入线性表中 printf(“Please input datan”);// std::cout << “Please input datan”;int nIn = 0; // 表中元素个数 int nLinearList[nMaxSize];班级:自动化 0901 班 姓名:郝万福 学号:20092395 编译环境: Visual Studio 2011 Windows 7 x86-64 旗舰版 } for(int i = 0;i <= 9;i++){ } LSort();// 排序线性表 LOut();// 输出结果 scanf(“%d”,&nIn);nLen++; // std::cin >> nIn; nLinearList[i] = nIn;printf(“Please input a data to insert n”);scanf(“%d”,&nIn);LInsert(nIn);LOut();printf(“Please input a data to delete n”);scanf(“%d”,&nIn);LDelete(nIn);LOut();char chTmp;printf(“Please input a char to finish this program.”);chTmp = getch();return 0;// 输入一个数字,并从线性表中删除 // 输入一个数字,并插入到线性表中 void LSort(){ } void LOut(){ // 冒泡排序,由大到小 for(int j=0;j<=10;j++){ } for(int i=0;i<11-j;i++) if(nLinearList[i] int temp=nLinearList[i];nLinearList[i]=nLinearList[i+1];nLinearList[i+1]=temp;} printf(“n”);for(int i = 0;i < nLen;i++){ } } printf(“%d, ”, nLinearList[i]);printf(“n”);void LInsert(int n){ nLen++;nLinearList[nLen] = n;for(int k=0;k<=nLen;k++){for(int l=0;l 实验结果: 实验2:栈与队列的应用 目的: 掌握栈与队列的基本概念、基本操作及设计与应用。内容: 键盘输入算数表达式,并放入队列当中; 应用栈的概念设计表达式求值算法; 输出表达式求值结果; 要求: 程序清单; 运行过程及运行结果。 要求: 实现实验内容的SQL语句,以及输出结果 为检验实验内容的有效性而执行的SQL语句,例如向数据表中插入数据; 检验运行结果(例如插入、删除)的SQL语句,以及输出的结果。 实验代码: /* */ #include “stdafx.h” #include const int MAX_LEN = 10; // 定义一个队列的结构 struct QUEUE { int nMaxSize;int nCount;int nFront;// 最大值 // 个数 // 头 // 字符串的长度 const int MAX_SIZE = 30;// 栈或队的最大元素个数 班级:自动化 0901 班 姓名:郝万福 学号:20092395 编译环境: Visual Studio 2011 Windows 7 x86-64 旗舰版 int nRear;// 尾 char szQueue[MAX_SIZE][MAX_LEN];} QQ;//定义一个栈的结构 struct STACK { // 队列的操作 void InitQueue(QUEUE *q,int nMaxSize){ } void InQueue(QUEUE *q, char *pItem){ } void OutQueue(QUEUE *q, char *pItem){ if(q->nCount == 0){ } q->nCount--;int i;printf(“队列已空n”);getch();return 0;if(q->nMaxSize == q->nCount){ } q->nCount++;int i;for(i=0;i<10;i++){ } q->nFront ++;return;q->szQueue[q->nFront][i]= pItem[i];printf(“队列已满n”);getch();return 0;q->nMaxSize=nMaxSize;q->nCount=0;q->nFront=0;q->nRear=0;int nMaxSize;int nTop;// 最大值 // 栈顶 char szStack[MAX_SIZE][MAX_LEN];} ST; } for(i=0;i<10;i++){ } q->nRear ++;return;pItem[i] = q->szQueue[q->nRear][i];//栈的操作 void InitStack(STACK *s,int nMaxSize){ } void PushStack(STACK *s, char *pItem){ } void PopStack(STACK *s, char *pItem){ if(s->nTop == 0){ } printf(“堆栈已空n”);getch();return 0;if(s->nTop == s->nMaxSize-1){ } for(int i=0;i<10;i++){ } s->nTop++;s->szStack[s->nTop][i]= pItem[i];printf(“堆栈已满n”);getch();return 0;s->nMaxSize=nMaxSize;s->nTop=0;// 栈顶 // 最大值 s->nTop--;for(int i=0;i<10;i++){ } void GetTopStack(STACK *s, char *pItem){ pItem[i] = s->szStack[s->nTop][i];} } for(int i=0;i<10;i++)pItem[i] = s->szStack[s->nTop-1][i];{ } int Priority(char *op);式的值 int main(){ int i=0; char c,temp[10]; // 声明一个队列 QUEUE qq; // 声明OS栈和NS栈 STACK ns,os; // 获得操作符的优先级 // 计算表达void Compute(char *num1, char *num2, char *op, char *chResult); InitQueue(&qq,MAX_SIZE);InitStack(&ns,MAX_SIZE);char x[MAX_LEN];char op[MAX_LEN]; // 定义扫描的表达式 // 栈顶运算符 // 运算结果 InitStack(&os,MAX_SIZE);char num1[MAX_LEN], num2[MAX_LEN];// 两个操作数 char chResult[MAX_LEN];printf(“Input expression please:n”);while((c=getchar())!='n'){ InQueue(&qq,temp);temp[0]=c;InQueue(&qq,temp);i=0; if(isdigit(c)){ } else { for(;i<10;i++){ } temp[i]=' ';temp[i++]=c; }; OutQueue(&qq, x);while(true){ if(isdigit(x[0])) // 是数 // 扫描表达式 // ;压栈 PushStack(&os,“;”);// 表达式p求值 } { PushStack(&ns,x);OutQueue(&qq, x); // 认为是运算符,没有考虑空格等 // 获得OS栈顶运算符 // 运算符的优先级〉栈顶运算符 } else { GetTopStack(&os, op);if(Priority(x)> Priority(op)) } else if(x[0]== ';' && op[0] == ';') } else if(Priority(x)<= Priority(op)) // 不大于栈顶运算符 printf(“最终的答案是%s”,chResult);break; // 扫描结束 PushStack(&os,x);OutQueue(&qq, x);{ { { PopStack(&ns,num1);PopStack(&ns,num2);PopStack(&os,op);Compute(num1, num2, op, chResult);PushStack(&ns,chResult);} } } } getch();return 0;int Priority(char *op){ } void Compute(char *num1, char *num2, char *op, char *chResult){ fNum1 = atof(num1);fNum2 = atof(num2);switch(op[0]){ case '^': fResult = pow(fNum2,fNum1);break;fResult = fNum1*fNum2;break;fResult = fNum2/fNum1;break;fResult = fNum1+fNum2;break;double fNum1,fNum2;double fResult = 0;switch(op[0]){ case '^': nPriority = 3;break;int nPriority = 0;case '*': case '/': nPriority = 2;break;case '+': case '-': } return nPriority;nPriority = 1;break;nPriority = 0;case ';': case '*': case '/': case '+': case '-': } } fResult = fNum2-fNum1;break; //把计算的结果转化为字符串 sprintf(chResult,“%.4f”,fResult);return;实验结果: 实验3:关系数据语言的应用 目的: 掌握SQL基本语句,实现数据库、表的创建,以及增删改和查询操作。内容: 创建数据库MyDB; 创建学生表Stu,内容包括:Sno、4个字符、主键,Sname、10个字符,Sex、2个字符,Age、整数,Birthday、日期型,Class、10个字符; 创建课程表Course,内容包括:Cno、2个字符、主键,Cname、10个字符,Chour、整型; 创建成绩表Score,内容包括: Sno、4个字符、主键,Cno、2个字符、主键,Grade、整型; 向各个数据表中插入多条实验数据,并查看操作后的结果; 实验环境: 操作系统: Linux Ubuntu 10.04 数据库: Mysql 5.1.62 使用字符集: utf-8 实验步骤: 1.$>mysql-u root 进入mysql 命令行。2.显示当前数据库 mysql> show databases;+----------------------+ | Database | +----------------------+ | information_schema | | mysql | | new-mato_development | | new-mato_test | +----------------------+ 4 rows in set(0.03 sec) 3.创建数据库 MyDB mysql> create database MyDB;Query OK, 1 row affected(0.02 sec) mysql> show databases;+----------------------+ | Database | +----------------------+ | information_schema | | MyDB | | mysql | | new-mato_development | | new-mato_test | +----------------------+ 5 rows in set(0.00 sec) 成功建立了数据库 MyDB。 4.创建学生表Stu mysql> create table Stu(-> Sno char(4)primary key,-> Sname char(10),-> Sex char(2),-> Age int(4),-> Birthday datetime,-> Class char(10));Query OK, 0 rows affected(0.08 sec) mysql> desc Stu;+----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | Sno | char(4)| NO | PRI | NULL | | | Sname | char(10)| YES | | NULL | | | Sex | char(2)| YES | | NULL | | | Age | int(4)| YES | | NULL | | | Birthday | datetime | YES | | NULL | | | Class | char(10)| YES | | NULL | | +----------+----------+------+-----+---------+-------+ 6 rows in set(0.00 sec) 5.创建课程表 Course mysql> create table Course(-> Cno char(2)primary key,-> Cname char(10),-> Chour int(4));Query OK, 0 rows affected(0.06 sec) mysql> desc Course;+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | Cno | char(2)| NO | PRI | NULL | | | Cname | char(10)| YES | | NULL | | | Chour | int(4)| YES | | NULL | | +-------+----------+------+-----+---------+-------+ 3 rows in set(0.00 sec) 6.创建成绩表 Score mysql> create table Score(-> Sno char(4)primary key,-> Cno char(2),-> Grade int);Query OK, 0 rows affected(0.05 sec) mysql> desc Score;+-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | Sno | char(4)| NO | PRI | NULL | | | Cno | char(2)| YES | | NULL | | | Grade | int(11)| YES | | NULL | | +-------+---------+------+-----+---------+-------+ 3 rows in set(0.00 sec) 7.向各个数据表中插入多条实验数据,查看操作结果。 mysql> insert into Stu values('1','Jobs','man',22,'1991-04-13','G2C2');Query OK, 1 row affected, 2 warnings(0.09 sec) mysql> insert into Stu values('2','Susan','feman',23,'1988-02-03','G2C2');Query OK, 1 row affected, 2 warnings(0.00 sec) mysql> insert into Stu values('3','Bob','man',23,'1979-01-03','G2C2');Query OK, 1 row affected, 2 warnings(0.00 sec) mysql> insert into Score values('1','1',23);Query OK, 1 row affected(0.01 sec) mysql> insert into Score values('1','2',43);Query OK, 1 row affected(0.01 sec) mysql> insert into Score values('1','3',63);Query OK, 1 row affected(0.01 sec) mysql> insert into Score values('1','4',93);Query OK, 1 row affected(0.01 sec) mysql> insert into Score values('2','1',56);Query OK, 1 row affected(0.00 sec) mysql> insert into Score values('3','1',66);Query OK, 1 row affected(0.00 sec) mysql> insert into Course values('1','G2C2',22);Query OK, 1 row affected, 1 warning(0.02 sec) 8.查询学生出生日期 mysql> select Birthday from Stu where Sno='2' OR Sname='Jobs';+---------------------+ | Birthday | +---------------------+ | 1991-04-13 00:00:00 | | 1988-02-03 00:00:00 | +---------------------+ 2 rows in set(0.00 sec) 9.按照学号顺序查询一个班级所有学生: +-------+ | Sname | +-------+ | Jobs | | Susan | | Bob | +-------+ 3 rows in set(0.02 sec) 10.列出学生选择各门课程的成绩。 mysql> select r.Grade,s.Sname,c.Cname from Score r inner join Stu s on r.Sno = s.Sno inner join Course c on c.Cname = s.Class; +-------+-------+-------+ | Grade | Sname | Cname | +-------+-------+-------+ | 23 | Jobs | G2C2 | | 56 | Susan | G2C2 | | 66 | Bob | G2C2 | +-------+-------+-------+ 3 rows in set(0.00 sec) 11.列出有过不及格成绩的学生名单 mysql> select r.Grade,s.Sname,c.Cname from Score r inner join Stu s on r.Sno = s.Sno inner join Course c on c.Cname = s.Class where r.Grade < 60;+-------+-------+-------+ | Grade | Sname | Cname | +-------+-------+-------+ | 23 | Jobs | G2C2 | | 56 | Susan | G2C2 | +-------+-------+-------+ 2 rows in set(0.01 sec) 12.求学生的平均成绩和总成绩。 mysql> select t.Sname, SUM(s.Grade)as ZCJ,AVG(s.Grade)as PJCJ from Score s inner join Stu t on t.Sno = s.Sno where Sname = 'Jobs';+-------+------+---------+ | Sname | ZCJ | PJCJ | +-------+------+---------+ | Jobs | 222 | 55.5000 | +-------+------+---------+ 1 row in set(0.00 sec) 13.找到所有成绩都在85以上的学生。mysql> select t.Sname from Stu t inner join Score s on t.Sno = s.Sno having count(s.Grade >85)= 4; Empty set(0.00 sec) 14.将课程号为01的课程改名为“软件技术” mysql> update Course set Cname = '软件技术' where Cno = 1;Query OK, 1 row affected, 1 warning(0.26 sec)Rows matched: 1 Changed: 1 Warnings: 1 +-----+------------+-------+ | Cno | Cname | Chour | +-----+------------+-------+ | 1 | 软件技术 | 22 | +-----+------------+-------+ 1 row in set(0.04 sec) 15.修改一名学生的姓名/性别/年龄 mysql> update Stu set Sname = 'Ruby',sex = 'f',Age = 31 where Sno = 3;Query OK, 1 row affected(0.03 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from Stu where Sname ='Ruby';+-----+-------+------+------+---------------------+-------+ | Sno | Sname | Sex | Age | Birthday | Class | +-----+-------+------+------+---------------------+-------+ | 3 | Ruby | f | 31 | 1978-02-03 00:00:00 | G2C2 | +-----+-------+------+------+---------------------+-------+ 1 row in set(0.00 sec) 16.将成绩为 55-59分的男生的成绩修改为60分。 mysql> update Score s inner join Stu t on t.Sno = s.Sno set s.grade = 60 where t.Sex = 'man' AND s.grade BETWEEN 55 AND 59; 17.删除90年以后,80年以前出生的学生的所有信息成绩。 mysql> DELETE FROM Stu WHERE Birthday > '1990-01-01 00:00:00' OR Birthday < '1980-01-01 00:00:00'; 18.删除一个班上的所有学生 mysql> DELETE FROM Stu WHERE Class = 'G2C2'; 19.删除所有数据表和数据库 mysql> drop table Stu;Query OK, 0 rows affected(0.08 sec) mysql> drop table Course;Query OK, 0 rows affected(0.12 sec) mysql> drop table Score;Query OK, 0 rows affected(0.02 sec) mysql> drop database MyDB;Query OK, 0 rows affected(0.27 sec) mysql> show databases;+----------------------+ | Database | +----------------------+ | information_schema | | mysql | | new-mato_development | | new-mato_test | +----------------------+ 4 rows in set(0.03 sec) 20.退出 mysql> quit Bye 软件技术实验报告 实验序号 一 名称 B VB 的感性认识--B VB 基本控件 班级 学号 姓名 实验内容及完成情况: 实验内容:1) 在屏幕上开辟一个窗口(文本框),窗口的上部放置一个标签,标签中显示:“欢迎使用 0 Visual Basic6.0 中文版”。窗口的下部有三个按钮,左边按钮中标有“开始显示”,中间按钮中标有“清屏”,右边按钮中标有“结束”。当鼠标单击左边按钮时,文本框中显示“欲穷千里目,更上一层楼!”如果单击中间按钮,则清除文本框中显示的内容,单击右边按钮则程序结束。2)单击“清屏”后,让光标出 现在文本框中,此时往文本框中输入若干文字,例如“您好”,然后单击窗体,使得在窗体的指定位置上显示在文本框中输入的文字。3)如果将 1 1)中单击左边按钮后文本框中显示的“欲穷千里目,更上一层楼!”改为“白日依山尽,黄河入海流,欲穷千里目,更上一层楼!”此时文本框在一行中将显示不下所有文本,请试调整该文本框的“ Multiline ”属性,并将文本框纵向距离调整到可容纳两行以上文字。此时再次执行程序,观察执行结果所发生的变化。 完成情况:顺利完成。 实验中遇到的问题及解决方法: 实验中所涉及的知识及技术: 文本框的双向作用(即输入与输出);窗体的双重作用(容器与输出);事件过程的编写;输入输出的简单实现;窗体、文本框、标签、命令按钮等基本控件的常用属性的动、静态设置等。 实验中的创新及功能扩充: 实验收获与体会: 备注: 软件技术基础上机实验报告 姓名:肖燕平上机实验 一 Ex1_1 #include typedef struct list_type { int data[maxnum];int length;}list_type; void error(int a){ switch(a){ case 0: printf(“nthe length of the data is too longn”);break; case 1: printf(“nthe place is wrongn”);break;} } void creatlist(list_type *table) //创建链表 { int i;int k;table->length=0;printf(“nplease input the numbers of the datan”);for(i=0;i scanf(“%d”,&k); if(k==-1) //输入-1则结束 break; 学号:2011019090028 } } table->data[i]=k;table->length++; while(k!=-1)//如果数据输入过长,则报错且重新输入数据 { error(0);while(k!=-1)//防止接下来的程序变量得到错误的数据 { scanf(“%d”,&k);} creatlist(table);} void showlist(list_type *table)//显示数据 { int i;while(table->length<=0){ printf(“NO DATA”); creatlist(table); } for(i=0;i printf(“%d ”,table->data[i]);} printf(“nthe length of the data is %dn”,table->length); } void insertlist(list_type *table,int pla,int num)//插入一个数 { int i; while(pla<0||pla>table->length)//如果插入的位置不符合条件,则重新输入 { error(1); printf(“nplease input the place of the insert number againn”); scanf(“%d”,&pla); } table->length=table->length-1; pla=pla-1; for(i=table->length;i>pla-1;i--) { table->data[i+1]=table->data[i]; } table->data[pla]=num; table->length=table->length+2; } void delete_list(list_type *table,int place) //删除一个数 { int i;while(place>table->length-1||place<1){ error(1); printf(“nplease input the place of the delete number againn”); scanf(“%d”,&place); } for(i=place-1;i table->data[i]=table->data[i+1];} table->length--;} void main(){ int inse_place,inse_num;int del_place; list_type table; creatlist(&table);//创建顺序表 showlist(&table);//显示顺序表 printf(“nplease input the insert place and numbern”);scanf(“%d%d”,&inse_place,&inse_num); insertlist(&table,inse_place,inse_num); //插入一个数 printf(“nthe new list isn”); showlist(&table);//显示插入数后的顺序表 printf(“nplease input the delete placen”);scanf(“%d”,&del_place); //删除一个数 delete_list(&table,del_place);printf(“nthe new list isn”);showlist(&table); } 输出数据: 1,不考虑边界情况 2,考虑边界 问题及解决方法 问题1:遗漏了某个变量而直接用 注意:对于变量,要那个变量则再来定义,定义后再用。 问题2:输入数据量大于19时,其余数字会赋给后程序的scanf。解决方法:利用另一变量k值,若k不等于-1则不允许程序往下走。 问题3:在print“NO DATA”后,程序依然往下走,不能重新录入数据。 解决方法:再调用输入数据函数,并且惯用while.问题还有很多,但忘了些。。。 心得体会: 1,在使用变量时,将要用哪个马上定义再使用。 2,error函数尽量写在所有函数之前。方便任一函数调用。3,对于printf函数,多用换行。 4,用scanf函数时,若输入数的量大于某一scanf的需求量,则要运用一函数消耗掉多余量,避免影响下面的函数,赋错值。 5,对于一些不符合要求的录入值,要习惯于重新调用输入函数或调用自我重新录入。 6,虽然自我的思考很重要,但还是要和同学讨论和交流算法。7,对于取值检验时,不能只取一种类型的数值或只随机取值,要注意取边界值和范围之外的值。 8,对于删除许多数时(例如把负数全部删除),要避免一次又一次的调用删除函数,防止出错。用x,y。Y首先比x前一位,若想<0,则y值赋给x。若不符合前提,令y往下走,至符合条件。 9,编程时,不要一来就写代码,一定要明确自己的步骤,在纸上写下来,用框图画好再写程序。 10,在有的方法总走不通时回头看是不是自己把问题复杂化了。 不知不觉中9周的《软件技术基础》 这门课课已经结束了,虽然时间有点短,但这九个星期的学习中我却受益匪浅,不仅让我系统的了解了许多计算机软件相关的基础知识和一些常用的系统软件,还让我有了更科学的方法去分析一些软件方面的问题,这对于我今后的学习和工作都是有很大帮助的。下面来谈谈我对学习这门课的一点点心得。 首先,我们认识到了计算机对现在社会、生活的影响之重,我们要想灵活的应对以后生活中的各种问题,拥有一个好的计算机技术必不可少的,而要想真的学好计算机技术,我们首先就得对计算机的操作、工作原理和规则等有一个清晰的认识。 如今仅仅掌握计算机语言并不能有效地使用计算机,我们必须掌握数据结构和算法方面的知识才能应对众多复杂的应用课题。刚开始学习数据结构时感觉它很抽象,而且感觉它没多大用处,后来发现不然,我们学习的是一些方法、思维,只有学会了这些我们才能解决一些非数值运算的程序设计方面的问题。 以前我们用过数据库比如Access,但我们只是很基础的应用它们,并不懂它的创建和工作原理,自从学习了这门课,我才初步了解了数据处理和数据管理方面的一些知识,并学到了 SQL语言的一些基础知识,这对我以后更深层次的学习计算机技术打下了一个基础。 虽然这门课程已经结束,我们学到的也是很基础的一部分,但它对我们影响很深,让我们以后学习更简单了。当然我仍会继续学习各种关于计算机技术方面的知识,让自己有一个过硬的技术,去应对各方面的问题。第二篇:计算机软件技术基础实验报告
第三篇:软件技术实验报告
第四篇:软件技术基础上机实验报告 顺序表
第五篇:软件技术基础学习心得