《C语言程序设计课程设计练习题.doc》由会员分享,可在线阅读,更多相关《C语言程序设计课程设计练习题.doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言程序设计练习题1. 输入10个整数,输出其中最大者和最小者。 解析:用数组保存这10个数,从第一个数开始做比较,若后一个数比前一个数小则调换位置。做如此的排序,则第一个数为最大者,最后一个数为最小者。 程序清单: #include int main(void)int a10,i,j,t;printf(input 10 numbers:n);for (i=0;i10;i+)scanf(%d,&ai);for (i=0;i9;i+)for (j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;printf(the max is:%dn,a9);printf(the min is:%d
2、n,a0);return 0; 运行结果: input 10 numbers:1 2 3 4 5 6 7 8 66 55the max is:66the min is:12. 判断输入的任意年是否为闰年。 解析:能被4整除而且不能被100整除或者能被400整除的年份是闰年。 程序清单:#include int main(void)int a;printf(请输入一个年份n);scanf(%d,&a);if (a%4=0&a%100!=0|a%400=0)printf(是闰年n);elseprintf(不是闰年n);return 0;运行结果:请输入一个年份2004是闰年3. 输入一个年、月、日
3、,输出该日是本年中的第几天。 解析:主函数接收从键盘输入的日期,并调用sum-day和leap函数计算天数。 程序清单:#include int main(void)int sum_day(int,int);int leap(int year);int year,month,day,days;printf(input date (year,month,day):);scanf(%d,%d,%d,&year,&month,&day);printf(%d/%d/%d,year,month,day);days=sum_day(month,day);if (leap(year)&month=3)day
4、s=days+1;printf(is the %dth day in this year.n,days);return 0;int sum_day(int month,int day)int day_tab13=0,31,28,31,30,31,30,31,31,30,31,30,31;int i;for (i=1;imonth;i+)day+=day_tabi;return (day);int leap(int year)int leap;leap=year%4=0&year%100!=0|year%400=0;return (leap);运行结果:input date (year,mont
5、h,day):2012,5,272012/5/27is the 148th day in this year.4. 求两个正整数m和n的最大公约数和最小公倍数。 解析:用辗转相除法求之。 程序清单:#include int main(void)int n,m,t,p,r;printf(请输入两个正整数:);scanf(%d %d,&n,&m);if (nm)t=n;n=m;m=t;p=n*m;while (m!=0)r=n%m;n=m;m=r;printf(最大公约数是:%dn,n);printf(最小公倍数是:%dn,p/n);return 0; 运行结果:请输入两个正整数:12 8最大公约
6、数是:4最小公倍数是:245. 输出1001000之间的素数输出。 解析:只能被1和本身整除的数为素数,设数n,用循环语句判断从2起到n-1的数是否被n整除,若没有可被n整除的数则n为素数。再依次找出1001000之间的素数。 程序清单:6. 求解方程ax2+bx+c=0的根,其中a、b、c是键盘输入的双精度数。 解析:定义双精度变量a,b,c利用求根公式求解。 程序清单:#include#includeint main(void)double a,b,c,disc,x1,x2,p,q;scanf(a=%lf,b=%lf,c=%lf,&a,&b,&c);disc=b*b-4*a*c;p=-b/
7、(2*a);q=sqrt(disc)/(2*a);x1=p+q;x2=p-q;printf(x1=%5lf,x2=%5lf,x1,x2);return 0;运行结果:a=1,b=3,c=2x1=-1.,x2=-2.7. 求由双精度数a、b、c组成的三角形的面积。 解析:定义双精度变量a,b,c,为三角形的三边,利用海伦公式求三角形面积。 程序清单:#include#includeint main(void)double a,b,c,p,s;scanf(%lf,%lf,%lf,&a,&b,&c);p=1.0/2*(a+b+c);s=sqrt(p*(p-a)*(p-b)*(p-c);printf(
8、s=%lfn,s);return 0;运行结果:3,4,6s=5.8. 输入球的半径r(双精度数),计算球的表面积和体积。 解析:定义双精度变量r为球的半径,利用球体的表面积公式与体积公式求解。 程序清单: #include #define PI 3.14int main(void)double r,s,v;printf(请输入半径r:);scanf(%lf,&r);s=4*PI*r*r;v=4/3*PI*r*r*r;printf(球体表面积s=%lf,s); printf(球体体积v=%lf,v);return 0;运行结果:请输入半径r:2球体表面积s=50.球体体积v=25.9. 编写交
9、换两个整数的函数(使用指针)。解析:利用指针调用函数。程序清单:#include void huhuan (int *p,int *q)int t;t=*p;*p=*q;*q=t;int main(void)int a=3;int b=5;huhuan(&a,&b);printf(a=%d,b=%dn,a,b);return 0;运行结果:a=5,b=310. 编写一个函数,返回函数本身被调用的次数。11. 输入两个运算数和一个算术运算符,编程实现四则运算,并输出运算结果。12. 编写一个摄氏温度和华氏温度转换程序(双精度数)。 解析:公式为C=5/9(F-32),用双精度变量。 程序清单:#
10、includeint main(void)double c,f;printf(请输入一个华氏温度:);scanf(%lf,&f);c=(5.0/9.0)*(f-32);printf(摄氏温度为:%5.2lfn,c);return 0; 运行结果:请输入一个华氏温度:78摄氏温度为:25.5613. 打印九九乘法表。解析:用两层for循环实现。程序清单:#include int main(void)int i,j,t;for (i=1;i=9;i+)for(j=1;j=i;j+)t=i*j;printf(%3d*%d=%2d,i,j,t);printf(n);return 0;运行结果: 1*1
11、= 1 2*1= 2 2*2= 4 3*1= 3 3*2= 6 3*3= 9 4*1= 4 4*2= 8 4*3=12 4*4=16 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*
12、8=72 9*9=8114. 打印由*组成的九层高的等腰三角形。 解析:把三角形的顶点放在40列的位置,每行的输出开始位置比上一行提前一列,每行的输出星号数是上一行的2倍减去1.程序的外循环控制输出的行数,内循环是两个并列的循环,前一个循环输出每行前面的空格,后面一个循环输出改行的星号,星号输出结束后换行。 程序清单:#include int main(void)int j,k;for (k=1;k=9;k+)for (j=1;j40-k;j+)printf( );for (j=1;j=2*k-1;j+)printf(*);printf(n);return 0; 运行结果: * * * * *
13、 * * * *15. 输出signed char、unsigned char、signed short、unsigned short、signed int、unsigned int、signed long、unsigned long、float、double所能表示的最大值和最小值。16. 从键盘输入的字符串,将其中的大写字母变成小写字母,将小写字母变成大写字母。17. 输入一个字符串,统计其中的字母、数字、空白符及其它符号的个数。 解析:用循环语句和字符输入输出语句。 程序清单:#includeint main(void)char c;int letters=0,space=0,digit
14、=0,other=0;printf(请输入一行字符:n);while(c=getchar()!=n)if (c=a&c=A&c=0&c0,输出y=1,当x0,输出y=-1,当x=0,输出y=0。 解析:用if语句的嵌套。 程序清单:#include int main(void)int x;printf(input x=);scanf(%d,&x);if (x0)printf(y=1);else if (x=0)printf(y=0);elseprintf(y=-1);return 0;运行结果:input x=3y=119. 将百分制成绩转换为等级(优秀90100、良好8090)、中等7080
15、)、及格6070)、不及格060) )成绩。 解析:用if语句额嵌套完成。 程序清单:#include int main(void)int a;printf(输入分数0-100:);scanf(%d,&a);if (a=90)printf(优秀);else if (a=80)printf(良好);else if (a=70)printf(中等);else if (a=60)printf(及格);else printf(不及格);return 0; 运行结果:输入分数0-100:87良好 20. 根据输入的利润,计算奖金:利润低于或等于10万元时,奖金为利润的10%;利润低于或等于20万元时,高
16、于10万元部分的奖金为利润的7.5%;利润低于或等于40万元时,高于20万元部分的奖金为利润的5%;利润低于或等于60万元时,高于40万元部分的奖金为利润的2.5%;利润高于100万元时,高于60万元部分的奖金为利润的1%。 解析:用if语句和switch语句完成,注意不同利润的不同提成比例。 程序清单:#include int main(void)long i;float bonus,bon1,bon2,bon4,bon6,bon10;bon1=*0.1;bon2=bon1+*0.075;bon4=bon2+*0.05;bon6=bon4+*0.025;printf(请输入利润i:);sca
17、nf(%ld,&i);if (i=)bonus=i*0.1;else if (i=)bonus=bon1+(i-)*0.075;else if (i=)bonus=bon2+(i-)*0.05;else if (i=)bonus=bon4+(i-)*0.025;else bonus=bon6+(i-)*0.01;printf(奖金是%10.2fn,bonus);return 0;运行结果:请输入利润i:奖金是 19000.0021. 输入一个不多于5位的正整数,计算其位数、各位之和、逆序输出各位数字。22. 求1+2+3+n之和,n由键盘输入。 解析:用循环语句实现。 程序清单:#includ
18、e int main(void)int i,n,sum=0;printf(please enter n=);scanf(%d,&n);for (i=1;i=n;i+)sum=sum+i;printf(1+2+3+n之和为:%d,sum);return 0;运行结果:please enter n=1001+2+3+n之和为:505023. 求1!+2!+3!+n!,n由键盘输入。 解析:用for循环实现。 程序清单:#include int main(void)float s=0,t=1;int i,n;printf(请输入n值:);scanf(%d,&n);for (i=1;i=n;i+)t=
19、t*i;s=s+t;printf(1!+2!+.+n!=%en,s);return 0;运行结果:请输入n值:201!+2!+.+n!=2.e+01824. 求s=a+aa+aaa+aaaa,其中最后a的个数为n,a和n键盘输入。 解析:用while语句实现。 程序清单:#include int main(void)int a,n,i=1,sn=0,tn=0;printf(a,n=);scanf(%d,%d,&a,&n);while (i=n)tn=tn+a;sn=sn+tn;a=a*10;+i;printf(a+aa+aaa+.=%dn,sn);return 0;运行结果:a,n=2,5a+
20、aa+aaa+.=2469025. 根据p/4=1-1/3+1/5-1/7+求p的近似值(某一项的绝对值小于10-6终止)。 解析:26. 根据e=1+1/1!+1/2!+1/3!+,求e的近似值(某一项的绝对值小于10-6终止)。27. 根据sin(x)=x-x3/3!+x5/5!-x7/7!,求sin(x)的近似值(某一项的绝对值小于10-6终止)。28. 输出Fibonacci数列的前N项。29. 输出所有的“水仙花数”。 解析:所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。所求数范围为1001000,将其每个位上的数分离求其立方和与该数比较。 程序清单:#include
21、 int main(void)int m,j,k,i;printf(narcissus numbers are:);for (m=100;m1000;m+)i=m/100;k=m/10-i*10;j=m%10;if (m=i*i*i+k*k*k+j*j*j)printf(%d,m);printf(n);return 0;运行结果:narcissus numbers are:153,370,371,407,30. 输出1000内的所有“完数”。 解析:一个数如果恰好等于它的因子之和,这个数称为“完数”。用for循环找出这个数的所有因子,将因子累加如果等于这个数则是“完数”。 程序清单:#incl
22、udeint main(void)int m,s,i;for (m=2;m1000;m+)s=0;for (i=1;im;i+)if (m%i)=0) s=s+i;if(s=m)printf(%d,its factors are,m);for (i=1;im;i+)if(m%i=0) printf(%d,i);printf(n);return 0;运行结果:6,its factors are1,2,3,28,its factors are1,2,4,7,14,496,its factors are1,2,4,8,16,31,62,124,248,31. 把100元人民币换成20元、10元、5元
23、的零钱,有多少种换法。 解析:用3个for语句的嵌套实现。 程序清单:#include int main(void)int i,j,k,cnt=0;for (i=0;i=100;i+)for(j=0;j=50;j+)for(k=0;k=20;k+)if(i+2*j+5*k=100)cnt+;printf(count=%dn,cnt);return 0;运行结果:count=54132. 布袋中有红、绿、蓝、白4种颜色的小球各一个,每次从中取出3个,列出3个小球不同颜色的所有可能的取法。33. 求a平方根,迭代公式为xn+1=(xn+a/xn)/2.0。 解析:用迭代法求平方根的算法如下:(1)
24、 设定一个X的值;(2) 用以上公式求出X的下一个值x1;(3) 再将x1代入以上公式的右侧,求出x1的下一个值x2;(4) 如此继续下去直到大药要求精确的值。 程序清单:#include #include int main(void)float a,x0,x1;printf(erter a positive number:);scanf(%f,&a);x0=a/2;x1=(x0+a/x0)/2;dox0=x1;x1=(x0+a/x0)/2;while(fabs(x0-x1)=1e-5);printf (the square root of %5.2f is %8.5fn,a,x1);retu
25、rn 0;运行结果:erter a positive number:2the square root of 2.00 is 1.4142134. 用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。35. 用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。36. 用弦截法求方程x3-5x2+16x-80=0的根。37. 用矩形法求函数sin(x)、cos(x)、ex在0,1区间的定积分。38. 顺序查找int aN中的最大元素和最小元素。39. 用“筛选法”求100之内的素数。40. 逆序输出数组int aN的元素。 解析:先将10个自然数输入到一个一维数组a,
26、然后将a0与an-1对换直到将a4与an2对换。 程序清单:#include#define N 10int main(void)int i,j,t;int aN=1,2,3,4,5,6,7,8,9,10;for (i=0;iN;i+)printf(%3d,ai);printf(n);for (i=0;iN/2;i+)j=N-i-1;t=ai;ai=aj;aj=t;for (i=0;iN;i+)printf(%3d,ai);printf(n);return 0; 运行结果: 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 141. 在N个学生姓名中查找输入的姓名。
27、42. 使用冒泡排序对数组int aN进行排序并输出。43. 使用选择排序对数组int aN进行排序并输出。44. 使用插入排序对数组int aN进行排序并输出。45. 将N个国家的英文名字,按字典顺序输出。46. 在有序(升序)数组int aN插入一个输入的整数num,使数组仍有序。47. 删除字符串中指定的字符。48. 在有序数组int aN中折半查找输入的整数num。49. 编写函数计算字符串长度。50. 编写函数实现两个字符串连接。 解析:51. 编写函数实现字符串复制。52. 编写函数两个字符串比较。53. 删除字符串中指定的一个字符。54. 判断一个字符串是否为回文(顺读和倒读相同
28、)。55. 编写一个函数,将第一个字符串中有而第二个字符串中无的字串返回。56. 编写一个函数,将两个字符串的字符排序后输出。57. 统计字符串中的单词(单词之间用一个或多个空格分隔)。58. 找出二维数组的鞍点(鞍点是指行上最大,在列上最小的元素),如果有输出鞍点数据和位置。59. 实现int aMN矩阵的转置。60. 求矩阵int aNN的两个对角线之和、上下三角之和。61. 输出杨辉三角的前10行。62. 输出元素个数为n2(n为奇数)的魔方阵。63. 使用“第i个字母变换成第(26-i+1)个字母”的规则对字符串明文加密,输出密文。64. 用递归方法将一个整数n转换成字符串。65. 用
29、递归方法将十六进制数转换为十进制数。66. 用递归方法将十进制数转换为二进制数。67. 用递归方法求1N的和。68. 用递归方法求n!。69. 用递归方法求Hanoi(汉诺塔)问题。70. 用递归方法求Fibonacci数列的第N项。71. 编写程序使用数组求解josephus(约瑟夫环)问题。72. 编写程序使用链表求解josephus(约瑟夫环)问题。73. 使用数组指针的方法实现输入星期n,输出对应的星期的英文名。74. 使用数组指针输出二维数组的全部元素。75. 编写程序实现echo命令的功能(回显命令行所有参数)。76. 分别使用头部和尾部插入的方法建立链表,并访问输出该链表,最后释
30、放链表。77. 在链表中查找输入的整数,若找到则删除相应的节点。78. 在有序链表中插入一个输入的整数节点,使链表仍有序。79. 合并两个有序链表并输出。80. 将一个链表逆向并输出。81. 取出机器字从右边第p位开始(从0开始计数)左边n位。82. 将无符号整数x从p位开始的左边n位,置为y的最右边的n位,其它位不变。83. 将无符号整数x从p位开始左边的n位变反,其它位不变84. 给定一个有符号整数的原码,求其反码和补码。85. 将一个整数循环n位,若n为正则左循环,若n为负则右循环。86. 将16位无符号数的高8位和低8位交换。87. 将符号串“Hello World!”写入文本文件,并
31、对文件打开、读写、关闭进行测试。88. 显示文本文件student.txt的内容,文件包含N个学生的学号、姓名、成绩(TAB分隔)。89. 将一个文本文件复制成另一个文本文件。90. 加行号显示文本文件。91. 将文本文件中的若干整数相加,并将结果写入文件最后。92. 比较两个文本文件,输出其首次不同符号所在行号和列号。93. 将C语言源程序中的所有注释去掉并存入另一个文件中。94. 有N个学生,每个学生有学号(no)、姓名(name)及数学(math)、物理(physics)、英语(english)三门成绩。从键盘输入每个学生的数据,按平均成绩排序后(从高到低)保存在文件中,并实现增加、删除学生操作,操作的结果仍保存在文件中。从该文件中读取并输出。95. 创建一个储户文件,记录储户的帐号、姓名、余额,可以开户、销户、查询查询。创建一个流水帐文件记录储户的存款和取款信息,包括账户、日期、金额(正为存款,负为取款),并修改相应账户的余额。96. 定义符号常量p,利用该符号常量求园的周长和面积。97. 编写求两数较大者和较小者的两个宏98. 将输入字符串以小写/大写字母输出,使用条件编译指令指示输出大写还是小写。99. 多个自定义函数调用,使用头文件进行声明,并添加防止重复包含的条件编译指令。100. 定义无符号32位整数和16位整数的宏,并使用。
限制150内