C语言程序设计实践课程报告.docx
北方民族大学课程报告课程名称:程序设计实践专业班级:软件工程(2)班学生姓名:李思良学号:20152170任课教师:王晓锋学 期:2015-2016学年春季学期课程报告任务书题 目30个小程序组合成一个大程序主要内容1- -已知半径求圆面枳2- -已知球半径,求表面积和体积3- -输入两个实数,交换其值输出4- -输入两个整数,求他们的平方和5- -分段计费6- -求一元二次方程的根7- -判断三个整数是否能构成三角形8- -计算11000之间能被三整除的所有自然数之和9- -猴子吃桃问题10- -输入一个正整数,求位数和位数之和11- -输入一行字符,统计大小写字母,数字和其他字符12- -输入一个四位数,将其加密后输出14- -用for,while, dowhile循环实现100以内素数之和15- -将大于10元小于100元的钱换成1元,2元,5元的组合16- -输出99乘法口诀17- -验证哥德巴赫猜想18- -求两个正整数的最大公约数和最小公倍数19- -判断素数20- -求(m,n)以内全部素数,每行输出10个21- -输出10000到99999的所有回数22- -两个6*6矩阵的乘积23- -对一批数进行排列,求出最大值与平均数24- -输入一批学生的成绩,换成五分制25- -逆序输出26- -求阶乘27- -用递归函数求Fibonacci数列的前40个数,每行输出8个28- -输入某年某月某日,判断这一天是这一年的第几天29- -写出1000以内的所有完数30- -输入年和天数,输出对应的年、月、日将以上30个子函数放在一个主函数内进行调用。任务要求一、提交材料应包括:(1)系统源代码(2)课程报告二、整个设计过程具体要求(1)需求分析 对子函数各功能进行分析,设计出需要完成的功能,完善各个 子函数的调用关系;(2)设计过程进一步明确各模块调用关系,进一步完善模块函数细节(函数名、 参数、返回值等)(3)实现过程 养成良好的编码习惯、完成各个模块并进行测试,最终完成系统 整体测试;(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。成绩评定报告撰写情况(30分)系统完成情况(30分)答辩情况(40分)总分内容 20分规范程度 5分程序测试 5分基本功能 20分扩展功能10分自述情况 10分答辩情况30分成绩评定教师:1. int diyi()2. int dier()3. void disan()4. void disi()5. void diwu()6. void diliu()7. void diqi()8. void diba()9. void dijiu()10. void dishi()11. void dishiyi()12. void dishier()13. int dishisan()14. void dishisi()15. void dishiwu()16. void dishiliu()17. void dihsiqi()18. void dishiba()求两个正整数的最大公约数和最小公倍数19. void dihsijiu()20. void diershi()21. void diershiyi()22. void diershier()23. void diershisan()1. 需求分析经过大一上学期的理论学习,在基础实验的基础上,本学期我们继续开设了C语言程序 设计实践课。课程要求我们对已经学习的基础实验进行整合与衔接处理,并最终形成一个系 统性质的规模较大的程序。本次课程设计要求我们达到能独立完成一个1000行以上的程序,完成后要求实现已知半径求 圆面积、已知球半径,求表面积和体积,输入两个实数、交换其值输出等30中功能。通过整个程序的开发过程,最终使我们掌握利用计算机解决实际问题的基本方法,熟悉C语言开发的全过程,提高综合应用C语言的能力、编程和调试能力,为学习计算机后续课 程打好专业基础。2. 概要设计模块划分:已知半径求圆面积已知球半径,求表面积和体积输入两个实数,交换其值输出输入两个整数,求他们的平方和分段计费求一元二次方程的根判断三个整数是否能构成三角形计算11000之间能被三整除的所有自然数之和猴子吃桃问题输入一个正整数,求位数和位数之和输入一行字符,统计大小写字母,数字和其他字符输入一个四位数,将其加密后输出用冒泡排序对10个数排序用for,while, dowhile循环实现100以内素数之和将大于10元小于100元的钱换成1元,2元,5元的组合输出99乘法口诀验证哥德巴赫gcd(int m,int n) int lcm(int m,int n)int isprime(int m)判断素数求(m,n)以内全部素数,每行输出10个输出10000到99999的所有回数两个6*6矩阵的乘积void allPrimes(int m,int n) void sort(int array,int n)对一批数进行排列,求出最大值与平均数24. int diershisi() char switchScore(int score)输入一批学生的成绩,换成五分制25. void diershiwu()逆序输出 long reverse(long number)返 回 number 的逆序数26. void diershiliu() 求阶乘27. void diershiqi()用递归函数求Fibonacci数列的前40个数,每行输出8个28. int dierhsiba()输入某年某月某日,判断这一天是这一年的第几天29. void diershijiu() 写出1000以内的所有完数30. void disanshi() void MonthDay(int year,int yearDay,int *pMonth,int *pDay)输入年和天数,输出对应的年、月、日31. void myprint() 显示菜单界面将以上30个子函数放在一个主函数内进行调用。int main() 主函数3. 详细设计:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#include<string.h>#define PI 3.14void myprint();/*显示菜单界面*/*此函数的功能是:已知圆半径R的值,求圆的面积S。*/int diyi()float r,area;printf("请输入圆的半径:”);scanf("%f”,&r);area = PI * r *r;printf("该圆的面积为:fn”,area);return area;/*此函数的功能是:已知球半径R的值,求球的表面积S和球的体积V。S = 4 n R2; V = 4/3 n R3 ;*/int dier()float r,s,v;printf("请输入球的半径:”);scanf("%f”,&r);s = 4 * PI * r *r;printf("该球的表面积为:fn”,s);v = s * r / 3;printf("该球的体积为:fn”,v);/*此函数的功能是:从键盘输入两个实数,并交换其值后输出。*/void disan( )double x,y,z;printf("请输入两个实数:");scanf("%lf%lf”,&x,&y);printf("交换前两个实数为:f,%fn”,x,y);z = x; x = y; y = z;printf("交换后两个实数为:f,%fn”,x,y);/*此函数的功能是:从键盘输入两个整数,输出它们的平方和。*/void disi( )int x,y,z;printf(-请输入两个整数:”);scanf("%d%d”,&x,&y);printf("%d 和d 的平方和为:dn”,x,y,x*x+y*y);/*此函数的功能是:创建时间:*/void diwu()int x;double y;printf(-请输入 x :”);scanf("%d”,&x );if( x < 0)y = 0;else if (x>=0 && x<=15)y = 4*x/3.0;elsey = 2.5*x-10.5;printf("x = %d, y = f(x) = %lf n”,x, y);/*此函数的功能是:编写程序,求一元二次方程ax2+bx+c=0的根。创建时间:*/ void diliu()float a,b,c,delt,x1,x2;printf("请输入系数 a,b,c :");scanf("%f%f%f”,&a,&b,&c );if(a !=0)delt = b * b - 4 * a * c;if(delt = 0)x1 = x2 = -b / (2 *a);printf("有两个相同的实根:.2f.n”,x1);else if(delt > 0)x1 = (-b + sqrt(delt)/(2*a);x2 = (-b - sqrt(delt)/(2*a);printf("有两个不同的实根:x1 = %.2f,x2 = %.2f。n”,x1,x2); else printf("无实根。n");elseprintf("不是一元二次方程。n");该程序的功能是:/*从键盘输入三个整数,判断能否由它们作为三边长构成一个三角形。(提示:任意两边之和大于第三边。)*/void diqi()int a,b,c;printf("请输入三个整数:”);scanf("%d%d%d”,&a,&b,&c);if(a+b>c && a+c>b && b+c>a)printf("三个整数可以作为三条边构成一个三角形。n");elseprintf("不能构成一个三角形”);该函数的功能是:用循环语句计算11000之间的能被3整除的所有自然数的和。/*分别用do.while, while, for三种循环语句求和,输出结果。*/void diba( )int i,sum_for = 0;for( i=3; i<1000; i+=3 )sum_for = sum_for + i;printf("使用 for 循环计算 3+6+9+.+999 的和,结果为:%d n",sum_for);/*此函数的功能是:解决猴子吃桃问题创建时间:*/void dijiu()( int day,peach_num;peach_num = 1; /第10天的桃子个数/printf("第 10 天的桃子个数为 %6d .n",peach_num);for(day=9; day>=1; day-)peach_num = 2 * (peach_num + 1);/printf("第 %2d 天的桃子个数为 %6d .n”,day,peach_num);/第一天的桃子数即为所摘的桃子总数。输出第一天的桃子数。printf("第1天摘的桃子总数为%d .n”,peach_num);/*输入一个正整数,求该整数的位数和各位数之和。*/*逆序输出一个正整数*/void dishi(void)int n,count = 0, sum = 0,m;printf("Enter n: ");/* 输入提示 */scanf ("%d", &n);m = n; /保存输入的n的值,便于后面输出while(n != 0)sum += n % 10;n = n / 10;count + ;printf("该数是%d,它共有d位,它的各个数字之和%d。n",m,count, sum);9 / 39该函数的功能是:/*输入十个字符,分别统计其中的英文大写字母,小写字母、数字字符和其他字符。*/ void dishiyi()int count_upper = 0, count_lower = 0, count_digit = 0, count_other = 0,i,j;char ch10;printf("请输入十个字符,最好包含大小写字母、数字和其他符号:n");getchar();for(i=0;i<10;i+)scanf("%c”,&chi);printf("%c”,ch9);for(j=0;j<10;j+)if(chj >= 'A' && chj <= 'Z') count_upper +;else if(chj >= 'a' && chj <= 'z') count_lower +;else if(chj >= '0' && chj <= '9') count_digit +;elsecount_other +;printf("大写字母有%3d个,n小写字母有%3d个,n数字字符有%3d个,n其他字符有%3d 个.n",count_upper,count_lower,count_digit,count_other);return ;/*此函数的功能是:编写程序,完成以下功能:输入一个四位数,将其加密后输出。方法是该数每一位上的数字加9,然后除以10取余,作为该位上的新数字,最后将千位和十位上的数字互换,百位和各位上的数字互换,组成加密后的新四位数。如:输入 1257 ,输出 4601。创建时间:*/void dishier()int x,y,ge,shi,bai,qian;因为是要输入一批四位数,所以用循环结构;while(1)printf(-请输入一个四位的正整数x:");scanf ("%d”,&x);if(x<1000 | x>9999) break; 如果输入的不是一个四位数,则结束循环。/分离各位上的数字qian = x / 1000;bai = x % 1000 /100; /bai = x/100 - qian*10;shi = x % 100 /10;/shi = x/10 - qian*100 - n*10;ge = x % 10;/ge = x - qian*1000 - n*100 - o*10;printf("加密前该数的各位数字分别为:%d %d %d %dn”,qian,bai,shi,ge);查看分离的各个数字是否正确/加密qian = (qian + 9) % 10;bai = (bai + 9) % 10;shi = (shi + 9) % 10;ge = (ge + 9) % 10;y = shi * 1000 + ge * 100 + qian * 10 + bai;printf("加密前该数为:%-6d,加密后该数变为:-6dn”,x, y);/*此函数的功能是:用冒泡法对10个数进行排序*/int dishisan()int i,j,t,a10;printf("imput 10 numbers:");for(i=0;i<10;i+)scanf("%d”,&ai);for(i=0;i<10;i+)for(j=0;j<10;j+)if(aj<aj+1)t=aj;aj=aj+1;aj+1=t;printf("nthe result is :n");for(j=0;j<10;j+)printf("%d ",aj);/*此函数的功能是用for,while,do-while循环实现100以内所有偶数之和 * */ void dishisi()int i,sum=0;printf("用 for,while,do-while循环实现100以内所有偶数之和”);for(i=2;i<=100;i+=2)sum+=i;printf("for 循环:sum=%dnn",sum);i=2;sum=0;while(i<=100)sum+=i;i+=2;printf("while 循环:sum=%dnn",sum);i=2;sum=0;dosum+=i;i+=2;while(i<=100);printf("do-while 循环:sum=%dnn",sum);/*此函数的功能是:将一笔钱(大于10元,小于100元)换算成1元、2元和5元的纸币组合。输入金额,问有几种换算方法?针对每一种换算方法,输出各种面额的纸币数量,要求每种硬币至少有一枚。创建时间:*/void dishiwu()( int num_1,num_2,num_5,count = 0;int money;printf(-请输入要换算的钱的金额:");scanf("%d”,&money);printf(-针对每种换算方法,各种面值的纸币的数量分别为:n5元 2元 1元n");for(num_5 =1; num_5 <= money/5 ; num_5 +)for(num_2 =1; num_2 <= money/2 ; num_2 +)for(num_1 =1; num_1 <= money ; num_1 +)if( money = 5 * num_5 + 2 * num_2 + 1 * num_1)printf("%6d%6d%6dn”,num_5,num_2,num_1);count +;printf("共有 %d 种换算方法。n",count);/*该函数的功能是:用循环结构输出”九九乘法表”。*/ void dishiliu()int i,j;for(i = 1; i <= 9; i+ )for(j = 1; j <= i; j+ )printf("%d * %d = %2d, ",i,j,i*j);3 “/*该函数的功能是:验证哥德巴赫猜想:任何一个大于6的偶数均可表示为2个素数之和。要求将6到100之间的偶数都表示为2个素数之和,输出时一行输出4组。基本思想:对6100之间的所有偶数n,若n = a + b,则首先a、b 一定都是奇数,所以选用穷举法对a(3n/2范围内的奇数)的值从3开始列举,若a是素数,再判断b是否为素数。*/ void dishiqi()int n,i,a,b,c,d;int count ;printf(-验证哥德巴赫猜想:任何一个大于6的偶数均可表示为2个素数之和nn");for(n = 6;n <= 100; n = n+2)count = 0;for( a = 3; a<= n/2; a = a + 2)/判断a是否为素数 c = sqrt(a);for(i=2;i<= c;i+)if(a % i = 0) break;if( i> c) /a是素数的情况下/判断b是否为素数b = n - a;d = sqrt(b);for(i=2;i<= d;i+)if(b % i = 0) break;if( i> d) /b是素数的情况下printf(" %3d = %3d + %3d ”,n,a,b);count +;if(count % 4 =0)printf("n");printf("n");/*此函数的功能是:求两正整数的最大公约数和最小公倍数,用一个函数求最大公约数,另一个函数求最 小公倍数。*/int gcd(int m,int n);int lcm(int m,int n);void dishiba()printf("求两正整数的最大公约数和最小公倍数nn");int m,n, a,b;printf("input m,n:");scanf("%d%d”,&m,&n);a = gcd(m,n);b = lcm(m,n);printf("gcd(%d,%d)=%dn”,m,n,a);printf("lcm(%d,%d)=%dn”,m,n,b);/使用枚举法求最大公约数int gcd(int m,int n)( int i,temp;temp = m < n ? m : n ; 临时变量temp存储m、n中较小的数for(i = temp; i >= 1; i- ) /在1,temp之间找公倍数if( m % i = 0 && n % i = 0 ) return i;/使用枚举法求最小公倍数int lcm(int m,int n)( int i,temp;temp = m > n ? m : n ; 临时变量temp存储m、n中较大的数for(i = temp; i <= m * n; i+ ) /在temp, m*n之间找公倍数if( i % m = 0 && i % n = 0 ) return i;/*此函数的功能是:写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。*/void dishijiu()( int n;int isprime(int m); /此处是函数声明printf("请输入一个正整数:”);scanf("%d”,&n); 输入一个正整数nif(isprime(n) = 1) printf("%d is a prime.n",n);elseprintf("%d is not a prime.n”,n);/*定义判断素数的函数,如果x是素数则返回1("真”);否则返回0 (”假”)*/int isprime(int m)int i;double n;if(m = 1) return 0;/* 1不是素数,返回0 */n = sqrt(m);for( i = 2; i <= n; i+)if (m % i = 0)/*如果m不是素数*/return 0;/*返回0 */return 1;/* m是素数,返回1 */*求m,n以内的全部素数(1vmv=nv500),每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。*/*使用嵌套循环求一定范围以内的全部素数*/*调用求平方根函数,需要包含数学库*/*声明:判断素数的函数,如果x是素数则返回1("真”);否则返回0 (”假”)*/int isprime(int m);声明子函数:输出m,n 范围内的所有素数。void allPrimes(int m,int n);void diershi()int count, m, n,x;printf("请输入正整数的范围m和n(1<mv=n<500):);scanf("%d%d”,&m,&n);/*count = 0;/count记录素数的个数,并用于控制输出格式for(x = m; x <= n; x+)if(isprime(x)/如果x是素数printf("%6d”, x); / 输出 xcount+;累加已经输出的素数个数if(count % 10 = 0) /如果 count 是 10 的倍数,换行printf("n");*/allPrimes(m,n);调用子函数来完成此功能printf("n");定义子函数:输出m,n范围内的所有素数。void allPrimes(int m,int n)int x,count=0;for(x = m; x <= n; x+)if(isprime(x)/* 如果 x 是素数 */printf("%6d”, x);/* 输出 x */count+;/*累加已经输出的素数个数*/if(count % 10 = 0) /* 如果 count 是 10 的倍数,换行 */printf("n");/*输出10000到99999的所有回文数”回文数”是一种数字.如:98789,这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数.还有10001,11111,12721等都是回文数.*/void diershiyi()printf("输出 10000 到 99999 的所有回文数nn");19 / 39int a,b,c,d,e;long f=10000;dof+;a=f/10000;b=(f-a*10000)/1000;c=(f-a*10000-b*1000)/100;d=(f-a*10000-b*1000-c*100)/10;e=f-a*10000-b*1000-c*100-d*10;if (a=e&&b=d) printf("%8ld",f);while (f);/*求两个矩阵的乘积*/void diershier()int a66;int i,j,sum=0;int max=0;printf("请输入一个6*6数组的各个元素:n");for(i=0;i<6; i+)for(j=0;j<6;j+)scanf("%d”,&aij);if(aij>max)max=aij;sum+=aij;printf("最大值为:dn所有元素的和为%dn",max,sum);for(i=0;i<6;i+)for(j=0;j<6;j+)if(aij=max)printf("最大值的行标:d 列标:dn”,i+1,j+1);break;if(aij=max)break;/*对一批数进行排列,并求出最大值与平均数*/#define MAX 100#define S) int t;t=x;x=y;y=t;void diershisan()int n,i;void sort(int a,int );int arrayMAX;printf(-你想对多少个数进行排序:n");scanf("%d”,&n);srand(unsigned)time(NULL);for(i=0;i<n;i+)arrayi=rand()%50;printf("n输出排序前的数:n");for(i=0;i<n;i+)printf("n");sort(array,n);void sort(int array,int n)int i,k,j;double av=0;for(i=0;i<n-1;i+)k=i;for(j=i+1;j<n;j+)if(arrayj>arrayk)k=j;if(k!=i)Si,arrayk);for(i=0;i<n;i+)av+=arrayi;printf("输出排序后的数:n");for(i=0;i<n;i+)printf("%3d”,arrayi);printf("n 最大数是:dn”,array0);printf("平均数是:lfn”,av/n);printf("n");/*此函数的功能是:将学生成绩由百分制换算成五分制创建时间:*/char switchScore(int score);void diershisi()int score;char grade;char switchScore(int score);while(1)因为是要输入一批四位数,所以用循环结构;printf("请输入一个100以内的正整数:");scanf("%d”,&score );if(score<0 | score>100) break; /若输入的不是100以内的整数,在结束循环。grade = switchScore(score);/*printf(,输入的百分制成绩为:%-6d,其对应的五分制等级为:-6cn”,score, grade);*/ char switchScore(int score)char grade;switch( score / 10) case 10:case 9: printf("An");break;case 8: printf("Bn");break;case 7: printf("Cn");break;case 6: printf("Dn");break;default: printf("En");/*输入一个正整数,将它逆序输出。要求定义并调用函数reverse (number),它的功能是返回number的逆序数。例如 ,reverse ( 12345)的返回值是 54321.*/*逆序输出一个正整数*/void diershiwu()printf("逆序输出一个正整数nn");long n,m;long reverse(long number);printf("Enter n: ");/* 输入提示 */scanf ("%d", &n);m = reverse(n);printf("该数是:%d,它的逆序数是:d.n”,n,m);long reverse(long number) long m ;m = 0; /保存输入的n的值,便于后面输出while(number != 0)(m = m * 10 + number % 10 ;number = number / 10;return m ;求1-100阶乘之和void diershiliu()printf("求 110 阶乘之和 nn");int i=0;long temp=1;double sum=0;for(i=1;i<=10;i+)temp*=i;sum+=temp;printf("sum=%lfn",sum);/用递归求fibonacci数列的前40个数,每行输出8个void diershiqi()int f(int n);int i;int count=0;for(i=0;i<40;i+)printf("%d ”,f(i);count+;if(count%8=0)printf("n");int f(int n)switch(n)(case 0:return 0;case 1:return 1;default:return f(n-1)+f(n-2);输入某年某月某日,判断这一天是这一年的第几天?int diershiba()int i, days = 0;int year, month, day;int day_tab13 = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;printf("输入年、月、日,用空格隔开:,scanf("%d%d%d”, &year, &month, &day);for (i=1; i<month; i+)days += day_tabi;days += day;if (year%4=0 && year%100!=0 | year%400=0) && month>=3)days+=1;printf("%d 年d 月 d 日是这一年的第d 天! n”, yea