您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言课程设计实习报告11
合作·创新·挑战C语言课程设计实习报告班级:131132姓名:王涛学号:201310005132014-7合作·创新·挑战合作·创新·挑战题目一、题目描述:已知银行整存整取存款不同期限的月息利率(采用复利方式,即利滚利)分别为0.63%期限一年0.66%期限二年月息利率=0.69%期限三年0.75%期限五年0.85%期限八年要求输入存钱的本金和期限(以整数年为单位),求到期时能从银行得到的利息与本金的合计。设计思路:用嵌套的if-else结构或switch结构实现,核心函数pow(1+月利率,月份)。然后用这个函数计算每次的结果。运行效果截图:附源程序如下:#includestdio.h#includemath.hmain(){intyear;floatrate,corpus;doublec;printf(请输入存入本金:\n);scanf(%f,&corpus);printf(请输入存放时间(单位:年):\n);scanf(%d,&year);if(year=8){rate=0.0085;c=corpus*pow(1+rate,year*12);}elseif(year=5&&year8){rate=0.0075;c=corpus*pow(1+rate,year*12);}elseif(year=3&&year5){rate=0.0069;合作·创新·挑战c=corpus*pow(1+rate,year*12);}elseif(year=2&&year3){rate=0.0066;c=corpus*pow(1+rate,year*12);}else{rate=0.0063;c=corpus*pow(1+rate,year*12);}printf(总收入为=%f\n,c);return0;}题目二、题目描述:编写程序,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。设计思路:①用do-while语句实现。②二分法的计算步骤:(1)准备计算f(x)在有根区间[a,b]端点处的值f(a),f(b)(2)二分计算f(x)在区间中点(a+b)/2处的值f[(a+b)/2](3)判断若f[(a+b)/2]=0,则即是根,计算过程结束。否则,检测:A.若f[(a+b)/2]与f(a)异号,则根位于区间[a,(a+b)/2]内,这时以(a+b)/2代替b;B.若f[(a+b)/2]与f(a)同号,则根位于区间[(a+b)/2,b]内,这时以(a+b)/2代替a;反复执行步骤2和3,直到区间[a,b]长度缩小到允许的误差范围之内,此时中点(a+b)/2即为所求的根。运行效果截图:附源程序如下:#includestdio.h#includemath.hmain(){floatx1,x2,x0,fx1,fx2,fx0;do{printf(请输入区间范围x1和x2\n);scanf(%f%f,&x1,&x2);合作·创新·挑战fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;}while(fx1*fx20);/*该循环语句实现:确保区间范围内有零点,否则将一直重新输入区间范围*/do{x0=(x1+x2)/2;fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;if((fx0*fx1)0){x2=x0;fx2=fx0;}else{x1=x0;fx1=fx0;}/*标准2分发算法*/}while(fabs(fx0)1e-5);/*精度*/printf(%f\n,x0);}题目三、题目描述:已有一个已排好序的10元素整型数组,要求输入一个数后,按原来排序的规律将它插入数组中。设计思路:首先准备一个11个空间的一维数组,然后把用户输入的数放到最后一个地址,并依次和前面的数作比较直到比前面一个数大就好,此时打印这11个数。运行效果截图:附源程序如下:#includestdio.hvoidmain(){inta[30]={7,10,13,16,20,24,26,46,68,69,99};//11个数,最后一个是a[10]//inti,n;//n为从键盘录入的一个整数//printf(请输入一个整数\n);scanf(%d,&n);printf(这个原数组为:\n);for(i=0;i11;i++)//将原数组a的11个元素先打印出来//printf(%d,a[i]);printf(\n);for(i=10;i=-1;i--)//从原数组a的第11个也就是最后一个元素开始和整数n比较大小//{if(a[i]n)//如果a数组的第i个元素比n大,则把第i个元素往后移一个位置//合作·创新·挑战a[i+1]=a[i];/*这里值得注意的是,当输入的数小于a[0],则下次循环比较是a[-1]与n比,a[-1]是一个很小的负数,所以肯定会执行else。即把n赋给a[0]*/else//如果a数组的第i个元素不比n大,则将n存放在第(i+1)的空位置上//{a[i+1]=n;break;//当n在a数组中按从小到大的顺序存进以后,退出此循环//}}printf(您输入的整数按原来的排序规律将它插入数组后为:\n);for(i=0;i12;i++)printf(%d,a[i]);printf(\n);}题目四、题目描述:编写程序,给定一个整数i,请求出另一个整数j,使i和j在用8位二进制表示时互为逆序。例如:给定i=3时,应得到j=192(3的二进制为:00000011,192的二进制为11000000)。设计思路:①十进制整数转换为二进制整数用“除2求余”法。②二进制整数转换为十进制整数用“按权相加”法。通过这两个思路可以把二进制和十进制相互转化,然后只要做一件事情,把二进制数倒着输出变成十进制数即可。运行效果截图:附源程序如下:#includestdio.h#includemath.hvoidmain(void){inti,s[8],m,a;intj=0;printf(请输入整数i:\n);scanf(%d,&m);a=m;for(i=0;i8;i++)/*用for循环求m的2进制表示并存放到s[i]中*/{s[i]=m%2;/*m对2求余*/m=m/2;合作·创新·挑战}/*该算法将m的2进制数存入s[8]*//*接下来直接用一种巧妙的算法算j*/for(i=0;i8;i++)/*同样用循环依次取出s[8]里的数*/if(s[i]==1)j+=pow(2,7-i);/*pow(x,y)表示x的y次方j=j+pow(2,7-i)*/printf(%d的二进制的互逆为%d\n,a,j);/*7-i是把s[i]逆向排序,如11010000变为00001011*/}题目5、题目描述:用递推法求ex=1+x+x2/2!+x3/3!+…+xn/n!的值。设计思路:很简单,只要按照公式进行编程就好。不过有几个地方值得注意,一个是该公式是n趋于无穷大的,我们也可以将循环做成无限循环的。第二个,不能一直循环,当到达某一精确度时停止循环,用break最好不过。运行效果截图:附源程序如下:#includestdio.hintmain(){inti;doublen,s=1,x=1,y=1;printf(请输入指数x(x为大于等于0的正实数)\n);scanf(%lf,&n);for(i=1;;i++)/*无限循环*/{x*=n;y*=i;/*这里有个赋值运算符*=,例:x*=y+3等价于x=x*(y+3)。*/s+=x/y;if(x/y1e-5)break;}printf(e的%lf次方的精确到百万分之一的值为%f\n,n,s);return0;}合作·创新·挑战题目六、题目描述:打印出以下的杨辉三角形(要求打印出10行)。11112113311464115101051………………设计思路:这个问题的话,用二维数组实现。首先把1都存入二维数组,用二重循环,然后利用杨辉三角的特点,每一个值都为上两个元素的和,用语句:a[i][j]=a[i-1][j-1]+a[i-1][j]即可实现。最后打印二维数组,注意间隔就好。运行效果截图:附源程序如下:#includestdio.hintmain(){inta[10][10];inti,j;printf(杨辉三角的前十行是\n);for(i=0;i10;i++){a[i][0]=1;/*就是把第一列的十个数都写成1,也可以说是杨辉三角的每行第一个数*/a[i][i]=1;/*把二维数组的对角线都写成1,也可以说是杨辉三角的每行最后一个数*/}for(i=2;i10;i++)/*重新给i赋初值为2*/for(j=1;ji;j++)/*大循环套小循环*/a[i][j]=a[i-1][j-1]+a[i-1][j];/*这个算法很奇妙,利用了杨辉三角的特性,每个元素等于合作·创新·挑战上头那两个元素相加,所以之前一定要把所有的1打出来。这步是程序的灵魂*/for(i=0;i10;i++)/*接下来打印2维数组,2重循环不解释*/{for(j=0;j=i;j++)printf(%d,a[i][j]);/*注意这里显示每个数字空格的间距*/printf(\n);}return0;}题目七、题目描述:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。设计思路:一个二维数组可能有鞍点也可能没有鞍点,若有鞍点,则只有一个。因此最后肯定是两种情况之一。首先我们准备一个a[10][10]的二维数组,让用户自行输入m,n,然后只写成m*n的一个矩阵。这个都很好办。关键是判断鞍点,就按要求来,先用循环扫行,找出该行最大的数并赋给max,在判断max在该列是否为最小,不是的话循环继续,找下一行最大再赋给max的并判断max是否为该列最小,直到找到鞍点为止。没有找到就直接显示矩阵无鞍点。小技巧,在找到该行最大数的时候把他的纵坐标记下来,找到鞍点时就可以把横纵坐标都记下来并放到两个变量里。最后把变量加一就可以显示鞍点坐标了。运行效果截图:附源程序如下:/*找出一个二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小。*/#includestdio.h#defineN10#defineM10voidmain(){合作·创新·挑战inti,j,k,m,n,flag1,flag2,a[N][M],max,maxj;/*二维10*10数组*/printf(输入行数n,n=10:);/*n为行*/scanf(%d,&n);printf(\n输入列数m,m=10:);/*m为列*/scanf(%d,&m);printf(\n输入二维矩阵,元素之间用空格间隔,换行建议用回车\n);for(i=0;in;i++)/*2重循环扫描输入数组元素*/for(j=0;jm;j++)/*这里值得注意的是虽然是10*10的数组,但我们只用了n*m的空间。*/scanf(%d,&a[i][j]);flag2=0;for(i=0;in;i++)/*最大层循环,i为控制变量,灵魂算法*/{max=a[i][0];/*max已在前面定义为整形*/for(j=0;jm;j++)/*注意这里j是小于m*/if(a[i][j]max){max=a[i][j];maxj=j;}/*这个循环的功能把地i行的最大值给max,maxj为其纵坐标j。*/for(k=0,flag1=1;kn&&flag1;k++)/*再看列(纵坐标不变看所有的行),注意是k小于n*/if(maxa[k][maxj])/*纵坐标不变,当max为大数的时候,让下面判断条件为假*/flag1=0;/**/if(flag1){i=i+1;maxj=maxj+1;/*这里由于数组是以a00开头,为修正,各加一就好了*/printf(\n第%d行第%d列的%d是鞍点\n,i,maxj,max);flag2=1;/*因为有
本文标题:C语言课程设计实习报告11
链接地址:https://www.777doc.com/doc-3180444 .html