C 语言inline函数小结

2024-08-17

C 语言inline函数小结(精选8篇)

1.C 语言inline函数小结 篇一

实验7 函数

一、实验目的(1)掌握定义函数的方法;

(2)掌握函数实参与形参的对应关系以及“值传递”的方式;

(3)掌握函数的嵌套调用和递归调用的方法;

(4)掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。

(5)学习对多文件程序的编译和运行。

二、实验内容

编程序并上机调试运行。

(1)写一个判别素数的函数,在主函数输入一个整数,输出是否是素数的信息。(习

题8.3)

本程序应当准备以下测试数据:17、34、2、1、0。分别输入数据,运行程序并检查结果是否正确。

(2)用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递

给该函数。(习题8.10)

把两个函数放在同一程序文件中,作为一个文件进行编译和运行。

把两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。

(3)用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。

n的为数不确定,可以是任意的整数。(习题8.17)

(4)求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用另一个

函数根据求出的最大公约数求最小公倍数。(习题8.1)

① 不用全局变量,分别用两个函数求最大公约数和最小公倍数。两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数2,以求出最小公倍数,再返回主函数输出最大公约数和最小公倍数。

② 用全局变量的方法,分别用两个函数求最大公约数和最小公倍数,但其值不由函数带回。将最大公约数和最小公倍数都设为全局变量,在主函数中输出它们的值。

(5)写一函数,输入一个十六进制数,输出相应的十进制数。(习题8.16)

2.C 语言inline函数小结 篇二

一、验证随机函数取值范围

有资料显示C语言中随机函数RAND () 的取值范围是-90—32767之间的随机整数, 和我们上面提到的0—32767之间的随机整数有一定差距, 到底哪个正确, 我们不妨亲自编写程序验证。思路是:产生n个随机整数, 每当这个随机整数值小于0时, 我们把计算器次数x增加一次, 程序最后打印x的值。我们可以根据打印出的x值, 做出相应的判断, 如果x值大于0次, 说明rand () 函数有取[-0, -90]之间负整数的可能。据此我们编写c语言程序, 代码如下:

经多次运行, 甚至n最大值取到2G验证, x值始终为零, 说明rand () 函数不可能取负值, 因此验证得到结论:随机函数RAND () 的取值范围是0—32767之间的随机整数。

二、利用随机函数产生指定位数的随机整数

利用RAND () 函数产生一位随机整数 (0—9) , 公式为rand () %10, 产生两位随机整数 (10—99)

公式为rand () %90+10, 产生三位随机整数 (100—999) 公式为rand () %900+100, 以此类推产生n位随机整数公式为rand () % (int) (pow (10, n) -pow (10, n-1) ) + (int) pow (10, n-1) ) , 据此我们可以编程序实现产生n个n位的随机整数 (这里只产生10个数) 。代码如下:

三、利用随机函数产生指定范围的随机整数

利用RAND () 函数产生指定[A, B]范围的随机整数, 公式为rand () % (B-A+1) +A。依此公式我们编写了一个程序, 功能是:出几道加法题给小学生做, 如果学生写对答案, 显示‘ok’字样, 可以进行下一道题;如果没做对, 返回, 重做此题。程序代码如下:

当然, 程序还可有很多变化, 比如学生可以预先选择做几道题, 做完每道题退不退出等, 此处不赘述。

四、综述

利用上述方法, 我们研究了C语言随机整数rand () 几种用法, 运算结果正确问题得到解决, 该方法省时省力, 安全高效, 对c语言的应用与推广意义重大。

参考文献

[1]谭浩强等编著.C程序设计[M].北京:清华大学出版社, 2005 (2007重印)

[2]徐金梧等编著.TURBO C使用大全[M].北京:北京科海培训中心, 1989.

3.C语言教学中函数调用问题探讨 篇三

关键词:函数调用 库函数 案例

1 函数调用问题的提出

本人在教学过程中,出现了多次这种问题。在讲授函数的概念、函数的定义和函数的调用之后,给学生出一道题目用函数来实现,通常情况下,该问题如果不用函数方法而用其他方法做的话,学生可能会做得出来,但让他们必须用自定义函数的方法来实现,他们就感觉无从下手,并不是这个问题本身很难,归根结底,学生对于怎么自定义函数,定义多少个参数,怎么在主调函数中调用自己定义的被调函数不知道如何做。从而导致了用函数解决的问题却用其他方法实现。在这里,我个人通过自己的反复思量,为了提高讲授函数调用的教学效果,自己总结了几条经验。

2 函数调用问题方法讨论

要知道函数怎么调用,首先得知道用户怎么定义函数。

2.1 函数定义的一般格式:

类型标识符[3] 函数名(形式参数列表)

{ 声明部分

语句部分

}

这个格式定义的函数为有参函数,“形式参数列表”中的参数被称为形参,有些函数是无参函数,则“形式参数列表”可以没有,但括弧不能省略,即无参函数。

函数在使用之前要先声明、定义,然后才能调用[1]。

2.2 函数调用的一般形式为:

函数名(实参表列)

函数在程序中出现的位置来分,可以有以下三种函数调用方式[2]:

①函数语句

把函数调用作为一个语句,这种方式不要求函数带回值,如打印图形、显示字符串等。只要函数完成一定的操作。

②函数表达式

函数出现在一个表达式中,这种表达式称为函数表达式。要求函数带回一个确定的值以参加表达式的运算。如:c=10*max(a,b),其中,函数max就是表达式的一部分。

③函数参数

函数调用作为一个函数的实参,如:printf(“%d”,max(a,b));是把max(a,b)作为printf函数的一个参数。

2.3 函数问题案例讲解

①首先从库函数的调用案例着手讲授,学生自然就很轻松上手。

众所周知,库函数中的数学函数学生从高中就经常接触到,在计算机教学的其他课程里面也会经常出现,如excel里面就有数学函数,学生们已经很熟悉了,如下面一道编程题就需要调用库函数解决。

用C语言求14+24+34+……94+104之和。

#include"math.h"

main()

{int n=10,k=4;

long y=0;

for(i=1;i<=n;i++)

y=y+pow(i,k);

printf("%d",y);

}

其中,pow(i,k)就是系统自带的数学函数,i和k是它自带的两个参数,其功能是计算i的k次方。通过这个系统数学函数的调用程序的编写及调试,学生们很轻松就知道库函数怎么调用,即函数名加上函数括号里面的参数。

另外大家使用库函数的时候,一定要在本文件开头用#include命令,将调用有关库函数时所需用到的信息“包含”到本文件中来。该程序开头用语句# include"math.h",即可将数学库函数“包含”到主函数中来。

②用大家熟悉且简短的函数编程案例入手讲解。

典型小案例教学具有很强的启发性,既有利于学生学习,也有利于老师教授。

用C语言函数实现1+2+3+……+20之和。

long fnsum(int n)

{int i;

long y=0;

{for(i=1;i<=n;i++)

y=y+i;}

return y;

}

main()

{

int n=20;

printf("%d",fnsum(n));

}

在这个程序代码中,程序行long fnsum(int n)是自定义函数,fnsum是函数名,n是定义的一个形参,也仅需要一个,表示1+2+……+20共有多少个数求和。由于fnsum函数代码写在main()函数之前,可以不进行声明。反之,若fnsum函数代码写在main()函数之后,必须用代码long fnsum(int n);进行声明。fnsum函数功能即是题目要完成的功能实现,最后通过main()主函数定义一个实参n并赋值20,在printf函数中通过代码printf("%d",fnsum(n)),调用了自定义函数fnsum,并将实参n=20传递给自定义函数fnsum(int n)中的形参n,最终将结果打印输出。

在main()主函数中,fnsum这个函数调用也可以改成如下:

main()

{

int n=20,sum;

sum=fnsum(n);

printf("%d",sum);

}

