计算机科学与技术第4次上机实验Word文件下载.docx
《计算机科学与技术第4次上机实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机科学与技术第4次上机实验Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
![计算机科学与技术第4次上机实验Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/27/c60b66a8-53b1-481b-8e5a-cdb9ff05e3ae/c60b66a8-53b1-481b-8e5a-cdb9ff05e3ae1.gif)
#include<
stdio.h>
intsum(inta,intn);
//sum函数声明
intmain()
{
intn;
inta;
printf("
请输入a,n:
\n"
);
scanf("
%d%d"
&
a,&
n);
前%d项和为%d\n"
n,sum(a,n));
//调用函数sum
return0;
}
intsum(inta,intn)
intsum=0;
inti;
intcount;
count=0;
for(i=1;
i<
=n;
i++)
{
count=count*10+a;
//每次乘10加a
sum=sum+count;
}
returnsum;
验证与结论:
总结与心得体会:
声明函数时后面一定要有分号,但写函数时不需要。
实验题目2:
编程实现求10000以内的回文数。
其中,函数实现判断任一正整数是否为回文数。
所谓回文数就是将一个数从左向右读与从右向左读是一样的,例如121和1331都是回文数。
声明judje函数,判断number是否为回文数。
在函数内部先判断数字number位数,由于回文数为对称结构,故通过位数来确定判断次数,每次判断数字首位与个位然后去掉首位与个位再次判断直至循环结束。
另外需要对个位数另行判断,个位数一定为回文数。
如果为回文数返回1,否则返回0。
math.h>
intjudje(intnumber);
//声明judje函数
for(i=0;
10000;
if(judje(i)==1)//judje为1的数输出
%d\t"
i);
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)//如果为个位数一定为回文数
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。
doublefinal_money(doublemoney,doublelilv,intn);
//函数声明
doublemoney,lilv;
//每月存款数,年利率
//月份
请输入每月存款数、年利率和存款月份数(以空格隔开):
%lf%lf%d"
money,&
lilv,&
账户上的剩余钱数为%.3lf"
final_money(money,lilv,n));
doublefinal_money(doublemoney,doublelilv,intn)//存款数、年利率和月份数
doublefinal_money=0;
//赋初值
//循环变量
final_money=(final_money+money)*(1+lilv/12);
//表达式
returnfinal_money;
//返回钱数
函数参数可以是多个但返回值只有一个。
实验题目4:
用递归法将一个整数n转换成字符串。
例如,输入483,应输出的字符串“483”,n的位数不确定,可以是任意位数的整数。
声明函数,在函数将数每次除以10反复递归调用直到为0,而余数加上'
0'
可以产生相应的字符。
voidchange(intn);
请输入整数n:
"
%d"
输出相应字符串:
if(n<
0)
{putchar('
-'
//先输出一个‘-’号
n=-n;
//转化为正值
change(n);
voidchange(intn)
i=n/10;
if(i!
=0)
change(i);
//对n每次除以10反复递归调用直到为0
putchar(n%10+'
//余数加上'
可以产生相应的字符
余数可以加上48来得到相应的字符但加’0’会更加简单。
函数递归必须要有限制条件,转换字符串函数限制条件就是i为0。
实验题目5:
用递归方法求n阶勒让德多项式的值。
直接利用函数递归,当阶数值为o返回1,阶数值为1返回输入的数。
另外阶数值在递归时需要强制转换为float类型,否则式子计算为整型数。
floatnumber(floatx,intn);
//阶数
floatx;
//循环变量充当输入的数
请输入x值和阶数:
%f%d"
x,&
%.2f\n"
number(x,n));
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的阶乘。
longlongfactorial(intnumber);
inti=19;
longlongx;
//数据极大必须用longlong数据类型
x=factorial(i);
//仅调用一次函数
//printf("
%ld"
x);
for(i=19;
i>
0;
i--)
%d!
是%lld\n"
i,x);
//longlong用%lld输出
x/=i;
//除掉之后多余的数的到当前i的阶乘
longlongfactorial(intnumber)//求任意整数阶乘函数
staticlonglongy=1;
//静态变量只赋一次初值以后函数调用会保留上一次的值
for(i=1;
number;
y=y*(i+1);
//用循环求阶乘
returny;
//返回阶乘值
局部静态变量会保留上一次运行的值,故在此题中只调用了一次函数.另外由于10以上阶乘数极大,声明类型时用了longlong类型。
实验题目7:
编程实现两个整形变量内容互换。
用带参数的宏实现变量内容的交换。
直接用带参数的宏充当函数来对两个整型变量交换。
#definechange(x,y)mid=x;
\
x=y;
y=mid//宏定义两个整形变量内容互换
intx,y,mid;
请输入xy的值:
y);
change(x,y);
//宏
替换后xy值%d\t%d"
x,y