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 }
View Code

执行结果:

 

实现了先从键盘输入到一个数组中,再用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 }
View Code

执行结果:

const保护数组内的数据

void show_array(const double arr[], int n);  //声明一个函数,一个参数为静态数组,意思是可以访问数组内的数据,但是不可以修改数组内的数据

 

posted @ 2019-03-10 17:08  兵临城下的匹夫  阅读(689)  评论(0编辑  收藏  举报
TOP