如何编写有多个返回值的C语言函数.docx
《如何编写有多个返回值的C语言函数.docx》由会员分享,可在线阅读,更多相关《如何编写有多个返回值的C语言函数.docx(18页珍藏版)》请在冰豆网上搜索。
![如何编写有多个返回值的C语言函数.docx](https://file1.bdocx.com/fileroot1/2022-11/23/47464066-8674-4ceb-9b63-777ec163e8f9/47464066-8674-4ceb-9b63-777ec163e8f91.gif)
如何编写有多个返回值的C语言函数
如何编写有多个返回值的C语言函数
摘要:
本文从全局变量、数组指针、结构体三种途径深入探讨了如何实现有多个返回值的C语言函数。
关键词
本文来自:
计算机毕业网:
函数;全局变量;数组;结构体
1引言
笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数。
编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题。
有学生也尝试了不少方法:
如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值;或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回。
这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑,显然不理想。
我们知道C语言函数的返回值是通过函数中的return语句来实现的,可是每调用一次函数,return语句只能返回一个值。
那么当我们希望从一个函数中返回多个值时,用什么方法去实现比较合理呢?
在教学过程中,我建议学生跳出对return语句的定势思维,一步步引导学生通过几种间接方式实现多个返回值的C语言函数。
以下是笔者在教学过程中引导学生采用的三种不同方法编写多个返回值的C语言函数。
2方法1:
利用全局变量
分析:
全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。
由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。
当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。
函数被调用后被更改后的全局变量值即为函数的数个返回值。
下面以一个实例演示该方法的应用。
实例1:
编写函数求3个数中的最大值与最小值。
方法:
把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。
函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。
程序参考代码如下:
#include"stdio.h"
#include"conio.h"
intmax,min;/*定义两个全局变量用于保存函数返回值*/
voidmax_min(inta,intb,intc)/*定义求最大最小值的函数*/
{max=min=a;/*初始化最大最小值*/
if(max if(max if(min>b)min=b;
if(min>c)min=c;
}
main()
{intx,y,z;
printf("请输入3个整数:
\n");
scanf("%d,%d,%d",&x,&y,&z);
max_min(x,y,z);/*调用求最大值与最小值的函数*/
printf("三个数中的最大值为:
%d;最小值为:
%d",max,min);/*输出最大值与最小值*/
getch();
}
调试结果如下:
请输入3个整数:
5,-6,2
三个数中的最大值为:
5;最小值为:
-6
注意:
该方法虽然可以实现有多个返回值的函数,但由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用。
3方法2:
传递数组指针
分析:
在教学过程中,我们知道C语言函数参数的传递方式有值传递与地址传递。
当进行值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运行函数。
在值传递过程中被调函数参数值的更改不能导致实参值的更改。
而如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。
因此,我们可以考虑把多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。
函数被调用后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。
以下实例演示该方法的应用。
实例2:
编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。
方法:
以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。
函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。
程序参考代码如下:
#include"stdio.h"
#include"conio.h"
voidmax_min(int*ptr,intn)/*定义求数组最大值最小值的函数,传递数组指针*/
{inti,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int*temp;/*用于交换位置*/
*temp=*ptr;
for(i=0;i {
if(*ptr<*(ptr+i))/*最大值与第一个元素进行交换*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值与最后一个元素进行交换*/
{
j=i;
*temp=*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)=*temp;}
}
}
/*调用最大最小值函数*/
main()
{
intA[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d,min=%d\n\n",A[0],A[5]);
getch();
}
调试结果如下:
请输入6个整形数,以空格隔开:
58932-64
max=32,min=-6
注意:
该方法适用于多个返回值的数据类型一致的情况。
当返回值数据类型不一致时,不适用该方法。
4方法3:
传递结构体指针
分析:
结构体作为教学中的一个难点,教材对它介绍的内容并不多,应用的实例更是少之又少,所以学生对于结构体普遍掌握情况不理想。
其实,编写返回多个值的C语言函数,也可以考虑采用结构体的方式去实现。
通过方法2,我们知道如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。
实例3:
编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
方法:
把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。
参考代码如下:
#include"stdio.h"
#include"conio.h"
structinf{/*定义学生结构体,分别包含成员学号、姓名、班别、总评成绩*/
charxh[12];
charname[20];
charclass[15];
intchj;
};
main(void)
{
structinfa1;/*定义学生结构体类型变量*/
voidxxxx(structinf*ptr);
printf("请输入学号,姓名,班别,总评成绩,以空格隔开:
\n");
xxxx(&a1);/*调用函数,以学生结构体类型变量地址作为实参*/
printf("学号:
%s,姓名:
%s,班别:
%s,总评成绩:
%d",a1.xh,a1.name,a1.class,a1.chj);
getch();
}
voidxxxx(structinf*ptr)/*该函数实现对结构体成员数据的录入操作*/
{
charxh1[12],name1[20],class1[15];
intchj1;
scanf("%s%s%s%d",xh1,name1,class1,&chj1);
strcpy(ptr->xh,xh1);
strcpy(ptr->name,name1);
strcpy(ptr->class,class1);
ptr->chj=chj1;
}
调试结果如下:
请输入学号,姓名,班别,总评成绩,以空格隔开:
200102LiLi200185
学号:
200102,姓名:
LiLi,班别:
2001,总评成绩:
85
注意:
当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。
5结束语
对于以上这三种方法,如果想要返回的数个值数据类型一致,可以考虑采用方法2;而对于不同数据类型的返回值,如果各个数值之间是相互联系的,则方法3较为合适;方法1虽然在很多情况下都可以实现多个返回值的C语言函数,但毕竟全局变量应用过程中有很多危险,要慎重使用。
通过对以上几种方法的分析讲解,在教学过程中,学生再遇到这样的问题时,就能根据返回值的情况选择合适的途径去实现多个返回值的C语言函数。
另外,如果再遇到类似的无法用教材知识点去直接解决的问题时,他们基本都能举一反三地尝试采用间接方式去解决。
参考文献
[1]谭浩强.C程序设计(第二版)[M].北京:
清华大学出版社,1999.
[2]薛万鹏译.C程序设计教程[M].北京:
机械工业出版社,2000.
[3]邓劲生译.VisualC++程序员实用大全[M].北京:
中国水利水电出版社,2005.
[1]
摘要:
本文根据笔者在计算机基础教学中的一些探索和实践,从多样化教学、与其他中医课程的结合以及灵活的教学评价方式等方面探索了中医药院校计算机的教学工作。
关键词
本文来自:
计算机毕业网:
中医药类院校;计算机教学;教学改革
21世纪进入信息化时代,各个领域正日益受到新技术的冲击,科学技术迅猛发展造成信息量剧增,计算机应用能力已成为信息社会中的基本技能。
如何提高高等中医院校学生的计算机应用水平,培养出具有时代竞争力的信息人才是当今社会的新要求,也是教学研究的重要课题。
笔者结合近几年我校杏林学院的计算机教学现状以及教学改革实践,就以下几方面进行讨论。
1教学现状及存在问题
一部分学生在进入高等院校之前就已经掌握了计算机的基础知识,而对于某些来自经济落后地区的学生,入学前可能没用过计算机,因此一个班里学生的计算机水平参差不齐,这就对高等中医院校计算机教学提出了新的要求。
另外,计算机的发展十分惊人,学生大一学的知识到毕业可能就已经过时了。
应如何适应时代的发展,是高等中医院校计算机教学需要讨论的问题。
2教学改革实践中的重要问题
2.1探索多样化教学模式
在多媒体和网络技术的推动下,摆脱封闭式教学方法,探索多样化教学模式,才能使信息技术课丰富多彩。
在教学中,我一般采用多种教学模式,收到了良好的教学效果。
首先,采用多媒体演示。
多媒体技术以其图文声像并茂的特点,形象生动地传递教学内容,把教学内容涉及到的事物、现象及过程再现于学生面前,让学生耳闻目睹,产生身临其境之感,激发了学习的兴趣。
某些知识借助于多媒体设备演示,教师做适当讲解,能使学生获得大量的感性知识,加深对知识的理解。
例如,在讲授PowerPoint幻灯片制作时,我运用多媒体课堂教学软件,将操作过程演示给学生并适当讲解,使学生观看到了完整的操作过程,这样不仅易于传授内容,还能有效控制课堂进程,提高教学效率。
同时,为了配合演示模式的教学,我还根据课程内容及学生接受能力,制作有针对性的课件,使课程内容生动形象,变难为易。
其次,采用学生自学模式。
学生要想熟练使用计算机,仅靠教师的讲授和演示是远远不够的,必须通过大量的实践练习才能掌握运用操作技能和技巧。
练习的方式要多种多样,如课堂问答、上机操作等。
在进行上机操作练习时,一般由教师给学生布置有针对性的练习内容。
例如,讲完Word后,提出排版要求,让学生课下每人准备一篇短文,课上用Word进行排版处理;讲完EXCEL后,让每位学生建立一个中药药物档案。
如此,每完成一项教学内容,就及时让学生进行一定量的练习,有利于调动学生学习兴趣,熟练掌握所学内容,提高学习效果。
2.2与其他中医药课程的整合
高等中医院校计算机教学的最终目的是培养学生利用信息工具为专业服务,而这种能力的培养关键在于教师潜移默化地引导。
利用信息技术学科的工具性特点,加强与其他学科的横向联系,不仅能使学生更扎实地掌握课堂所学内容,而且还能对信息技术课有更完整的认识。
随着计算机技术的发展,从新药品的仿真测试到计算机化培养皿中生长的数字生命形式,这是一种新的方法,不是基于直接的观察和实验,而是基于从真实空间向虚拟空间的映射。
在这样一个伟大的时代,古老的中医学面临着前所未有的机遇和挑战。
怎样将计算机科学与技术融入中医学领域,是一个值得深思和大胆尝试的问题。
例如在中医学中五脏、六腑、气、血、津、液、经络、筋、脉、骨、髓等,都可以构成相对独立的对象。
赋予每个对象适当的属性,对象具有智能性与自适应性,它们可以按照各自的属性做出决策,并随时准备根据接收到的新信息修改自身的行为规则,它们之间通过信息交换互相联系,构成一个复杂系统,这一复杂系统即人体。
用计算机仿真学对中医学中的概念、现象、原理、机制等进行模拟,可以建立各种模型,服务于教学、科研、临床。
2.3激发学生对知识的自主性延伸
在教学过程中,我发现许多学生不满足于书本上学到的内容,总是试图获得更多的信息知识。
有的在课上经常打开其他应用软件并尝试着使用,还有的问我目前市场上流行的软硬件及趋势,这是学生对该学科具有强烈求知欲望的表现。
为此,我们采取了以下两种途径:
第一种途径是让学生围绕计算机相关话题进行讲演。
丰富的信息科技知识是增强信息能力必不可少的条件,它不仅来源于书本,还来源于日常生活中知识的积累。
由于接触环境不同,每位学生对书本之外的信息知识掌握程度不等,为了使更多的学生了解更广泛的信息知识,利用每次课前一小段时间让学生围绕计算机相关话题进行讲演,目的是倡导学生之间进行“信息”交流,把自己了解到的最新的信息知识、市场动态讲出来,让大家来“共享”,或把自己遇到的某些问题提出来让大家一起讨论解决等。
这同时也激发了学生学习的积极性。
例如:
有的学生介绍计算机的最新病毒,有的学生介绍怎样做个人主页等。
通过这种方式,既锻炼了学生的语言表达能力,又可以把教材上没有介绍的前沿知识告诉给大家,不仅令学生信息知识面扩大,拓展了视野,而且激发了学生不断主动去探寻更多信息知识的动力。
第二种途径是创设第二课堂。
为了满足一部分学生想深入学生信息技术知识的要求,我开设了第二课堂,按学习内容不同分为两个活动小组:
(1)程序语言设计
(2)应用软件使用。
学生根据兴趣要求不同进行选学。
经过一段时期的学习,有些学生已能编写VFP或VB语言程序,有些学生对个别应用软件的使用达到了较高的水平,并利用所学帮助其他学科教师制作考试系统,受到了一致好评。
2.4采取灵活多样的教学评价方式
现在我们一般不采用传统的考试方式来评价学生对知识掌握程度的高低。
考核时采取“模块化”、“任务式”的办法,根据所学内容不同采取不同的评价方式。
一般所给题目应满足如下要求:
一要有适当难度;二要在每次考核中,每项任务应有简单的基本要求,让学生明确任务,但不要干涉学生的思路,留给学生足够的想象空间和创新空间;三要能培养与训练学生的实践能力和应用能力。
例如,在学完Word软件后,采取了指定内容、单人考核的方法,由教师提出具体考试要求并限时完成。
要求每位学生用Word软件打印一篇文章,限定排版要求,尽量在测试要求中包括Word中学过的大部分文字处理功能,完成后由教师当堂打分。
在学完PowerPoint软件后,采取了作品展示、他人评价的方式,当学生完成作品时,要求部分学生向全班展示他的作品,并讲述该作品的意图、制作过程等,让其他学生给予评价,教师适当地加以引导。
总之,高等中医院校计算机教学中还有许多问题需要讨论和探索。
但只要我们遵循教育规律,把握信息时代教育观念,在实践中不断探索新的教学模式、教学方法,就一定能培养出赋有时代竞争力的信息人才。
收稿时间:
2010-2-25
笔者通过近几年来在多媒体技术领域的教学和科研,并对国内高校多媒体技术课程教学现状作了认真思考,在此基础上,对笔者已出版的本课程教材进行了改版,由清华大学出版社出版了《多媒体技术基础》(第3版)、《多媒体技术教程》和与这两种教材配套使用的《多媒体技术课程设计和学习辅导》。
下面对这几种教材和笔者在教学中的一些经验和体会与同行作一个简要的交流。
另外,在多年的科研和教学工作中,笔者深感专业技术术语的定名和理解的重要性,因此在本文最后再简要介绍笔者最新修订完成的《英汉多媒体技术辞典》(第2版)所做的一些工作和努力。
1《多媒体技术基础》第3版
《多媒体技术基础》第1版于1998年定稿2000年8月出版,第2版于2001年定稿,2002年9月出版,共印刷20次,曾被评为“2003年度全国优秀畅销图书(科技类)”,2005年评为“北京高等教育精品教材”。
《多媒体技术基础》(第3版)被列选为“普通高等教育‘十一五’国家级规划教材”,现已由清华大学出版社出版发行(ISBN9787-302-17780-7)。
《多媒体技术基础》第2版在2001年定稿时,许多新技术还没有出现或正在开发之中,如MPEG-4AVC/H.264(2003年)和XML1.1(2006年);有些当时认为比较有前途的技术,现在已有更新的技术,如普遍认为2002年公布的SIP(RFC3261)比1996年公布的H.323更简单。
根据笔者近几年的科研、教学和观察,教材中的大部分内容都适合当前使用,因此确定第3版教材的修改方针是保留第2版的体系结构,更新部分章节内容并增加新内容。
1.1教材的组织结构
为保持多媒体技术基础教材内容的完整性,第3版教材仍由多媒体压缩编码、多媒体存储、多媒体传输和多媒体内容处理语言共四个相对独立的部分组成:
(1)多媒体压缩编码(第2~13章),主要介绍声音、图像和数字电视的基本知识、压缩与编码方法;
(2)多媒体存储(第14~16章),主要介绍CD,DVD,HD-DVD和BD(Blu-rayDisc)光盘的存储原理和多媒体在光盘上的存放格式;
(3)多媒体传输(第17~20章),主要介绍多媒体网络应用、服务质量(QoS)、因特网、TCP/IP协议和多媒体传输的基础知识;
(4)多媒体内容处理语言(第21~22章),主要介绍HTML和XML的基础知识。
为帮助读者加深对基础知识的理解,每章后面都有练习和思考题,另有参考答案,可在网站http:
// 每章后面都有参考文献和站点,列出它们有两个目的:
(1)表示在编写本教材过程中访问过这些站点,参考或引用了它们的内容;
(2)更重要的是为读者提供进一步学习的指南,教师要鼓励学生主动上网查阅。
虽然到本书截稿时每个网址都有效,但以后可能会有变化。
1.2教材修改的内容
在第2版教材基础上,第3版教材作了如下修改:
(1)考虑到视像压缩技术在多媒体产品和各种服务中的重要性,因此增加了一章专门用来介绍MPEG-4AVC/H.264。
此外,考虑到光盘存储器在多媒体存储方面的重要性,因此增加了HDDVD和Blu-rayDisc的内容。
(2)考虑到网上多媒体应用如火如荼,如IP电视、IP电话、即时通信和多媒体会议,因此重写了第三部分(第17~20章),突出了多媒体传输或称多媒体通信技术。
(3)考虑到20世纪90年代末期开展的内容处理已成重要的研究方向,因此在第22章(XML语言)中增加了XML新版本的内容。
HTML和XML等标准已经并将继续对日益增长的包括移动通信在内的多媒体网络应用和多媒体电子出版业等行业产生深远的影响。
(4)为降低教材篇幅,第2版中的部分内容没有保留,如MIDI系统。
(5)XHTML是用XML重写的HTML版本,2008年1月介绍的HTML5(也称XHTML5)也是用XML编写的。
因此本版教材没有保留第2版中的第23章(XHML语言)。
1.3教材的使用建议
国内许多大学开设多媒体技术课程已有多年,在网上看到许多兄弟院校在教材建设和课程教学方面已有很多很好的经验,在学习和借鉴他们成功经验的基础上,为使用或打算使用本教材的老师和同学提出如下建议供参考。
(1)有所教有所不教
在编写本教材过程中笔者注意到,国外有些信息技术学院从入大学到研究生毕业,每个年级都开设内容不同、深浅不同的多媒体课程,既有广度又有深度。
考虑到我们目前的多媒体课程教学计划只安排一个学期,学时也不多,因此教师可采用有所教有所不教和有所学有所不学的策略。
任课教师可根据自己的兴趣和专长、学生已有的基础和专业方向,有的放矢地选择其中的部分内容。
对于不作为重点的教学内容,如果有需要,学生自己就会主动去钻研。
(2)教材作为参考书
对于信息技术课程的教材来说,写进书面教材的内容通常是比较成熟的,即使刚刚出版的教材,其内容也不见得新。
据我观察,许多大学的多媒体课程内容是当前最新的技术,教师都有自己编写的教学提纲和材料,而把正式出版的教科书列为必要