c语言程序设计实训报告 篇1
适用场景:高校计算机课程实训、编程能力考核
本文要点:复利计算逻辑构建、二进制逆序转换算法、方程根求解方法
行文逻辑:输入参数设置→选择语句应用→循环结构实现→结果输出处理
姓名:张弛
学号:1000491
题目一、 题目描述: 已知银行整存整取存款不同期限的月息利率(采用复利 方式,即利滚利)分别为 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 void main() { int years; float capital,sum;
scanf("%f %d",&capital,&years); switch(years) { case 1:sum=capital*pow(1+0.63*0.01,12);break; case 2:sum=capital*pow(1+0.66*0.01,24);break; case 3:sum=capital*pow(1+0.69*0.01,36);break;
case 4:sum=capital*pow(1+0.69*0.01,48);break;
case 5:sum=capital*pow(1+0.75*0.01,60);break; case 6:sum=capital*pow(1+0.75*0.01,72);break; case 7:sum=capital*pow(1+0.75*0.01,84);break; case 8: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 语句编写一个程序计算表达式: 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)在有根区间[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(假)为止才结束。 (三)Void main()是声明函数,并且是对主函数的声明。题目所 给的范围是(-10,10) ,因此在声明函数中定义一个 a 和 b 来代替区 间的范围,而用 c 来代指中间指也是最后的结果,在这个程序中 a、 b、c 都是随着范围不断变化的变量。如果(-10,10)的范围过大,
就需要循环语句来缩小区间范围, 即 a=c 或 b=c。 当函数值在 (-10,10) 中任意一点取得 0 时,就正是我们所要的结果。循环条件是当区间 a 和 b 的函数值小于精度 0.01。 运行效果截图:
附源程序如下: #include "stdio.h" 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)<0.01); /*解的精度为 0.01*/ printf("方程的解是:%f",c); }
题目四 题目描述:编写程序,给定一个整数 i,请求出另一个整数 j,使 i 和 j 在用 8 位二进制表示时互为逆序。例如:给定 i=3 时,应得到 j=192(3 的二进制为:00000011,192 的二进制为 11000000) 。 提示: ① 十进制整数转换为二进制整数用“除 2 求余”法。 ② 二进制整数转换为十进制整数用“按权相加”法。
设计思路: (一)二进制整数转化为十进制整数用“按权相加”法 (二)二十进制整数转化为二进制整数用“除 2 求余” ,用&转化。
(三)运算符:<<是指左移一位,>>是指右移一位,<<=结合时从右 到左运算, 其中 a<>a 是指 b 向右移 a 位, 左移一位相当于乘 2 右移 1 位相当于除 2 (四)在交换时,用的是中间法
运行效果截图: 附源程序如下:#include "stdio.h" void main() { int i,j,s=1,a[8]; printf("请输入一个整数 i: "); scanf("%d",&i); for(j=0;j<8;j++,s<<=1) { a[j]=i & s; } printf("所得到的 j 为: ");
printf("%d ",(a[0]<<7) | (a[1]<<5) | (a[2]<<3) | (a[3]<<1) | (a[4]>>1) | (a[5]>>3) | (a[6]>>5) | (a[7]>>7)); }
题目五 题目描述:编写程序,抓交通肇事犯。 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没 有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相 同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位 数学家,他说:四位的车号刚好是一个整数的平方。根据以上线索求 出车号。 提示: ① 按照题目的要求,造出一个前两位数相同、后两位数相同且相互 间又不同的整数,然后判断该整数是否是另一个整数的平方。 ② 用穷举法解此题。穷举法是最简单、最常见的一种程序设计方法, 它充分利用了计算机处理的高速特征。穷举法的关键是要确定穷 举的范围,既不能过分扩大穷举的范围,也不能过分缩小穷举的 范围,否则程序的运行效率会很低,或有可能遗漏正确的结果而 产生错误。
设计思路:
(一)11 11
到 11
99
在
99 11 这样 穷举
判断是否一个
数的平方 则是 将这个数开方
取整 再取平方 是否还是原来的数
(二)此题需要满足三个条件:①前两个数相同,后两个数相同;② 前后两数分别不相同;③这个数是一个整数的平方。需要每个条件都 满足,if 才为真。 (三)主要思路是穷举。穷举是指在适当的范围内举出一个数。 运 行 效 果 截 图 :
附源程序如下: #include void main() { int a,b; for(a=32;a<=99;a++)
{ b=a*a; if(b/1000==b%1000/100 b%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 "stdio.h" int f(int x,int n) { int i,m=0; for(i=0;i
for(i=0,s=0;f(x,i)<0.001;i++) s+=f(x,i); printf("其结果为:%d ",s); }
题目七 题目描述:打印出以下的杨辉三角形(要求打印出 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 a[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
题目八 题目描述:找出一个二维数组的“鞍点” ,即该位置上的元素在该行 上最大,在该列上最小。 提示: ① 一个二维数组可能有鞍点也可能没有鞍点,若有鞍点,则只有一 个。
② 准备两组测试数据: (1) 二维数组有鞍点: 9 80 205 90 -60 210 40
96 1 89
-3 101
(2) 二维数组没有鞍点: 9 80 205 90 -60 210 40 1 89
196
-3 101 7
45 54 156
③用 scanf 函数从键盘输入数组各元素的值,检查结果是否正确。如 果已指定了数组的行数和列数,可以在程序中对数组元素赋初值,而 不必用 scanf 函数。请同学们修改程序以实现之。
设计思路: (一) 先找出一行中值最大的元素,然后看它是不是该列中的最小值,由于 一个二维数组最多有一个鞍点,所以如果是则鞍点存在且它就是鞍 点,输出该鞍点;如果不是,则再找下一行的最 大数,以此类推。如果每一行的最大数都不是鞍点,则此数组无鞍点 (二) 在程序中,先令 a[i][0]最大赋值给 maxi,在 for 循环的比较中,把
符合条件的行的最大值赋给 maxi,将每一次比较后的最大的列数赋 值给 maxj,从而找出 i 行最大的那个。 再假设那个数就是鞍点,将最大数和同列的数值相比,如果 maxj 不 是最小的,则不是鞍点,继续找。 (三)引入一个参数 flag=1,若不存在鞍点则 flag 为 0,若存在鞍 点则 flag 依旧为 1
运行效果截图:
附源程序如下:#include "stdio.h" #define S 80 #define T 80 void main() { int m,n,i,j,t,maxh,maxl,flag,a[S][T]; printf("请输入二维数组的行数 m 和列数 n: "); scanf("%d %d",&m,&n); printf("请输入二维数组的各个元素: ");
for(i=0;ia[i][0]) t=a[i][j];maxh=i;maxl=j; } for(i=0;i
a[%d][%d]=%d ",maxh,maxl,a[maxh][maxl]); }
题目九 题目描述:某班期终考试科目为高数 MT、英语 EN 和物理 PH,有 30
个人参加考试。为评定奖学金,要求统计并输出一个表格,表格内容 包括学好、各科分属、总分和平均分,并标出 3 门课均在 90 分以上 者(该栏标志输出为 Y,否则为 N) ,表格形式如下: NO MT EN PH SUM V >90 1 2 3 97 87 92 276 92 92 91 90 273 91 90 81 82 253 84 ...... N Y N
#include "stdio.h" void main()
设计思路:由于是对 30 个学生的数据进行输入与统计,所以建立二 维数组, 根据各位置的条件来定义其内容, 第 8 个数据是字符型数据, 所以另设一数组进行存储,最后在将数据整合输出。
附源程序如下:#include "stdio.h" void main() { int i,j,sum,flag,a[30][7]; printf("请输入 30 个考生的三科成绩: ");
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; else flag=0; } a[i][4]=sum; a[i][5]=sum/3; if(flag=1) a[i][6]="Y"; else a[i][6]="N";
} printf("NO MT EN PH SUM V >90 "); for(i=0;i<30;i++) for(j=0;j<6;j++) { printf("%5d",a[i][j]); printf(" %c ",a[i][6]); }
}
题目十 题目描述下面是一个 5*5 阶的螺旋方阵,试编程打印出此形式的 n*n (n<10)阶的方阵(顺时针旋进) 。 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 提示:用二维数组实现。
设计思路:定义一个 n*n 维数组存放该方阵,m 为该方阵的圈数,一个大循环中嵌套了
四个小循环,每一圈为一个大循环,第一个小循环按顺序写出第一行的数,第二个小循环按 顺序写出最后一列的数, 第三个小循环按顺序写出最后一行的数, 第四个小循环按顺序写出 第一列的数,再进行第二次大循环,循环完毕后再进行循环输出数组中的 n*n 个数,该螺旋 方阵就出来了。
附源程序如下: #include "stdio.h" void main() { int i, j, k = 0, m, n,a[10][10]; printf("请输入方阵行列数 n(n<10): "); scanf("%d",&n); if(n%2==0) m = n / 2; else m = n / 2 + 1; for(i=0;i
k++; a[i][j]=k; } for (j=i+1;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
printf("%5d", a[i][j]); printf(" "); } } 附:
实习总结与心得体会
经过 C 语言实习,让我加深了对 C 语言的了解,而不只是单单 的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编 写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理 论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。 不过,通过几天的实习,逐渐积攒了一些经验,有些错误可以很快就 看出来。 这次实习有很大的收获,让我对 C 语言有了更深的认识,平时 在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技 能。如果是一个程序写完一处错误也没有,会有种成就感,于是兴趣 就来了,兴趣来了,自然学的东西也就多了,能把理论变成实际的技 能,让我对 C 语言有了浓厚的兴趣和更深层的认识。 C 语言是一个有序的学习, 学了最基本的替换, 然后扩展到循环, 嵌套, 条理很清楚, 不是一个零散的知识, 实际上所有的课程都如此, 不过通过实习我也知道了自己的不足,存在的很多问题。比如自己写 的写的小程序出了问题,不会解决了就叫老师帮忙,但是会养成一种 依赖的心理,碰到问题了个想到的是求助而不是自己独立解决,所以
以后要多多锻炼自己的信心和增加自己的能力, 争取做到老师不在身 边的时候也可以完成一些简单的程序编写与错误排除。 还有自己的基础知识不扎实, 遇到的问题, 没有很好的逻辑思维, 亲自编写一个陌生的程序的时候会有种无法下手的感觉, 找不到突破 口。通过实习,逐渐理清了顺序,对于简单的程序和一些相对比较繁 琐的嵌套,循环,不在是看着一头雾水。其实只要理清了思路,把基 础知识掌握了,然后有条不紊的分析,一步一步理解,C 语言还是很 有意思的课程。 自己亲自动手编写程序让我增加了对 C 语言程序开发环境的了 解,在上课的时候老师就讲,学习 C 语言最重要的是学习 C 语言的 逻辑思维,不管以后从事什么行业,学习 C 语言都对自己的职业很 有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的 编程工作可能不用 C 语言,但是拥有扎实的 C 语言基础是对工作很 有用的。 当初在初步接触 C 语言的时候,看着一堆“奇形怪状”的符号, 觉得甚是无聊,通过这次实训,摆脱了那种似懂非懂的状态! 感谢学校安排这次实习和老师的耐心讲解,让我学到了很多知 识,在实习过程中,同学之间的相互探讨,老师的循循善诱,最终让 我们达到了举一反三的效果,在学知识的同时,也增加了同学老师之 间的感情。希望以后还会有更多类似的实习课程,在有限的大学时间 内学到更多的实用技能,为以后的生活和工作打下一个良好的基础。
C语言程序设计实训报告 篇2
适用场景:C语言实验报告撰写、程序调试操作指导
本文要点:记录C程序建立过程、分析数据类型运算结果、修正选择结构错误
第一章 基础掌握
1.1 实验目的
掌握c程序设计编程环境visual c++,掌握运行一个c程序的基本步骤,包括编辑、编译、链接和运行。(]
1.2 实验要求
在报告中记录建立、保存c程序实习过程。
1.3 实验基本内容
编写程序,在屏幕上显示一个短句“hello world”
(1) 程序:
1) 编译如下程序:
#include
void main
{
printf (“hello world!”);
}
2)链接。执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
(2) 运行结果:
输出结果:hello world!
总结:
掌握c语言程序设计的基本框架,能够编写简单的程序。
第二章 数据类型
2.1 实验目的
(1) 掌握c语言的运算符和表达式的正确使用以及c语言的几种基本数据类型和基本输入输出函数的使用方法。()
(2)通过编程进一步理解和掌握运算符的确切含义和功能。
2.2 实验要求
(1) 在报告中记录建立、保存c程序实习过程。 (2) 完成典型题目,分析遇到的困难和实验中的收获。
2.3 实验基本内容
输入程序,观察输出结果 1>./*test2.1c*/
1)编译如下程序: #includevoid main {
char ch; int k;
ch="a",k="b";
printf("%d,%x,%c",ch,ch,ch,ch,k); printf("k=%%d",k) }
2)链接。执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
2>./*test2.2c*/
1)编译如下程序: #includevoid main {
float a1,a2; double b1,b2; a1=1234.12; a2=0.000001; b1=1234.12;
b2=0.000001;
printf("%f,%l f",a1+a2,b1+b2);
}
2)链接。执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
实验结果:
97.61,141,ak=xd
实验结果:
扩展:c语言程序实验报告 / c语言实验报告 / c语言程序设计报告
1234.120089,1234.120001
总结:
学会c语言的运算符和表达式的正确使用
第三章 选择结构程序设计
3.1 实验目的
学会改正程序中的错误
3.2 实验要求
(1) 在报告中记录建立、保存c程序实习过程。(]
(2) 完成典型题目,分析遇到的困难和实验中的收获。
3.3 实验基本内容
输入实验程序,程序有错,改正程序中的错误
1)输入如下程序:
#include
#include
void main
{
double a,b,c,d;
printf("输入一元二次方程a=,b=,c=");
scanf("a=%l f,b=%l f",&a,&b,&c); if(a==0) { if(b=0) } { } else print f("x=%0.2f",-c/b); if(c==0) print f("0==0参数对方程无意义!”); else print f("c!=0方程不成立"); else if(d>=0) { printf("x1=%0.2f",(-b+sq rt(d))/(2*a)); printf("x1=%0.2f",(-b-sq rt(d))/(2*a)); } else {
printf("x1=%0.2f+%0.2fi",-b/(2*a),s q rt(-d)/(2*a)); printf("x1=%0.2f-%0.2fi",-b/(2*a),s q rt(-d)/(2*a));
}
}
2)链接。()执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
实验结果:
运行不了程序 ,做以下修改:
#include
#include
void main
{
//
//
double a,b,c,d; printf("输入一元二次方程a=,b=,c="); scanf("a=%l f,b=%l f",&a,&b,&c); c=5; if(a==0) //{ /*if(b=0) { } else printf("x=%0.2f",-c/b); if(c==0) printf("0==0参数对方程无意义!”); else printf("c!=0方程不成立"); }*/ else if(d>=0) { } else { } printf("x1=%0.2f",(-b+sq rt(d))/(2*a)); printf("x1=%0.2f",(-b-sq rt(d))/(2*a)); printf("x1=%0.2f+%0.2fi",-b/(2*a),sq rt(-d)/(2*a)); printf("x1=%0.2f-%0.2fi",-b/(2*a),sq rt(-d)/(2*a));
}
这样就可以输出程序了。
总结: 学会使用逻辑运算符和逻辑表达式,掌握简单的查错方法,并改错。
第四章 循环程序设计
4.1 实验目的
熟练使用whiledo…while语句实现循环程序设计。[)
4.2 实验要求
(1) 在报告中记录建立、保存c程序实习过程。
(2) 完成典型题目,分析遇到的困难和实验中的收获。
4.3 实验基本内容
1) 编译如下程序:
#include
void main
{
int m,n,j,k; printf("input m n"); while(scan f ("%d",&m,&n),m<0&&n<0); j=m; while(j/n!=0) j=j+m; k=(m*n)/j; printf("最小公倍数是%d最大公约数是%d",j,k); }
2)链接。执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
实验结果:
input m n
5 2
然后运算出来结果:
最大公倍数是5
最大公约数是0
总结:
学使用for,while,do...while语句实现循环程序,
第五章 程序设计
5.1 实验目的
检验最近学习成果,进一步巩固c语言的学习
5.2 实验要求
1)输入任意四位数,写出个,十,百,千位上的数 2)连接任意两个字符串
5.3 实验基本内容
1)编译如下程序: #includevoid main {
int a,b,c,d,x; scanf("%d",&x); if(999<10000) {
a=x/1000;
b=x/100-a*10;
c=x/10-a*100-b*10; d=x-a*1000-b*100-c*10; printf("%d",x);
1)编译如下程序: #includemain {
char s1[10],s2[5]; int i,j;
scanf("%s",s1); scanf("%s",s2); i=j=0;
while(s1[i]!="") i++;
printf("a=%d,b=%d,c=%d,d=%d",a,
b,c,d); }
}
while((s1[i++]=s2[j++])!=""); printf("string no.1. %s",s1); }
2)链接。(]执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
2)链接。执行build-命令。
3)运行。执行build execute 命令。显示结果。
4)关闭程序工作区。
实验结果: abcd
adsg
string no.1.abcdadsf
实验结果:
2678 2678
a=2,b=6,c=7,d=8
总结:通过对程序的设计提高编程能力
C语言程序设计实训报告 篇3
适用场景:程序设计课程作业提交、编程技能考核准备
本文要点:判断素数函数实现、循环结构应用、数组存储素数数据
实验名称 计算出1000以内10个最大素数之和
实验目的
1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。
2、熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。
3、掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。
实验内容
计算并输出1000以内最大的10个素数以及它们的和。
要求:
在程序内部加必要的注释。
由于偶数不是素数,可以不考虑对偶数的处理。
虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。
输出形式为:素数1+素数2+素数3+…+素数10=总和值。
算法描述流程图
main函数:
判断素数:
源程序
#include
#include
int sushu(int n)/* 判断素数的函数 */
{
int t,i;
t=sqrt(n);
for(i=2;i<=t;i++)
if(n%i==0)/* 如果不是素数,返回 0 */
return 0;
return n;/* 如果是素数,返回该数 */
}
void main()
{
int i,j=0,n,m=0,a[1000],x;
/*clrscr();*/
printf("please input a number form 1 to 1000:");
scanf("%d",&x);
if(x==2)/* x=2时的处理 */
printf("%dn",x);
else if(x<=1) /* x在1~1000范围外时的处理 */
printf("error!n");
else
{
if(x%2==0)/* x为偶数时,把x变为奇数 */
x--;
for(i=x;i>1;i-=2)/* x为奇数时,做函数计算 */
{
n=sushu(i); /* 做判断素数的函数调用 */
if(n!=0)/* 对素数的处理 */
{
a[j]=n;/* 把素数由大至小存入数组a[ ]中 */
j++;
if(j<11)
m+=n; /* 统计前10个素数之和 */
}
}
if(j<10)/* 当素数个数小于10个时,结果输出 */
{
for(i=0;i
{
n=a[i];
printf("%d",n);
printf("+");
}
printf("2=");
printf("%dn",m+2);
}
else for(i=0;i<10;i++)/* 当素数个数大于等于10个时,结果输出 */
{
n=a[i];
printf("%d",n);
if(i<9)
printf("+");
else
{
printf("=");
printf("%dn",m);
}
}
}
}
测试数据
分别输入1000、100、10测试。
运行结果
出现问题及解决方法
当素数个数小于10时的处理不够完善,考虑不够周全。把“+2”的处理做的太勉强。
程序过大,不够精简,无用文字太多。
学习耐心与细心不足,如scanf(“%d”,&n);中的“&”经常忘记。
编程思想不够发散,例如如何判断素数,只能想出2种方式(其中1种为参考教科书上内容);在今后学习中应更多的动脑,综合运用所学。
基本功不够,如清屏clrscr()等函数用的不好,有时同样的.问题多次犯,给实验课老师带来很大的麻烦。这说明我的知识不够广,有很多有用但不做考试要求的书中内容没有学好,认识程度不够深刻。就算以后c语言这门课程结束后,也应多看相关东西,多上机练习,才能真正从本质上提高自己。
物理实验报告 ·化学实验报告 ·生物实验报告 ·实验报告格式 ·实验报告模板
知识不够广泛,如vc++6.0等程序,自己试了好一阵也不会用;说明我电脑水平还是不够,自学能力不够。已会的东西掌握的还是不够好。
实验心得
通过本次c语言上机实验,我对这个介于人类与非人类之间
的计算机编程语言有了一定的体验。其间开心过、郁闷过、无奈过、彷徨过……随着实验的胜利成功与实验报告的胜利完成,有点微微的自豪感使人难忘。感谢高克宁老师的高标准、严要求,感谢实验课上小老师们的耐心指点,也感谢我在实验中经历过的点点滴滴……伴随着学习的深入,我发现高深的东西还有很多很多,等待着我自己去挖掘。对c语言,我会更加努力。
