APP下载

“C语言程序设计”教学案例分析

2020-07-31纪辉进

现代信息科技 2020年4期
关键词:C语言程序设计项目驱动C语言

摘  要:“C语言程序设计”课程是计算机类专业的一门基础课程,旨在引导学生建立逻辑思维,体会编程的乐趣;然而市面上绝大多数教材中的案例,多以解析数学题、科学常数等为主,学习起来呆板乏味,因此引入时下非常流行的“抢红包”游戏,比起做数学题更接“地气”,“抢红包”程序用到了if-else、循环、函数、数组等知识,几乎涵盖课程大纲中需要学生掌握的所有知识点,是一个很好的综合项目,让学生自己玩自己编写的游戏,学生更加有学习的动力和成就感,对学习这门课程有很大的促进作用。

关键词:C语言;项目驱动;教学案例;抢红包

中图分类号:TP312     文献标识码:A 文章编号:2096-4706(2020)04-0095-03

Abstract:“C Language Programming” is a basic course for computer major. It aims to guide students to establish logical thinking and experience the fun of programming;however,most of the cases in the textbooks on the market are mainly based on the analysis of mathematical problems and scientific constants,which are dull to learn. Therefore,the popular game of “snatching red envelopes” is introduced,which is more “earthly” than doing mathematical problems,“snatching red envelopes” program uses if-else,cycle,function,array and other knowledge,almost covering all the knowledge points that students need to master in the curriculum outline. It is a good comprehensive project,so that students can play their own games,and students have more motivation and sense of success,which has a great role in promoting the learning of such courses.

Keywords:C language;project driven;teaching cases;snatching red envelopes

0  引  言

“C语言程序设计”课程是计算机类相关专业的专业基础课程,本科院校和高职院校相关专业都在开设本门课程。学生通过学习,熟悉C语言的开发环境,掌握C语言的基本语句,初步了解和掌握程序设计的基本方法,为学习后继其他专业课程做好铺垫。“C语言程序设计”课程对培养学生的逻辑思维素质、编程能力、科学精神都具有十分重要的作用。本学习领域强调以学生为主体、知识为技能服务,培养学生的自主学习能力、创新能力和团队合作能力,争取通过一个学期的课程学习,在短时间内让学生掌握编程思想。

在实际讲授“C语言程序设计”的过程中,大多数教材用求奇数、偶数、约数、公约数、最小公约数、最大公约数,求精确到指定位数的π值、求平方、平方根、求幂、求裴波那契数列等案例;这些案例非常经典,完全能让学生掌握对应的知识点,但学生普遍反映这些数学题案例枯燥、生涩、难懂。

1  案例背景

在软件设计教学过程中,如果缺少和生活紧密相关的主题,就难以激励学生产生主动学习编程的动力。老师在设计“C语言程序设计”教学案例时,需要按照日常生活中实际的、具体的情景进行设计,使用项目教学法调动学生学习的主观能动性,让学生在项目实践过程中充分体会到成就感,从而能运用编程思维去思考和解决日常生活中的实际问题,进一步提升学生的思考能力和表达能力。

生活化情境教学能营造出轻松愉悦的课堂氛围,使课堂学习不再枯燥乏味,学生不再埋头玩手机和呼呼酣睡,教师能通过学生表情了解学生疑惑所在、对重难点内容著重阐述;学生不理解的知识随时跟老师交流,在情境中师生相互进行引导与启发,增强师生互动,让学生学会主动学习,探求新知识,构建知识链。

这些年来QQ群和微信群的抢红包游戏如火如荼,是一个非常好的生活化案例。设定红包总金额money和分发人数n,程序就生成总金额为money的n个随机红包,本案例就探讨实现随机红包的算法。

2  项目设计

2.1  开发环境

开发语言:C语言。

开发工具:Visual Studio 2012/Visual C++6.0。

2.2  项目需求

红包总金额为money(元),分发份数为n,程序自动完成红包金额分配;要保证每一个红包都有钱,每一个红包金额至少为1分钱,所有红包金额之和必须与总金额money相等;红包生成后由软件展示每个红包的金额。效果图如图1所示。

2.3  数据类型

在整个C语言学习过程中,我们接触到的数据类型有int、float、double、char;在本案例中,我们会用到int和double数据类型。红包总金额以元为单位,带小数点,需要用到double类型的数据;抢到红包的最小金额为1分钱,以分为单位就是整型数;n个红包,应该采用整型数组。

2.4  涉及的知识点

实现这个程序,需要用到C语言基础知识,所涉及到的知识点有以下几点:

(1)变量的声明,赋值和引用。

(2)整型数组的声明,赋值和引用。

(3)输入输出函数的使用。

(4)数据类型的隐式转换和强制转换。

(5)if-else语法结构的使用。

(6)for循环结构的使用及数组的遍历。

(7)随机数的获取。

(8)stdlib.h和time.h头文件的引入。

3  项目编码

3.1  核心算法分析

