小言_互联网的博客

小菜版考试系统——“C”

558人阅读  评论(0)

各位CSDN的uu们你们好呀,今天,小雅兰的内容是小菜版考试系统,最近一直在忙C语言课程设计的事,那么,就请uu们看看我的学习成果吧。


课程设计任务

摘要

题目分析

流程图

关键程序代码

程序运行结果

结论与心得

参考文献

源代码


课程设计任务:

此考试系统的要求:

从屏幕上输出四个菜单项供用户选择,用户输入数字1、2、3选择,输出以下编号对应题目及其答案,输入4,退出系统。 

  1. 输出杨辉三角形(10行)。
  2. 鸡兔同笼,共有98个头,386只脚,求鸡兔各多少只?提示,设鸡为X,兔为Y,据题意有X+Y=98,2X+4Y=386。采用穷举法,X从1到97,Y取98-X,如果X,Y同时满足条件2X+4Y=386,则输出X,Y的值。
  3. 键盘任意输入一个年号,判断它是否是闰年。若是闰年输出“Yes”,否则输出“No”。已知符合下列条件之一者是闰年:①能被4整除,但不能被100整除,②能被400整除

摘要 

    C语言程序设计是本专业必备的技术知识。通过做C语言课程设计,有助于加深我们对C语言这门课程的理解,在课堂上学到的都是基础理论知识,对于如何用程序语言来描述所学的知识还是有一定难度。通过课程设计我们可以真正理解其内涵。而且,C语言课程设计有助于逻辑思维的锻炼,程序设计能直接有效地训练我们的创新思维、培养分析问题、解决问题的能力。

    本课题要设计的是小菜版考试系统。程序开始运行,首先,需要进行密码验证才能进入系统。如果输入错误密码,程序提示密码输入错误。当错误密码次数超过规定次数,系统自动退出。如果输入正确密码,进入考试系统以后,可以看到菜单,有三个题目,分别是杨辉三角、鸡兔同笼、判断闰年,利用switch语句和case语句以及do-while循环,选择序号1,调用了自定义的yanghui函数,结果就得到杨辉三角,可以继续选择序号2,调用自定义的jitu函数,得到鸡兔同笼,选择序号3,调用自定义函数leap_year,随意输入一个年份,会判断此年份是否为闰年,如果是闰年,输出YES,如果不是闰年,输出NO。这样,一个简单的考试系统就运行成功了。经过程序运行测试,输入密码错误超过3次,系统能够自动退出。

关键词:杨辉三角;鸡兔同笼;闰年


题目分析

1. 输出十行杨辉三角

    杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。

    规律也很简单,在最上面一行的中央写下1;第二行,写下两个1,和上一行形成三角形;随后的每一行,开头和最后的数字都是1,其他的每个数都是它左上方和右上方的数字之和,就是说除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和。

    首先,定义一个10行10列的二维整型数组,给二维数组的每一行的最后一个赋值为1,再将二维数组的每一行的开头赋值为1,然后,前两行都为1,于是从数组第三行开始直到第十行结束,列从第二列开始,最后一列为1,所以列比行少1。在循环中,除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和。再用一个嵌套的for循环,输出二维数组,宽度为6。

2.鸡兔同笼 

    鸡兔同笼是中国古代的数学名题之一大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:

    今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

    这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?

   本题是:共有98个头,386只脚,求鸡兔各多少只?提示,设鸡为X,兔为Y,据题意有X+Y=98,2X+4Y=386。采用穷举法,X从1到97,Y取98-X,如果X,Y同时满足条件2X+4Y=386,则输出X,Y的值。

   当然,本题还可以使用二元一次方程组法,联立这两个方程,解出X、Y的值的表达式。

