C语言程序设计教学改革探究
2021-04-13王智
王智
摘 要 在新工科建设背景下,各大高校主动设置和发展新兴工科专业,推动现有工科专业的改革创新也势在必行。针对C语言程序设计课程教学研究现状,依托电工电子国家级实验教学示范中心(长江大学),长江大学电子信息学院提出基于项目化的教学模式,大力探索课程教学改革的创新。以电磁场数值模拟中的正演为例,阐述课程项目化过程,该方法不仅能有效促进学生对电磁波的理解,而且能引导学生关注科技前沿,是培养学生学以致用的意识和提高学生探索创新能力的有效手段。
关键词 新工科;C语言程序设计;电磁场;项目化教学;教学改革
中图分类号:G642.0 文献标识码:B
文章编号:1671-489X(2021)05-0087-03
0 前言
为了应对新一轮科技革命和产业变革,教育部对高等工程教育提出发展新工科的要求[1-2]。21世纪以来,计算机技术发展越来越快,已经成为现代人必须掌握的基本技能。C语言是当今世界上最流行的计算机程序设计语言之
一[3],在过去40多年里已经成为最重要的编程语言之一。最近20多年里,虽然许多人从C语言转而使用其他编程语言(如C++、Objective C、Java等),但是C语言仍凭借自身实力在众多语言中脱颖而出,在学习C语言过程中会发现它的许多优点,如高效性、可移植性、灵活性等。
1 C语言程序设计课程教学现状
大部分工科非计算机专业在讲C语言课程时往往存在“在空中飘着,落不了地”的情形,学完后不知道干什么。C语言是很多课程的先修课程,目前课程的理论教学过程中仍然存在一些问题。传统的理论教学通常采用“填鸭式”教学,按照课本上的知识体系来授课,先介绍面向过程程序设计方法的三大基本结构——顺序程序设计、选择结构程序设计、循环结构程序设计,然后讲解数组与函数的相关知识、指针的运用、结构体与文件,过于注重C语言语法知识的讲解[4]。实际上,C语言是一门实践性很强的课程,很多时候学生在课堂上听着十分明白,到了上机操作却无法灵活运用。虽然相应的编程实践题是针对语法学习的一些简单编程,但这些程序都很简单,功能单一,与解决现实问题有很大差距,很难将学生的积极性调动起来,往往学生学习C语言就单纯为了应对考试。
2 C语言程序设计教学改革措施
针对目前C语言程序设计课程教学过程中出现的问题,本文提出以项目化教学理论指导课程改革,在教学过程中结合项目进行交流,把项目实施过程作为学生成绩考核的一项指标,解决传统考核模式的单一性问题[5]。项目实施过程中需要将其他相关课程内容联系在一起(高等数学、线性代数、算法与数据结构等),利用C语言编程以图像的形式实现结果,既能锻炼学生的C语言编程能力,又能加深其对专业课的理解。采用教师评定和答辩交流两个环节相结合的考核办法进行科学合理的评估。通过一系列实例的训练,使得学生能够通过自学或查阅相关资料,分析和研究复杂问题,具备一定的创业意识和创新精神及较强的综合实践能力和科学研究能力。
本文项目开发案例以电磁场数值模拟中涉及的系数矩阵压缩存储与线性方程组求解两个子问题为目标,由教师提供计算的地电模型,子问题1为子问题2做基础,最终以子问题2的结果作为最终的评价对象。几何地电模型与网格化后的示意图分别如图1与图2所示。
系数矩阵的压缩存储 通常情况下,电磁场数值模拟中正演最后形成的方程Ku=p(2-59)的系数矩阵K是对称、稀疏的,也称为刚度矩阵。矩阵中非零元素很少,因此可以采用压缩存储的方式只存储非零元素。采用行压缩存储(Compressed Sparse Row,简称CSR)格式,顺序地按行存储矩阵中的非零元素。CSR存储格式使用三个一维数组存储刚度矩阵的非零元素和相关的行列信息,具体说明如表1所示。
在存储刚度矩阵K时,由于CSR格式需要事先知道存储元素的位置信息,而在三维反演过程中形成的刚度矩阵没有足够的内存显式开出二维数组来存储刚度矩阵并转化成CSR的存储格式,因此可以使用三元组(COO)这样一种存储格式来进行过渡。具体实现方式如下。
1)首先使用i_ElemNodes来存储每个单元所含的节点信息,ElemNodes(i,4)存储了第i个单元与之相关联的四个节点信息;r_Nodes(i,3)分别存储了第i个节点的三个坐标值;i_Elements与i_Nodes分别表示网格单元的单元总数和节点总数。
2)令i=1到i_Elements进行循环,根据i_ElemNodes与r_Nodes两个数组的信息进行单元积分,将单元积分后的值存储到三元数组r_cooa、i_cooR、i_cooC中。
3)通过求和运算将所有单元的数值扩展成总体刚度矩阵的三元数组存储形式,利用Youcef Saad的SPARSKIT工具包中的coocsr函数将COO存储格式转成CSR存储格式。
线性方程组的求解 方程Ku=p(2-59)是一个超大型稀疏、对称、病态的线性方程组。通常求解该线性方程组的方法有直接法和迭代法两大类。直接法以矩阵分解为基础,是一种非常耗时的算法,通常方程的个数非常巨大,直接法求解会非常耗时。而迭代法能够大大减少计算量和存储的大小,常用的Krylov子空間法来求解,有共轭梯度法(CG)、双正交共轭梯度法(BICG)、准残量最小化法(QMR)、广义极小残量法(GMRES)、稳定双共轭梯度法(BICGSTAB)法等。而迭代法收敛性的好坏取决于稀疏矩阵K的条件数,为了改善系数矩阵的条件数,提高计算收敛速度,在方程组中往往引入预条件矩阵M,形成方程组:
M-1Ax=M-1b
采用对称超松弛预条件共轭梯度法(SSOR-PCG)实现快速稳定的计算,得到各个节点的电位。SSOR-PCG算法如下:
其中D为系数矩阵的对角阵,L和U分别为系数矩阵的严格上三角和下三角,0<ε<2为松弛因子。
迭代过程如下:
表2是线性方程组方程的Ku=p结果,本班学生完成两个子课题后,可以自行和表2的答案进行比对。
3 结语
本文针对C语言程序设计课程理论教学存在的不足,提出以技术发展更改教学内容,更新工程人才知识体系,以项目任务为学习导向,创新工程教育考核方式。以电磁波的传播理论为例,笔者阐述了项目化教学方法在课程中实施的过程,并取得良好的教学效果。通过结合项目任务,融入新科技,优化教学内容,创新考核方式,提高了学生的自主学习和创新能力,促进了新工科背景下创新人才的培养。
参考文献
[1]钟登华.新工科建设的内涵与行动[J].高等工程教育研究,2017(3):1-6.
[2]宋晓燕,杨光,崔光照,等.新工科背景下地方高校创新创业教育发展现状与对策研究[J].中国教育技术装备,2020(8):10-13.
[3]李少华.《C语言程序设计》教学中的几点体会[J].长江大学学报(社会科学版),2010(33):38-39.
[4]马艳,王浩.C语言实践教学方法探究[J].长江大学学报(自然科学版),2009(6):381-382.
[5]吴国强,张白,潘俊涛.基于项目驱动的C语言理论与实践一体化教学实践[J].无线互联科技,2018:134-136.
[6]黑创,李修全,张鑫,等.新工科背景下“感测技术”课程教学改革探究[J].无线互联科技,2019(5):160-162,166.