创建函数:
定义、提供原型和调用。
1、为什么需要函数原型
原型描述了函数到编译器的接口,也就是,它将函数返回值的类型以及参数的类型和数量告诉了编译器。
c++的编程风格是将main()放在最前面,因为它通常提供了程序的整体结构。
在原型的参数列表里,可以包括变量名,也可以不包括,原型中的变量名相当于占位符,不必与函数定义中的变量名相同。
例如:
double cheer(double x); 可以写成: void cheers(int);//只提供参数类型,列表即可
原型的功能:
仅当有意义时,原型化才会导致类型转换。
(原型不会将整数转换为结构或者指针)
在编译阶段进行的原型化被称为静态类型检查。
2、函数参数和按值传递
2.1、多个参数
在调用函数时,只需要使用逗号将这些参数分开即可。
3、函数和数组
int sum_arr{int arr[],int n}; //函数和数组的结合使用
3.1、函数使用指针来处理数组
1、c++将数组名解释为其第一个元素的地址。
int sum=sum_arr(cookies,ArSize);
在,c++中,当用于函数头或者函数原型中, int *arr[]和int arr[ ]的含义才是相同的。他们都意味着arr是一个int 类型的指针。
谨记:
将指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。对于遍历数组而言,使用指针加法和数组下标时等效的。
2、将数组作为参数意味着什么
将数组作为参数可以节省复制整个数组所需的时间和内存,如果数组很大,则使用拷贝的系统开销将非常大;程序不仅需要更多的计算机内存,还需要花费时间来复制大块的数据,另一方面,使用原始数据增加了破坏数据的风险。
3、更多数组函数示例
3.1、填充数组
int fill_array(double arr[], int limit) { using namespace std; double temp; int i; for (i = 0; i < limit; i++) { cout << "Enter value #" << (i + 1) << ":"; cin >> temp; if (!cin) { cin.clear(); while (cin.get() != '\n') { cin.clear(); while (cin.get() != '\n') continue; cout << "Bad input;input process terminated\n"; break; } } else if (temp < 0) break; arr[i] = temp; } return 0; }
3.2、显示数组及用const保护数组
为防止函数无意中修改数组的内容,可以在声明形参时使用关键字const。
举例:
void show_array(const double ar[ ],int n);
3.3、修改数组
在修改数组的函数中, 由于这个函数将修改数组的值,因此在声明ar时,不能够使用const。
4、程序说明
通过数据类型和设计适当的函数来处理数据,然后将这些函数组合成一个程序。称为自下而上的程序设计。
传统的过程性编程倾向于从上如下的程序设计,首先指定模块化设计方案,然后在研究细节。
两种方法都很有用,最终的产品都是模块化程序。
5、使用数组区间的函数
for(pt=begin;pt!=end;pt++) { total=total+*pt; }
pt设置为指向要处理的第一个元素的指针,然后加入total中,然后通过递增操作来更新pt,使之指向下一个元素,当pt等于end时,将指向区间中最后一个元素后面的一个位置,循环将结束。
6、指针和const
6.1、将指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。
int age=39; const int *pt=&age;//该声明指出,pt指向一个const int,不能使用pt来修改这个值。换句话,*pt的值为const,不能被修改。
const int **pp2; int *p1; const int n=13; pp2=&p1; *pp2=&n; *p1=10;
仅当只有一层关系时,才可以将非const地址或指针赋给const指针。
注意:
如果数据类型本身并不是指针,则可以将const数据或者非cnost数据的地址或指针赋给const指针。
6.2、将指针本身声明为常量,这样可以防止改变指针指向的位置。
7、函数和二维数组
数组名将被视为地址,相应的形参是一个指针。
例如:
int sum(int (*ar2)[4],int size);
int sum(int ar2[ ][4],int size);
两种都是正确的表达形式,但是相比较下面的代码的可读性更强。
8、函数和结构
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; struct travel_time { int hours; int mins; }; const int mins_per_hr = 60; travel_time sum(travel_time t1, travel_time t2); void show_time(travel_time t); int main() { travel_time day1 = { 5,45 }; travel_time day2 = { 4,55 }; travel_time trip = sum( day1,day2 ); cout << "Two-day total: "; show_time(trip); travel_time day3 = { 4,32 }; cout << "There-day total: "; show_time(sum(trip, day3)); return 0; } travel_time sum(travel_time t1, travel_time t2) { travel_time total; total.mins = (t1.mins + t2.mins) % mins_per_hr; total.hours = t1.hours + t2.hours + (t1.mins + t2.mins) / mins_per_hr; return total; } void show_time(travel_time t) { using namespace std; cout << t.hours << "hours." << t.mins << "minutes\n"; }
9、传递结构的地址
10、函数和string对象
除函数getline()外,这个程序像对待内置类型(int)一样对待string对象。如果需要string数组,秩序使用通常的数组声明格式即可:
string list[size];
这样,数组list的每个元素都是一个string对象,也可以像下面这样使用它:
getline(cin,list[i]);
11、函数和array对象
使用array对象来存存储一年四个季度的开支:
std::array<double,4>expenses;
声明这两个函数:
void show(std::array<double,4>da);
void fill(std::array<double,4>*pa);
例如:
使用一个const array 对象,该对象包含四个string对象,用于表示几个季度:
const std::arraystd::string,seaspmssnames=
{“spring”,“summer”,“fafl”,“winter”};
注意,模板array并非只能存储基本数据类型,它还可存储类对象。
12、函数指针
1.获取函数的地址
2.声明一个函数指针
3.使用函数指针来调用函数
第一题:
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; double aerage(double, double); int main() { using namespace std; double a, b; cout << "输入两个数:"; cin >> a >> b; while (a != 0&&b != 0) { cout << "调和平均数:"; cout << aerage(a, b) << endl; cout << "输入两个数:"; cin >> a >> b; } return 0; } double aerage(double a,double b) { double average; average = 2.0*a*b / (a + b); return average; }
第二题:
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; const int max = 10; double garde[max]; int number = 0; void input();//输入 void display();//输出 void calculation();//平均数 int main() { input(); display(); calculation(); return 0; } void input() { cout << "输入高尔夫成绩:" << endl; while (cin >> garde[number++]) { if (garde[number-1] == -1) { break; } } number--; } void display() { cout << "输出高尔夫成绩:"<<endl; for (int i = 0; i < number; i++) { cout << garde[i] << " "; } cout << endl; } void calculation() { double sum = 0; for (int i = 0; i < number; i++) { sum = sum + garde[i]; } cout << "平均成绩:"; cout << sum/number << endl; }
第三题:
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; void shuruxianshi(struct box mbox); void shezhi(struct box *pbox); struct box { char maker[40]; float height; float width; float length; float volume; }; int main() { struct box mbox = { "张",1.0,2.0,3.0,0.0 }; shuruxianshi(mbox); shezhi(&mbox); shuruxianshi(mbox); return 0; } void shuruxianshi(struct box mbox) { cout << "Box maker: " << mbox.maker << endl; cout << "Box height: " << mbox.height << endl; cout << "Box width: " << mbox.width << endl; cout << "Box length: " << mbox.length << endl; cout << "Box volume: " << mbox.volume << endl << endl;; } void shezhi(struct box *pbox) { pbox->volume = pbox->height*pbox->width*pbox->length; }
第五题:
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; int factproal(int n); int main() { int n; cout << "输入整数参数:" << endl; while (cin >> n) { if (n == -1) { break; } else { cout << "输出阶乘:\n" << factproal(n) << endl << endl; cout << "输入整数参数:" << endl; } } return 0; } int factproal(int n) { if (n == 0||n==1) return 1; else return n * factproal(n - 1); return 0; }
第六题:
#include <iostream> #include <string> include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; const int max = 10; int fill_array(double data[], int max); void show_array(double data[], int longs); void reverse_array(double data[], int longs); int main() { int longs; double data[max]; longs = fill_array(data, max); show_array(data, longs); reverse_array(data, longs); return 0; } int fill_array(double data[], int max) { int longs = 0; double temp; int i; cout << "输入数值:" << endl; for ( i = 0; i < max; i++) { cout << "第" << i << "个数:"; cin >> temp; if (!cin) { cin.clear(); while (cin.get() != '\n') { continue; } break; } else if (temp < 0) { cout << "输入数据已经结束,请进入其他函数!"; break; } data[i] = temp; } return i; } void show_array(double data[], int longs) { cout << endl; cout << "输出数组的内容:" << endl; for (int i = 0; i < longs; i++) { cout << data[i] << " "; } } void reverse_array(double data[], int longs) { cout << endl; cout << "显反转后的数组的内容:" << endl; for (int i = longs - 1; i >=0; i--) { cout << data[i] << " "; } }
第八题:
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; const int Seasons = 4; const char *Snames[Seasons] = { "Spring", "Summer", "Fall", "Winter" }; struct cost { double expenses[Seasons]; }; void fill(double *pa) { for (int i = 0; i < Seasons; i++) { cout << "Enter " << Snames[i] << " expenses: "; cin >> pa[i]; } } void show(double *pa) { double total = 0.0; cout << "\nEXPENSES\n"; for (int i = 0; i < Seasons; i++) { cout << Snames[i] << ": $" << pa[i] << endl; total += pa[i]; } cout << "Total Expenses: $" << total << endl; } void fill(struct cost *pCost) { for (int i = 0; i < Seasons; i++) { cout << "Enter " << Snames[i] << " expenses: "; cin >> pCost->expenses[i]; } } void show(struct cost *pCost) { double total = 0.0; cout << "\nEXPENSE\n"; for (int i = 0; i < Seasons; i++) { cout << Snames[i] << ": $" << pCost->expenses[i] << endl; total += pCost->expenses[i]; } cout << "Total Expense: $" << total << endl; } int main() { // situation a cout << "Situation a: " << endl; double pa[Seasons] = { 0 };//初始化double数组内都为0 fill(pa);//输入季度的存储开支 show(pa);//输出每季度以及总的开支 // situation b cout << endl << endl; cout << "Situation b: " << endl; struct cost *pCost = new struct cost;//动态分配数组 fill(pCost); show(pCost); delete pCost; return 0; }
第十题:
#include <iostream> #include <string> #include <ctime> #include <istream> using namespace std; double add(double x, double y) { return x + y; } double mul(double x, double y) { return x * y; } double calculate(double x, double y, double(*fun)(double, double)) { return fun(x, y); } void number() { double x = 0.0; double y = 0.0; cout << "Enter two double number: "; while (cin >> x >> y) { cout << "Call add, the result of " << x << " and " << y << " is " << calculate(x, y, add) << endl; cout << "Call mul, the result of " << x << " and " << y << " is "<< calculate(x, y, mul) << endl; cout << "Enter next two doublee number: "; } } int main() { number(); while (getchar()); return 0; }