c语言实验报告函数

2024-11-29 版权声明 我要投稿

c语言实验报告函数(精选16篇)

c语言实验报告函数 篇1

实验六 函数 掌握函数实参与形参的对应关系以及“值传递”的方式; 3 掌握函数递归调用的方法;

二 实验内容 编写两个函数,分别求两个正整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个正整数由键盘输入。

【提示】设有两个正整数m和n ⑴ 实验四介绍了求最大公约数的算法,也可以用递归的方法求最大公约数。设hcf(int m,int n)是用来求m和n的最大公约数h函数,k=m%n,则:

hcf(n,k)hnk0k0⑵ 若最大公约数为h,则最小公倍数为:m*n/h。

实验时,完成以下两个函数的定义,使之和主程序构成完整的程序,实现题目的要求。#include int hcf(int m,int n)/* 求最大公约数的函数 */ { „„ } int lcd(int m,int n,int h)/* 求最小公倍数的函数 */ { 返回最小公倍数; } main(){ int m,n,h,l;printf(“请输入两个正整数m、n:”);scanf(“%d,%d”,&m,&n);h=hcf(m,n);printf(“%d和%d的最大公约数是:%dn”,m,n,h);l=lcd(m,n,h);printf(“%d和%d的最小公倍数是:%dn”,m,n,l);} 程序调试通过后,用m=350、n=125和m=96、n=64两组数据运行程序,记录程序的输出。

完整程序如下: #include int hcf(int m,int n)/* 求最大公约数的函数 */ { int temp,r;if(m

int lcd(int m,int n,int h)/* 求最小公倍数的函数 */ { return(m*n/h);} main(){ int m,n,h,l;printf(“请输入两个正整数m、n:”);scanf(“%d,%d”,&m,&n);h=hcf(m,n);printf(“%d和%d的最大公约数是:%dn”,m,n,h);l=lcd(m,n,h);printf(“%d和%d的最小公倍数是:%dn”,m,n,l);}

运行结果如下图: 编写求n!的函数f(int n),在主函数中输入两个整数m、n,然后调用函数求:

Cnmm!n!(m-n)!【注意】函数f的类型应用long或double。

程序如下:

#include long f(int n){ if(n)return n*jc(n-1);else return 1;}

void main(){ long m,n,c;printf(“请输入两个整数”);

scanf(“%d,%d”,&m,&n);c=f(c);m=m*(m-1)n=n*(n-1)c=m/(n*c)printf(“组合为%dn”,c);

} 有一个字符串,输入一个字符,编写函数dstr将输入的指定字符从字符串中删去。#include void dstr(char str[],char ch){ } main(){ char str[80],ch;printf(“请输入字符串:”);gets(str);printf(“请输入欲删除的字符:”);scanf(“%c”,&ch);dstr(str,c);printf(“删除指定字符后的结果:%sn”,str);}

完整程序如下: #include void enter_string(char str[80]){ printf(“请输入字符串:”);gets(str);/* 从键盘输入字符串到数组str */ } void delete_string(char str[],char ch){ int i,j;for(i=j=0;str[i]!=';i++)if(str[i]!=ch)str[j++]=str[i];str[j]=';} void print_string(char str[]){ printf(“删除指定字符后的结果:%sn”,str);} void main(){ char c;char str[80];enter_string(str);printf(“请输入欲删除的字符:”);scanf(“%c”,&c);delete_string(str,c);print_string(str);}

c语言实验报告函数 篇2

关键词:C语言,scanf函数,格式输入

C语言本身不提供输入语句, 输入操作是由函数实现的。scanf函数就是最常用的一个, 它是C语言函数库中的“格式输入”函数。

C语言中格式输入的规定比较繁琐, 用得不对就得不到预期的结果, 而输入又是最基本的操作, 几乎每一个程序都包含它。在这几年的教学实践中, 我发现不少学生由于掌握不好这个知识点而浪费了大量调试程序的时间, 也为进一步学习造成了障碍, 因此, 这个知识点就成了教学的重点和难点。不过根据这几年的教学经验, 我觉得只要遵循规律, 精讲多练, 学生完全能够掌握这个知识点。下面我将这方面的体会进行一些归纳和总结。

首先, 要准确讲解scanf函数的一般格式, 这是教学的前提和基础:

scanf函数一般格式是:scanf (格式控制, 地址表列) ;

“格式控制”是用双引号括起来的字符串, 它包括两种信息:

a.格式说明, 由“%”和“格式字符”组成, 它的作用是将输入的数据转换成指定的格式。

b.普通字符, 即需要原样输入的字符。

“地址表列”是由若干个地址组成的表列, 可以是变量的地址, 或字符串的首地址。

如输入dog坻

则‘d’送给a, ‘’送给b, ‘o’送给c, 因为%c只要求读入一个字符, 后面不需要用空格作为两个字符的间隔, 因此‘’作为下一个字符送给b。

d.在输入数据时, 遇到以下情况时该数据认为结束。

(1) 遇空格, 或按“回车”或“跳格” (Tab) 键。

(2) 按指定的宽度结束, 如“%3d”, 只取3列。

(3) 遇非法输入。

e.可以指定输入数据所占列数, 系统自动按它截取所需数据, 如:

系统自动将123赋给a, 将456赋给

b, 此方法也可用于字符型:

如果从键盘连续输入3个字符abc, 由于ch只能容纳一个字符, 系统就把第一个字符'a赋给ch。

f.输入数据时不能规定精度, 例如:

这是不合法的, 不能企图用这样的scanf函数输入以下数据而使a的值为12345.67.

最后, 还要补充的一点就是在使用C语言库函数时, 要用预编译命令“#include”将有关的“头文件”包括到用户源文件中, 在头文件中包含了与用到的函数有关的信息。但考虑到scanf函数使用频繁, 系统允许在使用此函数时可不加#include命令。

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

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

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.

c语言实验报告 篇4

(注意:红字不用抄写,其它必须抄写。实验纸不够用写反面。)

一、实验内容

if语句、ifelse语句、ifelse if语句的练习

二、重点难点

分析题目,正确应用相应的选择语句

三、实验目的掌握if语句、ifelse语句、ifelse if语句的简单用法

四、实验要求

根据题目,编写程序并在vc6.0开发平台运行,查看运行结果是否与期望一致

五、实验题目

输入三角形的三边边长,判断并输出,说明三角形是等边、等腰、直角、一般三角形。

六、实验过程

1.画流程图

2.编写完整的程序

3.写出实验程序运行结果

七、实验总结:(模仿着写三行文字即可)

C语言实验报告模版 篇5

指导教师曾宪华实验时间: 2010 年10月日 学院通信与信息工程专业通信类

班级0101105学号2011210150姓名陈环宇 实验室s313

实验目的及要求:

(1)掌握选择结构程序设计,学会if语句嵌套的应用。

(2)以此程序掌握使用断点调试程序的方法。

实验题目:

实验内容及步骤:源程序(已修正)

操作步骤

a.打开C++,新建文件,输源程序。

b.进行编译和连接时,没有出现错误或者警告。

c.单击Go,输入a,b,c的值后,程序执行到断点①处,输入变量a,b,c,查看a,b,c的值。此时,变量的值与输入的值一致。

d.单击Go,程序运行到断点②处,运行显示d为49.81,此时方程有实根。

e.单击Go,运行到最后一个断点处,运行显示x1=-0.44,x2=-3.80,符合题目要求。f.单击Stop Debugging,调试完成。

运行结果示例

心得体会:

C语言程序设计实验报告 篇6

实验目的

1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。

2、熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。

3、掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。

实验内容

计算并输出1000以内的10个素数以及它们的和。

要求:

在程序内部加必要的注释。

由于偶数不是素数,可以不考虑对偶数的处理。

虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。

输出形式为:素数1+素数2+素数3+…+素数10=总和值。

算法描述流程图

Main函数:

判断素数:

源程序

#include

#include

int sushu(int n)/* 判断素数的函数 */

{

int t,i;

t=sqrt(n);

for(i=2;i1;i-=2)/* x为奇数时,做函数计算 */

{

n=sushu(i); /* 做判断素数的函数调用 */

( 励志天下 )

if(n!=0)/* 对素数的处理 */

{

a[j]=n;/* 把素数由大至小存入数组a[ ]中 */

j++;

if(j<11)

m+=n;/* 统计前10个素数之和 */

}

}

if(j<10)/* 当素数个数小于10个时,结果输出 */

{

for(i=0;i

{

n=a[i];

printf(“%d”,n);

printf(“+”);

}

printf(“2=”);

printf(“%d ”,m+2);

}

else for(i=0;i<10;i++)/* 当素数个数大于等于10个时,结果输出 */

{

n=a[i];

printf(“%d”,n);

if(i<9)

printf(“+”);

else

{

printf(“=”);

printf(“%d ”,m);

}

}

}

}

测试数据

分别输入1000、100、10测试。

运行结果

出现问题及解决方法

当素数个数小于10时的处理不够完善,考虑不够周全。把“+2”的处理做的太勉强。

程序过大,不够精简,无用文字太多。

学习耐心与细心不足,如scanf(“%d”,&n);中的“&”经常忘记。

编程思想不够发散,例如如何判断素数,只能想出2种方式(其中1种为参考教科书上内容);在今后学习中应更多的动脑,综合运用所学。

基本功不够,如清屏clrscr等函数用的不好,有时同样的问题多次犯,给实验课老师带来很大的麻烦。这说明我的知识不够广,有很多有用但不做考试要求的书中内容没有学好,认识程度不够深刻。就算以后C语言这门课程结束后,也应多看相关东西,多上机练习,才能真正从本质上提高自己。

物理实验报告 ·化学实验报告 ·生物实验报告 ·实验报告格式 ·实验报告模板

C语言中的函数与指针 篇7

随着计算机技术的飞速发展及应用领域的扩大, 熟练掌握一门语言已变的尤为关键。C语言这门课程在计算机的基础教学中一直占有比较重要的地位, 然而要想突破C语言的学习, 对函数和指针的掌握是非常重要的, 本文将具体针对函数和指针的关系做详尽的介绍。

一、函数的有关概念

为了使程序的编写更加清晰、直观且易于修改, C语言中引用了函数。所谓函数, 就是一个程序模块, 该模块用来完成一个特定的程序功能。引用一个函数时, 需要包括对函数的定义、声明, 继而调用。在掌握函数相关概念的同时, 有以下几点需要注意:

(1) 调用函数和被调用函数

由上例可以看出, 函数A在执行的过程中包括了对函数B的调用, 则函数A称为调用函数 (调用函数B) , 而函数B被函数A调用, 称为被调用函数。

(2) 实参和形参

调用函数中定义的变量是实参, 被调用函数中定义的变量是形参。如上例, 函数A中的变量a是实参, 函数B中的变量b是形参。

(3) 实参变量和形参变量之间的独立性

实参变量和形参变量之间只存在值的传递过程, 实参变量的存储空间在调用函数中分配, 而形参变量的存储空间在被调用函数中分配, 被调用函数执行完毕后, 其所分配的存储空间被释放, 即形参变量的存储空间被释放, 它不会返回值给实参变量, 也不会参与调用函数的继续执行。例如 (实现两个数的交换) :

显然, 函数main是调用函数 (调用函数swap) , 函数swap是被调用函数。main函数中的a, b由main函数分配存储空间, 而swap函数中的a, b由swap函数分配存储空间。main函数执行到swap函数时, 调用swap函数, swap函数为其变量分配存储空间, 然后实现了swap函数中变量a, b的值交换, 执行完毕后即释放其分配变量的存储空间。继而, main函数继续执行, 但其变量a, b没有做任何改变, 即main函数不能实现a, b的交换。由上例可以看出, 若单纯的使用变量, 则被调用函数无法改变调用函数中的变量值, 即swap函数无法实现main函数中变量a, b的交换。

二、指针的有关概念

指针是C语言中功能最强大, 使用最广泛的一种数据类型, 主要用于描述存储单元的地址。通过使用指针, 可以在函数中进行传址调用。

(1) 指针变量的定义

定义指针变量的一般形式:类型标识符*变量名;其中, 变量名前的符号“*”表示将要定义的变量, 类型说明符表示该指针变量所指向数据的类型。例如:int*p1;char*p2;float*p3;

(2) 指针变量的引用

&为取地址运算符, 其一般形式为:&变量名, 例如:

int x=3, *p;p=&x;指针变量p指向变量x。

在使用x的值时, 可以直接使用x, 也可以用*p来代替使用x。此外, 指针变量一定是和它所对应的变量相互引用, 即指针变量在使用时一定要有明确的指向, 必须赋予具体的值, 否则将可能导致错误。

三、指针与函数的关系

在函数的编写过程中, 若单纯的只用变量参数, 则无法实现被调用函数改变调用函数中变量值的目的。而为了实现这一目的, 就需要函数和指针之间的结合使用。

(1) 引用指针, 可以实现调用函数和被调用函数中的指针变量共同指向调用函数中的存储单元, 从而实现被调用函数改变调用函数中变量值的目的。例如:

由上例可以看出, 在调用函数 (main函数) 中定义了变量a和指针变量p1, 被调用函数 (change函数) 中定义了指针变量p2。程序首先从main函数开始执行, 分配变量a和指针变量p1的存储单元, 此时指针变量p1指向变量a (p1=&a) 。当程序执行到change函数时, 程序跳转到change函数执行其函数体, change函数为其指针变量p2分配存储单元, 同时p2也得到了p1传过来的值 (变量a的地址) , 此时p2也指向了调用函数中的变量a, 即实现了p1和p2共同指向了调用函数中的存储单元 (变量a的存储单元) , change函数执行其函数体 (*p2=3) , 即使a的值变为3。change函数执行完毕后, 释放其变量的存储空间, 转而继续执行main函数, 此时a的值已经发生改变 (由2变为3) , 实现了被调用函数改变调用函数中变量值的目的。

(2) 调用函数和被调用函数中实参和形参之间的关系图

被调用函数执行完毕后, 释放它所分配的存储单元, 而调用函数分配的存储单元仍继续使用。此外, 只有当调用函数中传指针值 (即实参是指针值) , 而被调用函数中引用变量 (即形参收到指针值后, 在函数体内引用变量值) , 才能达到改变的目的。

例如, 实现变量a和b的交换, 程序如下:

例1虽然传的是指针值, 但在函数体的执行过程中引用的仍然是指针值 (引用x和y) , 所以不能实现a和b的交换;例2程序传指针值后, 引用变量 (*x和*y, 即a和b) , 所以能实现a和b的交换。

四、结束语

在以后的编程过程中, 若遇到想通过被调用函数改变调用函数中变量值的目的, 则可以把该变量的地址值传给被调用函数, 从而达到改变的目的。鉴于文章篇幅及个人能力有限, 本文肯定还存在许多不足之处, 仅供大家学习和参考。

参考文献

[1]谭浩强.C程序设计[M].二版.清华大学出版社, 2004.

[2]杜友福.C语言程序设计[M].二版.科学出版社, 2007.

c语言实验报告函数 篇8

班级:机械09-2学号: 0901010205姓名:某某某

一实验目的和要点(简单描述实验目的和知识要点)

定义变量、变量赋值、符号常量、使用算数运算符、转换规则、赋值语句

二 实验范例阅读(写出预测的范例程序运行结果,上机验证)

范例1 运行结果:

xxxxxxx …….范例2运行结果:

xxxxxxx …….范例3运行结果:

xxxxxxx …….三 实验练习程序设计(写出程序代码)

练习3(4)、4

题目一 程序代码

#include

……………

题目二 程序代码

#include

……………

c语言函数 篇9

一、实验目的(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,以求出最小公倍数,再返回主函数输出最大公约数和最小公倍数。

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

c语言实验报告函数 篇10

在C语言的开发学习中,经常要进行内存分配,动态内存分配技术可以保证在程序运行过程中按照实际需要申请适量的内存,使用结束后释放。C语言跟内存申请相关的函数主要有alloca、calloc、malloc、free、realloc、sbrk等。在实际学习中主要通过调用库函数malloc()和free()来进行内存的分配和释放。

2 函数的基本用法

2.1 分配内存函数malloc

调用形式:(类型说明符*)malloc(size);

功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。

(类型说明符*)表示把返回值强制转换为该类型指针。

“size”是一个无符号数。

例如:

表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

2.2 释放内存空间函数free

调用形式:free(void*ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

2.3 举例

分配一块区域,输入一个学生数据。

本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

3 malloc()和free()的存储机制

3.1 堆

堆是共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给操作系统,否则就会内存泄漏。

3.2 栈

栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动地切换栈,就是切换SS/ESP寄存器。

3.3 malloc()分配内存

malloc()从堆里面获得空间,也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

3.4 free()释放内存

free()释放的是指针指向的内存。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。

4 结语

malloc与free是C语言的标准库函数,当使用malloc()申请了内存空间后,必须检查是否分配成功,而且malloc()和free()必须是配对使用。当不需要再使用申请的内存时,必须使用free()释放,释放后应该把指向这块内存的指针指向NULL,以免分配的空间占着不用,造成内存泄露。

参考文献

[1]徐翔.C++程序设计教学探讨[J].硅谷,2009,(02):155-156.

[2]戴春燕,徐智文.对C++中malloc/free和new/delete的探讨[J].包钢科技,2009,(01):59-60,66

[3]安晶,谢莹.C++教学探讨[J].黑龙江科技信息,2009,(03):183,99.

C语言中函数的返回值 篇11

这句话觉得有些难以理解。

于是写了段测试代码,如下:

#include

int f(int i) {

if (1)

return;

else

return 1;

}

main(void) {

int i = -10;

printf(“%dn”, f(i));

}

/*

* 本程序用gcc编译没有问题,

* 运行结果如下:

* -10

*/

c语言实验报告函数 篇12

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. 一些特殊规定字符

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

字符作用

浅议C语言中函数递归调用的教学 篇13

关键词:函数,递归调用,教学

在C语言的教学中, 函数的递归调用是教学的重点与难点。初学者对于递归调用, 往往容易陷入一个误区, 他们脑子里总是在想递归是如何实现的, 函数是如何被调用的, 又由于其调用过程太复杂而理不清头绪, 其实这给第一次接触递归调用带来了不必要的麻烦。笔者根据多年的教学经验, 整理出几个有关的知识点, 只要明白这些问题, 函数递归调用的教学与学习将迎刃而解。

一、递归条件

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

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

说明:解决问题的方法相同, 调用函数的参数每次不同 (有规律的递增或递减) , 如果没有规律也就不能适用递归调用。

2、用这个转化过程使问题能得到解决。

3、必定要有一个明确的结束递归的条件。

说明:一定要能够在适当的地方结束递归调用。不然可能导致系统崩溃。

二、递归函数的执行过程

递归的函数过程———执行到函数体中间再回归到自身开头的位置, 再进行。可以借助栈来解释其执行过程, 下面用求阶乘的例子来说明:

假设这里执行Factorial (4) , 那么程序会按照下面方式来执行:

1、执行Factorial (4) 判断n>1执行Factorial (3) , 并且将Fac-torial (4) 函数相关信息存入一个栈.

2、执行Factorial (3) 判断n>1执行Factorial (2) , 并且将Fac-torial (3) 函数相关信息存入一个栈.

3、执行Factorial (2) 判断n>1执行Factorial (1) , 并且将Fac-torial (2) 函数相关信息存入一个栈.

4、执行Factorial (1) 判断n==1执行返回1;

5、将Factorial (2) 函数从栈中取出, 执行2*1, 并且返回2.

6、将Factorial (3) 函数从栈中取出, 执行2*3, 并且返回6.

7、将Factorial (4) 函数从栈中取出, 执行6*4, 并且返回24.

如下图所示:

三、递归函数的参数

当函数自己调用自己时, 系统自动把函数中当前的变量和形参暂时保留起来, 在新一轮的调用过程中, 系统为新调用的函数所用到的变量和形参开辟另外的存储单元 (内存空间) 。每次调用函数所使用的变量在不同的内存空间。即系统每次调用该函数使用的函数参数不同, 且保存在不同的存储空间。如上例, 第一次调用时函数参数为4, 以后依次减1。

四、递归转非递归

任何“递归函数”都可以通过程序员自己控制系统转为“非递归程序”实现。一般采用循环方法实现:循环方法是所有递归到非递归的转换中最理想的方法, 可以将开销减少到最小。

不过分析起来很复杂, 对于简单的递归可以用这样的方法来处理.

例如:求Fibonaccio数列问题

首先用递归形式表示如下:

转为非递归函数分析如下:

这里回到Fibonaccio数列定义上面来分析, 这里将第n项的值的数学公式分析为n=1或者n=2时值为1, 当n>2时第n项则为第n-1和n-2的数据之和。

这样就可以很容易得到另外一个定义:

求Fibonaccio数列第n项的值则表示执行n-2次循环计算一个增量f, 初始i=3和结果f=0;每次f值为前两项数值的和。

因为函数递归时需要不断的在内存中保存/恢复现场, 这将大大增加系统的开销, 所以在选择递归结构进行程序设计时, 要考虑到“可理解性和效率”之间的关系。

只要讲清楚以上四个知识点, 函数的递归调用教学就不再困难, 学生学习也容易理解了, 而且扩展了学生的学习思路, 增加了学生学习C语言的兴趣, 可以达到较好的教学效果。

参考文献

[1]《C程序设计》 (第二版) 谭浩强主编清华大学出版社。

c语言实验报告函数 篇14

首先, 尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次,定义是分配空间并赋初值(如果有) 的声明。

最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的`一致性。这条规则提供了高度的可移植性: 它和ANSI C 标准一致, 同时也兼容大多数ANSI 前的编译器和连接器,

Unix 编译器和连接器通常使用“通用模式” 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为为“公共扩展”, 没有语带双关的意思。

可以使用预处理技巧来使类似DEFINE(int, i);的语句在一个头文件中只出现一次, 然后根据某个宏的设定在需要的时候转化成定义或声明。

c语言实验报告函数 篇15

程序一:

#include void fun(int arr[10]){printf(“fun::%d ”, sizeof(arr));//}int main(){int i = 10;short a = 0;int arr[10];fun(arr);printf(“%d ”, sizeof(arr));//40 printf(“%d ”, sizeof(a++));//2printf(“%d ”, a);//0printf(“%d ”, i);//10system(“pause”);return 0;}

结果:

fun::4

40

2

0

10

请按任意键继续. . .

程序二:

定义一个数组arr,输出arr和&arr的区别#include int main(){int n = 10;int arr[10] = {0};int *p = NULL;int (*q)[10] = NULL;printf(“%d ”, sizeof(n));//4printf(“%d ”, sizeof(int));//4printf(“%d ”, sizeof(arr));//40 printf(“%d ”, sizeof(&arr));//4printf(“%p ”, arr);//00D4FACC &arr[0],它表示数组首元素的地址printf(“%p ”, &arr);//00D4FACC,它表示数组的地址,这两个表示意义不同p = arr;q = &arr;printf(“p+1=%p ”,p+1);//p+1=007DF958printf(“q+1=%p ”,q+1);//q+1=007DF97Creturn 0;}

结果:

4

4

40

4

00F5F7C8

00F5F7C8

p+1=00F5F7CC

q+1=00F5F7F0

C语言程序设计函数的教学研究 篇16

函数是构成C程序的基本单位, 也是实现模块化程序设计的重要手段[1]。函数可以和C语言的其它知识点综合起来, 实现对C语言知识点地综合理解和应用。但是学生在对函数的学习过程中存在诸多问题, 笔者认为首先从宏观上理解函数, 再从微观上学习函数。

1 函数的宏观理解

C函数有四要素:函数名、参数、函数体、返回值, 函数就像一台机器 (函数名) , 对输入的数据 (参数) 进行加工 (函数体) 并输出加工得到结果 (返回值) 。如图所示。具体函数的输入、功能及输出是什么取决于函数的定义。

2 函数的定义

函数的定义是制造一台实现某一功能的机器, 函数定义的基本格式为[2]:

返回值类型即机器加工输出数据的类型, 函数的返回值最多有一个通过return语句实现, 若没有返回值用void来定义。函数名是这台机器的唯一标识, 用于说明其功能。形式参数列表来说明机器需要的输入原材料的个数及类型, 如果不需要输入需用void代替函数形参列表中的内容, 声明语句序列来说明函数内部的变量, 可执行语句序列实现对原材料的加工处理, 实现函数的功能。例如:

bigger这台机器需要两个整形的输入, 对其进行大小比较并把较大值放在局部整形变量max中返回回来。

3 函数的调用

函数调用就如用已经制造好的机器生产产品一样, 实际放入的原材料称为实参。函数调用的一般形式:

函数名 (实参列表) ;

在函数的调用过程中就产生了实参向形参的数据传递, 并且只能由实参传递给形参, 而不能有形参传递给实参[3]。函数的参数可以有多种形式:简单变量、指针变量、数组名。下面通过“借书”为例对其进行分析。

3.1 简单变量作为函数的参数

实参传递给形参的是值, 即“单向值传递”。例如A来向B借一本书, B复印了一本给A, 他们手中的书虽然相同但是不是同一本, A在拿到的书中作标记不会对B的书产生影响。

3.2 指针变量作为函数的参数

由于指针变量存储的是一个地址, 所以实参传递给形参是地址, 即“地址传递”。例如A来向B借一本书, B把放书的位置告诉了A, A通过位置信息找到书并在上面作标记, B再来看这本书时就是A做了标记的书了。

但并不是B把放书的位置或一套书的起始位置告诉了A, 书的内容就会发生改变, 如下面代码, A只是看了看书并且改变了放书的位置, 书的内容没有发生改变。

3.3 数组名作为函数的参数

数组是相同类型数据的有序集合, 采用连续顺序存取的方式, 数组名标识数组的首地址, 如果要传递批量数据用普通变量作为函数的参数实现起来非常麻烦, 就可以把数据先存放在数组中, 把存放的首地址传递给函数即可。如B有一套书 (10分册) 按照分册号整齐的摆放在书橱中, A来向B借这套书, B就把第一分册在书橱中的位置告诉A, A就可以找到这套书了, 进而可以进行标记了。B再来看这套书时就是A做了标记的书了。

同样B把一套书的起始位置告诉了A, 书的内容就会发生改变, 可能A只是看了看书并且改变了放这套书的位置, 但是没有在书中作任何标记。

4 结束语

本文以学生经常进行的“借书”活动为例, 通过类比法对函数定义、函数调用进行分析, 可以看出函数参数的传递只能是实参的值传递给形参。指针变量作为函数的参数可以产生双向的影响, 数组名作为函数的参数可以实现批量数据的处理。加强学生了对局部变量、指针、数组的理解及综合应用, 提高了学生的学习积极性。

摘要:C语言程序设计是理工科专业的一门重要公共基础课, 根据实际教学经验通过类比法对函数定义和函数调用中参数的多样性进行分析, 提高学生对C语言学习的兴趣和积极性, 加强知识点的综合掌握和应用。

关键词:C语言,函数,参数,类比法

参考文献

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

[2]苏小红, 王宇颖, 孙志岗, 等.C语言程序设计[M].北京:高等教育出版社, 2011.

上一篇:小学生守则心得体会200字下一篇:外教英语