西安交大C程序设计作业
西安交大C程序设计作业 Revised by BLUE on the afternoon of December 12,2020.
西安交通大学实验报告
课程__计算机程序设计__实验名称_____函数______第 1 页共 18 页
系别____ _______ 实验日期 2014 年 3月 28日
专业班级__ __组别_____________ 实验报告日期 2014 年 3 月 29日
姓名___ _______学号_ _ 报告退发 ( 订正、重做 )
同组人_________________________________ 教师审批签字
一、实验目的
掌握函数的概念,使用函数的优越性,定义函数的方法以及调用函数的方法。
二、实验内容
(一)第一题:编写字符串反转函数mystrrev(),该函数的功能是将指定字符串中的字符顺序颠倒排列。然后再编写主函数验证之。
1.源程序代码:
#include
#include
using namespace std;
void mystrrev(char string[]);验结果:由于函数中有“for(int i=0;i (1)奇数: (2)偶数: (3)含空格字符串: 3.问题分析: (1)起初没有用“.get”,不够全面; (2)如果一直执行到i=m的话,就等于反转两次又回到了原来的字符串顺序,因而要考虑只执行一半,而由于字符串长度有奇偶的问题,所以容易错误; (3)第一次编写时,没有写string[m]='\0';这使得输出结果混乱。 (二)第二题:编写一组求数组中最大元素和最小元素的函数。其函数原型为:int imax(int array[],int count); int imin(int array[],int count); 1.源程序代码: #include using namespace std; int imax(int array[],int count);验结果: 3.问题分析: (1)起初误将: cout<<"最大值为:"< cout<<"最小值为:"< 写成imin、imax,不能执行。 (2)误将: if(array[i]>m) if(array[i] 写为: if(array[i]> array[i-1]) if(array[i]< array[i-1]) 导致输出不正确。 (3)虽然理论上应该加上判断输入的数字是否为整数的程序,但考虑到这个不是重点,只是徒劳的增加麻烦,因而就没有加。 (三)第三题:编写函数isprime(int a)用来判断变量a是否为素数,若是素数,函数返回1,否则返回0。调用该函数找出任意给定的n个整数中的素数。 1.源程序代码: #include using namespace std; int isprime(int a); int main() { cout<<"请输入要进行判断的数字的个数:"; int n; cin>>n; cout<<"请输入要判断的各个数:\n"; int a[50]; int i; for(i=0;i { cin>>a[i]; } cout<<"其中的素数为:\n"; for(i=0;i { if(isprime(a[i])!=0)验结果: 3.问题分析: (1)对于“if(isprime(a[i])!=0)”,起初写为“if(isprime(a[i])=1)”,没有认识到只有零和非零的区别,导致程序始终判断得到错误结果; (2)对“int m=a-1,i”:原来写作“int m=a,i;”,这样的时候会将1也作为素数输出。为了避免如此,故将m的初始值设为a-1,这样的话,输入1时m=0,正好能够使1不经过循环而判断为合数,同时,输入2及以上的数字时,由于初始值m>0,也不会被影响。 (四)第四题:(必做题)(注意必须用自定义函数,并和系统库函数asin()进行比较测试检验) 1.源程序代码: 验结果: (1)特别检测了输入的自变量不符合范围要求的情况的鉴别: (2)正常运行: 3.问题分析: (1)题目中用到了三个自定义函数,分别的作用是:乘方、阶乘和求反正弦函数的自定义函数主体,前两个函数的出现主要是为了简化运算过程。由于不知道标准的乘方、阶乘库函数,所以就自定义了。 (2)不足:精确性不太好,如输入时差距较大,但一直找不到问题所在。 (3)说明:在此题中将精度设置成了可调整的,而在下题中则设置为不可调整。貌似应该都设为不可调整的,但个人觉得可调整的虽然麻烦且不一定精确,但也人性化。 五、第五题:(必做题)编写计算平方根函数,并和库函数进行比较测试检验。提示:采用牛顿迭代法,计算精度10-7。函数原型:doublen mysqrt ( double x ) #include #include using namespace std; double mysqrt(double x); int main() { double x; cout<<"请输入自变量x:"; cin>>x; cout<<"自定义函数计算结果是:"< cout<<"库函数计算结果是:"< return 0; } double mysqrt(double x) { double f=1,f_; do{ f_=f; f=(f+x/f)/2; }while(f-f_>||f_-f>;验结果: (1)结果为整数的: (2)结果为非整数的: 很准确!!! 六、第六题:编写函数判定一个正整数是否是递增数,即该数各位数字从左至右递增排列,例如:1122334、123456、5599、等都是递增数。例如:32768、43987、123498都不是递增数。显示输出0至9999999之间所有递增数。 1.源程序代码: #include using namespace std; int my(int n);题分析: (1)一,要设计一个识别是否为递增数的函数,这个函数作为分离出主函数的函数; 二,在输出0到999999之间递增数时,主函数中用到循环体,从0逐一循环到9999999每次都用函数进行判断是否递增; 三,在分离出的函数中,返回值应该为是或否,1或0,然后在主函数中判断是否输出;或者不返回,直接输出也可以。 四,需要有一个识别整数位数的系统以及一个分离各个位上的数字的程序。 (2)对于: if(gwsz[i]>=gwsz[i+1]) u++; return (u==m-11:0); 只有在该m位数的每两个相邻位数字均为递增的时候,才能使得u每次都增加1,从而最终得到u=m-1;只要有一个地方不满足,就可以说明不是递增的。故可以用该条件判断是否递增。 (七)第七题:(选作题)假设有如下一元多项式: a n X n+a n-1X n-1+......+a1X1+a0 编写程序求该多项式的值和多项式导数的值,这两个结果值的计算都必须采用函数求得,具体函数原型如下: double dxs(double a[],double x,int n) double dxsds(double a[],double x,int n) 形式参数a[]用来存放多项式n+1个系数,x为多项式的变量,n为次方数。(提示:先输入某个多项式系数,然后输出该多项式及其导数多项式,再输入某个x的值,再输出多项式和导数的计算结果值) 1.源程序代码: #include using namespace std; double dxs(double a[],double x,int n); double dxsds(double a[],double x,int n); double cf(double x,int n); int main() { int n; cout<<"请输入多项式最高次项的次数n:"; cin>>n; cout<<"请按照从低次到高次的顺序依次输入系数:\n"; int i=0; double a[30];验结果: 经过验算,确实正确。 3.问题分析: 过程简述: >主函数: 输入n——循环输入系数,将系数作为数组储存下来,这是后边的自定义函数的处理目标——利用循环将循环每次输出结果贴到一块得到多项式——输入x——调用函数计算函数值、导数值; 需要以下自定义函数: >多项式计算函数: >乘方函数: >多项式导数计算函数: