C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的
/* 第七章函数的基本知识 */
/*
01)c++对于返回值有一定的限制:可以是常量、变量、指针、结构对象或表达式,但不可以是数组
02)c++返回数组的方法:将数组作为结构会对象组成部分来返回
03)函数遇到return则结束该函数
04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起
05)
*/
//本代码注意double类型的写法以及double和int类型数据的转换
1 #include <iostream> 2 3 void cheers(int n); //声明函数原型 4 double cube(double x); //声明函数原型 5 6 int main() 7 { 8 using namespace std; 9 cheers(5); //函数调用 10 cout << "Give me a number(double): "; 11 double side = 0.0; //定义一个double类型数据,并初始化为0.0,注意double类型的写法 12 cin >> side; 13 double volume = cube(side); //函数调用 side为实参(参量) 14 cout << "A " << side << "-foot cube has a volume of " << volume << " cubic feet" << endl; 15 cheers(cube(2)); //cube()函数需要一个double类型的数据,而2是int型,所以c++将2转换为2.0后传递给cube() 16 //cube()返回的值为8.0,而8.0是一个double类型的数据,所以c++将8.0转换为int类型的8之后 17 //再将8传递给cheers()函数 18 19 system("pause"); 20 return 0; 21 } 22 void cheers(int n) //n为形参(参数) 23 { 24 using namespace std; 25 for (int i = 0; i < n; i++) 26 cout <<"0"<<i<<")"<< "Cheers" << endl; 27 } 28 double cube(double x) 29 { 30 return x * x*x; 31 }
执行结果:
求阶乘的子函数
//这里只写一个实现阶乘的子函数吧
//假如从numbers个数中选取picks个数,如果参与者选择的这个picks个数与彩票管理者选取的picks个数一样
//则中将,求中奖的概率
//例如 numbers=51 picks=6 概率为R 则1/R=(51*50*49*48*47*46)/(6*5*4*3*2*1)
//对于求概率要使用long double类型
1 long double probability(unsigned numbers, unsigned picks) //unsigned等价于unsigned int 无符号整形 2 { 3 using namespace std; 4 long double result = 1.0; 5 long double n; 6 unsigned p; 7 for (n = numbers, p = picks; p > 0; n--, p--) 8 { 9 result = result * n / p; //这个结果只是获奖概率的倒数 10 cout << "You have one chanse in " << result << endl; 11 } 12 return result; 13 }
//循环并不是将所有的分子项相乘,而是首相将1.0与第一个分子项相乘,然后除以第一个分母项.
//然后下一轮循环乘以第二个分子项,并除以第二个分母项。
//这种交替乘除运算的策略可以防止中间结果超出最大的浮点数
/* 函数参数类型为数组 */
1 #include <iostream> 2 3 const int ArSize = 8; 4 int sum_arr(int arr[], int n); //n为数组内元素的个数 5 6 int main() 7 { 8 using namespace std; 9 int cookies[ArSize] = { 1,2,4,8,16,32,64,128 }; //定义一个数组并初始化 10 11 int sum = sum_arr(cookies, ArSize); //注意在调用含有数组参数的函数时,只写上数组名字就好了 12 cout << "Total cookies eaten: " << sum << endl; 13 14 system("pause"); 15 return 0; 16 } 17 int sum_arr(int arr[], int n) 18 { 19 int total = 0; 20 21 for (int i = 0; i < n; i++) 22 total = total + arr[i]; 23 return total; 24 }
/*
01)c++将数组名视为指针,并且解释为第一个元素的地址
02)对数组名使用sizeof将得到整个数组的长度(以字节为单位)
03)在主函数中调用int sum_arr(int arr[], int n)时候
使用的是sum_arr(cookies, ArSize),cookies是数组第一个元素的地址,因此函数传递的是地址
由于数组的元素的类型是int型指针,因此cookies的类型必须是int指针,即用int*表示
因此另一种形式的函数头是:int sum_arr(int* arr, int n)
04)无论arr是指针还是数组名,表达式arr[3]都指的是数组的第4个元素
05)就目前而言,需要记住下面两个恒等式:
arr[i] == *(arr + i) //值恒等
&arr[i] == arr + i //地址恒等
06)函数调用sum_arr(cookies, ArSize)将cookies数组第一个元素的地址和数组中中的元素的数目传递给了sum_arr()
sum_arr()函数将cookies地址赋给指针变量arr,将ArSize赋给int变量n。这意味着以上程序并没有将数组内容
传递给函数,而是将数组的位置、包含元素的种类以及元素数目提交给了函数,有了这写以后,函数就可以使用原来的数组
07)传递常规变量时,函数使用该变量的拷贝
传递数组时,函数使用原来的数组,传递的是地址
*/
求数组内所有元素和、部分元素和的方法
01)cookies和arr都指向同一个地址
02)sizeof(cookies)为32,sizeof(arr)为4,这是由于sizeof(arr)只是指针变量的长度,
而sizeof(cookies)是整个数组的长度
1 #include <iostream> 2 const int ArSize = 8; 3 int sum_arr(int arr[], int n); //n为数组内元素的个数 4 int main() 5 { 6 using namespace std; 7 int cookies[ArSize] = { 1,2,4,8,16,32,64,128 }; //定义一个数组并初始化 8 9 cout << "Address of cookies is: " << cookies<<endl; 10 cout << "Size of cookies is: " << sizeof(cookies) << endl;//Size of cookies is: 32 11 12 int sum = sum_arr(cookies, ArSize); 13 cout << "Total cookies eaten: " << sum << endl; 14 15 sum = sum_arr(cookies, 3); //从数组内第一个元素开始,只计算数组前三个元素的累加和 16 cout << "数组内前三个元素和: " << sum << endl; 17 18 sum = sum_arr(cookies+4, 4); //从数组内第五个元素开始,只计算数组后四个元素的累加和 19 //cookies+4是第五个元素的地址 20 //也可以这样调用 sum = sum_arr(&cookies[4], 4); 21 cout << "数组内后四个元素和: " << sum << endl; 22 23 system("pause"); 24 return 0; 25 } 26 int sum_arr(int arr[], int n) 27 { 28 using namespace std; 29 30 int total = 0; 31 cout << "Address of arr is: " << arr << endl; 32 cout << "Size of arr is: " << sizeof(arr) << endl;//Size of arr is: 4 33 34 for (int i = 0; i < n; i++) 35 total = total + arr[i]; 36 37 return total; 38 }
执行结果:
实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的
/*
01)函数接收两个参数,一个是数组名,一个是指定了要读取的最大元素数
02)该函数返回的是实际读取的元素数
03)提前结束读取输入到数组中的方法:使用特殊值来结束输入或者是输入一个负数(对应实际问题房价)
*/
1 #include <iostream> 2 int fill_array(double arr[], int limit); 3 int main() 4 { 5 using namespace std; 6 int i,m,n; 7 double prices[5]; 8 i = fill_array(prices,5); 9 cout << "输入的数目为:" << i << endl; 10 for(m=0; m<i; m++) 11 cout << "prices["<< m <<"] is: " << prices[m] << endl; 12 system("pause"); 13 return 0; 14 } 15 16 int fill_array(double arr[], int limit) 17 { 18 using namespace std; 19 double temp; 20 int i; 21 22 23 for ( i= 0; i < limit; i++) //不能在这里定义int i=0,否则在最后return i 是会报错的 24 { 25 cout << "Enter value #" << i + 1 << endl; 26 cin >> temp; 27 if (!cin) //bad input 输入字母也会结束for循环 28 { 29 cin.clear(); //复位输入流中错误的标志位,使cin可以继续接收字符 30 while (cin.get() != '\n') 31 continue; 32 cout << "Bad input; Input progress terminated" << endl; 33 break; 34 } 35 else if (temp < 0) 36 break; //结束for循环 37 arr[i] = temp; 38 } 39 return i; //由于for循环完成后的最后一项工作是将i加1, 40 //所以循环结束后,i将比最后一个数组索引大1,即等于填充的元素数目 41 }
执行结果:
const保护数组内的数据
void show_array(const double arr[], int n); //声明一个函数,一个参数为静态数组,意思是可以访问数组内的数据,但是不可以修改数组内的数据