這个是通过函数表达式的方法进行函数调用,通过这个自定义函数的简单案例讲解,学生很轻松能够理解函数怎么自定义并在main()主函数中调用。

3 结束语

本文分析了C语言函数调用学习过程中存在的问题,在今后的教学过程中,本人将进一步努力提升自己,希望能总结出更多更好的方法来改进函数教学方法,使学生能够更轻松地上手学习。

参考文献:

[1]汪明光.C++语言中函数指针的分析与应用[J].巢湖学院学报,2006,8(3):30-34.

[2]谭浩强.C语言程序设计(第三版)[M].北京:清华大学出版社,2005.143-150.

4.学通C语言:函数型指针 篇四

int func(const int a, const int b);

那么,此时声明的函数变量add的地址即为这个函数的地址,同时,add的值保存为这个函数的地址,这个特性与数组相似:数组变量与数组变量的地址均为数组的起始地址。而在这个函数声明中,函数类型为int (const int a, const int b)。使用该函数类型来定义一个函数型指针,其方式如下:

int (* fp)(const int a, const int b);   /* 其中,参数列表的参数名a和b可省 */

上述语句将变量func定义为指向类型为int (const int a, const int b)的指针操作符和变量名两侧的小括号不可省,否则其含义大不相同。例如:

int * fp(const int a, const int b);

此时,指针操作符与数据类型int结合为int型指针类型,该语句只是声明了一个fp函数,而非定义一个函数指针。为该函数型指针赋值的方式如下:

fp = func;

被赋值的函数变量的类型必须与fp的类型完全一致,包括其返回类型和每一个形参的类型。否则程序将报错。

注意:函数型指针变量赋值时,左值与右值的类型必须完全一致。

使用函数型指针变量调用函数的方法与使用函数变量类似,得到函数地址后再带上参数列表即可。可以使用下面两种方式来调用函数:

fp(5, 6);

(*fp)(5, 6);

由于fp被赋值为函数变量func的地址,而func的值又等于其地址,所以*fp可以得到func函数的地址。因此,在调用方式上,可以粗略地将两者视为一致(实际上其后台的处理略有不同)。范例14-7演示了如何使用函数型指针来调用函数。

【范例14-7】使用函数型指针来调用函数,实现方法如示例代码14-7所示。

示例代码14-7

01   #include

02

03   int add(const int a, const int b) {         /* 定义add函数 */

04      return a + b;

05   }

06

07   int main(void) {

08      int (*fp) (const int a, const int b);      /* 定义函数指针 */

09

10      fp = add;                        /* 将其赋值为add */

11      printf(“3 + 4 = %d”, fp(3, 4));         /* 使用fp计算+ 4的值 */

12      printf(“3 + 4 = %d”, (*fp)(3, 4));      /* 使用*fp计算+ 4的值 */

13

14      printf(“%p”, add);                  /* 输出add的值 */

15      printf(“%p”, &add);                  /* 输出add的地址 */

16      printf(“%p”, fp);                  /* 输出fp的值 */

17      printf(“%p”, *fp);                  /* 输出fp指向的值 */

18

19      return 0;

20   }

【运行结果】程序运行后,

【代码解析】本程序定义了一个函数指针,并将其赋值为相应类型的函数变量add。

   第11~12行分别使用fp和*fp的方式调用函数,从图14-12的第1~2行中可以看到它们的调用结果是一样的。

   第14~17行输出了add的值和地址、fp的值和指向的值,从图14-12的第3~6行中可以看到它们的调用结果都是一样的。

5.c语言函数知识点总结 篇五

1、C语言编写的程序称为源程序,又称为编译单位。

2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。

3、一个C语言程序有且只有一个main函数,是程序运行的起点。

第二节、熟悉vc++

1、VC是软件,用来运行写的C语言程序。

2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c—.obj—.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!)

第三节、标识符

1、标识符(必考内容):

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了

2、标识符分为关键字、预定义标识符、用户标识符。

关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。

用户标识符:基本上每年都考,详细请见书上习题。

