回到课程主页,链接:C++程序设计课程主页-2012级
本次上机对应的教学内容:第4章 函数
【项目1-调用函数输出星号图】
这一组的练习意在通过调用函数输出星号图,体会与理解函数的工作过程,并为其后编制自定义函数实现特定功能,打下基础。
任务1:补充完下面的程序,使程序输出上面的两个星号图,要求在main()函数中调用自定义函数printstars()。
给出的程序如下:
//while循环中调用函数printstars的程序 #include <iostream> using namespace std; void printstars(int m) //定义能输出一行m个星号的函数 { for (int j=1; j<=m; ++j) cout<<'*'; } int main( ) { int n=6; //n代表要输出的行数 //请在下面构造循环,调用printstars()输出每一行的星号 return 0; }要求:左图必需实现,右图尝试实现。
回答:实现右图遇到了什么困难?如何解决,有何办法?用你想到的办法尝试一下。
进一步提示:如果要输出的不是星号(*)图,而是井号(#)图,该如何改上面的程序?试着实施一下。
任务2:请先阅读已经定义好的函数printchs(),然后利用这个函数输出星号图:
给出的程序如下:
//调用函数printchs输出星号图 #include <iostream> using namespace std; void printchs(char c, int m) //定义能输出一行m个字符c的函数 { for (int j=1; j<=m; ++j) cout<< c; cout<<endl; } int main( ) { int n=6; //n代表要输出的行数 //请在下面构造循环,调用printchs()输出符号 return 0; }要求:分别编程序,输出左右两个星号图;
进一步要求:有了printchs()函数,这儿的处理比任务1要方便了很多。如果要输出的不是星号(*)图,而是井号(#)图,该如何改上面的程序?试着实施一下。
任务3:在由多个函数构成的程序中,程序员常用的做法是,main()函数先定义,其他自定义函数后定义,这时必须在main()函数前声明自定义的函数(请详读教材4.4.3小节)。按这个要求,重写上面任务2中的程序。
通过项目1中的3个任务,请思考:你认为函数的参数有什么作用?在设计中如何考虑参数,会给调用带来方便?将你的体会写到上机报告的博文中。
【项目2-求解分段函数的值】
/* * 程序的版权和版本声明部分 * Copyright (c)2012, 烟台大学计算机学院学生 * All rightsreserved. * 文件名称: fun.cpp * 作 者: * 完成日期: 年 月 日 * 版本号: v1.0 * 对任务及求解方法的描述部分 * 输入描述:函数自变量x * 问题描述:求函数的值:当x<0.3时,f(x)=0; 当0.3≤x≤0.8时,f(x)=(x-0.3)/(0.8-0.3);当x>0.8时,f(x)=1; * 程序输出:f(x)的值 */ #include<iostream> using namespacestd; const double x1=0.3, x2=0.8; //式子中出现的两个常数定义为全局常变量,方便,易维护 double f(double); //先声明 int main( ) { double x; cout<<"请输入x的值:"; cin>>x; cout<<"解得:f("<<x<<")="<<f(x)<<"\n"; return 0; } //下面是自定义函数的定义部分 double f(double x) { }提示:函数求解的结果要在main()中使用,要用return <表达式>得到返回值。
通过这个项目,体会函数利用返回值的方法。
【项目3-四数的最大公约数】
输入四个数,并求出其最大公约数
#include <iostream> using namespace std; //自定义函数的原型(即函数声明) int main() { int a,b,c,d; cin>>a>>b>>c>>d; cout<<"最大公约数是: "<<gcds(a,b,c,d)); return 0; } int gac(int x,int y) //用于求两数的最大公约数 { } int gcds(int x,int y,int z,int w) //调用gcd()求四数的最大公约数 { }
【项目4-回文、素数】
编制一个返回值为bool型的函数isPrimer(),用于判断参数是否为素数,isPalindrome()用于判断参数是否是回文数,调用函数回答以下问题(可以分别编制几个程序完成,也可以在一个main()函数中完成,输出时,用明显的提示语,说明正在完成哪个任务。)
int main() { } bool isPrimer(int n) { } bool isPalindrome(int n) { }(1)输出10000以内的所有素数。
(2)输出10000以内的所有回文数。
(3)输出10000以内的所有回文素数。
(4)拓展(选做):若一个素数的反序数仍为素数,则称它为可逆素数。求10000以内的所有可逆素数,在上面的代码基础上拓展。
【项目5-特殊三位数】
请输出满足条件n=a!+b!+c!的所有三位数n,其中,a、b、c分别是n的百、十、个位数。要求用自定义函数实现求阶乘。
参考程序段:
int main() { } long fac(int n) { }【项目5拓展(选做)-求组合数】
求组合数公式为:
编一程序,输入m和n的值,求组合数。要求分别定义求阶乘和求组合的函数,求组合数的函数调用求阶乘的函数来实现求解,在main()函数中,负责输入输出及调用求组合数的函数。
【项目6-泰勒展开】
先听故事,再编程序。故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这幅摸样了?他说:是啊,太乐了!故事讲完了。不懂吗?好好学高数。否则,挂了不冤。
编程序求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3)
一点说明:数学库(#include<Cmath>)中已经提供了sin和cos函数,一般解题中我们直接调用即可,而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
提示和要求:(1)要求自定义函数要写在main函数之后;(2)自定义函数中求解的效率问题必须考虑(用好迭代方法);(3)关于精度:当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义实现);(4)为验证求解是否正确,可以调用数学库中相应的函数,输出结果以对比。
#include <iostream> using namespace std; const double pi=3.1415926; int main( ) { cout<<"sin(π/2)的值为"<<mysin(pi/2)<<endl; cout<<"sin(56°)的值为"<<_____________<<endl; cout<<"cos(87°)的值为"<<mycos((87.0/180)*pi)<<endl; cout<<"cos(π/3)的值为"<<______________<<endl; return 0; } //下面定义mysin函数 //下面定义mycos函数 //下面定义myabs函数迷底揭晓:将任意函数展开为多项式,是计算机求解数值问题的一个重要手段。高等数学中的“泰勒定理”为我们解决这一大类问题提供了理论依据与方法指导。Sin听相声“太乐”了,变成了多项式,太太cos都不认识了。高等数学、线性代数等课程为我们提供解决各种问题的基础知识,是大学中最为实用的学科,学好,必须的。
【项目6扩展(选做)-编制三角函数表】
要求在main()函数中调用show_sin_table(min_angle, max_angle),显示角度值为min_angle到max_angle之间的所有角度(间隔为1度)的正弦值。要求不能用数学库函数,将项目6中的mysin函数拷贝到这个程序中,用于计算sin值。例如show_sin_table(0, 90)可以显示出所有0到90度的正弦值。为取得更好的效果,可以考虑像英尺到米的转换一样,以速查表格的形式给出结果。#include <iostream> using namespace std; //下面加入常变量和自定义函数的声明 int main( ) { show_sin_table(0, 90); show_sin_table(135, 180); return 0; } //下面定义show_sin_table()函数 //下面定义mysin函数