文档库 最新最全的文档下载
当前位置:文档库 › 实验八

实验八

实验八
实验八

浙江大学城市学院实验报告

课程名称操作系统原理实验

实验项目名称实验八进程通信——管道

学生姓名专业班级学号

实验成绩指导老师(签名)日期

注意:

●务请保存好各自的源代码,已备后用。

●请上传到BB平台。

一. 实验目的和要求

1.了解Linux系统的进程间通信机构(IPC);

2.理解Linux关于管道的概念;

3.掌握Linux支持管道的系统调用和管道的使用;

4.巩固进程同步概念。

二、实验内容

用系统调用pipe( )创建管道,实现父子进程间的通信。

三、实验步骤

1、并发进程的无管道通信

1)编译运行给出的pipe1.c,观察运行结果。

2)思考:观察程序运行结果,比较新旧文件的内容是否有差异,并分析原因。

有。程序将aa文件中的数据读取并存入到bb文件中,但是没有对父子进程进行互斥,导致数据输出顺序混乱。

2、多进程的管道通信,编译并运行给出的代码pipe3.c,观察并理解多进程通过管道通信。

3、编写程序:(来自第三章习题)假定系统有三个并发进程read,move和print共享缓冲器

B1和B2。进程read负责从输入设备上读信息,每读出一个记录后把它存放到缓冲器B1中。进程move从缓冲器B1中取出一个记录,加工后存入缓冲器B2。进程print将B2中的记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。试创建三个进程,用pipe( )打开两个管道,如错误!未找到引用源。所示,实现三个进程之间的同步。

程序源码:

#include

#include

#include

int pid1,pid2;

int fd1[2];

int fd2[2];

char str1[100],str2[100],str3[100];

main( )

{

pipe(fd1);

pipe(fd2);

while((pid1=fork()) == -1);

if(pid1 == 0)

{

while((pid2=fork()) == -1);

if(pid2 == 0) //grandson

{

lockf(fd1[1],1,0);

/*把输出串放入数组str1中*/

sprintf(str1,"hello xyz!");

write(fd1[1],str1,30); /*向管道写长为30字节的串*/

sleep(2); /*自我阻塞2秒*/

lockf(fd1[1],0,0);

return 0;

}

else //son

{

wait(0);

read(fd1[0],str2,30);

printf("son: %s\n",str2);

lockf(fd2[1],1,0);

write(fd2[1],str2,30); /*向管道写长为30字节的串*/

sleep(3);

lockf(fd2[1],0,0);

return 0;

}

}

else //father

{

wait(0);

read(fd2[0],str3,30);

printf("father: %s\n",str3);

return 0;

}

}

程序运行结果:

程序分析:

记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

实验八 公式、序列及函数的使用

实验八公式、序列及函数的使用 一、实验目的 1.熟练掌握序列填充及公式复制的方法; 2.掌握常用函数的功能及使用方法,并能用它们来解决一些实际问题。 二、实验内容与操作步骤 在Excel环境下完成以下各操作: (一)序列填充及公式的使用 1.在Excel中创建一个空白工作簿 2.利用Excel提供的数据填充功能,在Sheet1工作表中输入以下数据: ⑴在区域A1:A9中从上到下填入:2,4,6,8,10,12,14,16,18 ⑵在区域B1:B9中从上到下填入:1,2,4,8,16,32,64,128,256 ⑶在区域C1:C12中从上到下填入:JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC ⑷在区域D1:D7中从上到下填入:星期日,星期一,星期二,星期三,星期四,星期五,星期六 3.在Sheet2工作表中,利用公式计算二次函数ax2+bx+c的值,其中a=2,b=3,c=5,x从-3到4变化,每隔0.5取一个函数值。操作方法写出如下: 4.把工作簿以E81.XLS为文件名存入D:\EX8中。 (二)函数的使用 在Excel环境下打开D:\EX8\E82.XLS文件,依次完成以下各操作后按E83.XLS为文件名存入D:\EX8中。 1、统计函数的使用 ⑴单击“统计函数”工作表;