第四节:进制的转换

十进制转换成二进制、八进制、十六进制。

二进制、八进制、十六进制转换成十进制。

第五节:整数与实数

1)C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理。(考过两次)

a、C语言中的八进制规定要以0开头。018的数值是非法的,八进制是没有8的,逢8进1。

b、C语言中的十六进制规定要以0x开头。

2)小数的合法写法:C语言小数点两边有一个是零的话,可以不用写。

1.0在C语言中可写成1.

0.1在C语言中可以写成.1。

3)实型数据的合法形式:

a、2.333e-1 就是合法的,且数据是2.333×10-1。

b、考试口诀:e前e后必有数,e后必为整数。请结合书上的例子。

4) 整型一般是4个字节, 字符型是1个字节,双精度一般是8个字节:

long int x; 表示x是长整型。

unsigned int x; 表示x是无符号整型。

第六、七节:算术表达式和赋值表达式

核心:表达式一定有数值!

1、算术表达式:+,-,*,/,%

考试一定要注意:“/” 两边都是整型的话,结果就是一个整型。 3/2的结果就是1.

“/” 如果有一边是小数,那么结果就是小数。 3/2.0的结果就是0.5

“%”符号请一定要注意是余数,考试最容易算成了除号。)%符号两边要求是整数。不是整数就错了。[注意!!!]

2、赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

1、int x=y=10: 错啦,定义时,不可以连续赋值。

2、int x,y;

x=y=10; 对滴,定义完成后,可以连续赋值。

3、赋值的左边只能是一个变量。

4、int x=7.7;对滴,x就是7

5、float y=7;对滴,x就是7.0

