c语言函数毕业论文范文

时间:2022-12-09 05:51:51 作者:我像科学家吗亲 综合材料 收藏本文 下载本文

“我像科学家吗亲”通过精心收集,向本站投稿了17篇c语言函数毕业论文范文,以下是小编为大家整理后的c语言函数毕业论文范文,欢迎参阅,希望可以帮助到有需要的朋友。

篇1:C语言实验报告《函数》

C语言实验报告《函数》 -实习报告

学号:__________    姓名:__________    班级:__________    日期:__________指导教师:__________    成绩:__________实验四  函数一、 实验目的1、掌握函数定义、调用和声明的方法2、掌握实参和形参之间的'传递方式3、函数的嵌套调用二、 实验内容1、 写一个函数,将两个字符串连接。(习题8.6)2、 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。(习题8.9)3、 请将实验三中的实验内容三改正后,再改写成函数形式(排序部分)。物理实验报告 ・化学实验报告 ・生物实验报告 ・实验报告格式 ・实验报告模板三、 实验步骤与过程 四、程序调试记录

篇2:五、(C语言)函数

概述

在第一章中已经介绍过,C源程序是由函数组成的, 虽然在前面各章的程序中都只有一个主函数main, 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。 C语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。

可以说C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。 由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。

在C语言中可从不同的角度对函数分类。

1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。

(1)库函数

由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、scanf 、getchar 、putchar、gets、puts、strcat等函数均属此类。

(2)用户定义函数

由用户按需要写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。

(1)有返回值函数

此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。

(2)无返回值函数

此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。

3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。

(1)无参函数

函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

(2)有参函数

也称为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。

4. C语言提供了极为丰富的库函数, 这些库函数又可从功能角度作以下分类。

(1)字符类型分类函数

用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。

(2)转换函数

用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。

(3)目录路径函数

用于文件目录和路径操作。

(4)诊断函数

用于内部错误检测。

(5)图形函数

用于屏幕管理和各种图形功能,

(6)输入输出函数

用于完成输入输出功能。

(7)接口函数

用于与DOS,BIOS和硬件的接口。

(8)字符串函数

用于字符串操作和处理。

(9)内存管理函数

用于内存管理。

(10)数学函数

用于数学函数计算。

(11)日期和时间函数

用于日期,时间转换操作。

(12)进程控制函数

用于进程管理和控制。

(13)其它函数

用于其它各种功能。

以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。 应首先掌握一些最基本、最常用的函数,再逐步深入。由于篇幅关系,本书只介绍了很少一部分库函数, 其余部分读者可根据需要查阅有关手册。

还应该指出的是,在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 因此,C程序的执行总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有,也只能有一个主函数main。

函数定义的一般形式

1.无参函数的一般形式

类型说明符 函数名()

{

类型说明

语句

}

其中类型说明符和函数名称为函数头。 类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也有类型说明, 这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值, 此时函数类型符可以写为void。

我们可以改为一个函数定义:

void Hello()

{

printf (“Hello,world \n”);

}

这里,只把main改为Hello作为函数名,其余不变。Hello 函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。

2.有参函数的一般形式

类型说明符 函数名(形式参数表)

型式参数类型说明

{

类型说明

语句

}

有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。在形参表中给出的参数称为形式参数, 它们可以是各种类型的变量, 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,当然必须给以类型说明。例如,定义一个函数, 用于求两个数中的大数,可写为:

篇3:c语言函数天天见

总结在学习过程中遇到的c语言函数:

1、相关函数:fstat, lstat, chmod, chown, readlink, utime

头文件:#include#include

定义函数:int stat(const char * file_name, struct stat *buf);

函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中,成功返回0,失败返回-1. stat结构体内详细信息不再赘述,可以参考其他博客资料。

使用方法:

struct stat sa;

if(stat(filename,&sa)<0)

{

return -1;

}

....

2、memset

总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

#include

using namespace std;

void main()

{

char s[20];

cout<<“s大小”<

3、rand(),RAND_MAX

rand()产生随机数的一个随机函数;

RAND_MAX是C中stdlib.h中宏定义的一个字符常量:

#define RAND_MAX Ox7FFF

其值最小为32767,最大为2147483647

通常在产生随机小数时可以使用RAND_MAX,

#include

#include

#include

using namespace std;

int main(void)

{

srand((unsigned int)time(NULL));

double a[10];

int i;

cout<

篇4:C语言调用Lua函数

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪,那个时期,人们经常称互联网为赛博空间。如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部《红楼梦》那么多的文字。只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。在你的时间线上,两条相邻信息往往是八竿子也打不着的。而且你还时不时去看看关注者有没有更新,期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境地滚动着,是如此的热闹,仿佛每个人都在狂欢,而我的内心却如此的空虚与孤独。

在lua API中,调用一个函数的步骤很简单:1.压入你要调用的函数,使用lua_getglobal。2.压入调用参数。3.使用lua_pcall4.从栈中弹出结果。

举例说明,假设你有这么一个lua函数:function f (x, y)

return (x^2 * math.sin(y))/(1 - x)

end

那么,我们就可以定义个c函数来封装这个调用:/* call a function ‘f‘ defined in Lua */

double f (double x, double y) {

double z;lua_getglobal(L, “f”); lua_pushnumber(L, x); lua_pushnumber(L, y); /* do the call (2 arguments, 1 result) */if (lua_pcall(L, 2, 1, 0) != 0) error(L, “error running function ‘f‘: %s”,lua_tostring(L, -1));

if (!lua_isnumber(L, -1)) error(L, “function ‘f‘ must return a number”);z = lua_tonumber(L, -1);lua_pop(L, 1); return z;}

lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入,

如果lua_pcall运行出错,那么会返回个非0值。(完)

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

第一节、对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)转义字符:

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

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

八进制转义字符: ‘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、使用printf和scanf函数时,要在最前面加上#include“stdio.h”

2、printf可以只有一个参数,也可以有两个参数。(选择题考过一次)

3、printf(“ 第一部分 ”,第二部分 );把第二部分的变量、表达式、常量以第一部分的形式展现出来!

4、printf(“a=%d,b=%d”,12, 34) 考试重点!

一定要记住是将12和34以第一部分的形式现在在终端也就是黑色的屏幕上。考试核心为:一模一样。在黑色屏幕上面显示为 a=12,b=34

printf(“a=%d, b=%d”,12, 34)那么输出的结果就是:a=12,

b=34

5、int x=017; 一定要弄清楚为什么是这个结果!过程很重要

printf(“%d”, x); 15

printf(“%o”, x); 17

printf(“%#o”,x); 017

printf(“%x”, x); 11

printf(“%#x”,x); 0x11

6、int x=12,y=34; 注意这种题型

char z=‘a’;

printf(“%d ”,x,y); 一个格式说明,两个输出变量,后面的y不输出

printf(“%c”,z); 结果为:12a

7、一定要背诵的

格式说明 表示内容 格式说明 表示内容

%d 整型 int %c 字符 char

%ld 长整型 long int %s 字符串

%f 浮点型 float %o 八进制

%lf double %#o 带前导的八进制

%% 输出一个百分号 %x 十六进制

%5d %#x 带前导的十六进制

举例说明:

printf(“%2d”,123 ); 第二部分有三位,大于指定的两位,原样输出123

printf(“%5d”,123 ); 第二部分有三位,小于指定的五位,左边补两个空格 123

printf(“%10f”,1.25 ); 小数要求补足6位的,没有六位的补0,。结果为 1.250000

printf(“%5.3f”,125 ); 小数三位,整个五位,结果为1.250(小数点算一位)

printf(“%3.1f”,1.25 );小数一位,整个三位,结果为1.3(要进行四舍五入)

第二节 数据输入

1、scanf(“a=%d,b=%d”,&a,&b) 考试超级重点!

一定要记住是以第一部分的格式在终端输入数据。考试核心为:一模一样。

在黑色屏幕上面输入的为 a=12,b=34才可以把12和34正确给a和b 。有一点不同也不行。

2、scanf(“%d,%d”,x,y);这种写法绝对错误,scanf的第二个部分一定要是地址!

scanf(“%d,%d”,&x,&y);注意写成这样才可以!

3、特别注意指针在scanf的考察

例如: int x=2;int *p=&x;

scanf(“%d”,x); 错误 scanf(“%d”,p);正确

scanf(“%d”,&p); 错误 scanf(“%d”,*p)错误

4、指定输入的长度 (考试重点)

终端输入:1234567

scanf(“%2d%4d%d”,&x,&y,&z);x为12,y为3456,z为7

终端输入:1 234567 由于1和2中间有空格,所以只有1位给x

scanf(“%2d%4d%d”,&x,&y,&z);x为1,y为2345,z为67

5、字符和整型是近亲:

int x=97;

printf(“%d”,x); 结果为97

printf(“%c”,x); 结果为 a

6、输入时候字符和整数的区别(考试超级重点)

scanf(“%d”,&x);这个时候输入1,特别注意表示的是整数1

scanf(“%c”,&x);这个时候输入1,特别注意表示的是字符‘1’ASCII为整数48。

补充说明:

1)scanf函数的格式考察:

注意该函数的第二个部分是&a 这样的地址,不是a;

scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。

2)putchar ,getchar 函数的考查:

char a = get) 是没有参数的,从键盘得到你输入的一个字符给变量a。

put‘y’)把字符y输出到屏幕中。

3)如何实现两个变量x ,y中数值的互换(要求背下来)

不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。

4)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)

y=(int)(x*100+0.5)/100.0 这个保留两位,对第三位四舍五入

y=(int)(x*1000+0.5)/1000.0 这个保留三位,对第四位四舍五入

y=(int)(x*10000+0.5)/10000.0 这个保留四位,对第五位四舍五入

这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉。

篇7:c语言函数知识点总结

特别要注意:C语言中是用非0表示逻辑真的,用0表示逻辑假的。

C语言有构造类型,没有逻辑类型。

关系运算符号:注意<=的写法,==和=的区别!(考试重点)

if只管后面一个语句,要管多个,请用大括号!

1)关系表达式:

a、表达式的数值只能为1(表示为真),或0(表示假)。

如 9>8这个关系表达式是真的,所以9>8这个表达式的数值就是1。

如 7<6这个关系表达式是假的,所以7<6这个表达式的数值就是0

b、考试最容易错的:就是int x=1,y=0,z=2;

x

篇8:C 语言free 函数的原理

今天在网上看到了这样一个问题,“如果malloc 了一块字符串的内存,然后,它改变了这个字符串的大小,问会不会有一部分内存没有被释放掉,”这个问题,以前的确没有仔细想过。

当然,我觉得是肯定会释放掉的,但是一直没有了解过free 的原理,不敢乱说。我看了一下操作系统的内存管理,基本上是这样的,当然各个系统的实现不一样。

操作系统管理内存,维护了一个空闲内存链表,malloc从个链表中选出一个来使用,每个内存块都有一个头部来表示这个内存的基本信息,如内存大小,

所以free 时候 能够记住原来指针所指的内存大小,而不是用内存块中是否有 \0 来临时计算指向内存的大小,不要字符串的计算长度的方法所误导,

还有一点要注意的就是,系统在free 内存的时候,记住的只是 malloc 时候的地址,和 分配内存的大小。

比如 char *p = (char *)malloc(10); 就会产生分配10个 字节。如果 你把指针的地址改变了 p = p + 1; 然后 free 就要出问题了。程序会崩溃。

如果一定要改变指针的值,建议这样做 char *newp = p; 然后 改变 newp = newp + 1 , 最后 free(p);

还有一点要注意,一个长度 为10 的字符串 要占用 11个字节。因为还有一个 '\0', 所以分配内存的时候要分配 lenght + 1 的大小。

篇9:学通C语言:函数型指针

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行中可以看到它们的调用结果都是一样的。

篇10:C语言sprintf与sscanf函数

1、前言

我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来,从给定的字符串中提取相关内容,例如给定一个地址:www.bokeyuan.cn:2345,我们要从地址中提出协议,主机地址和端口号。之前对字符串和数字之间的关系不是很熟悉,工作中经常涉及到这个,如是好好总结一下。C语言提供了一些列的格式化输入输出函数,最基本的是面向控制台标准输出和输入的printf和scanf,其实还有面向字符串的sprint和sscanf,面向文件的流的fprintf和fscanf。今天着重总结一下sprintf和sscanf系列函数,这两个函数类似于scanf和printf ,不同点是从字符串*buffer用于输入输出。

2、sprintf函数

sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串,具体功能如下所示:

(1)将数字变量转换为字符串。

(2)得到整型变量的16进制和8进制字符串。

(3)连接多个字符串。

举例如下所示:

1 char str[256] = { 0 };

2 int data = 1024;

3 //将data转换为字符串

4 sprintf(str,“%d”,data);

5 //获取data的十六进制

6 sprintf(str,“0x%X”,data);

7 //获取data的八进制

8 sprintf(str,“0%o”,data);

9 const char *s1 = “Hello”;

10 const char *s2 = “World”;

11 //连接字符串s1和s2

12 sprintf(str,“%s %s”,s1,s2);

3、sscanf函数

sscanf函数原型为int sscanf(const char *str, const char *format, ...)。将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。具体功能如下:

