当前位置:范文大全 > 调查报告 > c课程设计实践报告

c课程设计实践报告

发布时间: 2021-10-22 14:33:01

  C++课程设计实践报告

 班级: 83121

 姓名:张弛

 学号: XX1000491

 题目一、 题目描述: 已知银行整存整取存款不同期限 的月息利率 ( 采用复利 方式,即利滚利 ) 分别为 % 期限一 年 % 期限二年 月息利率 = % 期限三年% 期限五年 % 期限八年 要求输入存钱的本金和期限 ( 以整数年为单位 ) ,求到期时能从银行 得到的利息与本金 的合计。

 提示:可以用嵌套的 if-else 结构或 switCh 结 构实现,核心函数pow(1+月利率,月份)。请思考年份是四、 六、七或八年以上的情况。设计思路: ( 一 ) 使用 switCh 选择语句 对应年份

 ( 二) 明确核心函数 pow 是计算复利的 ( 例如: x 的 n 次方 ) ; 由于 是以年为计算期限的,而所给的利率是月利 率,所以计算时 应该在年的基础上乘以 12; ( 三)复利计算 就是一种幕运算,I=p*(1+i)An ,本金和利率都是变动的 ( 四 ) 在除了 1 、 2、 3、 5 和 8 年之外的其他年份 中,要注意“就低 不就高”的原则,尤其是在 8 年之后, 也是套用期限八年的利率。附源程序如下: #inClude #inClude void main() { intyears; float Capital,sum;

 { case 1:sum=capital*pow(1+*,12);break; case2:sum=capital*pow(1+*,24);break; case

 3:sum=capital*pow(1+*,36);break;

 case 4:sum=capital*pow(1+*,48);break;

 case 5:sum=capital*pow(1+*,60);break; case6:sum=capital*pow(1+*,72);break; case

 7:sum=capital*pow(1+*,84);break; case

 8:sum=capital*pow(1+*,96);break;

 default:sum=capital*pow(1+*,12*years); }

 printf("%f",sum); }

 题目二、 题目描述: 简单计算器。用 switch 语句编 写一个程序计算表达式: data1 op data2 的值。

 其中 op 为 运算符 +、- 、* 、/ 。设计思路: ( 一)明确计算器是怎样进行计算的 ; ( 二) 细节, 比如很多地方需要分号, 在遇到字符时, 我们应 该用 ‘' , 而不是“” ; ( 三 Switch 语句主要用于多 分支选择,此题有 +、-、*、/ ,这就是 选择。使用 switch 每个 case 对应 + - * / 符号 程序涉及到至少三个量,运算符 op 和两个数字 ; 先让用户输入两个 数字和运算符, 两个数字的计算在后面的程序中用 swith 结构运行。

 运 行 效 果 截 图 :附 源 程 序 如 下 : #include int main() { float data1,data2,c;char op; printf(" 请输入表达式中两个数字 data1 和 data2"); // 打 印 scanf("%f%c%f",&data1,&op,&data2); // 输入printf(" 请输入运算符 +、- 、* 、/");// 打印 switch(op)//switch (){case stick: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); return 0; } 题目三 题目描述:编写程序, 用二分法求方程 2x3-4x2+3x-6=0 在(-10 , 10) 之间的根。

 提示: ① 用 do-while 语句实现。② 二分法的计算步骤: (1) 准备 计算 f(x) 在有根区 间端点处的值 f(a) ,f(b) (2) 二分 计算 f(x) 在区间中点 (a+b)/2 处的值 f (3) 判断若 f=0 ,则即是根,计算过程 结束。

 否则,检测: A. 若 f 与 f(a) 异号, 则根位于区 间内, 这时以 (a+b)/2 代替 b; B. 若 f 与 f(a) 同号, 则 根位于区间内, 这时以 (a+b)/2 代替 a; 反复执行步骤 2 和 3 ,直到区间长度缩小到允许的误差范围之 内,此时中点(a+b)/2 即为所求的根 设计思路:(一)二分法是指在整 个算法中,让计算值无限趋近于根的值,利用 数学知识可 知,当了两个点的结果异号时, 函数的根就在这两个数之 间, 利用二分法可以无限的把根的范围缩小,直到可以确定为止 ;(二)do-while 是循环语句,先执行一次指定的循环体语句, 然后 判别表达式, 当表达式的值为非零 ( 真 ) 时, 返回 重新执行循环语句, 如此反复, 直到表达式的值等于 0( 假) 为止才结束。(三)Void main() 是声明函数,并且是对主函 数的声明。题目所 给的范围是 (-10 , 10) ,因此在声明函 数中定义一个 a 和 b 来代替区 间的范围,而用 c 来代指 中间指也是最后的结果,在这个程序中 a、 b、c 都是随着 范围不断变化的变量。如果 (-10,10) 的范围过大,就需要循环语句来缩小区间范围, 即 a=c 或 b=c 。

 当 函数值在 (-10,10) 中任意一点取得 0 时,就正是我们所要的结果。循环条件是当区间

 a 和 b

 的函数值小于精度

 运行效果截图:

 附源程序如下: #include

 "" float

 f(float x) { float

 y; y=2*x*x*x-4*x*x+3*x-6;

 return

 y; } void main()

 { float a=-10,b=10,c;

 do{c=f((a+b)/2); if(c==0) break; if(c*f(a)>0) a=c;else b=c; } while(f(b)*f(a) 题目四 题目描述:编写

 程序,给定一个整数 i ,请求出另一个整数 j ,使 i 和 j 在 用 8 位二进制表示时互为逆序。例如:给定 i=3 时,应得 到 j=192(3 的 二 进 制 为 :, 192 的 二 进 制 为 。

 提示: ① 十进制整数转换为二进制整数用 “除 2 求余” 法。

 ② 二进制整数转换为十进制整数用 “按 权相加”法。设计思路: ( 一) 二进制整数转化为十进制整数用“按 权相加”法 ( 二) 二十进制整数转化为二进制整数用“除 2求余” ,用 &转化。

 ( 三 ) 运算符: >是指右移一位, a 是指 b 向右移 a 位, 左移一位相当于乘 2 右移 1 位相当于除 2 ( 四) 在交换时, 用的是中间法运行效果截图: 附源程序如下: #include "" void main() { int i,j,s=1,a; printf(" 请 输 入 一 个 整 数 i : "); scanf("%d",&i); for(j=0;j printf("%d",(a>1) | (a>>3) | (a>>5) | (a>>7)); }题目五 题目描述:编写程序,抓交通肇事犯。

 一辆卡 车违反交通规则,撞人后逃跑。现场有三人目击事件,但都 没 有记住车号,只记下车号的一些特征。甲说:牌照的前 两位数字是相 同的; 乙说:牌照的后两位数字是相同的,但 与前两位不同 ; 丙是位 数学家,他说:四位的车号刚好是一 个整数的平方。根据以上线索求 出车号。

 提示: ① 按照 题目的要求,造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。

 ② 用穷举法解此题。穷举法是最简单、最常见的一种程序 设计方法, 它充分利用了计算机处理的高速特征。穷举法 的关键是要确定穷 举的范围,既不能过分扩大穷举的范围, 也不能过分缩小穷举的 范围,否则程序的运行效率会很低, 或有可能遗漏正确的结果而 产生错误。设计思路:

 ( 一 )11 11

 到 11

 99

 在

 99 11 这样 穷举

 判断是否一个

 数的平方 则是 将这个数开方

 取整 再取平方 是否还是原来的数

 (二)此题需要满足三个条件:①前两个数相同,后两个

 数相同 ; ② 前后两数分别不相同 ; ③这个数是一个整数的平 方。需要每个条件都 满足, if 才为真。

 ( 三)主要思路是 穷举。穷举是指在适当的范围内举出一个数。

 运 行 效 果 截图:附源程序如下: #include void main() { int a,b;

 for(a=32;a { b=a*a; if(b/1000==b%1000/100b%100!=(b/1000)*10+b%1000/100) printf("The license plate is:%d",b); } } && b%100/10==b%10 &&题目六 题 目 描 述 : 从 终 端 输 入 实 数 ex=1+x+x2/2!+x3/3!+?+xn/n! 的值。

 设计思路: 先输入一 个 x 的值 ; 再设计一个子函数, 计算 1! , 2! , 3! ?n! 的值 ; 之后用 sum 函数,和 pow 函数处理分子,用累加的 方式进行分 子计算,并形成等式 ; 最后输出结果。

 x , 用 递推法求附源程序如下: #include "" int f(int x,int n) { int i,m=0; for(i=0;ifor(i=0,s=0;f(x,i) 题目七 题目描述:打印出以 下的杨辉三角形 (要求打印出 10 行) 。

 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 设计思路: ( 一) 二维数组主要用于处理多行的问题, 而且第一行在数组之中是 第 0 行。

 ( 二) 杨辉三角有一个 明显的特点:每一行的最后一个数字与第一个 数是相同的, 此外,下 ( 三) 一行的第二个数是由上一行的第一个数和第 二个数相加之和, 以此类推。定义指针是为了让整个程序不那么复杂。

 运行效果截 图:

 附 源 程 序 如 下 : #include int main(void) { int*(*(p+i)+i)=1;

 *(*(p+i)+i)=1; } for(i=2;i 一个二维数组的“鞍点”

 题目八 题目描述:找出

 ,即该位置上的元素在该行 上最

 大,在该列上最小。

 提示: ① 一个二维数组可能有鞍点 也可能没有鞍点,若有鞍点,则只有一 个。② 准备两组测试数据: (1) 二维数组有鞍点: 9 80 205 90 -60 210 4096 1 89

 -3 101

 (2) 二维数组没有鞍点: 9 80 205 90 -60 210 40 1 89196

 -3 101 7

 45 54 156

 ③用 scanf 函数从键盘输入数组各元素的值,检查结 果是否正确。如 果已指定了数组的行数和列数,可以在程 序中对数组元素赋初值,而 不必用 scanf 函数。请同学们 修改程序以实现之。设计思路: ( 一 ) 先找出一行中值最大的元素,然后看 它是不是该列中的最小值,由于 一个二维数组最多有一个 鞍点,所以如果是则鞍点存在且它就是鞍 点,输出该鞍点 ; 如果不是,则再找下一行的最 大数, 以此类推。如果每一行的最大数都不是鞍点,则此数组无鞍点 ( 二 ) 在程序中,先

 令 a 最大赋值给 maxi ,在 for 循环的比较中,把

 符合条件的行的最大值赋给 maxi ,将每一次比较后的 最大的列数赋 值给 maxj ,从而找出 i 行最大的那个。

 再 假设那个数就是鞍点,将最大数和同列的数值相比,如果 maxj 不 是最小的,则不是鞍点,继续找。

 ( 三) 引入一个 参数 flag=1 ,若不存在鞍点则 flag 为 0 ,若存在鞍 点则 flag 依旧为 1运行效果截图:

 附源程序如下: #include "" #define S 80 #define T80 void main() { int m,n,i,j,t,maxh,maxl,flag,a; printf(" 请 输 入 二 维 数 组 的 行 数 m 和 列 数 n:"); scanf("%d %d",&m,&n); printf(" 请输入二维数组的各个元 素: ");for(i=0;ia) t=a;maxh=i;maxl=j; } for(i=0;i a=%d",maxh,maxl,a); }题目九 题目描述:某班期终考试科目为高数 MT、英语

 EN和物理PH,有30

 个人参加考试。为评定奖学金,要求统计并输出一个表 格,表格内容 包括学好、各科分属、总分和平均分,并标 出3门课均在90分以上 者(该栏标志输出为 丫,否则为 N) ,表格形式如下: NO MT EN PH SUM V >90 1 2 3 97 8792 276 92 92 91 90 273 91 90 81 82 253 84 N 丫#include "" void main()

 设计思路:由于是对 30 个学生的数据进行输入与统计,

 所以建立二 维数组, 根据各位置的条件来定义其内容, 第 8 个数据是字符型数据, 所以另设一数组进行存储,最后 在将数据整合输出。附源程 序 如下: #include "" void main() { int i,j,sum,flag,a; printf(" 请输入 30 个考生的三科成绩: ");for(i=0;i90) flag=1; else flag=0; } a=sum; a=sum/3; if(flag=1) a='Y'; else a='N';} printf("NO MT EN PH SUM V >90 "); for(i=0;i }题目十 题目描述下面是一个 5*5 阶的螺旋方阵,试编 程打印出此形式的 n*n (n 设计思路:定义一个 n*n 维数组存放该方阵, m 为该方阵的圈数,一个大循环中嵌套了 四个小循环,每一圈为一个大循环,第一个小循环按顺 序写出第一行的数,第二个小循环按 顺序写出最后一列的 数, 第三个小循环按顺序写出最后一行的数, 第四个小循 环按顺序写出 第一列的数,再进行第二次大循环,循环完 毕后再进行循环输出数组中的 n*n 个数,该螺旋 方阵就出 来了。附源程序如下: #include "" void main() { int i, j, k = 0, m, n,a; printf(" 请输入方阵行列数 n(n k++;a=k; } for (j=i+1;j=i;j--) { k++; a =k; } for(j=n-i-2;j>=i+1;j--) { k++; a=k; } } for (i=0;iprintf("%5d", a); printf(""); } } 附:

 实习总结与心得体会

 经过 C 语言实习,让我加深了对 C 语言的了解,而不 只是单单 的在课本中学到的那些理论,平时乏味的课程, 通过自己动手亲自编 写,变的生动有趣,而在自己动手的 过程中,出现的问题很多,比理 论要难的多,当一个程序 写完以后,经常会有很多错误而没法解决。

 不过,通过几 天的实习,逐渐积攒了一些经验,有些错误可以很快就 看 出来。

 这次实习有很大的收获,让我对 C 语言有了更深的 认识,平时 在课堂上学到的东西可以自己动手编写,将其 转化成一些实用的技 能。如果是一个程序写完一处错误也 没有,会有种成就感,于是兴趣 就来了,兴趣来了,自然 学的东西也就多了,能把理论变成实际的技 能,让我对 C 语言有了浓厚的兴趣和更深层的认识。

 C 语言是一个有序 的学习, 学了最基本的替换, 然后扩展到循环, 嵌套, 条 理很清楚, 不是一个零散的知识, 实际上所有的课程都如 此, 不过通过实习我也知道了自己的不足,存在的很多问 题。比如自己写 的写的小程序出了问题,不会解决了就叫 老师帮忙,但是会养成一种 依赖的心理,碰到问题了个想 到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力, 争取 做到老师不在身 边的时候也可以完成一些简单的程序编写 与错误排除。

 还有自己的基础知识不扎实, 遇到的问题, 没有很好的逻辑思维, 亲自编写一个陌生的程序的时候会 有种无法下手的感觉, 找不到突破 口。通过实习,逐渐理 清了顺序,对于简单的程序和一些相对比较繁 琐的嵌套, 循环, 不在是看着一头雾水。

 其实只要理清了思路, 把基 础 知识掌握了,然后有条不紊的分析,一步一步理解, C 语言 还是很 有意思的课程。

 自己亲自动手编写程序让我增加了 对 C 语言程序开发环境的了 解,在上课的时候老师就讲, 学习 C 语言最重要的是学习 C 语言的 逻辑思维,不管以 后从事什么行业,学习 C 语言都对自己的职业很 有帮助, 如果是从事编程工程工作的话,就更有帮助了,即使以后的 编程工作可能不用 C 语言,但是拥有扎实的 C 语言基础是 对工作很 有用的。

 当初在初步接触 C 语言的时候,看着 一堆“奇形怪状” 的符号, 觉得甚是无聊, 通过这次实训, 摆脱了那种似懂非懂的状态 ! 感谢学校安排这次实习和老 师的耐心讲解,让我学到了很多知 识,在实习过程中,同 学之间的相互探讨,老师的循循善诱,最终让 我们达到了 举一反三的效果, 在学知识的同时, 也增加了同学老师之 间 的感情。希望以后还会有更多类似的实习课程,在有限的大 学时间 内学到更多的实用技能,为以后的生活和工作打下一个良好的基础

版权所有:策划范文网 2010-2024 未经授权禁止复制或建立镜像[策划范文网]所有资源完全免费共享

Powered by 策划范文网 © All Rights Reserved.。沪ICP备20021408号