3、复合的`赋值表达式:

int a=2;

a*=2+3;运行完成后,a的值是12。

一定要注意,首先要在2+3的上面打上括号。变成(2+3)再运算。

4、自加表达式:

自加、自减表达式:假设a=5,++a(是为6), a++(为5);

运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,

再放到变量a中。 进行了++a和a++后 在下面的程序中再用到a的话都是变量a中的6了。

考试口诀:++在前先加后用,++在后先用后加。

5、逗号表达式:

优先级别最低。表达式的数值逗号最右边的那个表达式的数值。

(2,3,4)的表达式的数值就是4。

z=(2,3,4)(整个是赋值表达式) 这个时候z的值为4。(有点难度哦!)

z= 2,3,4 (整个是逗号表达式)这个时候z的值为2。

补充:

1、空语句不可以随意执行,会导致逻辑错误。

2、注释是最近几年考试的重点,注释不是C语言,不占运行时间,没有分号。不可以嵌套!

3、强制类型转换:

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b) 和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。

4、三种取整丢小数的情况:

1、int a =1.6;

2、(int)a;

3、1/2; 3/2;

第八节、字符

1)字符数据的合法形式::

‘1’ 是字符占一个字节,”1”是字符串占两个字节(含有一个结束符号)。

‘0’ 的ASCII数值表示为48,’a’ 的ASCII数值是97,’A’的ASCII数值是65。

一般考试表示单个字符错误的形式:’65’ “1”

字符是可以进行算术运算的,记住: ‘0’-0=48

大写字母和小写字母转换的方法: ‘A’+32=’a’ 相互之间一般是相差32。

2)转义字符:

转义字符分为一般转义字符、八进制转义字符、十六进制转义字符。

一般转义字符:背诵�、、’、”、。

八进制转义字符: ‘141’ 是合法的, 前导的0是不能写的。

十六进制转义字符:’x6d’ 才是合法的,前导的0不能写,并且x是小写。

3、字符型和整数是近亲:两个具有很大的相似之处

char a = 65 ;

printf(“%c”, a); 得到的输出结果:a

printf(“%d”, a); 得到的输出结果:65

第九节、位运算

1)位运算的考查:会有一到二题考试题目。

总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

例1: char a = 6, b;

b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。

例2: 一定要记住,异或的位运算符号” ^ ”。0 异或 1得到1。

0 异或 0得到0。两个女的生不出来。

考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。

例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。

6.浅谈C语言的递归函数教学方法 篇六

一、函数递归

函数递归, 是指在一个函数中直接或间接调用函数本身。关于递归的概念, 有些初学者感到不好理解, 下面用一个通俗的例子来说明。

例1:有4个人坐在一起, 问第4个人多少岁?他说比第3个人大3岁。问第3个人岁数, 他说比第2个人大3岁, 问第2个人, 说比第1个人大3岁。最后问第1个人, 他说是15岁。请问第4个人多大。

显然, 这是一个递归问题, 要求第4个人的年龄, 就必须先知道第3个人的年龄, 而第3个人的年龄也不知道, 要求第3个人的年龄必须先知道第2个人的年龄, 而第2个人的年龄又取决于第1个人的年龄。而且每一个人的年龄都比其前1个人的年龄大3。即:

可以用式子表述如下:

可以看到, 当n>1时, 求第n个人的年龄的公式是相同的。

求解可分成两个阶段:第一阶段是”回推”, 即将第n个人的年龄表示为第 (n-1) 个人年龄的函数, 而第 (n-1) 个人的年龄仍然不知道, 还要”回推”到第 (n-2) 个人的龄……, 直到第1个人的年龄。此时age (1) 已知, 不必再向前推了。然后开始第二阶段, 采用递推方法, 从第1个人的已知年龄推算出第2个人的年龄 (18岁) , 从第2个人的年龄推算出3个人的年龄 (21岁) , 一直推算出第4个人的年龄 (24岁) 为止。也就是说, 一个递归的题可以分为”回推”和”递推”两个阶段。要经历许多步才能求出最后的值。显而易见, 如果求递归过程不是无限制进行下去, 必须具有一个结束递归过程的条件。

二、递归的条件及递归程序的设计方法

采用递归方法来解决问题, 必须符合以下三个条件:

1、可以把要解决的问题转化为一个新问题, 而这个新的问题的解决方法仍与原来的解决方法相同, 只是所处理的对象有规律地递增或递减。

2、可以应用这个转化过程使问题得到解决。使用其他的办法比较麻烦或很难解决, 而使用递归的方法可以很好地解决问题。

3、必定要有一个明确的结束递归的条件。不然可能导致系统崩溃或陷入死循环。

基于上述的分析, 递归程序可采用以下两种方法写出。

方法一:对于数值问题, 想办法把问题转化为数学表达式, 在程序设计中一般采用下列的双分支语句来实现:

if (递归结束条件) return (递归结束条件中的返回值) ;

else return (递归计算的公式) ;

方法二:对于非数值问题, 同样可以用递归的方法解决。寻找非数值问题的递归算法可以从分析问题本身的规律着手解决。

三、典型例题分析

本文针对数值问题和非数值问题各举一例。

例2:求n!。经过分析, n!可以表示为:

算法分析如下

即有:

假定n!是一个long型, 则直接写出程序如下:

例3:输入一个正整数, 要求以相反的顺序输出该数。

第1步:先将问题进行简化。假设要输出的正整数只有一位, 则该问题就简化为”反向”输出一位正整数。对一位整数实际上无所谓”正”与”反”, 问题简化为输出一位整数。这样简化后的问题可以很容易实现。

第2步:对于一个大于10的正整数, 在逻辑上可以将它分为两部分:个位上数字和个位以前的全部数字。

第3步:将个位以前的全部数字看成一个整体, 则为了反向输出这个大于10的正整数, 可以按如下步骤进行操作:

①输出各位上的数字

②反向输出个位以前的全部数字

这就是将原来的问题分解后, 用较小的问题来解决原来大问题的算法。

参考文献

[1]迟成文:《高级语言程序设计》, 经济科学出版社, 2006年。

7.C 语言inline函数小结 篇七

程序调试技术在函数教学中的具体使用:

1.通过调试技术直观地查看函数的调用过程。首先设计一个简单的使用函数的实例, jc函数实现计算n的阶乘。在main函数中通过函数调用来求任意一个整数的阶乘。double jc (int n) , {double mul=1;//……2, int i;for (i=1;i<=n;i++) mul*=i;returnmul;}//……..3;intmain () , {int num=5;double r;r=jc (n) ;//…….1, printf ("jiecheng is:%.0f", jc (num) ) ;return 0;}。为了给学生演示函数调用的过程, 在标号1语句处设置断点, 然后选择go (F5) 菜单调试执行该程序, 则程序执行到断点处停下, 然后进行单步调试, 在debug工具栏中选择Step into (F11) 项, 跟踪进到jc函数内部查看, 系统的执行箭头就会从原先1的位置跳转到标号2的位置去, 可以通过单击debug工具栏中Call Stack项打开Call Stack对话框查看调用细节, 如图1所示。图中显示了main函数调用了jc函数, 实参的值是10。继续单步调试, 系统执行jc函数的代码, 执行到3处后, 系统的执行箭头就会从标号3的位置跳回到标号1的位置去, 表示函数调用完成, 此时Call Stack对话框也发生了变化, 如图2所示。这样学生就很清晰地看到了程序运行过程中函数的调用过程, 加深了记忆和理解。

2.通过程序调试技术了解函数参数传递过程和局部变量的概念。在函数教学中, 形参和实参的关系往往是学生容易出错的地方。形参和实参是两个不同的变量, 实参的作用就是给形参传值。而函数的形参以及函数内定义的变量都是函数的局部变量, 只能在该函数中使用。而在调试中通过查看变量的值可以很清晰地看到这些知识的作用, 则比较生动具体。在上例中, 程序在断点停下后, 选择debug工具栏中的watch项, 打开watch对话框, 在对话框中输入num和n, 如图3所示, 此时num的值是5, 而由于jc函数还没有被调用, 形参n还不存在。然后选择Step into (F11) 项, 跟踪进到jc函数内部查看, 注意观察watch对话框的变化, 发现n的值变为5, 而num失效了, 如图4所示。这说明程序的执行进入到jc函数, 形参变量n被创建并从实参获得了值5。而num是main函数的局部变量, 在其他函数中如jc函数中是无法访问的, 从而失效。

3.通过调试技术加强对指针做函数参数的内容的理解。在讲解函数的过程中, 指针做参数是重点和难点之一。教师在教学过程中强调指针做形参, 可以突破局部变量的限制而访问到其他函数的局部变量, 这在以后的函数使用中经常用到。但学生觉得很难理解。笔者通过调试技术运行一个实例, 查看实际的运行过程, 来加深学生对内容的理解。首先设计一个简单的指针做参数的实例。void fun (int*q) {*q=10;//…….2}int main () {int n=89;int*p=&n;fun (p) ;//…….1printf ("n=%dn", n) ;return 0;}, 在标号1处设置断点。调试运行该程序, 在断点处停下, p是fun函数的实参。此时选择debug工具栏中的watch项, 打开watch对话框, 分别输入p和&n, 如图5所示, 它们值相同, 都是0x0012ff44, 表示n的内存地址。然后选择Step into项跟踪进入fun函数内部执行, 由于p和n是main函数的局部变量, 在fun函数内部无法访问, 它们的值失效。然后, 在watch对话框中再输入q和*q, 则可以看到如图6的内容。说明形参q从实参p获得了值0x0012ff44, 即q也保存了main函数中n的地址, 而*q的意思是通过q保存的地址访问该地址所表示的变量。继续单步执行, 返回到main函数执行, 此时查看n的值, 果真变为了10。即在fun函数内部通过指针变量改变了main函数中局部变量的值。

笔者在实际的函数教学中采用了程序调试技术, 让学生直观地看到了程序的运行过程, 从而加深了学生对函数调用过程、参数传递、指针做参数等内容的理解。学生反应良好。计算机技术总是在不断的发展, 教师还要不断地探索更好的教学方法, 使C语言课程的教学质量进一步提高。

参考文献

[1]谭浩强.C程序设计 (第四版) [M].清华大学出版社, 2010.7.

[2]王涛伟, 杨秀金.C++函数的参数传递和返回值问题的教学研讨[J].吉林大学学报 (信息科学版) , 2005, (23) :70-74.

8.C 语言inline函数小结 篇八

在面向过程程序设计中, 涉及到文件相关的内容是C语言的一个难点。在C语言中, 对于输入、输出的数据都按“数据流”的形式进行处理;输出时, 系统不添加任何信息;输入时, 逐一读入数据, 直到遇到EOF或文件结束标志就停止。feof函数[1]是用来判断文件是否结束。如果遇到文件结束, 函数feof () 的值为1, 否则为0。目前常用的文档编码为ANSI和Unicode类型, 而在我们的电脑中, 系统默认的文本文档编码为ANSI编码。

2. 编写简单的测试程序

我们来看一个C语言程序:编写C程序将磁盘中的一个文件复制到另一个文件中。通过两个文本文档a.txt和b.txt进行操作。[2]

3. 程序分析

由上面这个程序可得首先定义两个文件指针f1和f2, f1执行读操作, f2执行写操作, 当系统读取到a.txt里的内容不为空的时候, while循环执行, 直到内容为空止, 然后把读取到的内容写入b.txt文件里面。最后关闭两个文件指针。程序没有任何问题, 但是执行以后, 出现了问题, 从a.txt复制到b.txt的内容在最后多了一个类似于“?”的奇怪的字符, 这是什么原因呢?先来看○1这个while循环里面的内容“!feof (f1) ”:feof是一个判断文件结束函数, 因为当数据以二进制形式存放到文件中, 就会有-1值的出现, 这时候不能采用EOF作为二进制文件的结束标志。为解决这一个问题, ANSI提供一个feof函数, 用来判断文件是否结束。如果遇到文件结束, 函数feof (f1) 的值为1, 否则为0。所以当f1打开的内容不为空时, while一直会循环。这里面关键的一点是feof (f1) 的值是由最后一次读操作决定, 如果读操作越过了文件尾, 那么feof () 返回TRUE。注意:是越过, 而不是到达。

举个例子:假如有1个10个字节的文件。

如果只读取了10个字节, feof () 返回FALSE, 也就是0,

如果只读取了11个字节, feof () 返回TRUE, 也就是1。

4. 结论

从测试结果看出, feof () 函数总会多读取一个字节后才会停止, 最后写入数据就是文件缓冲区结束符“?”的奇怪的字符, 在ANSI中, 文件缓冲区结束符的二进制代码为0xff, 转换为十进制为255, 将其输出到默认编码类型为ANSI的文本文档中 (windows操作系统初始的文本文档都是默认为ANSI编码) , 就会出现“?”这个字符 (这个字符还可以在文本文档中通过ALT+255进行操作) 。

为了避免“?”字符的出现, 可以采用以下方法:

(1) 在执行程序之前, 将文本文档的编码类型由ANSI改变成Unicode类型。

(2) 假如需要使用feof () 函数, 又不想改变 (下转第155页) 文档编码类型, 我们可以将fputc () 和fgetc () 用fputs () 和fgets () 函数进行替换, 因为使用fgets () 函数最多只能读入n-1个字符。读入结束后, 系统将自动在最后加'', 也就避免出现以上问题。

(3) 在while语句中用EOF来做, 因为当读到结束符时就跳出循环, 所以也不会出现这个问题了。比如可以在之前定义一个char ch[10], 循环内容变为while ( (ch=fgetc (f1) ) !=EOF) 。

综上所述, 在对C语言中文件中相关函数使用的时候, 需要注意涉及到相关的文档编码尽量要使其编码格式使用Unicode格式, 或者把单个字符的结构转换为字符串的结构, 这样输出的结果就不会出现问题了。

参考文献

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

上一篇:校园卫生食品安全教育下一篇:幼儿园安全宣传资料