计算机科学与技术第4次上机实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

哈尔滨工程大学《程序设计基础》实验报告基础实践一姓名:麦豆班级:学号:实验时间:2018年5月3日成绩哈尔滨工程大学计算机基础课程教学中心实验题目1:写一个函数,Sn=a+aa+aaa+···+aa···a求多项式的前n项和,其中a是一个数字。n由键盘输入。设计思想:声明函数sum,利用循环求得sum最终值并返回sum值实验代码及注释:#includestdio.hintsum(inta,intn);//sum函数声明intmain(){intn;inta;printf(请输入a,n:\n);scanf(%d%d,&a,&n);printf(前%d项和为%d\n,n,sum(a,n));//调用函数sumreturn0;}intsum(inta,intn){intsum=0;inti;intcount;count=0;for(i=1;i=n;i++){count=count*10+a;//每次乘10加asum=sum+count;}returnsum;}验证与结论:总结与心得体会:声明函数时后面一定要有分号,但写函数时不需要。实验题目2:编程实现求10000以内的回文数。其中,函数实现判断任一正整数是否为回文数。所谓回文数就是将一个数从左向右读与从右向左读是一样的,例如121和1331都是回文数。设计思想:声明judje函数,判断number是否为回文数。在函数内部先判断数字number位数,由于回文数为对称结构,故通过位数来确定判断次数,每次判断数字首位与个位然后去掉首位与个位再次判断直至循环结束。另外需要对个位数另行判断,个位数一定为回文数。如果为回文数返回1,否则返回0。实验代码及注释:#includestdio.h#includemath.hintjudje(intnumber);//声明judje函数intmain(){inti;for(i=0;i10000;i++){if(judje(i)==1)//judje为1的数输出printf(%d\t,i);}return0;}intjudje(intnumber)//判断number是否为回文数{intjudje,i=0,middle_number,parity,j;//回文数判断变量,数字位数,数字位数中间变量,数字位数奇偶intmiddle_number2;//取掉首位个位剩余数intshouwei,gewei;//首位,个位middle_number2=number;//全部赋初值middle_number=number;do//判断数字位数{i++;middle_number=middle_number/10;//对数字除以10直到为0}while(middle_number!=0);parity=i/2;//运算次数for(j=1;j=parity;j++){shouwei=middle_number2/pow(10.0,(double)(i-2*j+1));//首位数字gewei=middle_number2%10;//个位数字middle_number2=(middle_number2-shouwei*pow(10.0,(double)(i-2*j+1)))/10;//将首位与个位去除后剩余的数if((shouwei==gewei)&&j==parity)//个位与首位相等且都已比较完成{judje=1;//1为真}elseif(shouwei!=gewei){judje=0;break;}}if(parity==0)//如果为个位数一定为回文数judje=1;returnjudje;}验证与结论:总结与心得体会:通过函数可以使代码更加简洁,流程更加清晰。实验题目3:假设你每月在储蓄账户上存100元,年利率是5%,则每月的利率是0.05/12=0.00417。第一个月后,账户上的值变成100*(1+0.00417)=100.417;第二个月后,账户上的值变成(100+100.417)*(1+0.00417)=201.252;第三个月后,账户上的值变成(100+201.252)*(1+0.00417)=302.507,以此类推。写一个函数,根据用户输入的每月的存款数、年利率和月份数,计算给定月份后账户上的钱数。设计思想:声明final_money,由题意可知每个月钱数为上个月钱数加每月存的钱数乘以每月利率,在函数内部由循环得到钱数,返回final_money。实验代码及注释:#includestdio.hdoublefinal_money(doublemoney,doublelilv,intn);//函数声明intmain(){doublemoney,lilv;//每月存款数,年利率intn;//月份printf(请输入每月存款数、年利率和存款月份数(以空格隔开):\n);scanf(%lf%lf%d,&money,&lilv,&n);printf(账户上的剩余钱数为%.3lf,final_money(money,lilv,n));return0;}doublefinal_money(doublemoney,doublelilv,intn)//存款数、年利率和月份数{doublefinal_money=0;//赋初值inti;//循环变量for(i=1;i=n;i++){final_money=(final_money+money)*(1+lilv/12);//表达式}returnfinal_money;//返回钱数}验证与结论:总结与心得体会:函数参数可以是多个但返回值只有一个。实验题目4:用递归法将一个整数n转换成字符串。例如,输入483,应输出的字符串“483”,n的位数不确定,可以是任意位数的整数。设计思想:声明函数,在函数将数每次除以10反复递归调用直到为0,而余数加上'0'可以产生相应的字符。实验代码及注释:#includestdio.hvoidchange(intn);intmain(){intn;printf(请输入整数n:);scanf(%d,&n);printf(输出相应字符串:);if(n0){putchar('-');//先输出一个‘-’号n=-n;//转化为正值}change(n);printf(\n);return0;}voidchange(intn){inti;i=n/10;if(i!=0)change(i);//对n每次除以10反复递归调用直到为0putchar(n%10+'0');//余数加上'0'可以产生相应的字符}验证与结论:总结与心得体会:余数可以加上48来得到相应的字符但加’0’会更加简单。函数递归必须要有限制条件,转换字符串函数限制条件就是i为0。实验题目5:用递归方法求n阶勒让德多项式的值。设计思想:直接利用函数递归,当阶数值为o返回1,阶数值为1返回输入的数。另外阶数值在递归时需要强制转换为float类型,否则式子计算为整型数。实验代码及注释:#includestdio.hfloatnumber(floatx,intn);//函数声明intmain(){intn;//阶数floatx;//循环变量充当输入的数printf(请输入x值和阶数:\n);scanf(%f%d,&x,&n);printf(%.2f\n,number(x,n));return0;}floatnumber(floatx,intn){if(n==0){return1;}elseif(n==1)returnx;return(2*n-1)*x*number(x,n-1)/(float)n-(n-1)*number(x,n-2)/(float)n;//递归求n阶勒让德多项式注意n为整数需要强制转换}验证与结论:总结与心得体会:递归是c语言中最基础也是极为重要的算法,核心是函数自身对自身的调用。注意整型除以整型仍为整型,故需要对阶数值强制转换。实验题目6:编程求20以内正整数的阶乘。要求:写一函数求任一整数的阶乘,在函数内部通过定义静态局部变量求阶乘。设计思想:声明一个factorial函数,在函数内部定义静态变量,利用循环求阶乘值,由于局部静态变量会保留上一次运行的值,故求20以内正整数的阶乘只能调用一次factorial函数,求19的阶乘然后利用循环从19往下输出直到1的阶乘。实验代码及注释:#includestdio.hlonglongfactorial(intnumber);//函数声明intmain(){inti=19;longlongx;//数据极大必须用longlong数据类型x=factorial(i);//仅调用一次函数//printf(%ld,x);for(i=19;i0;i--){printf(%d!是%lld\n,i,x);//longlong用%lld输出x/=i;//除掉之后多余的数的到当前i的阶乘}return0;}longlongfactorial(intnumber)//求任意整数阶乘函数{staticlonglongy=1;//静态变量只赋一次初值以后函数调用会保留上一次的值inti;for(i=1;inumber;i++){y=y*(i+1);//用循环求阶乘}returny;//返回阶乘值}验证与结论:总结与心得体会:局部静态变量会保留上一次运行的值,故在此题中只调用了一次函数.另外由于10以上阶乘数极大,声明类型时用了longlong类型。实验题目7:编程实现两个整形变量内容互换。用带参数的宏实现变量内容的交换。设计思想:直接用带参数的宏充当函数来对两个整型变量交换。实验代码及注释:#includestdio.h#definechange(x,y)mid=x;\x=y;\y=mid//宏定义两个整形变量内容互换intmain(){intx,y,mid;printf(请输入xy的值:\n);scanf(%d%d,&x,&y);change(x,y);//宏printf(替换后xy值%d\t%d,x,y);return0;}验证与结论:总结与心得体会:带参数的宏可以充当函数来使用,由于宏不是语句,末尾不能加分号。宏对参数类型不做检查,是优点也是缺点,在使用时要注意。

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功