实验5数组.docx

上传人:b****5 文档编号:11981271 上传时间:2023-04-16 格式:DOCX 页数:20 大小:21.84KB
下载 相关 举报
实验5数组.docx_第1页
第1页 / 共20页
实验5数组.docx_第2页
第2页 / 共20页
实验5数组.docx_第3页
第3页 / 共20页
实验5数组.docx_第4页
第4页 / 共20页
实验5数组.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

实验5数组.docx

《实验5数组.docx》由会员分享,可在线阅读,更多相关《实验5数组.docx(20页珍藏版)》请在冰豆网上搜索。

实验5数组.docx

实验5数组

 

中南大学

实验报告

 

课程名称c++程序设计

实验项目名称实验4实验5实验6

指导老师向瑶

实验学生班级电子信息工程1503

实验学生姓名陶韬

学    号0903130309

实验时间2016.4.1至4.10

实验地点校本部科技楼4楼

实验成绩评定

 

实验5数组

实验5.1

5.1.1.题目:

用选择法对10个整数排序。

十个整数用cin输入,将选择排序与起泡法比较,分析它们的特点和效率

选择法的算法:

第一轮把第一个数和剩下的9个数比较通过比较交换使得第一轮交换后第一个数为这10个数中最小的,然后进行第二轮交换把第二个数和剩下的8个数比较,通过比较交换使得第二轮交换后第二个数为这9个数中最小的

5.1.2代码

#include

usingnamespacestd;

voidsawp(int&a,int&b);//交换函数的形参为引用

voidSetArray(int*a);//对数组进行初始化的函数

voidShowArray(int*a);//对数组进行输出的函数

voidSortArray(int*a);//对数组进行排序的函数

intmain()

{

inta[10];

SetArray(a);//把数组的首地址传递给该函数

cout<<"排序前的数组为"<

ShowArray(a);

SortArray(a);

cout<<"排序后的数组为"<

ShowArray(a);

}

voidswap(int&a,int&b)

{

inttemp;

temp=a;

a=b;

b=temp;

}

voidSetArray(int*a)

{

inti;

cout<<"请输入10个整数"<

for(i=0;i<10;i++)

cin>>a[i];

}

voidShowArray(int*a)

{

inti;

for(i=0;i<10;i++)

{

cout<

if((i+1)%4==0)//每输出4个数组元素就换行

cout<

}

}

voidSortArray(int*a)

{

inti,j;

for(i=0;i<9;i++)//外层循环控制轮数一共进行10-1=9轮

for(j=i+1;j<=9;j++)

{

if(a[i]>a[j])

swap(a[i],a[j]);

}

}

5.1.3输出结果

请输入10个整数

1

2

34

56

67

234

9

0

8

7

排序前的数组为

123456

6723490

87排序后的数组为

0127

893456

67234Pressanykeytocontinue

5.1.4用冒泡法进行排序

算法将相邻2个数比较,将较小的调到前头第一轮结束后最大的数应该沉到最下面,然后进行第二轮比较结束后第二大的数沉到倒数第二位以此类推

一共进行n-1轮比较第j轮要进行j-1轮比较

代码#include

usingnamespacestd;

voidsawp(int&a,int&b);//交换函数的形参为引用

voidSetArray(int*a);//对数组进行初始化的函数

voidShowArray(int*a);//对数组进行输出的函数

voidSortArray(int*a);//对数组进行排序的函数

intmain()

{

inta[10];

SetArray(a);//把数组的首地址传递给该函数

cout<<"排序前的数组为"<

ShowArray(a);

SortArray(a);

cout<<"排序后的数组为"<

ShowArray(a);

}

voidswap(int&a,int&b)

{

inttemp;

temp=a;

a=b;

b=temp;

}

voidSetArray(int*a)

{

inti;

cout<<"请输入10个整数"<

for(i=0;i<10;i++)

cin>>a[i];

}

voidShowArray(int*a)

{

inti;

for(i=0;i<10;i++)

{

cout<

if((i+1)%4==0)//每输出4个数组元素就换行

cout<

}

}

voidSortArray(int*a)

{

inti,j;

for(i=0;i<9;i++)

for(j=0;j<9-i;j++)

if(a[j]>a[j+1])

swap(a[j],a[j+1]);

}

5.1.5运行结果

请输入10个整数

1

2

34

56

67

234

9

0

8

7

排序前的数组为

123456

6723490

87排序后的数组为

0127

893456

67234Pressanykeytocontinue

5.1.6小结选择法和冒泡法的区别

相同点:

1.都要通过(n-1)组排出具有n个数的顺序

2.都是通过逐个相比

区别:

1.冒泡法顾名思义就是把小的泡冒到上面,大的泡沉到下面,最值在中间和其他的值交换;

2.而选择法,是假定了一个最值,所以最值和其他的值的交换就发生在假定最值得地方

实验5.2

有15个数按由小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数数是数组中第几个元素的值。

如果该数不在数组中,则输出“无此数”。

以15个数用赋初值的方法在程序中给出。

要找的数用scanf函数输入。

5.2.1代码

#include//因为题目要求用到scanf语句所以加上这一行代码

#include

usingnamespacestd;

voidSetArray(int*a);//对数组进行设置的函数

voidFind(int*a,intx);//寻找函数形参为数组的地址和整型变量

intmain()

{

inta[15];

SetArray(a);//对数组进行初始化

intNumberFind;//定义要寻找的数字

charSwitch='Y';//定义一个开关变量用来保存用户输入的提示符先初始化为'Y'

while(Switch=='Y'||Switch=='y')

{

cout<<"请输入要寻找的数"<

scanf("%d",&NumberFind);

if(NumberFinda[14])

{

cout<<"要寻找的数据不在数组范围内即无此数"<

continue;

}

Find(a,NumberFind);//调用寻找函数

cout<<"请问需要输入新的数据继续寻找吗?

请输入Y(y)或者N(n)"<

cin>>Switch;

}

return0;

}

voidSetArray(int*a)

{

inti;

cout<<"请按照由小到大的顺序输入15个整数"<

cin>>a[0];

for(i=1;i<15;)

{

cin>>a[i];

if(a[i]

cout<<"输入的数据不满足题目要求请重新输入"<

else

i++;

}

}

voidFind(int*a,intNumberFind)

{

inttop=0,bot=14,mid=7;

boolflag=false;

while(!

flag&&top<=bot)

{

if(NumberFind==a[mid])

{

cout<<"找到了数字"<

flag=true;

}

elseif(NumberFind

bot=mid-1;

else

top=mid+1;

mid=(top+bot)/2;

}

if(flag==false)

{

cout<<"无此数"<

}

}

5.2.2运行结果

请按照由小到大的顺序输入15个整数

1

2

3

4

5

6

7

8

9

10

2

输入的数据不满足题目要求请重新输入

11

12

3

输入的数据不满足题目要求请重新输入

13

14

15

请输入要寻找的数

5

找到了数字5它在数组中的位置是5

请问需要输入新的数据继续寻找吗?

请输入Y(y)或者N(n)

实验5.3

5.3.1题目:

编一程序,将2个字符串连接起来,结果取代第一个字符串。

用字符数组,不用stract函数(即自己写一个具有strcat函数功能的函数)

用c标准库的strcat函数

用string方法定义字符串变量

对这三种方法进行比较

5.3.2第一种方法的代码

#include

usingnamespacestd;

intmain()

{

charstring1[100],string2[100];

cout<<"请输入字符串1"<

cin>>string1;

cout<<"请输入字符串2"<

cin>>string2;

inti=0,j=0;

while(string1[i]!

='\0')

i++;

while(string2[j]!

='\0')

string1[i++]=string2[j++];

string1[i]='\0';

cout<<"结合后的字符串为"<

}

5.3.3第一种方法的运算结果

请输入字符串1

C++

请输入字符串2

Programing

结合后的字符串为C++Programing

Pressanykeytocontinue

5.3.4第二种方法的代码

#include

usingnamespacestd;

intmain()

{

charstring1[100],string2[100];

cout<<"请输入字符串1"<

cin>>string1;

cout<<"请输入字符串2"<

cin>>string2;

strcat(string1,string2);

cout<<"结合后的字符串为"<

}

5.3.5第二种方法的运行结果

请输入字符串1

C++

请输入字符串2

Programing

结合后的字符串为C++Programing

Pressanykeytocontinue

5.3.6第三种方法的代码

#include

#include

usingnamespacestd;

intmain()

{

strings1,s2;

cout<<"请输入字符串1"<

cin>>s1;

cout<<"请输入字符串2"<

cin>>s2;

s1+=s2;

cout<<"结合后的字符串为"<

}

5.3.7第三种方法的运行结果

请输入字符串1

C++

请输入字符串2

Programing

结合后的字符串为C++Programing

Pressanykeytocontinue

实验5.4

5.4.1题目:

输入十个学生的姓名,学号和成绩,将其中不及格者的姓名,学号和成绩输出。

5.4.2代码

分析第一部分应该解决数据输入和保存的问题可以用2个整型数组分别保存学号和成绩

用一个字符串数组保存姓名

第二部分遍历所有的成绩找出不及格的然后根据序列i输出对应的学号和成绩

#include

#include

usingnamespacestd;

intmain()

{

intstudent_number[10],score[10];

stringname[10];

inti=0;

cout<<"请输入10个学生的姓名学号和成绩"<

for(i=0;i<10;i++)

{

cout<<"请输入第"<

cin>>name[i]>>student_number[i]>>score[i];

}

cout<<"不及格的名单"<

for(i=0;i<10;i++)

{

if(score[i]<60)

cout<

}

}

5.4.3运行结果

请输入10个学生的姓名学号和成绩

请输入第1个学生的姓名学号和成绩

张三0188

请输入第2个学生的姓名学号和成绩

李四0287

请输入第3个学生的姓名学号和成绩

王老五0386

请输入第4个学生的姓名学号和成绩

张四0485

请输入第5个学生的姓名学号和成绩

张武0599

请输入第6个学生的姓名学号和成绩

张六0623

请输入第7个学生的姓名学号和成绩

张琪0734

请输入第8个学生的姓名学号和成绩

张巴0978

请输入第9个学生的姓名学号和成绩

张就0877

请输入第10个学生的姓名学号和成绩

张世1056

不及格的名单

张六6

张琪7

张世10

Pressanykeytocontinue

实验5.5

5.5.1题目:

找出一个4行5列的二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。

也可能没有鞍点。

5.5.2第一种情况直接对数组进行初始化

#include

usingnamespacestd;

intmain()

{

inta[4][5]={{1,2,3,4,5},{2,4,6,8,10},{3,6,9,12,15},{4,8,12,16,20}};

inti=0,j=0,max,maxj;

boolflag=true;//用来记录是否有鞍点先默认有鞍点

for(i=0;i<4;i++)

{

max=a[i][0],maxj=0;//先假设每行最大的元素为首元素

for(j=0;j<5;j++)

if(a[i][j]>max)

{

max=a[i][j];//找出每行最大的数并保存在max中

maxj=j;//把行最大元素的列坐标保存在maxj中

}

for(i=0;i<4;i++)

{

if(a[i][maxj]

flag=false;//如果这一行的最大值max不是“鞍点”那么继续外层for循环进入下一行

}

if(flag)//因为一个二维数组最多有一个鞍点所以如果这一点是鞍点那么就是唯一的鞍点可以直接跳出循环

{

cout<<"鞍点是"<<"a["<

break;

}

}

if(flag==false)//如果没有鞍点输出

cout<<"这个数组没有鞍点"<

}

5.5.3运行结果

鞍点是a[4][4]=5

Pressanykeytocontinue

5.5.4自己输入数组元素

代码

#include

usingnamespacestd;

voidSetArray(inta[4][5]);

voidFindAndian(inta[4][5]);

intmain()

{

inta[4][5];

SetArray(a);

FindAndian(a);

}

voidSetArray(inta[4][5])

{

cout<<"请输入一个4行5列的二维数组"<

inti,j;

for(i=0;i<4;i++)

for(j=0;j<5;j++)

cin>>a[i][j];

}

voidFindAndian(inta[4][5])

{

inti=0,j=0,max,maxj;

boolflag=true;//用来记录是否有鞍点先默认有鞍点

for(i=0;i<4;i++)

{

max=a[i][0],maxj=0;//先假设每行最大的元素为首元素

for(j=0;j<5;j++)

if(a[i][j]>max)

{

max=a[i][j];//找出每行最大的数并保存在max中

maxj=j;//把行最大元素的列坐标保存在maxj中

}

for(i=0;i<4;i++)

{

if(a[i][maxj]

flag=false;//如果这一行的最大值max不是“鞍点”那么继续外层for循环进入下一行

}

if(flag)//因为一个二维数组最多有一个鞍点所以如果这一点是鞍点那么就是唯一的鞍点可以直接跳出循环

{

cout<<"鞍点是"<<"a["<

break;

}

}

if(flag==false)//如果没有鞍点输出

cout<<"这个数组没有鞍点"<

}

5.5.5运行结果

请输入一个4行5列的二维数组

12345

246810

3691215

48121620

鞍点是a[4][4]=5

Pressanykeytocontinue

请输入一个4行5列的二维数组

112345

246810

3691215

48121620

这个数组没有鞍点

Pressanykeytocontinue

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1