C语言课程设计实习报告.docx
《C语言课程设计实习报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计实习报告.docx(23页珍藏版)》请在冰豆网上搜索。
C语言课程设计实习报告
C语言课程设计实习报告
班级:
83121
姓名:
张弛
学号:
20121000491
2014-1
题目一、
题目描述:
已知银行整存整取存款不同期限的月息利率(采用复利方式,即利滚利)分别为
0.63%期限一年
0.66%期限二年
月息利率=0.69%期限三年
0.75%期限五年
0.85%期限八年
要求输入存钱的本金和期限(以整数年为单位),求到期时能从银行得到的利息与本金的合计。
提示:
可以用嵌套的if-else结构或switch结构实现,核心函数pow(1+月利率,月份)。
请思考年份是四、六、七或八年以上的情况。
设计思路:
(一)使用switch选择语句对应年份
(二)明确核心函数pow是计算复利的(例如:
x的n次方);由于是以年为计算期限的,而所给的利率是月利率,所以计算时应该在年的基础上乘以12;
(三)复利计算就是一种幂运算,I=p*(1+i)^n,本金和利率都是变动的
(四)在除了1、2、3、5和8年之外的其他年份中,要注意“就低不就高”的原则,尤其是在8年之后,也是套用期限八年的利率。
运行效果截图:
附源程序如下:
#include
#include
voidmain()
{
intyears;
floatcapital,sum;
scanf("%f%d",&capital,&years);
switch(years)
{
case1:
sum=capital*pow(1+0.63*0.01,12);break;
case2:
sum=capital*pow(1+0.66*0.01,24);break;
case3:
sum=capital*pow(1+0.69*0.01,36);break;
case4:
sum=capital*pow(1+0.69*0.01,48);break;
case5:
sum=capital*pow(1+0.75*0.01,60);break;
case6:
sum=capital*pow(1+0.75*0.01,72);break;
case7:
sum=capital*pow(1+0.75*0.01,84);break;
case8:
sum=capital*pow(1+0.85*0.01,96);break;
default:
sum=capital*pow(1+0.85*0.01,12*years);
}
printf("%f",sum);
}
题目二、
题目描述:
简单计算器。
用switch语句编写一个程序计算表达式:
data1opdata2的值。
其中op为运算符+、-、*、/。
设计思路:
(一)明确计算器是怎样进行计算的;
(二)细节,比如很多地方需要分号,在遇到字符时,我们应该用‘’,而不是“”;
(三Switch语句主要用于多分支选择,此题有+、-、*、/,这就是选择。
使用switch每个case对应+-*/符号 程序涉及到至少三个量,运算符op和两个数字;先让用户输入两个数字和运算符,两个数字的计算在后面的程序中用swith结构运行。
运行效果截图:
附源程序如下:
#include
intmain()
{
floatdata1,data2,c;
charop;
printf("请输入表达式中两个数字data1和data2\n");//打印
scanf("%f%c%f",&data1,&op,&data2);//输入
printf("请输入运算符+、-、*、/\n");//打印
switch(op)//switch(){casestick:
break;}这个是个选择结构如果OP=stick则执行这一句如果没有则执行default后面的语句
{
case'+':
c=data1+data2;break;
case'-':
c=data1-data2;break;
case'*':
c=data1*data2;break;
case'/':
c=data1/data2;break;
default:
printf("输入错误");break;
}
printf("%f",c);
return0;
}
题目三
题目描述:
编写程序,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。
提示:
1用do-while语句实现。
2二分法的计算步骤:
(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即为所求的根
设计思路:
(一)二分法是指在整个算法中,让计算值无限趋近于根的值,利用数学知识可知,当了两个点的结果异号时,函数的根就在这两个数之间,利用二分法可以无限的把根的范围缩小,直到可以确定为止;
(二)do-while是循环语句,先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(真)时,返回重新执行循环语句,如此反复,直到表达式的值等于0(假)为止才结束。
(三)Voidmain()是声明函数,并且是对主函数的声明。
题目所给的范围是(-10,10),因此在声明函数中定义一个a和b来代替区间的范围,而用c来代指中间指也是最后的结果,在这个程序中a、b、c都是随着范围不断变化的变量。
如果(-10,10)的范围过大,就需要循环语句来缩小区间范围,即a=c或b=c。
当函数值在(-10,10)中任意一点取得0时,就正是我们所要的结果。
循环条件是当区间a和b的函数值小于精度0.01。
运行效果截图:
附源程序如下:
#include"stdio.h"
floatf(floatx)
{
floaty;
y=2*x*x*x-4*x*x+3*x-6;
returny;
}
voidmain()
{
floata=-10,b=10,c;
do{c=f((a+b)/2);
if(c==0)break;
if(c*f(a)>0)
a=c;
elseb=c;
}
while(f(b)*f(a)<0.01);/*解的精度为0.01*/
printf("方程的解是:
%f",c);
}
题目四
题目描述:
编写程序,给定一个整数i,请求出另一个整数j,使i和j在用8位二进制表示时互为逆序。
例如:
给定i=3时,应得到j=192(3的二进制为:
00000011,192的二进制为11000000)。
提示:
1十进制整数转换为二进制整数用“除2求余”法。
2二进制整数转换为十进制整数用“按权相加”法。
设计思路:
(一)二进制整数转化为十进制整数用“按权相加”法
(二)二十进制整数转化为二进制整数用“除2求余”,用&转化。
(三)运算符:
<<是指左移一位,>>是指右移一位,<<=结合时从右到左运算,其中a<>a是指b向右移a位,左移一位相当于乘2右移1位相当于除2
(四)在交换时,用的是中间法
运行效果截图:
附源程序如下:
#include"stdio.h"
voidmain()
{
inti,j,s=1,a[8];
printf("请输入一个整数i:
\n");
scanf("%d",&i);
for(j=0;j<8;j++,s<<=1)
{
a[j]=i&s;
}
printf("所得到的j为:
\n");
printf("%d\n",(a[0]<<7)|(a[1]<<5)|(a[2]<<3)|(a[3]<<1)|(a[4]>>1)|(a[5]>>3)|(a[6]>>5)|(a[7]>>7));
}
题目五
题目描述:
编写程序,抓交通肇事犯。
一辆卡车违反交通规则,撞人后逃跑。
现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。
甲说:
牌照的前两位数字是相同的;乙说:
牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:
四位的车号刚好是一个整数的平方。
根据以上线索求出车号。
提示:
1按照题目的要求,造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
2用穷举法解此题。
穷举法是最简单、最常见的一种程序设计方法,它充分利用了计算机处理的高速特征。
穷举法的关键是要确定穷举的范围,既不能过分扩大穷举的范围,也不能过分缩小穷举的范围,否则程序的运行效率会很低,或有可能遗漏正确的结果而产生错误。
设计思路:
(一)1111到1199在9911这样穷举判断是否一个数的平方则是将这个数开方取整再取平方是否还是原来的数
(二)此题需要满足三个条件:
①前两个数相同,后两个数相同;②前后两数分别不相同;③这个数是一个整数的平方。
需要每个条件都满足,if才为真。
(三)主要思路是穷举。
穷举是指在适当的范围内举出一个数。
运行效果截图:
附源程序如下:
#include
voidmain()
{
inta,b;
for(a=32;a<=99;a++)
{
b=a*a;
if(b/1000==b%1000/100&&b%100/10==b%10&&b%100!
=(b/1000)*10+b%1000/100)
printf("Thelicenseplateis:
%d\n",b);
}
}
题目六
题目描述:
从终端输入实数x,用递推法求ex=1+x+x2/2!
+x3/3!
+…+xn/n!
的值。
设计思路:
先输入一个x的值;再设计一个子函数,计算1!
,2!
,3!
…n!
的值;之后用sum函数,和pow函数处理分子,用累加的方式进行分子计算,并形成等式;最后输出结果。
运行效果截图:
附源程序如下:
#include"stdio.h"
intf(intx,intn)
{
inti,m=0;
for(i=0;im+=(double)x/i;
returnm;
}
voidmain()
{
inti,x,s;printf("请输入x的值:
\n");
scanf("%d",&x);
printf("精度小于0.001的值为:
\n");/*根据要求可以改精度*/
for(i=0,s=0;f(x,i)<0.001;i++)
s+=f(x,i);
printf("其结果为:
%d\n",s);
}
题目七
题目描述:
打印出以下的杨辉三角形(要求打印出10行)。
1
11
121
1331
14641
15101051
………………
设计思路:
(一)二维数组主要用于处理多行的问题,而且第一行在数组之中是第0行。
(二)杨辉三角有一个明显的特点:
每一行的最后一个数字与第一个数是相同的,此外,下
(三)一行的第二个数是由上一行的第一个数和第二个数相加之和,以此类推。
定义指针是为了让整个程序不那么复杂。
运行效果截图:
运行效果截图:
附源程序如下:
#include
intmain(void)
{
inta[10][10],(*p)[10]=a,i,j;
for(i=0;i<10;i++)
{
*(*(p+i)+0)=1;
*(*(p+i)+i)=1;
}
for(i=2;i<10;i++)
for(j=1;j
*(*(p+i)+j)=*(*(p+i-1)+j-1)+*(*(p+i-1)+j);
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
printf("%5d",*(*(p+i)+j));
printf("\n");
}
return0;
}
题目八
题目描述:
找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。
提示:
1一个二维数组可能有鞍点也可能没有鞍点,若有鞍点,则只有一个。
2准备两组测试数据:
(1)二维数组有鞍点:
98020540
90-60961
210-310189
(2)二维数组没有鞍点:
98020540
90-601961
210-310189
45541567
③用scanf函数从键盘输入数组各元素的值,检查结果是否正确。
如果已指定了数组的行数和列数,可以在程序中对数组元素赋初值,而不必用scanf函数。
请同学们修改程序以实现之。
设计思路:
(一)
先找出一行中值最大的元素,然后看它是不是该列中的最小值,由于一个二维数组最多有一个鞍点,所以如果是则鞍点存在且它就是鞍点,输出该鞍点;如果不是,则再找下一行的最
大数,以此类推。
如果每一行的最大数都不是鞍点,则此数组无鞍点
(二)
在程序中,先令a[i][0]最大赋值给maxi,在for循环的比较中,把符合条件的行的最大值赋给maxi,将每一次比较后的最大的列数赋值给maxj,从而找出i行最大的那个。
再假设那个数就是鞍点,将最大数和同列的数值相比,如果maxj不是最小的,则不是鞍点,继续找。
(三)引入一个参数flag=1,若不存在鞍点则flag为0,若存在鞍点则flag依旧为1
运行效果截图:
附源程序如下:
#include"stdio.h"
#defineS80
#defineT80
voidmain()
{
intm,n,i,j,t,maxh,maxl,flag,a[S][T];
printf("请输入二维数组的行数m和列数n:
\n");
scanf("%d%d",&m,&n);
printf("请输入二维数组的各个元素:
\n");
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);
for(i=0;i{
t=a[i][0];
for(j=1;j{
if(a[i][j]>a[i][0])t=a[i][j];maxh=i;maxl=j;
}
for(i=0;i{
if(a[i][maxl]elseflag=1;
}
}
if(flag==1)printf("二维数组的鞍点存在为a[%d][%d]=%d\n",maxh,maxl,a[maxh][maxl]);
}
题目九
题目描述:
某班期终考试科目为高数MT、英语EN和物理PH,有30个人参加考试。
为评定奖学金,要求统计并输出一个表格,表格内容包括学好、各科分属、总分和平均分,并标出3门课均在90分以上者(该栏标志输出为Y,否则为N),表格形式如下:
NOMTENPHSUMV>90
197879227692N
292919027391Y
390818225384N
............
#include"stdio.h"
voidmain()
设计思路:
由于是对30个学生的数据进行输入与统计,所以建立二维数组,根据各位置的条件来定义其内容,第8个数据是字符型数据,所以另设一数组进行存储,最后在将数据整合输出。
运行效果截图:
附源程序如下:
#include"stdio.h"
voidmain()
{
inti,j,sum,flag,a[30][7];
printf("请输入30个考生的三科成绩:
\n");
for(i=0;i<30;i++)
{
a[i][0]=i+1;
for(sum=0,j=1;j<4;j++)
{scanf("%d",&a[i][j]);
sum+=a[i][j];
if(a[i][j]>90)flag=1;
elseflag=0;
}
a[i][4]=sum;
a[i][5]=sum/3;
if(flag=1)a[i][6]='Y';
elsea[i][6]='N';
}
printf("NOMTENPHSUMV>90");
for(i=0;i<30;i++)
for(j=0;j<6;j++)
{
printf("%5d",a[i][j]);
printf("%c\n",a[i][6]);
}
}
题目十
题目描述下面是一个5*5阶的螺旋方阵,试编程打印出此形式的n*n(n<10)阶的方阵(顺时针旋进)。
12345
161718196
152425207
142322218
131211109
提示:
用二维数组实现。
设计思路:
定义一个n*n维数组存放该方阵,m为该方阵的圈数,一个大循环中嵌套了四个小循环,每一圈为一个大循环,第一个小循环按顺序写出第一行的数,第二个小循环按顺序写出最后一列的数,第三个小循环按顺序写出最后一行的数,第四个小循环按顺序写出第一列的数,再进行第二次大循环,循环完毕后再进行循环输出数组中的n*n个数,该螺旋方阵就出来了。
运行效果截图:
附源程序如下:
#include"stdio.h"
voidmain()
{
inti,j,k=0,m,n,a[10][10];
printf("请输入方阵行列数n(n<10):
\n");
scanf("%d",&n);
if(n%2==0)m=n/2;
elsem=n/2+1;
for(i=0;i{
for(j=i;j{
k++;
a[i][j]=k;
}
for(j=i+1;j{
k++;
a[j][n-i-1]=k;
}
for(j=n-i-2;j>=i;j--)
{
k++;
a[n-i-1][j]=k;
}
for(j=n-i-2;j>=i+1;j--)
{
k++;
a[j][i]=k;
}
}
for(i=0;i{
for(j=0;jprintf("%5d",a[i][j]);
printf("\n");
}
}
附:
实习总结与心得体会
经过C语言实习,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。
不过,通过几天的实习,逐渐积攒了一些经验,有些错误可以很快就看出来。
这次实习有很大的收获,让我对C语言有了更深的认识,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。
如果是一个程序写完一处错误也没有,会有种成就感,于是兴趣就来了,兴趣来了,自然学的东西也就多了,能把理论变成实际的技能,让我对C语言有了浓厚的兴趣和更深层的认识。
C语言是一个有序的学习,学了最基本的替换,然后扩展到循环,嵌套,条理很清楚,不是一个零散的知识,实际上所有的课程都如此,不过通过实习我也知道了自己的不足,存在的很多问题。
比如自己写的写的小程序出了问题,不会解决了就叫老师帮忙,但是会养成一种依赖的心理,碰到问题了个想到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取做到老师不在身边的时候也可以完成一些简单的程序编写与错误排除。
还有自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。
通过实习,逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。
其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。
自己亲自动手编写程序让我增加了对C语言程序开发环境的了解,在上课的时候老师就讲,学习C语言最重要的是学习C语言的逻辑思维,不管以后从事什么行业,学习C语言都对自己的职业很有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的编程工作可能不用C语言,但是拥有扎实的C语言基础是对工作很有用的。
当初在初步接触C语言的时候,看着一堆“奇形怪状”的符号,觉得甚是无聊,通过这次实训,摆脱了那种似懂非懂的状态!
感谢学校安排这次实习和老师的耐心讲解,让我学到了很多知识,在实习过程中,同学之间的相互探讨,老师的循循善诱,最终让我们达到了举一反三的效果,在学知识的同时,也增加了同学老师之间的感情。
希望以后还会有更多类似的实习课程,在有限的大学时间内学到更多的实用技能,为以后的生活和工作打下一个良好的基础。