(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。

(2)取指定长度的字符串

(3)取到指定字符为止的字符串

(4)取仅包含指定字符集的字符串

(5)取到指定字符集为止的字符串

sscanf可以支持格式字符%[]:

(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母

(2)^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符 %[^/]表示除/以外的所有字符

(3),: 范围可以用“,”相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母

(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[] 的一个特例 %[^ ](注意^后面有一个空格!)

解析网址的例子如下所示:

1 const char *s = “www.baidu.com:1234”;

2 char protocol[32] = { 0 };

3 char host[128] = { 0 };

4 char port[8] = { 0 };

5 sscanf(s,“%[^:]://%[^:]:%[1-9]”,protocol,host,port);

6

7 printf(“protocol: %s\n”,protocol);

8 printf(“host: %s\n”,host);

9 printf(“port: %s\n”,port);

10

4、snprintf函数

snprintf函数是sprintf函数的更加安全版本,考虑到字符串的字节数,防止了字符串溢出。函数形式为:int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);。最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。

5、测试程序

本次采用ip地址和整型之间的转换,mac地址转换作为测试程序,整个程序如下所示:

1 #include

2 #include

3

4 #define IP_STR_LEN 18

5 #define MAC_STR_LEN 18

6 #define MAC_BIT_LEN 6

7 #define LITTLE_ENDIAN 0

8 #define BIG_ENDIAN 1

9

10 typedef unsigned char uchar;

11 typedef unsigned int uint;

12

13 int big_little_endian

14 {

15 int data = 0x1;

16 if (*((char*)&data) == 0x1)

17 return LITTLE_ENDIAN;

18 return BIG_ENDIAN;

19 }

20

21 uint ipstr2int(const char * ipstr)

22 {

23 assert(ipstr);

24 uint a,b,c,d;

25 uint ip = 0;

26 sscanf(ipstr,“%u.%u.%u.%u”,&a,&b,&c,&d);

27 a = (a << 24) ;

28 b = (b << 16) ;

29 c = (c << 8) ;

30 d = (d << 0) ;

31 ip = a | b | c | d;

32 return ip;

33 }

34

35 char *int2ipstr(const uint ip, char *ipstr, const uint ip_str_len)

36 {

37 assert(ipstr);

38 if (big_little_endian() == LITTLE_ENDIAN)

39 sprintf(ipstr,“%u.%u.%u.%u”,

40 (uchar)*((char*)(&ip)+3),

41 (uchar)*((char*)(&ip)+2),

42 (uchar)*((char*)(&ip)+1),

43 (uchar)*((char*)(&ip)+0));

44 else

45 sprintf(ipstr,“%u.%u.%u.%u”,

46 (uchar)*((char*)(&ip)+0),

47 (uchar)*((char*)(&ip)+1),

48 (uchar)*((char*)(&ip)+2),

49 (uchar)*((char*)(&ip)+3));

50

51 return ipstr;

52 }

53

55 char *mac2str(const unsigned char *mac,char *mac_str,const uint mac_str_len)

56 {

57 assert(mac_str);

58 sprintf(mac_str,“%02X-%02X-%02X-%02X-%02X-%02X”,

59 mac[0],mac[1],mac[2],

60 mac[3],mac[4],mac[5]);

61 }

62

63 int main()

64 {

65 char ip_str[IP_STR_LEN] = {0};

66 char mac_str[MAC_STR_LEN] = {0};

67 unsigned char mac[MAC_BIT_LEN] = {0XEF,0XAD,0XF4,0X4F,0XAA,0X0F};

68 const char *ipstr = “10.0.3.193”;

69 unsigned int ip;

70 int2ipstr(167773121,ip_str,IP_STR_LEN);

篇11:C语言函数教学的论文

关于C语言函数教学的论文

C语言的学习在整个计算机专业甚至非计算机专业的学习中都有举足轻重的作用。函数的学习在C语言的学习中是具有灵魂作用的一章。根据笔者多年的C语言教学经验,发现很多学生在进行函数的学习时,遇到很大的困难。很多学生因为函数没搞清楚,导致整个C语言的水平永远只停留在入门的阶段。分析原因,一是大多课本函数知识的安排很靠后,这样函数在整个C语言的学习中课时较少;二是我认为大多是教学方法不合理,很多教师过分注重C语言语法知识的学习,没有注重编程思想的培养。

一、函数的概念函数是一组语句,这组语句可以完成一个独立的操作,这组语句有一个简短的名字,程序员可以仅仅利用这个名字完成某个操作。函数的使用,使复杂的程序变得简单化、条理化、清晰化。在C语言中函数分为两大类:库函数、用户自定义函数。

1、库函数在编写程序的过程中往往有一些操作需要频繁的使用,并且这些操作的.代码实现又有一定的难度。比如数据的输入、输出。在C语言中是没有输入输出语句的,由于输入输出涉及到多计算机硬件的直接操作,对用户来说较困难。这些操作往往由编译系统的开发商提供给用户。它们都是以独立程序块的模式出现,并且存在于编译系统的某个文件中,这就是库函数。比如printf(),scanf()。它们是由编译程序根据一般用户的需要编制并提供给用户使用的一组程序代码。C语言的库函数极大地方便了用户,同时也补充了C语言本身的不足。事实上,在编写C语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。

2、用户自定义函数用户自定义函数顾名思义就是用户自己定义的函数。程序的编写过程其实就是一个个函数的定义过程。很多情况下,C语言的编译系统提供给我们的函数并不能满足用户的要求,这就要求用户自己编写函数。函数是由一组语句组成,并给定一个名字。相应的函数的定义一般可分为两大部分:函数头部的定义、函数体的定义。形式如下:函数的类型函数名(函数的参数){函数体;}上面大括号上边的一行成为函数的头部(首部),它给出了函数的表面信息:函数返回值的类型,函数的名字,函数要处理的数据;大括号内的语句描述了函数的内在构造,这组语句完成一个独立的操作,是对函数能够完成功能的具体描述。

3、函数的调用函数是由一组语句组成,并给定一个名字。执行与函数相关的一组语句的行为称为函数的调用。应该说函数定义好之后调用之前是没有什么意义的。函数就像某个具有特殊功能的机器工具。这些机器只有在开关打开之后才能发挥作用。在程序编写过程中,完成“开关机器”这个操作的就是函数调用。函数调用的一般形式:函数名(实际参数);

二、函数的教学C语言函数的教学主要是学习自定义函数以及库函数的使用。

1、库函数的教学库函数的教学主要是引导学生主动积极地去使用库函数。由于大多数课本中库函数仅仅是提及,学生大多只会简单输入输出函数及一些字符串处理函数的使用。其实库函数还有大量的函数提供给我们。但很多学生不会主动去了解,去使用,原因主要是学生不了解库函数有哪些,能干什么。针对这种情况,我们可以在教学中找一些用法简单有趣的库函数来激发学生的学习兴趣。比如可以把图形函数库中的一些函数做一简单介绍,在屏幕上输出一些带有色彩的简单的图案。事实证明色彩的引入能引起很多学生主动使用库函数的兴趣。

2、自定义函数的教学在这个环节的教学中,函数定义的一般形式很多学生能够掌握。但是函数的参数确定以及函数返回值的确定对很多函数初学者来说是难点。我认为,这个地方我们可以引入图示法来理解函数的参数和函数的返回值。函数其实就是对某些数据的处理,我们把函数理解为一个黑匣子,它有一个入口和一个出口。入口进入的数据就是你要处理的数据,也就是函数的参数。出口出去的数据就是数据的处理结果,也就是函数的返回值。

篇12:C语言main函数生成可执行法

1、define预处理指令

这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串,示例程序如下:

#include

#define begin main

int begin(void)

{

printf(“Hello, World!\n”);

return 0;

}

#include

#define begin m##a##i##n

int begin(void)

{

printf(“Hello, World!\n”);

return 0;

}

严格来说,这种方式只算是一种技巧......

2、_start函数

_start函数是C程序的入口函数,会调用main函数。在调用main函数之前,会先执行_start函数分配必要的资源,然后再调用main函数。但是在用gcc编译程序时可以使用-nostartfiles选项来重写_start函数。示例程序如下:

#include

#include

_start(void) {

printf(“Hello, World!\n”);

exit(0);

}

编译上面的程序的命令为:

gcc -nostartfiles _start.c -o a.out

反汇编生成的可执行程序,如下所示:

a.out: file format elf64-x86-64

Disassembly of section .plt:

0000000000400320

:

400320: ff 35 ea 01 20 00 pushq 0x2001ea(%rip) # 600510 <_GLOBAL_OFFSET_TABLE_+0x8>

400326: ff 25 ec 01 20 00 jmpq *0x2001ec(%rip) # 600518 <_GLOBAL_OFFSET_TABLE_+0x10>

40032c: 0f 1f 40 00 nopl 0x0(%rax)

0000000000400330

:

400330: ff 25 ea 01 20 00 jmpq *0x2001ea(%rip) # 600520 <_GLOBAL_OFFSET_TABLE_+0x18>

400336: 68 00 00 00 00 pushq $0x0

40033b: e9 e0 ff ff ff jmpq 400320

0000000000400340:

400340: ff 25 e2 01 20 00 jmpq *0x2001e2(%rip) # 600528 <_GLOBAL_OFFSET_TABLE_+0x20>

400346: 68 01 00 00 00 pushq $0x1

40034b: e9 d0 ff ff ff jmpq 400320

Disassembly of section .text:

0000000000400350 <_start>:

400350: 55 push %rbp

400351: 48 89 e5 mov %rsp,%rbp

400354: bf 68 03 40 00 mov $0x400368,%edi

400359: e8 d2 ff ff ff callq 400330

40035e: bf 00 00 00 00 mov $0x0,%edi

400363: e8 d8 ff ff ff callq 400340 exit@plt

上面的结果是完整的反汇编结果,我们可以看到_start函数中只有我们调用printf和exit函数相关的一些指令,并且.txt段中只有_start函数,没有看到main函数。如果将源代码中的_start替换为main,重新编译程序,反汇编的结果中会看到_start函数会调用到main。

另外还有一点需要注意,因为这里重写了_start函数,所以gcc为默认的main函数准备的清理动作就没用上,所以如果退出的时候直接使用return,会导致程序崩溃。所以这里要使用exit来退出程序。具体的原因可以参见这篇文章。

3、gcc的-e选项

示例程序如下:

#include

#include

int nomain(int i, int j, int k) {

printf(“Hello, World!\n”);

exit(0);

}

将上面的程序保存为m.c,编译命令如下所示:

gcc -nostartfiles -e nomain m.c -o a.out

继续使用objdump反汇编生成的可执行程序,结果如下:

a.out: file format elf64-x86-64

Disassembly of section .plt:

0000000000400320

:

400320: ff 35 f2 01 20 00 pushq 0x2001f2(%rip) # 600518 <_GLOBAL_OFFSET_TABLE_+0x8>

400326: ff 25 f4 01 20 00 jmpq *0x2001f4(%rip) # 600520 <_GLOBAL_OFFSET_TABLE_+0x10>

40032c: 0f 1f 40 00 nopl 0x0(%rax)

0000000000400330

:

400330: ff 25 f2 01 20 00 jmpq *0x2001f2(%rip) # 600528 <_GLOBAL_OFFSET_TABLE_+0x18>

400336: 68 00 00 00 00 pushq $0x0

40033b: e9 e0 ff ff ff jmpq 400320

0000000000400340:

400340: ff 25 ea 01 20 00 jmpq *0x2001ea(%rip) # 600530 <_GLOBAL_OFFSET_TABLE_+0x20>

400346: 68 01 00 00 00 pushq $0x1

40034b: e9 d0 ff ff ff jmpq 400320

Disassembly of section .text:

0000000000400350:

400350: 55 push %rbp

400351: 48 89 e5 mov %rsp,%rbp

400354: 48 83 ec 10 sub $0x10,%rsp

400358: 89 7d fc mov %edi,-0x4(%rbp)

40035b: 89 75 f8 mov %esi,-0x8(%rbp)

40035e: 89 55 f4 mov %edx,-0xc(%rbp)

400361: bf 75 03 40 00 mov $0x400375,%edi

400366: e8 c5 ff ff ff callq 400330

40036b: bf 00 00 00 00 mov $0x0,%edi

400370: e8 cb ff ff ff callq 400340

从上面我们可以看到指定的nomain函数位于.text段的开始位置,同样在函数结束的时候没有gcc为main函数准备的清理动作,所以在这里也只能使用exit()来退出程序,而不能使用return,

4、nostartfiles选项

前面已经多次使用了该选项,不过都是配合其他选项使用的,这个选项也可以单独使用,其含义为“Do not use the standard system startup files when linking”。

示例程序如下:

#include

#include

void func() {

printf(“I am func....\n”);

}

int nomain1(int i, int j, int k) {

func();

printf(“%s: Hello, World!\n”, __func__);

exit(0);

}

上面的程序保存为k.c,然后使用下面的命令编译:

[root@CentOS_190 ~]# gcc -nostartfiles p.c

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400398

在单独使用nostartfiles选项时会报警告,生成的可执行程序可以执行,但是会产生段错误,去掉对func()函数的调用就不会产生段错误了。将生成的可执行程序反汇编,和使用前面的方法生成可执行程序的反汇编结果比较,发现除了函数名不一样外,没有其他区别,不知道为什么会产生段错误。知道的麻烦告知一声,拜谢!

篇13:计算机二级C语言程序设计考点:函数

1库函数的正确调用

1.C语言提供了丰富的库函数,包括常用数学函数、对字符和字符串处理函数、输入输出处理函数等。在调用库函数时要注意以下几点:

(1)调用C语言标准库函数时必须在源程序中用include命令,include命令的格式是:

#include″头文件名″

include命令必须以#号开头,系统提供的头文件名都以.h作为后缀,头文件名用一对双引号″″或一对尖括号〈〉括起来。

(2)标准库函数的调用形式:

函数名(参数表)

2.在C语言中库函数的调用可以以两种形式出现:出现在表达式中;作为独立的语句完成某种操作。

2函数的定义方法

1.C语言函数的一般形式为:

函数返回值的类型名函数名(类型名形参1,类型名形参2,…)

{

说明部分

语句部分

}

定义的第一行是函数的首部,{}中的是函数体。

2.在老的C语言版本中,函数的首部用以下形式:

函数返回值的类型名函数名(形参1,形参2…)

形参类型说明;

新的ANSI标准C兼容这种形式的函数首部说明。

3.函数名和形参名是由用户命名的标识符。在同一程序中,函数名必须唯一。形式参数名只要在同一函数中唯一即可,可以与函数中的变量同名。

4.C语言规定不能在一个函数内部再定义函数。

5.若在函数的首部省略了函数返回值的类型名,把函数的首部写成:

函数名(类型名形参1,类型名形参2,…)

则C默认函数返回值的类型为int类型。

6.当没有形参时,函数名后面的一对圆括号不能省略。

3函数的类型和返回值

1.函数的类型由函数定义中的函数返回值的类型名确定,函数的类型可以是任何简单类型,如整型、字符型、指针型、双精度型等,它指出了函数返回值的具体类型。当函数返回的是整型值时,可以省略函数类型名。当函数只完成特定的操作而没有或不需要返回值时,可用类型名void(空类型)。

2.函数返回值就是return语句中表达式的值。当程序执行到return语句时,程序的流程就返回到调用该函数的地方(通常称为退出调用函数),并带回函数值。

4形式参数与实际参数,参数值的传递

1.在函数定义中,出现的参数名称为形参(形式参数),在调用函数时,使用的参数值称为实参(实际参数)。

2.调用函数和被调用函数之间的参数值的传递是″按值″进行的,即数据只能从实参单向传递给形参。也就是说,当简单变量作为实参时,用户不能在函数中改变对应实参的值。

5函数的正确调用(嵌套调用,递归调用)

1.调用函数时,函数名必须与被调用的函数名字完全一样。实参的个数与类型和形参的个数与类型一致。

2.C语言规定:函数必须先定义,后调用,也就是被调用函数必须在调用之前加以说明,或被调用函数整个放在调用函数之前。但对返回值类型为int或char类型的函数可以放在调用函数的后面。

3.C语言中函数定义都是互相平行、独立的,C语言不允许嵌套定义函数,但允许嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。

4.在C程序中,调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

5.递归调用函数是C语言的特点之一,有时递归调用会使求解的问题变得更简单明了。

1.计算机二级C语言考点:字符型数据

2.计算机二级的excel函数

3.计算机二级c语言试题

4.计算机考试二级C++语言程序设计考试大纲

5.全国计算机二级考试C++语言程序设计大纲

6.计算机等级考试二级C语言程序设计考试大纲

7.2017计算机考试二级C语言程序设计考试大纲

8.计算机二级office考点

9.计算机二级MS office常用函数

10.2016计算机二级《C语言》基础练习题及答案

篇14:C语言函数调用方式的区别

通常在使用VC进行函数定义时会指定该函数调用方式,诸如:

int __stdcall max(int a, int b)

{

return a>b?a:b;

}

int __cdecl min(int a, int b)

{

return a

}

bool __fastcall equal(int a, int b)

{

return a=b?true:false;

}

首先,让我们来分个类,调用方法分为两大类另加一个较特殊的__thiscall.

第一类:__stdcall类 别名:WINAPI,CALLBACK,PASCAL,该类特点是:主调函数负责参数入栈,由函数本身负责栈的恢复。

第二类:__cdecl类 别名:C/C++中默认调用方式,若你定义函数未指定函数调用约定(Calling Conventions),例如在VC6中下面两个函数的调用约定是等价的:

int max(int a, int b)

{

return a>b?a:b;

}

int __cdecl min(int a, int b)

{

return a

}

该类调用约定的特点是:由主调函数负责参数入栈,并由主调函数负责线的恢复。

第三类:__thiscall 该类比较特殊,只用于类成员函数调用,你甚至不能强制指定这个函数调用约定。它是由C/C++编译器自动添加的。在C/C++中类成员函数会默认传入一个this指针,对于此,在默入情况下,C/C++中类成员函数通过此类调用约定来指定this指针。

接着介绍一下__thiscall,__thiscall是关于类的一种调用方式。

它与其他调用方式的最大区别是:

__thiscall对每个函数都增加了一个类指针参数

class aa

{

void bb(int cc);

};

实际上bb的函数原形是void bb(aa &this, int cc);

__cdecl的调用方式介绍: C和C++缺省调用方式

例子:

void Input( int &m,int &n);/*相当于void __cdecl Input(int &m,int &n);*/

以下是相应的汇编代码:

00401068 lea eax,[ebp-8] ;取[ebp-8]地址(ebp-8),存到eax

0040106B push eax ;然后压栈

0040106C lea ecx,[ebp-4] ;取[ebp-4]地址(ebp-4),存到ecx

0040106F push ecx ;然后压栈

00401070 call @ILT+5(Input) (0040100a);然后调用Input函数

00401075 add esp,8 ;恢复栈

从以上调用Input函数的过程可以看出:在调用此函数之前,首先压栈ebp-8,然后压栈ebp-4,然后调用函数Input,最后Input函数调用结束后,利用esp+8恢复栈。由此可见,在C语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈。

下面看一下:地址ebp-8和ebp-4是什么? 在VC的VIEW->debug windows->Registers,显示寄存器变量值,然后在选debug windows->Memory,输入ebp-8的值和ebp-4的值(或直接输入ebp-8和-4),看一下这两个地址实际存储的是什么值,实际上是变量“n ”的地址(ebp-8),m的地址(ebp-4)。

由此可以看出:在主调用函数中进行实参的压栈并且顺序是从右到左。另外,由于实参是相应的变量的引用,也证明实际上引用传递的是变量的地址(类似指针),

总结:在C或C++语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈,实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复。由于主调用函数管理堆栈,所以可以实现变参函数。另外,命名修饰方法是在函数前加一个下划 线(_)。

_stdcall调用约定介绍:实际上就是PASCAL,CALLBACK,WINAPI

例子:

void WINAPI Input( int &m,int &n);

看一下相应调用的汇编代码:

00401068 lea eax,[ebp-8]

0040106B push eax

0040106C lea ecx,[ebp-4]

0040106F push ecx

00401070 call @ILT+5(Input) (0040100a)

从以上调用Input函数的过程可以看出:在调用此函数之前,首先压栈ebp-8,然后压栈ebp-4,然后调用函数Input,在调用函数Input之后,没有相应的堆栈恢复工作(为其它的函数调用,所以我没有列出)下面再列出Input函数本身的汇编代码:(实际此函数不大,但做汇编例子还是大了些,大家可以只看前和后,中间代码与此例子无关)

39: void WINAPI Input( int &m,int &n)

40: {

00401110 push ebp

00401111 mov ebp,esp

00401113 sub esp,48h

00401116 push ebx

00401117 push esi

00401118 push edi

00401119 lea edi,[ebp-48h]

0040111C mov ecx,12h

00401121 mov eax,0CCCCCCCCh

00401126 rep stos dword ptr [edi]

41: int s,i;

42:

43: while(1)

00401128 mov eax,1

0040112D test eax,eax

0040112F je Input+0C1h (004011d1)

44: {

45: printf(“Please input the first number m:”);

00401135 push offset string “ Please input the first number m”… (004260b8)

0040113A call printf (00401530)

0040113F add esp,4

46: scanf(“%d”,&m);

00401142 mov ecx,dword ptr [ebp+8]

00401145 push ecx

00401146 push offset string “%d” (004260b4)

0040114B call scanf (004015f0)

00401150 add esp,8

47:

48: if ( m= s )

004011B3 mov eax,dword ptr [ebp+8]

004011B6 mov ecx,dword ptr [eax]

004011B8 cmp ecx,dword ptr [ebp-4]

004011BB jl Input+0AFh (004011bf)

篇15:C语言输入输出函数及控制流程语句

控制流程语句主要包括: 条件语句、循环语句和开关语句,

1.1 标准输入输出函数

1.1.1 格式化输入输出函数

Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和 scanf, 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏 幕)写数据; scanf() 函数用来从标准输入 设备(键盘)上读数据。下面详细介绍这两个函数的用法。

一、printf()函数

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序 时经常会用到此函数。printf()函数的调用格式为:

printf(“<格式化字符串>”, <参量表>);

其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以“%”开始, 后跟一个或几个规定字符, 用来确定输出内容格式。

参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 参数个数一样多, 各参数之间用“,”分开, 且顺序一一对应, 否则将会出现意想 不到的错误。

1. 格式化规定符

Turbo C2.0提供的格式化规定符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━

符号                 作用

──────────────────────────

%d             十进制有符号整数

%u             十进制无符号整数

%f             浮点数

%s             字符串

%c             单个字符

%p             指针的值

%e             指数形式的浮点数

%x, %X         无符号以十六进制表示的整数

%0             无符号以八进制表示的整数

%g             自动选择合适的表示法

━━━━━━━━━━━━━━━━━━━━━━━━━━

说明:

(1). 可以在“%”和字母之间插进数字表示最大场宽,

例如: %3d  表示输出3位整型数, 不够3位右对齐。

%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,

小数点占一位, 不够9位右对齐。

%8s  表示输出8个字符的字符串, 不够8个字符右对齐。

如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。

但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出;

若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。

另外, 若想在输出值前加一些0, 就应在场宽项前加个0。

例如:  %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度

为4位。

如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,

小数点 前的数字代表最小宽度。

例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则

第9个字符以后 的内容将被删除。

(2). 可以在“%”和字母之间加小写字母l, 表示输出的是长型数。

例如:  %ld  表示输出long整数

%lf  表示输出double浮点数

(3). 可以控制输出左对齐或右对齐, 即在“%”和字母之间加入一个“-” 号可

说明输出为左对齐, 否则为右对齐。

例如:  %-7d 表示输出7位整数左对齐

%-10s 表示输出10个字符左对齐

2. 一些特殊规定字符

━━━━━━━━━━━━━━━━━━━━━━━━━━

字符                          作用

──────────────────────────

篇16:(C语言)字符串比较函数,指针数组与数组指针

问题描述:

写一个函数,用于比较两个字符串的比较(string_compare).

程序分析:

(1)主要思想:传入两个字符串后,比较这两个字符串中的每个元素,如果第一次比较就不相等,就不要让它进入到下面的比较中,这样一来,将它返回一个相减的值(即:两数组中开始不相等的那两个元素相减,返回值(int类型),是ASCII码值相减)。进入比较的过程中时,相等就返回0;其他情况都返回那个相减的值。

(2)主要方式:定义指针数组,并对其初始化。然后照上面的思想,进行代码的实现。

代码如下:

/***指针数组(1)int *a[10] 是一个指针数组--->是一个数组(每个数组中的元素都是int*类型)(2)int (*a)[10] 是一个数组指针--->指向一个数组(十个int类型的数组) 注意:*,[],的优先级依次递增。下面使用了指针数组的例子,至于数组指针。。**/#include#includeint string_compare(const char *str1,const char *str2){ assert(str1); //ASSERT( f ) assert(str2);/*在Debug模式下,每次运行到这里后会计算括号中的表达式,如果表达式为0,则中断执行,弹出一个警告框,用户可选择“继续”,“重试”,“忽略”在Release模式下,这句语句不会被编译进代码, ASSERT一般用于程序内部确认参数的正确性,即调用内部函数的时候,要由调用者保证参数的正确,而被调用函数内部,就可以通过ASSERT来检查参数是否满足要求。*/ while(*str1 == *str2 ) //判断两个数组中的元素是否相等 { str1++; //使两个指针指向下一位;继续比较 str2++; if(*str1 == '\0') //双方比较到'\0'处,都相等 { return 0; //返回0,表示二字符串相等 } } return *str1-*str2; //若不相等,返回一个正值或负值}int main(){ char *ch[2]; ch[0] = “ab”; //对这个指针数组的元素初始化,使其指向这个字符串首元素的首地址 ch[1] = “a”; //同上 printf(“%d\n”,string_compare(ch[0],ch[1])); //调用这个函数 return 0;}

篇17:计算机专业毕业论文开题报告C语言

开题报告是由选题者把自己所选的课题的概况(即“开题报告内容”),向有关专家、学者、科技人员进行陈述。然后由他们对科研课题进行评议。再由科研管理部门综合评议的意见,确定是否批准这一选题。开题报告作为毕业论文答辩委员会对学生答辩资格审查的依据材料之一。

一、选题目的和意义

选题的目的:粗糙集理论自从提出后20多年来,逐渐成为数据挖掘领域的研究热点之一,基于粗糙集理论的属性约简算法具有重要的研究意义。目前,属性约简已有多种算法,各种算法也有其不同的优、缺点。求属性约简集,通常是从求核属性开始的。目前提出的各种算法当中,使用具体程序实现比较少,而本文实现了粗糙集理论中的求核和属性约简算法。另外,人们可能认为粗糙集仅仅是理论方面的研究,但实际上,粗糙集理论在现实生活中的应用是非常广泛的,不论是医疗、气象学方面,还是电信业、金融业等方面都有所应用。

选题的意义:本文使用C语言程序实现求属性核算法和基于分明矩阵的属性约简算法,通过程序可以清楚地表达算法的各个步骤和算法的具体实现过程。而本文中又结合了实际生活中的两个实例,分别是在房地产信息决策系统医疗诊断系统方面,说明粗糙集理论并不只是空洞的理论,而在实际当中有着广泛的应用,和人们日常的生产、生活和学习是息息相关的。

二、本选题在国内外的研究现状和发展趋势

国内外的研究现状:粗糙集理论是1982年由波兰数学家Z.Pawlak提出的,当时没有引起国际计算机学界和数学界的重视,研究仅限于东欧的一些国家,直到20世纪80年代末才逐渐引起各国学者的注意。1991年,Z.Pawlak发表了专著《Rough Set: Theoretical Aspects of Reasoning about Data》,奠定了粗糙集理论的`基础,从而掀起了粗糙集的研究热潮。后来,1996年在日本举行的国际粗糙集研讨会以及2001年在重庆举行中国粗糙集研讨会推动了亚洲地区和我国对粗糙集理论与应用的研究。具体地说,粗糙集中的求核算法和属性约简算法也有许多种,而这多种不同的方法也有其各自在空间复杂性或者时间复杂性上的优点和缺点。而将这些算法使用具体程序设计语言实现出来的,也是比较少的。

发展趋势:在理论研究方面,国内外学者不断提出新的研究成果和研究方法,其中包括数据库中的数据约简、数据相关性的发现、数据意义的评估、数据产生决策控制、数据的近似分类等方面,这些方面的理论研究是当前研究的热点之一,并引起越来越多的学者的关注。除了理论研究,人们也在积极寻找粗糙集在数据挖掘和知识发现中的应用,如在医疗诊断、药物学、气象学、电信业、银行及金融业、市场研究、工程设计及其他领域都有重要的应用。对于本文实现的这两种算法,通过文中的具体例子,也可以看出它们与人们生产、生活和学习等方方面面有着密切的联系。粗糙集理论在机器学习、归纳推理、模式识别、决策支持系统、振动分析、开关函数、冲突分析、图象处理、声音和字符等方面都已经有了成功应用的实例,在这些方面以及推广到其他方面的应用必将更加的广泛。另外,国际上研究粗糙集的机构和个人开发了一些应用粗糙集的实用化软件,也出现了商业化的软件,而且应用粗糙集理论的商业化软件也越来越多。

三、课题设计方案[主要说明:研究(设计)的基本内容、观点及拟采取的研究途径。]

研究的基本内容:理解数据挖掘和知识发现的基本概念,了解粗糙集的提出与发展、现状和发展前景,通过深入理解粗糙集理论及其相关定义和概念、属性约简和求属性核的方法,提出这两个算法使用C语言程序的具体实现,之后再研究粗糙集理论在人们实际生活中具体应用的可行性,并通过选取人们生产、生活中很具体的两个例子,文中选取德州市房地产信息决策系统和某医疗诊断系统,说明该理论确实是实际可行的、有用的和有效的,该理论的应用是同样可以推广到诸多其他领域的。

研究途径:在指导老师的指导下,阅读指导老师提供的有关书籍中的基本知识以及指导老师提供的一些个人的研究成果,并通过网络查阅相关论文数据库、借鉴国内大学往届优秀研究生论文,以及查阅相关国外大学论文数据库的资料,搜索网络中粗糙集具体应用方面的具体数据和资料,综合概括查询得到的有关知识,确定论文研究内容的可行性、完成开题目报告,用C语言程序写出文中两个算法、将程序在Microsoft Visual C++ 6.0中加以运行和调试、输入多个具体例子进行测试,积极与指导老师探讨研究方法、研究中疑惑的问题和论文的写作方法,针对指导老师对论文内容和格式等方面提出的意见和建议,修改论文,直到最终完成论文。

四、计划进度安排[主要说明:起止时间及分阶段的进度要求。]

2005年10月10日——2005年10月31日 查阅相关资料,确立论文研究方向和指导老师。在指导老师的指导下,阅读指导老师提供的有关书籍中的基本知识,并结合网络查询到的相关论文,确定论文题目,完成开题报告、任务书和课题说明书。

2005年11月1日——2005年12月10日 学习论文内容的基本知识,并用程序具体实现算法并通过调试和测试,完成论文部分章节,接受中期检查。

2005年12月11日——2006年1月15日 进一步查阅相关书籍和资料,并与指导老师探讨相关问题,写出论文。

2006年3月——2006年4月 检查论文,根据指导老师提出的关于论文内容和格式等问题,修改论文并最终完成,提交指导老师检查。参加毕业论文答辩。

五、主要参考文献

[1]刘清.Rough集及Rough推理.北京:科学出版社,2001.8:1~79,182~229.

[2]康晓东.基于数据仓库的数据挖掘技术.北京:机械工业出版社,2004.1.

[3]刘清.Rough集理论:现状与前景.计算机科学,1997.4:1~4.

[4]徐凤生.一种新的可区分矩阵与求核方法.计算机工程与应用(已录用).

[5]左孝凌,李为鉴,刘永才.离散数学.上海:上海科学技术出版社,1982.

[8]Masahiro Inuiguchi,Shoji Hirano,Shusaku Tsumoto. Rough Set Theory and Granular Computing, Springer,2003,125.

[9]Lech Polkowski,Shusaku Tsumoto,Tsau Y. Lin.Rough Set Method and Applicaions: New Deverlopments in Knowledge Discovery in Information Systems,Physica-Verlag,2000,56: 649~681.[10]叶东毅.Jelonek属性约简算法的一个改进.电子学报,2000.12:81~82.

[10]叶东毅.Jelonek属性约简算法的一个改进.电子学报,2000.12:81~82.

[11]孙惠琴,熊璋.粗集理论集成ORDBMS的原型系统.计算机学报,2005.11:1875~1877.

[12]代春艳.粗糙集理论及其应用发展综述.重庆工商大学学报,2004.12:575~576.

[13]王宗军,李红侠,邓晓岚.粗糙集理论的最新应用.统计与决策,2005.11(下):27~29.

[14]束金龙,丁文霞.粗糙集理论在属性约简及知识分类中的应用.运筹与管理,2003.12:41~43.

[15]闫德勤,刘菲斐.属性约简中的差别矩阵与近似精度.小型微型计算机系统,2005,11:1975~1976

[16]朱凌云,吴宝明.医学数据挖掘的技术、方法及应用.生物医学工程学杂志,2003,20(3):559~562

[17]杨涛,李龙澍.Rough集在软件测试用例选择中的应用.微机发展,2005,2:12~14

[20]刘惠,邱天爽.知识发现及其在临床医学上的应用.生物医学工程学杂志,2004,4:677~680

[21]蓝敏.用粗集理论挖掘项目审查(评估)中的专家共识.西南交通大学学报,2005,2:85~89

[22]Jiawei Han,Micheline Kamber.Data Mining Concepts and Techniques,China Machine Press, 2005,11

[23]吴明芬.粗糙集理论的研究现状与前景.五邑大学学报(自然科学版),2002,6

[24]刘健勤.粗糙集理论及其最新进展.计算技术与自动化,1998,17(1):43~48

[25]王国胤.决策表核属性的计算方法.计算机学报,2003,5:611~615

C语言函数教学设计与实践论文

c语言学习心得

C语言练习题

C语言学习心得

c语言练习试题库

c语言课程设计心得体会

C语言常用笔试题

c语言学习方法有哪些

C语言面试题大13

c语言试题及答案

c语言函数毕业论文范文(通用17篇)

欢迎下载DOC格式的c语言函数毕业论文范文,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档