具体问题:
给你一串数字 1,1.5,9.5,3,5,8,5.5,7.5,3.2,4.3,7
请找出其中最大和最小的那位数。
具体要求
1, 用两个数组分别为整数数组和浮点数数组来存储他们
2, 用指针来操数组
3, 额外申明一个函数来执行该算法
4, 用struct结构来存储两个数
5, 算法思想 打擂台算法
算法思想:定义两个数组zheng和fu,分别存放整形和浮点型数据。对每个数组内部分别比较大小,找出最大值max和最小值min,用结构体封装Min和max,返回到调用函数的地方(主函数中),在主函数中实例化两个结构体的对象,以接受调用函数传来的结构体对象。再将两个结构体中的最大值与最大值比较、最小值与最小值比较,最后输出结果。
代码如下:
#include<iostream>
using namespace std;
struct result1{ //定义结构体,结构体类型为result1,结构体内
int min1; 封装了两个数据:min1和max2,分别为zheng数
int max1; 组内的最小值和最大值。
};
struct result2{
float min2;
float max2;
};
result1 compare1(int * array1); //函数调用前要先声明
result2 compare2(float * array2 );
void compare3( result1 a, result2 b);
int main()
{
int zheng[]={1,3,5,8,7}; //定义zheng和fu数组,分别
float fu[]={1.5,9.5,5.5,7.5,3.2,4.3}; 存放整形和浮点型
result1 c; //(类型名 对象)实例化结
result2 d; 构体的对象c和d。c用来接
c=compare1(zheng); 收调用compare1函数返回
d=compare2( fu); 的对象
compare3( c,d);
return 0;
}
result1 compare1(int * array1) //定义compare1函数,形参为
{ int * array1,实参为zheng
int max1,min1; 形参是定义个指向整形的指针array1
struct result1 a; 实参是数组名,即数组的首地址,即
if(*array1>*(array1+1)) array1指向zheng数组的首地址。
{ 实例化结构体的一个对象a,先对数组
max1=*array1; 前两个数比较,得出min1和max1,再
min1=*(array1+1); 对后面的数分别和min1 max1比较,
} 将得出的结构赋给a对象中的min1
else 和max1.将a返回到主函数中赋给c
{
max1=*(array1+1);
min1=*array1;
}
for(int i=2;i<5;i++)
{
if(*(array1+i)<min1){
min1=*(array1+i); //这里array1是个指针,加1指向下一个位置,
} 加*是地址解析,即指向位置的数据。
else if(*(array1+i)>max1)
{
max1=*(array1+i);
}
else {
0;
}
}
a.min1=min1;
a.max1=max1;
return a;
}
result2 compare2(float * array2 ) //函数的类型为result2,因为这里函
{ 数类型和返回值类型一致,返回值
struct result2 b; 是结构体的对象,所有函数类型为
float max2,min2; 结构体对象的类型-结构体类型。
if(*array2>*(array2+1)) max2,min2是局部变量,只作用在
{ 定义的函数内部。
max2=*array2;
min2=*(array2+1);
}
else
{
max2=*(array2+1);
min2=*array2;
}
for(int i=2;i<6;i++)
{
if(*(array2+i)<min2){
min2=*(array2+i);
}
else if(*(array2+i)>max2)
{
max2=*(array2+i);
}
else {
0;
}
}
b.min2=min2;
b.max2=max2;
return b;
}
void compare3( result1 a, result2 b) //函数是空类型,所有最后没
{ return语句。这里要进行强制
if((float)a.min1<b.min2) 类型转换,比较时将整形转为
{ 浮点型。将min1 min2中最小的
b.min2=(float)a.min1; 数存min2中,max1 max2最大的
} 存max2中。最后输出结果。
if((float)a.max1>b.max2)
{
b.max2=(float)a.max1;
}
cout<<"最小值是:"<<b.min2<<endl; //如果将输出语句放入Main中
cout<<"最大值是:"<<b.max2<<endl; 则compare3函数就没有返回值了
} 因为是空类型,结果也就无法输出
写代码中遇到的问题:
1.由于调用每个函数都有两个值要返回(最大值和最小值),一般来说函数只能用return语句返回一个值,若返回两个值,就要想到结构体或类,对值进行封装,这里用结构体实例化一个对象,将两个值封装到对象里,再将对象返回到调用函数处。就可以解决返回多值的问题了。
2.一般尽量少使用全局变量,因为全局变量不仅占用空间时间长,而且会和后面函数调用内的一些变量冲突,并且代码多的时候也不适合理解。所有尽量使用局部变量,清晰易懂好用。
3.调用函数compare1和compare2时分别返回了两个值,怎样可以传到compare3中呢?答:要在主函数中实例化两个结构体对象,对返回的值赋给实例化的结构体对象,再用参数传递的形式将两个值传递到compare3中。
相关知识总结:
1. 给数组开辟空间的两种方式
1) int a[]={1,2,3,4,5};
2) int * a;
a=new int[5]; //用new开辟的空间最后需要delete释放:delete [] a;
2.形参与实参
形参:定义函数时函数名后面括号中的变量名称为形参
实参:在主调函数中调用一个函数时,函数名后面括号中的参数称为实参。
实参和形参的类型应相同或兼容。
3. 函数传递的两种方式:值传递和地址传递
值传递:实参向形参的数据传递是值传递,单向传递,只由实参传给形参,而不能有形参传回来给实参。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参的值如果发生改变,并不会改变主调函数的实参的值。
地址传递:用数组名或指针作函数实参进行传递时是地址传递,它是通过传递地址,使得实参数组和形参实参指向同一段内存单元,因此,形参数组中各元素的值如果发生变化会使得实参数组的值同时发生变化。
4. 局部变量和全局变量
局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。形参也是局部变量。
全局变量:在函数外部定义的变量称为外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
5. 函数的类型和返回值的类型
如果函数的类型和return表达式中的类型不一致,则以函数的类型为准。函数的类型决定返回值的类型。
6. 递归调用
递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。