⑵在区域F3:G8中用“统计函数”计算出各分店的统计值。 操作方法是:先在F3单元及G3单元输入的计算公式,然后选定区域F3:G3后双击其填充柄。其中F3单元的公式为,G3单元的公式为。 ⑶在区域B9:E12用“统计函数”计算出各季度的统计值。 2、条件函数的使用 ⑴单击“条件函数”工作表。 ⑵计算出各学生的平均分; ⑶给定各学生的成绩等级,规则如下:平均分≥90为“A”,80≤平均分<90为“B,70≤平均分<80为“C”,60≤平均分<70为“D”,平均分<60为“E”。以此规则在区域F3:F62用IF函数确定各学生的等级。 ⑷用FREQUENCY函数在区域I2:I5中统计出平均分0~59,60~79,80~99,100各分数段的学生人数。 3、文本函数的使用 ⑴单击“文本函数”工作表; ⑵在区域A2:F32给出的数据清单中,编号的前3位为系别信息,101为数学系,102为物理系,103为化学系,据此在区域B3:B32用函数求出每位教师的系别。其中B3单元使用的公式为。 ⑶已知身份证号的第7至第10位数为出生年份,据此在区域F3:F32用函数求出每位教师的出生年份。其中F3单元使用的公式为。 4、日期函数的使用 ⑴单击“日期函数”工作表; ⑵在区域A2:F32给出的数据清单中,在区域E3:E32用日期函数求出每位职工的工龄。其中E3单元使用的公式为。 ⑶在区域F3:F32用日期函数求出每位职工的工作天数(即自参加工作以来已经过的总天数。其中F3单元使用的公式为。 5、财务函数的使用 使用 PMT 函数完成以下有关的操作: ⑴单击“财务函数”工作表; ⑵某企业向银行贷款5 万元,准备4年还清,假定当前年利率为 4 % ,在 B5 单元 计算每个月应向银行偿还贷款的数额,根据条件在 B2 : B4 补充所需内容。其中单元格B5 使用的公式为。 ⑶假定当前年利率为 5 %,为使 5 年后得到 10 万元的存款,在 D5 单元计算现在开

Python 实验8 函数1

实验8 函数(一)实验目的: 1、理解自定义函数过程的定义与调用方法; 2、掌握自定义函数的定义与调用方法; 3、理解函数中的参数的作用; 实验内容: 1、编写一函数Fabonacci(n),其中参数n代表第n 次的迭代。While循环 def fib(n): if n==1 or n==2: return 1 a=1 b=1 i=2 while True: c=a+b a=b b=c i+=1 #第i次迭代,也就就是第i个数 if i==n: return c break def main(): n=input("Enter a number of generation:") print fib(n) main() 或者用for循环 def fib(n): a=1 b=1 c=0 if n==1 or n==2: return 1 else: for i in range(3,n+1): c=a+b a=b b=c return c def main(): n=input("enter n:") print fib(n) main() 2、编写一函数Prime(n),对于已知正整数n,判断该数就是否为素数,如果就是素数,返回True,否则返回 False。 def prime(n): if n<2: return False a=0 for i in range(1,n+1): if n%i==0: a+=1 if a>2: return False else: return True def main(): n=input("Enter a number:") print prime(n) main() Or: def prime(n): if n<2: return False if n==2: return True for i in range(2,n): if n%i==0: return False return True def main(): n=input("Enter a number:") print prime(n) main()

面向对象实验题及答案(全)

实验1 cin、cout及面向过程的编程实验2 引用与函数重载 实验3 类与对象 实验4 静态成员与对象参数 实验5 拷贝构造函数与内存分配 实验6 对象数组与子对象 实验7 含有数组成员的对象与深拷贝实验8 运算符重载(1) 实验9 运算符重载(2) 实验10 继承与派生 实验11 虚函数与类族 实验12 STL

实验1 cin 、cout 及面向过程的编程 1A :显示某个日期是星期几 (1) 输入、输出要求: 输入:3个正整数,依次为年、月、日,比如2049 10 1 输出:按类似“[2049-10-5] is Friday.”的形式输出 示例: (2) 处理方法 历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式,其中最著名的是蔡勒(Zeller)公式。即 7)%110)1(26244(-+? ?? ???++-??????+??????+=d m c c y y w 公式中的符号含义: w ——星期几 c ——年份的前两位 y ——年份的后两位 m ——月,3≤m ≤14,某年的1、2月视为上一年的13、14月,比如2003年1月1日要看作2002年的13月1日 d ——日 ??——代表取整,即只要整数部分 %——除法求余数 例如:对于2049年10月1日,计算过程如下: 5 7%547)%284051249(7)%1110)110(2620242044949(==+-++=-+??? ???++?-??????+??????+=w 即2049年10月1日是星期5。如果计算结果是负数,则加7。 1B :格式化输出实数 从键盘读取本金和年利率,求20年中每年末本息合计有多少钱。 输入:用空格分隔的两个数,都可以带小数点 输出:以“钱数(?年后)”的方式显示,以“2格、右对齐”的方式显示年,以“共10格、小数点后取2位、右对齐”的方式显示本息合计的钱数,见示例 示例:本金973.45元、年利率2%的显示结果如下

实验八 函数含答案

实验八函数 【目的与要求】 1.掌握C语言函数的定义方法、函数的声明及函数的调用方法。 2.了解主调函数和被调函数之间的参数传递方式。 【上机内容】 【一般示例】 【例1】将打印18个"*"组成星形线定义为一个返回值和形参列表都为空的函数,通过主函数调用它。 #include void Star(void) //画星形线。函数没有返回值,形参列表也为空 { int i; for(i=1;i<=18;i++) printf("*"); //18个"*"组成星形线 printf("\n"); return ; //返回值类型为void,return后不带表达式,此句可省略 } int main() { Star( ); //单独的函数调用语句,实参表为空,但必须保留括号 printf("I love C language!\n"); Star( ); return 0; } 【例2】调用prime 函数以每行5个素数的格式输出100到200之间的所有素数。

#include #include int prime(int m) //判断素数函数定义 { int i,k,f=1 ; //函数内定义3个变量 if (m==1) //形参若为1 f=0 ; //形参若为1,非素数 k=(int)sqrt(m); for (i=2; i<=k;i++) if (m%i==0) //m被某除数整除 f=0 ; //则不是素数 return f ; //用return语句返回 } //函数体结束 int main( ) { int i,count=0; for (i=101;i<200;i=i+2) //用i作为循环控制变量,从101开始,步长为2 if (prime(i)) //对每一个i,调用prime函数判断它是否为素数 { printf("%5d",i); //如果是素数,输出该素数i count++ ; //素数个数加1 if (count%5==0 ) //每输出5个素数换一行 printf("\n"); }

大学生c语言程序设计(第四版谭洪强)实验8答案

实验八 函 数(二) 参考答案 /*1.(sy8-1.c ) 请编写函数 fun ,其功能是:计算并输出给定数组(长度为 9)中每相邻两个元素之平均值的平方根之和。 例如,给定数组中的 9 个元素依次为 12.0、34.0、4.0、23.0、34.0、45.0、18.0、3.0、11.0,输出应为:s=35.951014。 【解题思路】 在给出的参考程序中,由于函数要求的返回值为双精度型,所以先将变量 avg 、sum 定义为双精度型,初值为 0.0,然后通过 for 循环分别求出相邻两个元素的平均值放入变量 avg 中,再使用求平方根函数sqrt()对各平均值开方求和,最终结果输出到变量 sum 中并返回。 【参考答案】*/ double fun(double x[9]) { int i ; double avg=0.0,sum=0.0; //将变量avg 、sum 定义为双精度型,并给其赋初值为0.0 for (i=0;i< 8;i++) { avg=(x[i]+x[i+1])/2; //通过for 循环分别求出相邻两个元素的平均值放入变量avg 中 sum+=sqrt(avg); //使用求平方根函数sqrt()对各平均值开方求和,最终结果输出到变量 sum } return sum; /*返回计算结果*/ } 2.(sy8-2.c ) 编写函数fun ,实现矩阵(3行3列)的转置(即行列互换)。例如,输入下 面的矩阵:????? ??900800700600500400300200100,程序输出: ???? ? ??900600300800500200700400100。 【解题思路】 方阵转置,只需要将左下半三角元素和右上半三角元素对换即可。 【参考答案】 int fun(int array[3][3]) { int i,j,t ; for(i = 0 ; i < 3 ; i++) for(j = 0 ; j < i ; j++) {t=array[i][j]; array[i][j]=arrar[j][i]; array[j][i]=t ; } } 3.(sy8-3.c ) 请编写函数 fun ,函数的功能是:统计一行字符串中单词的个数作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格。 【解题思路】I am a student! 在给出的参考程序中,若判断出当前字符为非空格,而它前面的字符是空格,则单词数累加 1;若当前字符为非空格,而其前面的字符也为非空格,则单词数不累加 1,程序细节可以参考程序的注释部分。 【参考答案1】 int fun( char s[])

实验十函数应用答案

实验十函数应用 一?实验目的 1.掌握函数的定义和调用; 2.理解形参和实参的使用和传值调用; 3.理解函数声明的使用; 4.掌握函数的嵌套调用; 5.了解函数的嵌套与递归调用,掌握递归函数的编写规律; 6.了解数组元素、数组名作函数参数。 二?实验学时数 2学时 三?实验步骤 (一)阅读程序 1.#include int fun (int x, int y, int z) { z=x * x + y * y; } main() { int a=38; fun(7,3,a); printf("%d",a); 2.#include void fun (int x,int y ); main() {int x=5,y=3; fun(x,y); printf("%d,%d\n",x,y); } void fun (int x,int y ) { x=x+y; y=x-y;

x=x-y; printf("%d,%d\n",x,y); 3.#include int f (int a); main() { int s[ 8 ] = {1,2,3,4,5,6} ,i, d=0; for (i=0; f( s[i] ) ; i++) d+=s[i]; printf("%d\n",d); } int f(int a) { return a%2; } 4.#include long f( int g) { switch(g) { case 0:return 0; case 1: case 2: return 1; } return ( f(g-1)+ f(g-2)); } main ( ) { long int k; k = f(7); printf("\nk= %d\n",k); }

实验8 函数——递归函数

淮海工学院计算机科学系实验报告书 课程名:《C语言程序设计A 》 题目:实验8 函数 ——递归函数 班级:软嵌151 学号:2015123349 姓名:陈正宁

1、实验内容或题目 (1)用递归编写n!的函数,并在main主函数中调用此函数。 (2)有n个大小不同的盘片从大到小放在A柱上,另有B和C两个空柱,要求将这n个盘片从A柱搬到C柱上,在搬动过程中,每次只能搬一个盘片,而且小的不能放在大的之下。编写hanio函数实现搬迁过程。 (3)编写一个程序,求解皇后问题:在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。 2、实验目的与要求 (1)要求熟练掌握函数的定义和调用,熟悉函数返回值的使用。 (2)熟悉函数调用的方式和过程。 (3)重点掌握递归函数的使用。 (4)要求实验的第2题采用递归函数编写,盘片的数目在main主函数中输入。提示:函数的参数定义如hanio(n,A,C,B),表示将n个盘片从A柱通过C柱搬到B柱。 (5)要求实验的第3题采用递归函数编写皇后的个数n由用户输入,其值不能超过20;采用整数数组q[N]求解结果,因为每列只能放一个皇后,q[i]的值表示第i个皇后所在的行号,即该皇后放在(q[i],i)的位置上。求解皇后问题的递归模型如下:place(i,n):若i=n,则n个皇后放置完毕,输出解(输出q数组元素) place(k,n):在第k列找一个合适位置i,放置一个皇后(即q[k]=i);place(k+1,n);其中,place(k,n)表示前面的第1,…,k-1个皇后放置好后,现在用于放置k,…,n的皇后。 3、实验步骤与源程序 ⑴实验步骤 ⑵源代码 (1)、 #include long fac(int n) { long f; if(n==0||n==1)

《C语言程序设计》实验.设计.习题.答案 函数

实验5 函数 姓名:学号:实验日期: 1.实验目的和要求:参见实验指导书实验八 2.实验内容和步骤: 实验内容:实验指导书中的实验八 实验步骤: 2.1.实验内容的第1题,通过本题,了解到要在单步调试时能够观察自定义的函数内部变量变化情况,单步调试如何操作: 1.在“菜单栏”中单击“组建”,然后在弹出的下划栏中选择“开始调试”,然后选择“Step Into”;或者按“F11”。 2.然后开始单步调试,按F10 提问 修改前运行结果画面: (1),请在下面粘贴运行结果画面: #include int a=3,b=5; max(int a,int b) { int c; c=a>b?a:b; return(c); } main() { int a=8; printf("%d\n",max(a,b)); }

实参a是否为同一变量?不是 提问(2),请请在下面粘贴运行结果画面:#include max(int a,int b) { int c; c=a>b?a:b; return(c); } main() { extern int a,b; printf("%d\n",max(a,b)); } int a=3,b=5; 提问(3),观察结果有何变化? #include max(int a,int b) { int c; c=a>b?a:b; return(c); } main() { int a,b; printf("%d\n",max(a,b)); }

int a=3,b=5; 通过本题,可以得出什么结论?若没给未知量赋予初值,那未知量将被随意赋值,赋值一主函数的赋值为先。 2.2 实验内容部分第2题源程序代码,请贴图: 程序运行结果画面,请贴图: 2.3 实验内容部分第3题源程序代码,请贴图:

实验八参考答案

实验8 参考答案 二、实验内容与操作步骤 (二) 函数的使用 1、统计函数的使用 其中F3单元的公式为=SUM(B3:E3) ,G3单元的公式为=A VERAGE(B3:E3)。 2、条件函数的使用 ⑶其中F3单元使用的公式为: =IF(E3>=90,”A”,IF(E3>=80,”B”,IF(E3>=70,”C”,IF(E3>=60,”D”,”E”))))。 然后双击F3单元的填充柄。 ⑷具体的操作步骤及计算公式如下: (1)在区域H2:H4输入统计间距数据59.9,79.9,99.9; (2)选定作为统计结果数据的输出区域:I2:I5; (3)输入频度分析统计函数的公式:=FREQUENCY(E3:E62,H2:H4); (4)按[Ctrl]+[Shift]+[Enter] 3、文本函数的使用 ⑵其中B3单元使用的公式为 =IF(LEFT(A3,3)=”101”,”数学系”,IF(LEFT(A3,3)=”102”,”物理系”,”化学系”))。 ⑶其中F3单元使用的公式为 =MID(E3,7,4) 。 4、日期函数的使用 ⑵其中E3单元使用的公式为 =YEAR(TODAY())-YEAR(D3)+1 。 ⑶其中F3单元使用的公式为 =TODAY()-D3 。 5、财务函数的使用 ⑵其中B5单元使用的公式为 =PMT(B2/12,B3*12,B4)。 ⑶其中E5单元使用的公式为 =PMT(E2/12,E3*12,,E4)。 6、排位函数的使用 ⑵其中G2单元使用的公式为 =F2-$B$10 。 ⑶其中H2单元使用的公式为 =RANK(F2,$F$2:$F$8,1) 或 =RANK(G2,$G$2:$G$8,1) 。 三、思考与练习 1、具体的操作步骤及计算公式如下: (1) 在区域F10:F13输入统计间距数据99,199,299,399; (2) 选定作为统计结果数据的输出区域:G10:G14; (3) 输入频度分析统计函数的公式:=FREQUENCY(C3:C23,F10:F13); (4) 按[Ctrl]+[Shift]+[Enter] 2、操作步骤及计算公式:

实验八 参考答案

实验八 函 数(二) 参考答案 1.(sy8-1.c ) 请编写函数 fun ,其功能是:计算并输出给定数组(长度为 9)中每相邻两个元素之平均值的平方根之和。 例如,给定数组中的 9 个元素依次为 1 2.0、34.0、4.0、2 3.0、3 4.0、4 5.0、18.0、3.0、11.0,输出应为:s=35.951014。 【解题思路】 在给出的参考程序中,由于函数要求的返回值为双精度型,所以先将变量 avg 、sum 定义为双精度型,初值为 0.0,然后通过 for 循环分别求出相邻两个元素的平均值放入变量 avg 中,再使用求平方根函数sqrt()对各平均值开方求和,最终结果输出到变量 sum 中并返回。 【参考答案】 double fun(double x[9]) { int i ; double avg=0.0,sum=0.0; //将变量avg 、sum 定义为双精度型,并给其赋初值为0.0 for (i=0;i< 8;i++) { avg=(x[i]+x[i+1])/2; //通过for 循环分别求出相邻两个元素的平均值放入变量avg 中 sum+=sqrt(avg); //使用求平方根函数sqrt()对各平均值开方求和,最终结果输出到变量 sum } return sum; /*返回计算结果*/ } 2.(sy8-2.c ) 编写函数fun ,实现矩阵(3行3列)的转置(即行列互换)。例如,输入下 面的矩阵:????? ??900800700600500400300200100,程序输出: ???? ? ??900600300800500200700400100。 【解题思路】 方阵转置,只需要将左下半三角元素和右上半三角元素对换即可。 【参考答案】 int fun(int array[3][3]) { int i,j,t ; for(i = 0 ; i < 3 ; i++) for(j = 0 ; j < i ; j++) t=array[i][j], array[i][j]=arrar[j][i], array[j][i]=t ; } 3.(sy8-3.c ) 请编写函数 fun ,函数的功能是:统计一行字符串中单词的个数作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始没有空格。 【解题思路】 在给出的参考程序中,若判断出当前字符为非空格,而它前面的字符是空格,则单词数累加 1;若当前字符为非空格,而其前面的字符也为非空格,则单词数不累加 1,程序细节可以参考程序的注释部分。 【参考答案】 int fun( char s[]) { int i,word=0,num=0;/*word 标志是否是单词,num 用来记录单词数*/ for(i=0;s[i]!=?\0?;i++)

上海九峰实验学校八年级数学下册第四单元《一次函数》检测卷(包含答案解析)

一、选择题 1.甲、乙两车分别从A 地出发匀速行驶到B 地,在整个行驶过程中,甲、乙两车离开A 城的距离(km)y 与甲车行驶的时间(h)t 之间的关系如图所示,则下列结论中正确的个数为( ) ①,A B 两地相距480km ; ②乙车比甲车晚出发1小时,却比甲车早到1小时; ③乙车出发后4小时时追上甲车; ④甲,乙两车相距50km 时, 3.5t =或4.5. A .1 B .2 C .3 D .4 2.若正比例函数y =(m ﹣2)x 的图象经过点A(x 1,y 1)和点B(x 2,y 2),当x 1<x 2时,y 1>y 2,则m 的取值范围是( ) A .m >0 B .m <0 C .m >2 D .m <2 3.已知函数y kx b =+的图象如图所示,则函数y bx k =-的图象大致是( ) A . B . C . D . 4.如图,一次函数y kx b =+(,k b 为常数,且0k ≠)的图像经过点(3,2)-,则关于x 的不等式2kx b +<的解集为( ) A .3x >- B .3x <- C .2x > D .2x < 5.甲,乙两车分别从A , B 两地同时出发,相向而行.乙车出发2h 后休息,当两车相遇时,两车立即按原速度继续向目的地行驶.设甲车行驶的时间为x (h ), 甲,乙两车到B 地

的距离分别为y 1(km ), y 2(km ), y 1, y 2关于x 的函数图象如图.下列结论:①甲车的速度是 45a km /h ;②乙车休息了0.5h ;③两车相距a km 时,甲车行驶了5 3 h .正确的是( ) A .①② B .①③ C .②③ D .①②③ 6.如图,在平面直角坐标系中,点()2,A m 在第一象限,若点A 关于x 轴的对称点B 在直线1y x =-+上,则m 的值为( ) A .-1 B .1 C .2 D .3 7.科学家就蟋蟀鸣叫的次数与室外温度的数量关系做了如下记录: 蟋蟀每分钟鸣叫的次数 温度/°F 144 76 152 78 160 80 168 82 176 84 ) A .178 B .184 C .192 D .200 8.火车匀速通过隧道时,火车在隧道内的长度y (米)与火车行驶时间x (秒)之间的关

实验八 函数(二)

实验八函数(二) 一.实验目的与要求 1.理解函数的嵌套调用和递归调用特点 2.熟悉简单的递归函数设计 3.理解函数参数的普通值传递和地址值传递特点 4.掌握用数组元素和数组名作为函数参数的应用 5.理解变量的作用域和存储属性,掌握局部变量和全局变量、静态变量和动态变量的特 点和应用。 二.实验准备。 1、函数的嵌套调用 C规定,函数不能嵌套定义,但可以嵌套调用。当一个函数调用另一个函数时,前者称为主调函数,后者称为被调函数。不管函数嵌套调用多少次,当被调函数执行结束后返回它的主调函数的调用位置,继续执行主调函数中的其他操作。 2、函数的递归调用 一个函数直接或间接地调用自身称为递归调用。有递归调用语句的函数称为递归函数。C对函数递归自调用的次数没有限制,但每调用一次函数,会在内存的堆栈区分配存储空间用于存放函数的返回位置等相关信息。堆栈的特点是后进先出,所以最后调用的函数最先返回。如果递归自调用的次数过多,可能导致堆栈的溢出。所以,在设计递归函数时,函数体中一般有if~else~这样的语句,用于设置递归结束的条件和继续递归的语句。 3、函数的参数的两种传递方式 (1) 普通值传递的特点: ●只能由实参向形参单向传递,形参的修改不能影响实参 ●形参变量在调用函数时才分配存储空间,调用结束后即释放其存储空间 ●最多只能通过return 语句带回一个返回值 (2) 地址值传递的特点: ●实参是地址常量或变量,形参是能接收实参值的地址变量 ●在被调函数中可以间接使用实参提供的地址空间的数据,相当于“双向”传递。 ●不用return 可以在主调函数中得到多个处理结果 4、数组作为函数参数 (1) 数组元素作为实参:等价于普通变量作为实参,形参为同类型的普通变量,是普通值传递。 (2) 数组名作为实参:传递主调函数中实参数组存储空间的首地址,形参定义为同类型同大小的数组,且形参一维数组可以省略其大小,形参二维数组可以省其第一维大小。是地址值传递。 5、需掌握的教材例题 ●嵌套调用:例7.5 ●递归调用:例7.6、例7.7 ●数组名作函数参数:例7.11、例7.12、例7.13 ●全局变量:例7.14、例7.15 ●静态变量:例7.16、例7.17 三、实验内容(按要求设计以下程序,并调试分析运行结果) 1.(sy8-1.c)请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和。例如,给定数组中的9 个元素依次为1 2.0、34.0、4.0、

vb6.0实验八习题与答案

实验八 专业_____________ 班级________年级________姓名______________学号_______________ 一、实验目的 1、掌握通用过程和函数的定义及调用方法 2、了解参数的传递 3、掌握简单的递归算法 二、实验内容 1、在窗体层编写过程Proc1(a() as integer)其功能:给数组a赋[0,99]的随机整数,并显示在Text1中;Proc2(a() as integer)其功能是把数组a进行逆序存放。单击“生成随机数”按钮用于调用Proc1过程;单击“调用proc”按钮,调用Proc2过程;单击“输出结果”按钮,将调用Proc2的结果显示在Text2中。 D i m b(9)A s I n t e g e r D i m s t r a A s S t r i n g P r i v a t e S u b C o m m a n d1_C l i c k() C a l l p r o c1(b()) E n d S u b S u b p r o c1(a()A s I n t e g e r) R a n d o m i z e F o r i=0T o U B o u n d(a) a(i)=I n t(R n d*100) T e x t1.T e x t=L T r i m(T e x t1.T e x t)+S t r(a(i)) N e x t i E n d S u b P r i v a t e S u b C o m m a n d2_C l i c k() C a l l p r o c2 E n d S u b S u b p r o c2() F o r i=9T o0S t e p-1 s t r a=s t r a&b(i)&"" N e x t i E n d S u b

第四版C语言实验报告8函数(2)

仲恺农业工程学院实验报告纸 计算机科学与工程(院)计算机科学与技术专业计111班1 组C语言程序设计课学号201110214113 姓名廖兆伟实验日期2012-3-29 教师评定 实验8函数(二) 实验目的: 1、进一步熟悉怎样利用函数实现指定的任务; 2、熟悉函数的嵌套调用和递归调用的方法; 3、熟悉全局变量和局部变量的概念和用法; 实验内容 (1)写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。 ①输入程序,进行编译和运行,分析结果。 输入程序如下: #include #include #define N 10 char str[N]; int main() {void sort(char[]); int i,flag; for(flag=1;flag==1;) {printf("input string:\n"); scanf("%s",&str); if(strlen(str)>N) printf("string too long,input again!"); else flag=0; } sort(str); printf("string sorted:\n"); for(i=0;istr[i+1])

实验八函数

实验八函数 班级___________姓名___________指导老师_____________成绩___________ 第_____________机房___________号机器时间________________________ 实验目的:1. 学会函数的定义和调用方法。 2. 掌握形参和实参的使用和传值调用。 3. 了解函数声明的使用。 实验要求:每次实验前,学生要先预习实验内容,写出分析结果或程序,经实验指导 老师检查后上机运行、调试程序,得出最终正确的结果。 实验内容 一、读程序 要求:读懂程序,写出分析结果;上机运行程序,得到运行结果,比较之。 1. #include fun (int x, int y, int z) { z=x*x+y*y; return(z); } main() { int a=31; fun(5,2,a); printf("%d",a); } 分析结果通过分析可以知道结果为:31 运行结果

#include fun (int x, int y, int z) { return( x*x+y*y ); } main() { int a=31; a=fun(5,2); printf("%d",a); } 分析结果:通过分析可以知道结果为:29 运行结果: 2. # include int func(int a,int b) { return(a+b); } main () { int x=2,y=5,z=8,r; r=func(func(x,y),z); printf("%d\n",r); } 分析结果通过分析可以知道结果为 :15 运行结果

实验6 函数 习题及答案

实验6 函数 一、实验目的 (1)掌握定义函数的方法; (2)掌握函数实参与形参的对应关系,以及“值传递”的方式; (3)掌握函数的嵌套调用和递归调用的方法; (4)掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法; (5)学习对多文件的程序编译和运行。 二、实验内容 1.阅读下面程序,写出程序运行结果,并且上机进行验证。 (1)a1.cpp 变量的虚实耦合,实现的是值传递,是单向传递 #include "stdio.h" int swap(int a,int b) { int c,s; c=a; a=b; b=c; s=a+b; return s; } void main() { int a,b,s; a=3;b=4; s=swap(a,b); printf("a=%d b=%d s=%d\n",a,b,s); } (2)a2.cpp

将十进制数26的各位数字相乘 #include "stdio.h" int fun(int num) { int k=1; do { k*=num %10; / num/=10; }while(num); return(k); } void main() { int n=26; printf("%d\n",fun(n)); } (3)a3.cpp 变量的作用域,当在函数内定义了与全局变量同名的局部变量时,全局变量被屏蔽#include "stdio.h" int a=3,b=5,c; void f(int b) { c=a+b; printf("%d %d %d\n",a,b,c); } void main() { int a=8; f(3); printf("%d %d %d\n",a,b,c); } (4)a4.cpp 递归,将十进制11转换为二进制 #include "stdio.h" void dtob(int n) { int i;

实验8-函数(2)(1)

实验8 函数嵌套调用及函数重载与带默认参数值的函数【实验目的】 1: 掌握函数嵌套的概念及嵌套中的相互调用关系。 2:理解并掌握函数递归调用的方法,学会用递归调用的方法解决实际问题。 3:了解内联函数,函数重载及带默认参数值的函数用法。 二、实验内容-上机调试理解 例1.编写函数求代数式11+22+33+44+55的值。 分析:本题采用函数嵌套来解决,在主函数中调用了sum求和函数,在sum函数中又调用了power 函数求幂。 源程序: #include int sum(int); //函数原型声明,因为函数先被主函数main中调用使用,后定义其功能。 int power(int); void main() { int n; n=5; cout<

例2.分别用用递归算法和非递归算法实现1!+2!+3!+…+n! 非递归算法-源程序: 分析:求阶乘的函数需要一个整型形参,函数类型为double,由于在主函数中要求1!+2!+…+n!,因此要循环调用该函数求累加和。 #include double fa(int n);//函数原型说明 void main() { int n; cin>>n; double s=0.0; for(int i=1;i<=n;i++) s+=fa(i); //在循环体多次中调用fa()函数,这里i为实参,传值调用 cout<

实验答案--函数

1.编一个带有函数的程序。在main()函数中输入一个字符串(长度<20),调用函数fun将该字符串中的所有字符按ASCII码升序排序,然后再输出排序后的字符串。例如,输入edcba,则应输出abcde.。 #include #include int main() { void fun(char x[],int y); int i; char c[20]; printf("Please input chars:\n"); gets(c); i=strlen(c); fun(c,i); return 0; } void fun(char x[],int y) { int i,j; char c; for(i=0;ix[j]) { c=x[i]; x[i]=x[j]; x[j]=c; } puts(x); }

2.下面程序的功能是依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串;(如:abcd123efg456变为123456)。 修改该程序,要求将红色部分用一个函数来实现。 #include "stdio.h" main() { char s[15]; int i,j; scanf("%s",s); for (i=0,j=0; s[i]!='\0'; i++) if (s[i]>='0' && s[i]<='9') { s[j]=s[i]; j++; } s[j]='\0'; printf("\nThe result:"); printf("%s",s); } #include int main() { void fun(char x[]); char s[15]; printf("Input chars to fill s[15]:\n"); scanf("%s",s); fun(s); return 0; } void fun(char x[]) { int i,j; for(i=0,j=0; x[i]!='\0'; i++) if(x[i]>='0'&&x[i]<='9') { x[j]=x[i]; j++; } x[j]='\0'; puts(x); }

实验八:MATLAB函数文件

实验八 MATLAB函数文件 一、实验目的 1. 理解函数文件的概念。 2. 掌握定义和调用MATLAB函数的方法。 二、实验内容 要求:命令手工 ( )输入!!! 1. 定义一个函数文件,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数文件。 解:M文件如下:

2. 编写一个函数,计算美元与人民币对换。现在汇率为6.23 。 解: function rmb = dh(my,hl) % my为美元,hl为汇率,rmb 为人民币 rmb=my*hl; return MATLAB 命令窗口输入: yy=dh(100,6.23) % 100 为美元,6.23为汇率,yy 为对换后的人民币 3. 一个自然数是素数,且它的数字位置经过任意对换后仍为素数,这种素数称为绝对素数。例如:13是绝对素数。试求所有两位绝对素数。 要求:定义一个判断素数的函数文件。

解:M 函数文件: 运算结果: 4. 设2411()(2)0.1(3)0.01 f x x x =+?+?+,编写一个MATLAB 函数文件fx.m ,使得调用f(x)时,x 可用矩阵代入,得出的f(x)为同阶矩阵。

运算结果: 5. 已知 (40) (30)(20) f y f f = + (1) 当f(n)=n+10ln(n2+5)时,求y的值。 (2) 当f(n)=1×2+2×3+3×4+...+n×(n+1)时,求y的值。

(2). 运算结果如下: *选作题: 6. 一个物理系统可用下列方程组来表示: 111211 12220cos sin 0sin 0cos 000sin 000cos 1a m m a m g m N m N m g θθθθθ θ????????????????????=???????????????????? 从键盘输入m 1、m 2和θ的值,求a 1、a 2、N 1和N 2的值。其中g 取9.8,输入θ时以角度为单位。 要求:定义一个求解线性方程组AX=B 的函数文件,然后在命令文件中调用该函数文件。

实验八

实验八友元函数和友元类 , 一,实验目的 1.熟悉类和模板类的使用。 2.掌握友元函数和友元类的声明格式。 3.了解友元函数和友元类的作用,使用友元的利弊。 4.掌握静态数据成员和函数成员的使用方法,它们同一般成员的差异。 5.掌握栈和队列的运算特点和有关算法。 二、实验内容 1.定义复数类Complex,使用友元,完成复数的加法、减法、乘法、除法运算,以及对复数的输出。 # include class complex { float real,imag; public: complex(float r=0,float i=0) {real=r;imag=i;} void print(); friend complex operator+(complex a,complex b); friend complex operator-(complex a,complex b); friend complex operator*(complex a,complex b); friend complex operator/(complex a,complex b); }; void complex::print() { cout<0)cout<<"+"; if(imag!=0)cout<

相关文档