在发第一个红包时,至少要保证给剩下的n-1个红包留下n-1分钱;第一个红包的金额由系统在1到money*100-(n-1)之间随机;将获得的随机数赋值给红包数组的第一个元素;然后能用来发红包的金额更新为money*100减去第一个红包金额之差;以此类推,在发第i个红包时,要保证还没有分发的红包每个至少有1分钱;第i个红包的金额在1到money-(n-i)之间随机;最后一个红包金额不用随机,将剩下的钱都给最后一个红包。

计算机的随机数是伪随机数,为使随机算法得到的随机值不重复实现,需要用与时间相关的随机种子,对随机函数进行初始化:srand((unsigned)time(NULL)),rand()返回的随机数在[0,32 767]之间,要控制随机数在1到n之间,rand()%n可以获得0到n-1之间的随机数,rand()%n+1刚好可以获得1到n之间的随机数。

多次产生随机数,需要用到循环结构,while循环、do-while循环、for循环都可以实现本案例,结合几个循环的特点,对于已知循环次数采用for循环比较简洁。每次产生随机金额之前,需要给剩下的还未生成的红包每个至少留1分钱,在留足余额后的金额里再进行随机,并且随机出的金额最少是1分钱,最多是提留后所有的金额;因此随机第i个红包需要留下n-(i+1)分,产生的随机数是[0,m-n+i+1]的闭区间,随机的钱是随机数加1分,所以bags[i]=rand()%(m-n+1+i)+1;最后一个红包金额不需要用随机数产生,直接将余额分发给最后一个红包即可。

3.2  完整代码

#include//系统函数scanf和printf包含在头文件里;

#include//随机函数所包含的头文件;

#include//时间函数所包含的头文件;

void main()

{

double money;//以元为单位的金额;

int I,m,n,bags[1000];//m是以分为单位的金额,n是红包总个数;

srand((unsigned)time(NULL));//对时间函数进行初始化;

printf("请输入红包总金额:");

scanf("%lf",&money);

printf("请输入红包总个数:");

scanf("%d",&n);

m=(int)(money*100);//以元为单位的带小数的金额转换以分为单位的整型数;

for(i=0;i

{

if(i==n-1)bags[i]=m;//如果是最后一个红包,把剩余的钱给最后一个红包;

else bags[i]= rand()%(m-n+1+i)+1;//非最后一个红包留好余额后随机;

m=m-bags[i];//更新剩余的金额;

}

for(i=0;i

{

printf("%。2lf\t",bags[i]/100.0);

}

}

3.3  算法存在的问题

随着逐个红包的生成,随机数的范围会逐步变窄;按照概率来说,最先随机得到的红包金额会比较大,后面随机产生的红包金额会逐渐变小;这跟我们平时抢的QQ红包,微信红包不一样;该算法充分体现了一个“抢”字,“先下手为强”。

程序的功能是按照需求设计的,如果觉得上述案例算法不妥,可以根据需求修改算法;例如,多声明一组数组list,将list数组所有元素的初始值都设置为-1,循环n次产生n个0到n-1之间不重复的随机数,依次保存在这个list数组中,然后遍历list数组,将list数组各元素的值作为红包数组的下标,因为这个下标是随机的,这样就按照随机算法不按顺序输出红包数组里各元素,最终结果就可以避免之前先生成的红包大后生成的红包小的问题。当然,不同的编程人员可以按照自己的理解用其他不同的算法来实现程序需求。

4  结  论

本项目案例非常生活化,实现的技术中用到了变量的声明、赋值和引用;整型数组的声明、赋值和引用;输入输出函数的使用;数据类型的隐式转换和强制转换;if-else语法结构的使用;for循环结构的使用及数组的遍历;随机数的获取。“C语言程序设计”课程旨在引导学生理解和运用C语言的基本语法,建立最基本的逻辑思维,为学习后续的软件开发课程奠定一个良好且稳固的基础;该项目的实现过程引导学生温习了C程序设计的基础知识,在编码过程中又对知识进一步强化,另外还扩展了C语言中取随机数的知识,让学生对知识的掌握有了进一步的提升。

该案例将复杂问题简化,从而激发学生学习编程的兴趣,增强了编程的乐趣,提高学生解决实际问题的能力,可以算得上C语言程序教学课程的一个经典案例。

参考文献:

[1] 谭浩强.C程序设计(第5版) [M].北京:清华大学出版社,2017.

[2] 本·克莱蒙.C程序设计新思维(第2版) [M].赵岩,译.北京:人民邮电出版社,2018.

[3] 王亮.《C语言程序设计》循环结构教学案例研究 [J].科技视界,2018(1):60-61.

作者简介:纪辉进(1977-),男,汉族,湖北黄陂人,讲师,本科,主要研究方向:软件技术教学。

猜你喜欢

C语言程序设计项目驱动C语言
“C语言程序设计”课程混合教学探索
基于C语言的计算机软件编程技术探究
中职C语言单片机课堂教学中的趣味性探讨
计算机原理中C语言的应用价值
以“学生为中心”的《C语言程序设计》教学设计探究
依托工作室的软件工程实践教学研究
基于物联网项目驱动的嵌入式系统教学改革的研究与实践
基于“红色之旅”项目驱动的《调酒与咖啡》工作室制人才培养机制探讨
基于翻转课堂的《C语言程序设计》课程教学系统的实现与研究
浅谈《C语言程序设计》课程的教学改革