3.判断闰年

    普通年能被4整除;且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年);世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)

   在判断闰年的代码中,运用到了分支语句和操作符的知识点。

    &&表示逻辑与,使用格式:“条件A && 条件B”,只有当条件A和条件B都成立时,结果才为1,也就是“真”;其余情况的结果都为0,也就是“假”。因此,条件A或条件B只要有一个不成立,结果都为0,也就是“假”。此运算符总是先判断条件A是否成立,如果条件A成立,接着再判断条件B是否成立:如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”;如果条件A不成立,就不会再去判断条件B是否成立:因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果肯定是0,也就是“假”。

    ||表示逻辑或,使用格式:“条件A || 条件B”,当条件A或条件B只要有一个成立时(也包括条件A和条件B都成立),结果就为1,也就是“真”;只有当条件A和条件B都不成立时,结果才为0,也就是“假”。此运算符总是先判断条件A是否成立,如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”;如果条件A不成立,接着再判断条件B是否成立:如果条件B成立,“条件A || 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”。

    在C语言中,0表示假,非0表示真。


流程图

总流程图

 这里给出了系统的总流程图。

 程序开始运行,进行密码判定,密码错误,即重新输入密码,密码错误三次以上,退出程序,密码正确,执行欢迎函数,进入程序执行输入命令函数。输入1,输出杨辉三角的答案;输入2,输出鸡兔同笼的答案;输入3,再输入数字,输出该年份是否是闰年;输出4,退出程序。

分程序流程图

  这里给出了杨辉三角的程序流程图。

  程序开始运行,定义一个十行十列的二维数组,令i=0,数组下标从0开始,令a[i][i]等于0,即每一行的最后一个都为1,a[i][0]等于1,即每一行的第一列都为1。前两行都为1,于是从第三行(i=2)开始,除开头和结尾两个数以外,每个数等于它的左上方与右上方两个数字之和。列数要等于行数减1,如果不等于,返回上一步,程序循环,直到i=10,停止循环,输出十行杨辉三角,结束程序。

 这里给出了鸡兔同笼的程序流程图。

 程序开始运行,假设鸡和兔的总头数为n,鸡和兔的总脚数为m,利用二元一次方程组的知识,解出x(鸡)和y(兔),然后结束程序。 

 

 这里给出了判断闰年的流程图。

 程序开始运行,任意输入一个年份,如果此年份可以被4整除并且不可以被100整除,或者此年份可以被400整除,那么此年份就是闰年,否则,此年份就不是闰年,程序结束。


关键程序代码

 定义一个欢迎界面函数welcome(),完成欢迎界面的设计。具体函数程序见下代码。


  
  1. void welcome()//定义一个欢迎界面函数
  2. {
  3. printf( "*****************************************\n");
  4. printf( "********欢迎使用小菜版考试系统**********\n");
  5. printf( "****************************************\n");
  6. }

