1、实验5数组中 南 大 学实 验 报 告课程名称 c+程序设计 实验项目名称 实验4 实验5 实验6 指导老师 向瑶 实验学生班级 电子信息工程1503 实验学生姓名 陶韬 学号 0903130309 实验时间 2016.4.1至4.10 实验地点 校本部科技楼4楼实验成绩评定 实验5 数组 实验5.15.1.1.题目:用选择法对10个整数排序。十个整数用cin输入,将选择排序与起泡法比较,分析它们的特点和效率选择法的算法:第一轮把第一个数和剩下的9个数比较 通过比较交换使得第一轮交换后第一个数为这10个数中最小的,然后进行第二轮交换 把第二个数和剩下的8个数比较,通过比较交换使得第二轮交换后第
2、二个数为这9个数中最小的5.1.2 代码#includeusing namespace std;void sawp(int &a,int &b);/ 交换函数的形参为引用void SetArray(int *a);/ 对数组进行初始化的函数void ShowArray(int *a);/对数组进行输出的函数void SortArray(int *a);/对数组进行排序的函数int main() int a10; SetArray(a);/把数组的首地址传递给该函数 cout排序前的数组为endl; ShowArray(a); SortArray(a); cout排序后的数组为endl; Sho
3、wArray(a);void swap(int &a,int &b) int temp; temp=a; a=b; b=temp;void SetArray(int *a) int i; cout请输入10个整数endl; for(i=0;iai;void ShowArray(int *a) int i; for(i=0;i10;i+) coutait;/为了使输出结果更加简洁我加入了水平制表符 if(i+1)%4=0)/每输出4个数组元素就换行 coutendl; void SortArray(int *a) int i,j; for(i=0;i9;i+)/外层循环控制轮数一共进行10-1=
4、9轮 for(j=i+1;jaj) swap(ai,aj); 5.1.3输出结果请输入10个整数123456672349087排序前的数组为1 2 34 5667 234 9 08 7 排序后的数组为0 1 2 78 9 34 5667 234 Press any key to continue5.1.4 用冒泡法进行排序算法 将相邻2个数比较 ,将较小的调到前头 第一轮结束后最大的数应该沉到最下面,然后进行第二轮比较 结束后第二大的数沉到倒数第二位 以此类推一共进行n-1轮比较 第j轮要进行j-1轮比较代码#includeusing namespace std;void sawp(int &
5、a,int &b);/ 交换函数的形参为引用void SetArray(int *a);/ 对数组进行初始化的函数void ShowArray(int *a);/对数组进行输出的函数void SortArray(int *a);/对数组进行排序的函数int main() int a10; SetArray(a);/把数组的首地址传递给该函数 cout排序前的数组为endl; ShowArray(a); SortArray(a); cout排序后的数组为endl; ShowArray(a);void swap(int &a,int &b) int temp; temp=a; a=b; b=tem
6、p;void SetArray(int *a) int i; cout请输入10个整数endl; for(i=0;iai;void ShowArray(int *a) int i; for(i=0;i10;i+) coutait;/为了使输出结果更加简洁我加入了水平制表符 if(i+1)%4=0)/每输出4个数组元素就换行 coutendl; void SortArray(int *a) int i,j; for(i=0;i9;i+) for(j=0;jaj+1) swap(aj,aj+1);5.1.5运行结果请输入10个整数123456672349087排序前的数组为1 2 34 5667
7、234 9 08 7 排序后的数组为0 1 2 78 9 34 5667 234 Press any key to continue5.1.6小结选择法和冒泡法的区别相同点:1.都要通过(n-1)组排出具有n个数的顺序 2.都是通过逐个相比区别:1.冒泡法顾名思义就是把小的泡冒到上面,大的泡沉到下面,最值在中间和其他的值交换;2.而选择法,是假定了一个最值,所以最值和其他的值的交换就发生在假定最值得地方实验5.2有15个数按由小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要
8、找的数用scanf函数输入。5.2.1代码#include/因为题目要求用到scanf语句所以加上这一行代码#includeusing namespace std;void SetArray(int *a);/对数组进行设置的函数void Find(int *a,int x);/寻找函数 形参为数组的地址和整型变量int main() int a15; SetArray(a);/对数组进行初始化 int NumberFind;/定义要寻找的数字 char Switch=Y;/ 定义一个开关变量 用来保存用户输入的提示符 先初始化为Y while(Switch=Y|Switch=y) cout请
9、输入要寻找的数endl; scanf(%d,&NumberFind); if(NumberFinda14) cout要寻找的数据不在数组范围内即 无此数endl; continue; Find(a,NumberFind);/调用寻找函数 cout请问需要输入新的数据继续寻找吗?请输入Y(y)或者N(n)Switch; return 0;void SetArray(int *a) int i; cout请按照由小到大的顺序输入15个整数a0; for(i=1;iai; if(aiai-1) cout输入的数据不满足题目要求 请重新输入endl;/如果用户输入的数据不满足从大到小 那么就提示用户需
10、要重新输入 else i+; void Find(int *a,int NumberFind) int top=0,bot=14,mid=7; bool flag=false; while(!flag&top=bot) if(NumberFind=amid) cout找到了数字amid它在数组中的位置是mid+1endl; flag=true; else if(NumberFindamid) bot=mid-1; else top=mid+1; mid=(top+bot)/2; if(flag=false) cout无此数endl; 5.2.2 运行结果请按照由小到大的顺序输入15个整数123
11、456789102输入的数据不满足题目要求 请重新输入11123输入的数据不满足题目要求 请重新输入131415请输入要寻找的数5找到了数字5它在数组中的位置是5请问需要输入新的数据继续寻找吗?请输入Y(y)或者N(n)实验5.35.3.1题目:编一程序,将2个字符串连接起来,结果取代第一个字符串。用字符数组,不用stract函数(即自己写一个具有strcat函数功能的函数)用c标准库的strcat函数用string方法定义字符串变量对这三种方法进行比较5.3.2 第一种方法的代码#includeusing namespace std;int main() char string1100,st
12、ring2100; cout请输入字符串1string1; cout请输入字符串2string2; int i=0,j=0; while(string1i!=0) i+; while(string2j!=0) string1i+=string2j+; string1i=0; cout结合后的字符串为string1endl;5.3.3 第一种方法的运算结果请输入字符串1C+请输入字符串2Programing结合后的字符串为C+ProgramingPress any key to continue5.3.4第二种方法的代码#includeusing namespace std;int main()
13、 char string1100,string2100; cout请输入字符串1string1; cout请输入字符串2string2; strcat(string1,string2); cout结合后的字符串为string1endl;5.3.5第二种方法的运行结果请输入字符串1C+请输入字符串2Programing结合后的字符串为C+ProgramingPress any key to continue5.3.6第三种方法的代码#include#includeusing namespace std;int main() string s1,s2; cout请输入字符串1s1; cout请输入
14、字符串2s2; s1+=s2; cout结合后的字符串为s1endl;5.3.7第三种方法的运行结果请输入字符串1C+请输入字符串2Programing结合后的字符串为C+ProgramingPress any key to continue实验5.4 5.4.1题目:输入十个学生的姓名,学号和成绩,将其中不及格者的姓名,学号和成绩输出。5.4.2 代码分析 第一部分应该解决数据输入和保存的问题 可以用2个整型数组分别保存 学号和成绩 用一个字符串数组保存 姓名第二部分遍历所有的成绩 找出不及格的然后根据序列i 输出对应的学号和成绩#include#includeusing namespace
15、 std;int main() int student_number10,score10; string name10; int i=0; cout请输入10个学生的姓名 学号和成绩endl; for(i=0;i10;i+) cout请输入第i+1个学生的姓名 学号 和成绩nameistudent_numberiscorei; cout不及格的名单endl; for(i=0;i10;i+) if(scorei60) coutnameistudent_numberiendl; 5.4.3运行结果请输入10个学生的姓名 学号和成绩请输入第1个学生的姓名 学号 和成绩张三 01 88请输入第2个学生
16、的姓名 学号 和成绩李四 02 87请输入第3个学生的姓名 学号 和成绩王老五 03 86请输入第4个学生的姓名 学号 和成绩张四 04 85请输入第5个学生的姓名 学号 和成绩张武 05 99请输入第6个学生的姓名 学号 和成绩张六 06 23请输入第7个学生的姓名 学号 和成绩张琪 07 34请输入第8个学生的姓名 学号 和成绩张巴 09 78请输入第9个学生的姓名 学号 和成绩张就 08 77请输入第10个学生的姓名 学号 和成绩张世 10 56不及格的名单张六6张琪7张世10Press any key to continue实验5.55.5.1题目:找出一个4行5列的二维数组的“鞍点”
17、,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。5.5.2 第一种情况 直接对数组进行初始化#includeusing namespace std;int main() int a45=1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20; int i=0,j=0,max,maxj; bool flag=true;/用来记录是否有鞍点先默认有鞍点 for(i=0;i4;i+) max=ai0,maxj=0;/先假设每行最大的元素为首元素 for(j=0;jmax) max=aij;/找出每行最大的数并保存在max中 maxj=j;/把行最大元
18、素的列坐标保存在maxj中 for(i=0;i4;i+) if(aimaxjmax) flag=false;/如果这一行的最大值max不是“鞍点”那么继续外层for循环进入下一行 if(flag)/ 因为一个二维数组最多有一个鞍点 所以如果这一点是鞍点那么就是唯一的鞍点可以直接跳出循环 cout鞍点是aimaxj=maxendl; break; if(flag=false)/如果没有鞍点输出 cout这个数组没有鞍点endl;5.5.3运行结果鞍点是a44=5Press any key to continue5.5.4 自己输入数组元素代码#includeusing namespace std
19、;void SetArray(int a45);void FindAndian(int a45);int main() int a45; SetArray(a); FindAndian(a); void SetArray(int a45) cout请输入一个4行5列的二维数组endl; int i,j; for(i=0;i4;i+) for(j=0;jaij;void FindAndian(int a45) int i=0,j=0,max,maxj; bool flag=true;/用来记录是否有鞍点先默认有鞍点 for(i=0;i4;i+) max=ai0,maxj=0;/先假设每行最大的元
20、素为首元素 for(j=0;jmax) max=aij;/找出每行最大的数并保存在max中 maxj=j;/把行最大元素的列坐标保存在maxj中 for(i=0;i4;i+) if(aimaxjmax) flag=false;/如果这一行的最大值max不是“鞍点”那么继续外层for循环进入下一行 if(flag)/ 因为一个二维数组最多有一个鞍点 所以如果这一点是鞍点那么就是唯一的鞍点可以直接跳出循环 cout鞍点是aimaxj=maxendl; break; if(flag=false)/如果没有鞍点输出 cout这个数组没有鞍点endl;5.5.5 运行结果请输入一个4行5列的二维数组1 2 3 4 52 4 6 8 103 6 9 12 154 8 12 16 20鞍点是a44=5Press any key to continue请输入一个4行5列的二维数组1 12 3 4 52 4 6 8 103 6 9 12 154 8 12 16 20这个数组没有鞍点Press any key to continue
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1