1.杨辉三角题求解


  
  1. int i,j,a[ 10][ 10];
  2. for(i= 0;i< 10;i++)
  3. {
  4. a[i][i]= 1; //给二维数组的每一行的最后一个都赋值为1
  5. a[i][ 0]= 1; //每一行的开头都为1
  6. }
  7. for(i= 2;i< 10;i++)
  8. for(j= 1;j<=i -1;j++)
  9. a[i][j]=a[i -1][j]+a[i -1][j -1]; //除开头和结尾之外,每个数等于左上方和右上方两个数之和
  10. for(i= 0;i< 10;i++)
  11. {
  12. for(j= 0;j<=i;j++)
  13. printf( "%6d",a[i][j]);
  14. printf( "\n");

 2.鸡兔同笼题求解二元一次方程组,解出X和Y的值的表达式


  
  1. int x= 0;
  2. int y= 0;
  3. //设鸡和兔共有n只,共m只脚
  4. //x+y=n
  5. //2x+4y=m
  6. x = ( 4 * 98 - 386) / 2;
  7. y = 98 - x;

  3.判断闰年题熟练掌握操作符的知识,并知道闰年的求解


  
  1. if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
  2. {
  3. printf( "Yes\n");
  4. }
  5. else
  6. {
  7. printf( "No\n");
  8. }

程序运行结果

界面运行结果截图

程序运行开始,首先要输入密码,结果如图所示。界面显示“请输入密码:>”

 如果三次都输入错误密码,系统会自动退出。

 如果正确输入密码,正确输入密码之后,会提示“密码正确,登录成功”,并看到欢迎使用小菜版考试系统,并看到了所要考试的题目。

 如果选择序号1,则会显示出十行十列的杨辉三角,还可以再选择下一个题目进行考试 

 接下来,可以选择序号2,这样就可以看到鸡兔同笼 

还可以选择序号3,这样可以看到闰年,随意输入一个年份,系统会自动判断,如果是闰年,就输出YES,如果不是闰年,就输出NO

 如果不想考试了,可以选择序号4,退出整个系统  


结论与心得

   通过这次C语言程序设计,学会了如何正确调用函数。本次共写了6个函数。

   小雅兰:通过这次课程设计,我懂得了很多,尤为深刻的是函数的调用和调试。如何写出一份优秀的代码呢?第一:代码运行要正常。如果你的代码连编译器都编译不过去,那么肯定不是一份优秀的代码。第二:bug很少。如果写出来的程序,一共没几行代码,bug倒是写出了不少,那么,肯定也不是一份易于调试的代码。第三:效率要高。如果写出来的程序效率极其低下,也可以称之为一份不合格的代码。第四:可读性高。如果写出来的程序只有你自己看得懂,甚至是自己都看不懂,别人又怎么可能看懂呢?这样的代码就是猪队友代码。第五:注释清晰。任何一份优秀的代码,都是需要写一定的注释,注释的作用是让别人能够更清晰看得懂你写的代码。第六:可维护性高。第七:文档齐全。对于函数调用,我是在switch语句中的case语句中进行的。函数调用分为传值调用和传值调用。传值调用是函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。传值调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。调试在程序编程中具有很重要的地位,调试可以解决很多问题,而且,调试对于写好一个程序是非常有帮助的功能,通过调试可以发现一些细微的Bug,这样就可以及时地发现并且改正。调试还有很多有用的操作,比如监视局部变量、调用堆栈、寄存器,因此,深入学习调试是非常重要的。

  小玉锦:通过这次课程设计,我学到了很多。第一,更加清晰的懂得了函数调用,以及循环之间的关系。不同的函数要从不同的函数库中调用,以前总是对这些记忆很模糊。第二,对细节的把控更好,比如分号与花括号,使用更加得心应手。第三,在制作程序框图的过程中,对c语言的逻辑掌控有所增强,一个好的程序必定有一个好的内在逻辑。第四,懂得运用注释,注释可以让别人更好的看懂你的程序,也更利于自己查找错误。第五,对于C语言的软件应用更加熟练,在另一位小组成员的推荐下,下载了VS2022,发现2022更加方便。通过此次的课程设计,我得出了一个结论,想要学好C语言,必须多加实践和讨论,它是一门需要自主学习的科目,多和同学交流也能学到更多。


参考文献

[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2012

[2][美]Kenneth A.Reek.C和指针[M].北京:人民邮电出版社,2020

[3]陈正冲.C语言深度剖析[M].北京:北京航空航天大学出版社,2012

[4]郑莉莉.C语言程序设计[M].北京:清华大学出版社,2012


源代码


  
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<conio.h>
  6. void welcome()
  7. {
  8. printf( "*********************************************************\n");
  9. printf( "****************欢迎使用小菜版考试系统*******************\n");
  10. printf( "*********************************************************\n");
  11. }
  12. void menu()
  13. {
  14. printf( "\n");
  15. printf( "#########################################################\n");
  16. printf( "#################1.杨辉三角(十行)######################\n");
  17. printf( "\n");
  18. printf( "#################2.鸡兔同笼 ######################\n");
  19. printf( "共有98个头,385只脚,求鸡兔各多少只?提示:设鸡为X,兔为Y\n");
  20. printf( "据题意有X+Y=98,2X+4Y=386.采用穷举法,X由1到97,Y取98-X##\n");
  21. printf( "如果X、Y同时满足条件2X+4Y=386,则输出X、Y的值############\n");
  22. printf( "\n");
  23. printf( "#################3.键盘任意输入一个序号 #################\n");
  24. printf( "判断它是否是闰年。若是闰年输出“Yes”, 否则输出“No” \n");
  25. printf( "已知符合下列条件之一者是闰年:<1>能被4整除,但不能被100整除\n");
  26. printf( "<2>能被400整除 ##########################################\n");
  27. printf( "\n");
  28. printf( "#################4.退出系统 ######################\n");
  29. printf( "\n");
  30. }
  31. void yanghui()
  32. {
  33. int i, j, a[ 10][ 10];
  34. for (i = 0; i < 10; i++)
  35. {
  36. a[i][i] = 1; //给二维数组的每一行的最后一个都赋值为1
  37. a[i][ 0] = 1; //每一行的开头都为1
  38. }
  39. for (i = 2; i < 10; i++)
  40. for (j = 1; j <= i - 1; j++)
  41. a[i][j] = a[i - 1][j] + a[i - 1][j - 1]; //除开头和结尾之外,每个数等于左上方和右上方两个数之和
  42. for (i = 0; i < 10; i++)
  43. {
  44. for (j = 0; j <= i; j++)
  45. printf( "%6d", a[i][j]);
  46. printf( "\n");
  47. }
  48. }
  49. void jitu()
  50. {
  51. int x = 0; //鸡
  52. int y = 0; //兔
  53. //设鸡和兔共有n只,共m只脚
  54. //x+y=n
  55. //2x+4y=m
  56. //解得x=(4n-m)/2 y=n-x
  57. //scanf("%d %d", &x, &y);//输入鸡和兔的数量
  58. //题目已知有98个头,386只腿
  59. x = ( 4 * 98 - 386) / 2;
  60. y = 98 - x;
  61. printf( "%d %d\n", x, y);
  62. }
  63. void leap_year()
  64. {
  65. int year = 0;
  66. printf( "请输入年份:>");
  67. scanf( "%d", &year); //年份
  68. if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
  69. {
  70. printf( "Yes\n");
  71. }
  72. else
  73. {
  74. printf( "No\n");
  75. }
  76. }
  77. int main()
  78. {
  79. char password[ 100] = { 0 };
  80. int i = 0;
  81. //假设密码为123456
  82. //模拟用户登录,只能登录三次,只允许输入三次密码,如果密码正确则显示登录成功
  83. //如果三次均输入错误,则退出程序
  84. int j = 0;
  85. for (i = 0; i < 3; i++)
  86. {
  87. printf( "请输入密码:>\n");
  88. for (j = 0; j < 6; j++)
  89. {
  90. password[j] = _getch();
  91. //getch 从控制台读取一个字符,但不显示在屏幕上
  92. if (password[j] == '\b')
  93. {
  94. //\b 退格(BS),将当前位置移到前一列
  95. j--;
  96. if (j >= 0)
  97. {
  98. j--;
  99. printf( "\b \b");
  100. }
  101. }
  102. else if (j >= 0)
  103. {
  104. printf( "*");
  105. }
  106. }
  107. password[j] = '\0';
  108. // //\0是判断字符字符数组结束的标志,表示这串字符到结尾了
  109. // //\0是占用位置的
  110. if ( strcmp(password, "123456") == 0)
  111. {
  112. printf( "密码正确,登录成功\n");
  113. break;
  114. }
  115. else
  116. {
  117. printf( "密码输入错误\n");
  118. }
  119. }
  120. if (i == 3)
  121. {
  122. printf( "三次密码均输入错误,退出程序\n");
  123. exit( 0);
  124. }
  125. int input = 0;
  126. welcome();
  127. do
  128. {
  129. menu();
  130. printf( "请选择序号:>");
  131. scanf( "%d", &input);
  132. switch (input)
  133. {
  134. case 1:
  135. printf( "杨辉三角\n");
  136. yanghui();
  137. break;
  138. case 2:
  139. printf( "鸡兔同笼\n");
  140. jitu();
  141. break;
  142. case 3:
  143. printf( "闰年\n");
  144. leap_year();
  145. break;
  146. case 4:
  147. printf( "退出系统\n");
  148. exit( 0);
  149. break;
  150. default:
  151. printf( "选择错误,请重新选择\n");
  152. break;
  153. }
  154. } while (input);
  155. return 0;
  156. }

好啦,小雅兰的C语言课程设计就此结束啦,以后要更加努力,把C语言没有学会的知识补过来。

 


转载:https://blog.csdn.net/weixin_74957752/article/details/129087418
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场