实验五 函数与编译预处理
函数与编译预处理

函数与编译预处理一、函数的定义1、无参函数的定义形式类型标识符函数名()第一行:函数首部{声明部分语句 { }包含的:函数体}例1:void fun( ){printf(“Hello!\n”);}2、有参函数的定义形式类型标识符函数名(形式参数列表){声明部分语句}例2:int max(int x, int y){ int z;z = x > y ? x : y;return (z);}注:“类型标识符”是指函数值的类型。
若省略,默认为int。
二、函数的调用无参函数:函数名()有参函数:函数名(实际参数列表)例3:在main函数中调用fun和max函数void main( ){int m,n,t;scanf(“%d,%d”,&m,&n);t=max(m,n); /*调用max函数*/fun(); /*调用fun函数*/printf(“max number is %d\n”,t);}注:1、C语言程序由函数构成,其中有且仅有一个main函数,各函数书写的先后顺序任意。
2、函数的定义是相互独立的,不能在一个函数的内部定义另一个函数,即函数的定义不能嵌套。
3、程序从main函数开始执行,其他函数被调用时执行,调用完后回到主调函数,最后在main函数中结束整个程序。
三、函数的声明在主调函数中一般要对被调函数进行声明。
声明的作用是告知编译器被调函数的函数名、函数类型、参数个数和参数类型,方便进行语法检查。
声明的形式:类型标识符函数名(形式参数列表);即:函数首部加分号例如:void fun( );int max(int x, int y);其中参数名称可省略,如:int max(int , int );Turbo C在以下两种情况中,可省略函数声明:1、被调函数定义在主调函数前。
2、被调函数类型为int、char。
四、参数的传递1、形参是变量,但函数被调用时才被分配内存,调用完毕,所占内存将被释放。
函数与编译预处理05

使用参数数目可变的函数时要注意以下几点:1、在定义函数时,固定参数部分必须放在参数表的前面,可变参数在后面,并用省略号“...”表示可变参数。
在函数调用时,可以没有可变的参数。
2、必须使用函数va_start()来初始化可变参数,为取第一个可变的参数作好准备工作;使用函数va_arg()依次取各个可变的参数值;最后用函数va_end()做好结束工作,以便能正确地返回。
3、在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的实参个数。
函数的重载所谓函数的重载是指完成不同功能的函数可以具有相同的函数名。
C++的编译器是根据函数的实参来确定应该调用哪一个函数的。
int fun(int a, int b) { return a+b; }int fun (int a){ return a{ return a**a; }void main(void){cout<<fun(3,5)<<endl;cout<<fun(5)<<endl;}8251、定义的重载函数必须具有不同的参数个数,或不同的参数类型。
只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。
2、仅返回值不同时,不能定义为重载函数。
即仅函数的类型不同,不能定义为重载函数int fun(int a, int b) { return a+b; } float fun (int a,int b) { return (float)a*a; }void main(void){cout<<fun(3,5)<<endl; cout<<fun(3,5)<<endl;宏定义不带参数的宏定义用一个指定的标识符(即名字)来代表一个字符串,以后凡在程序中碰到这个标识符的地方都用字符串来代替。
这个标识符称为宏名,编译前的替代过程称为“宏展开”。
# define 标识符字符串注意:1、宏展开只是一个简单的“物理”替换,不做语法检查,不是一个语句,其后不加分号“;”2、#define命令出现在函数的外面,其有效范围为定义处至本源文件结束。
C语言上机试题及答案

实验一Visual C++6.0的使用及顺序结构程序设计一、实验目的1、掌握启动和退出VC6 的方法。
2、熟悉 VC6 开发环境。
3、初步掌握简单程序的上机操作基本步骤,熟悉 C 单文件程序的输入、编译、链接和运行过程。
4、初步掌握程序的编辑修改和调试。
5、熟练使用赋值运算、算术运算等表达式。
6、熟练使用标准输入、输出函数及各种数据类型的格式说明符。
二、实验内容1、下面C语言程序,其功能是显示字符串“欢迎同学们来到华北水院计算中心!”。
请同学们按照下面的实验指导学习VisualC++6.0的使用。
1 .启动 VisualC++6 .0 开发环境(1)单击开“始”按钮,选择程“序”——〉“Microsoft Visual Studio6.0菜单项,单击“MicrosoftVisualC++6.0”,屏幕出现标题为“当时的提示”的窗口。
(2)单击“结束”按钮,关闭窗口,进入VC6.0 开发环境的主窗口。
2 .使用 Visual C++6.0 对一个 C 程序进行编辑、编译、连接和运行。
⑴分析Visual C++6.0 中程序的开发过程与其它高级语言的开发过程相仿,都要经过编辑、编译、连接和运行四个步骤。
⑵步骤①编辑图 1-1 New 对话框编辑是将 C 源程序输入计算机的过程。
在Visual C++6.0 主界面下,点击File 菜单,选择Ne w 菜单项,即可出现New 对话框,如图1-1 所示。
在弹出窗口中的Files 标签页下,选择C++ Sour ce File。
在选项卡右面的File 编辑框里输入文件名如“Exa.c”,在 Location 编辑框里输入文件路径,2如 : \test”。
点击 OK 按钮。
将出现编辑窗口 ,如图 1-2 所示。
在图 1-2 所示的右端编辑窗口里输 入以下 C 源程序并保存文件。
图 1-2 编辑窗口②编译编译是使用系统提供的编译器将文本文件 Exa.c 生成机器语言的过程 ,结果为 Exa.obj ,由于没有 得到系统分配的绝对地址,还不能直接运行,如图 1-3 所示。
实验五_函数与编译预处理

《C语言程序设计》实验报告实验五函数与编译预处理学号姓名一、实验目的1、掌握函数定义及调用的方法,正确理解函数调用时实参和形参的对应关系;2、掌握并正确使用数组作为函数参数;3、掌握函数的嵌套调用和递归调用的方法;4、理解变量的作用域和生存期;5、掌握宏定义、文件包含。
二、实验内容1、分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。
#include <stdio.h>int fun(int k){int result=1,i;for(i=1;i<=k;i++){result=result*i;}return result;}void main(){int n;printf("Input n please(1<=n<=10)");scanf("%d",&n);printf("%d!=%d\n",n,fun(n));}『运行结果:』2、编写程序,输出2~n之间的所有素数,n由键盘输入。
要求判断素数的过程要写在函数中,由主函数调用实现,并写出2组以上程序运行结果。
程序代码:『运行结果:』3、编程实现输入8个学生某门功课的成绩,用函数求出平均分,并在主函数中输出平均分以及高于平均分的同学的成绩。
并写出2组以上程序运行结果。
程序代码:运行结果:』三、问题讨论1、举例说明自动变量和静态变量的区别。
四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因。
C 程序设计函数和编译预处理.

C++程序设计 ----中南大学 C++程序设计 —函数和编译预处理
14
重载++和-一、关于++和- 1、C中的++和- -的两种形式: 前缀:++i; 后缀:i--; 2、在C++中的约定 (显式地区分前缀和后缀) (1)对于前缀方式++i: 成员函数:XX::operator ++ (); 友元函数:X operator ++ (X&); (2)对于后缀方式i++: 成员函数:XX::operator ++ (int); 友元函数:X operator ++(X&, int); 第二个参数INT一般设置为0,如: i++ 等价于:i++(0) 或:i++=0
C++程序设计 ----中南大学 C++程序设计 —函数和编译预处理
15
二、实例 Class X { … X operator ++() { a++; b++; return *this; } X operator ++(int x) { X temp; a++; b++; return temp; }
Class X { … friend operator ++(Y &a) { a.x++; b.y++; return a; } friend operator ++(Y &a, int i) { Y temp=a; a.x++; b.y++; return temp; }
C语言 函数与编译预处理

main() {
int i, m, s=0; for (i=1; i<6; i++)
{ m=mul( i ); s+=fact( m );
} printf(“%d\n”, s); }
函数的递归调用
函数的递归 函数自身
在调用函数的过程中,该函数又去调用 int f (int x)
补充:编写一个函数isprime(int a)用来判断自变 量a是否是素数,若是,返回数值1,否则返回数值0。
开始 输入a, flag=1 调用判断函数
算法思想: 只能被 1 和其本身整
除的数,称为素数
Y
N
是素数?
flag=1
返回
flag=0
查看源程序
补充:利用isprime函数,编程验证任意一个偶数可 以写成两个素数之和。
查看源程序
6.4 函数的嵌套与递归调用
函数的嵌套 在调用函数的过程中,又去调用另一个函数
main()
sub1()
sub2()
例6.6 计算 s = (1*1)!+(2*2)!+(3*3)!+...+(6*6)!
算法分析:n!可定义为一个函数fact( int n ) ( k*k)的运算也可以定义为一个函数mul( int k ) 计算s本身是一个循环程序
int n; scanf( “%d”, &n ); printf(“%d\n”,sum(n)); }
int sum ( int n ) {
int s=0; int k; for( k=1;k<=n; k++)
s= s + k; return s; }
函数与编译预处理
2021/5/8
5
局部变量
例1:void fun() { int a=3,b=4; printf("a=%d,b=%d\n",a,b); } main() { int a=1,b=2; fun(); printf("a=%d,b=%d\n",a,b); }
2021/5/8
结果: a=3,b=4 a=1,b=2
… }
2021/5/8
13
局部静态变量属于静态存储方式,它具有以下特点
局部静态变量在函数内定义,但它的生存期为整 个程序的运行期间。 局部静态变量的生存期虽然为整个程序,但其 作用域仍与自动变量相同,即只能在定义该变 量的函数内使用该变量。 对于局部自动变量来说,如果定义时不赋初值 则它的值是一个不确定的值。 局部静态变量定义时若不赋初值则自动赋0值 或空字符,而且是在编译时赋初值的,即只赋 初值一次,在程序运行时它已有初值。
第6章 函数与编译预处理
6.3 函数的递归调用 6.4 变量作用域与存储方式 6.5 编译预处理
2021/5/8
第10次课
1
教学目的: 1. 了解函数的递归调用形式及特点 2. 掌握程序中全局变量和局部变量的作用范围 3. 掌握变量的存储类别及生命用期 4. 了解简单宏定义的使用
重点: 1. 全局变量和局部变量的使用特点 2. 变量存储类别
8
3. 外部变量的使用
外部变量在定义位置到文件结束有效,但在明外部变量
int a;
main()
int fun(int x,int y) { extern int c;
int d; d=x*y*c;
{ extern int b; a=2;
printf("%d\n",fun(a,b)); }
C++学习资料-函数和编译预处理
int maxi(int a,int b) { return a>b?a:b;}
19:01
5.2 形参与实参的结合方式
值传递:实参将它的值传递给形参变量
int max(int x,int y)
a: 20
{x=100;return(x>y?x:y);}
3*f(2)
}
递归调用包括两个过程: 2*f(1)
递推和回代过程.
1
1*2*3*4*5 1*2*3*4 1*2*3 1*2
递推过程 回代过程
19:01
5.3 递归调用的较复杂例子
河内塔问题:A(n)C(借助B )
A柱
B柱
C柱
设A柱上有n个盘子,盘子大小不等,大盘子在下,小盘 子在上,要求将A柱上盘子移到C柱上,每次只能移动 一个盘子,在移动过程中可以借助于任一柱子,但必须 保证三根柱子上的盘子都是大盘子在下,小盘子在上. 要求编一个程序打印出移动盘子的步骤.
40 20
20 40
19:01
5.3 函数的嵌套调用
在函数体内定义另一个函数是不允许的, 每个C++函数都具有平等的地位.但在函 数调用时可以嵌套调用:
A函数{ B函数;
}
B函数{ C函数;
}
C函数{ 函数体;
}
19:01
5.3 函数的递归调用
在函数的嵌套调用中:
函数调用其本身: 称为直接递归
A函数{ A函数;
#include "iostream.h"
int maxi(int a,int b) { return a>b?a:b;}
C++学习课件PPT5 函数和编译预处理
#include “iostream.h” int i=100;
全局变量i
void main(void)
局部变量i
{ int i=50,j=20; int max(int i,int j);
局部变量i
cout<<max(i,j)<<‘\t’;
cout<<max(::i,j); }
引用全局变量
int max(int i,int j)
14:07
5.2 例
#include "iostream.h"
int maxi(int a,int b) 注意这里的
{ return a>b?a:b;} 实参表达式
void main()
计算顺序
{
int a,b;
a=20; b=40;
cout<< maxi(b+a,b=b+1); 问题:maxi函数输出值?
14:07
动态变量与静态变量例
例 #include “iostream.h”
int t(void) {static int i=100;
i+=5; return i; } void main(void) {cout<<“i=“<<t()<<‘\t’; cout<<“i=“<<t()<<‘\t’; }
14:07
河内塔问题:
第一步已完成: A(n-1)B(借助C)
A柱
B柱
C柱
第二步:将A柱剩下的一个最大的盘子移到C 柱
AC
14:07
原状态: A柱
河内塔问题:
函数与编译预处理实验报告
函数与编译预处理实验报告一、实验目的本次实验旨在通过编写程序,掌握函数与编译预处理的相关知识,了解函数的调用和返回机制以及编译预处理的作用。
二、实验环境操作系统:Windows 10开发工具:Code::Blocks 17.12编程语言:C语言三、实验内容1. 函数的定义和调用函数是C语言中的一个重要概念,它可以将一段代码封装成一个功能单元,方便代码重用和维护。
在本次实验中,我们需要掌握如何定义函数,并且了解函数的调用过程。
在C语言中,函数通常由以下几部分组成:返回类型函数名(参数列表){函数体;return 返回值;}其中,返回类型指定了函数返回值的类型;函数名是唯一标识符,用于调用该函数;参数列表指定了该函数需要传入的参数;函数体是一段具体的代码逻辑;return语句则将结果返回给调用者。
在调用一个函数时,我们需要按照以下格式进行:返回值变量 = 函数名(参数列表);其中,返回值变量接收该函数返回的结果;参数列表则按照定义顺序传入相应参数。
如果该函数不需要传入任何参数,则可以省略参数列表。
2. 函数指针除了直接调用一个已经定义好的函数外,我们还可以使用函数指针来间接调用一个函数。
函数指针和普通指针类似,它指向的是一个函数的地址。
通过函数指针,我们可以在运行时动态地确定需要调用哪个函数。
在C语言中,声明一个函数指针的方法如下:返回类型 (*指针变量名)(参数列表);其中,括号中的*表示这是一个指针变量;指针变量名则是该变量的标识符;参数列表和返回类型与被指向的函数相同。
通过以下代码可以将一个已经定义好的函数赋值给一个函数指针:int max(int a, int b){return a > b ? a : b;}int (*p)(int, int) = max;在上述代码中,p就是一个用于存储max函数地址的函数指针。
3. 编译预处理编译预处理是C语言中一项重要的功能,在编译过程中会对源代码进行一些预处理操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
swap(x,y); printf("(4)in main :x=%d,y=%d\n",x,y); } void swap (int m,int n) { int temp; printf("(2)in main :m=%d,n=%d\n",m,n); temp=m;m=n;n=temp; printf("(3)in main :m=%d,n=%d\n",m,n); }
运行结果: (需要截图) 运行结果分析:练习形参是数组的函数申明、调用格式;复习数组的输入方法 5、任务名称: 程序 c60105.c 的功能是从键盘上输入的若干个数按升序排序。请调试检查该
程序中的错误,程序如下:
源代码:#include <stdio.h> void main( ) { int i , k; void sort(int x[],int n); float s[100], j ; printf(" Input number : \n"); for (i=0; scanf("%f",&j); i++) s[i]=j; sort(s, i); for (k=0; k<i; k++) printf( "%f", s[k]); printf("\n"); } void sort( int x[], int n ) { int i, j, temp,min; for ( i=0; i<n-1; i++)
运行结果: (需要截图) 运行结果分析:求余 8、任务名称: 预习 c60201.c 程序,写出预习结果,上机验证并写出分析 源代码:# define LOW 10 # define HIGH 5 # define CHANGE 2 int i = LOW ; #include <stdio.h> void main( ) { int workover ( int i ) , reset ( int int i = HIGH ; reset ( i / 2) ; printf(" i = %d \n ", i ); reset ( i = i / 2) ;
二、实验内容 1、任务名称: 阅读 c60101.c 程序,通过调试该程序,熟悉函数的调用方法及单步跟踪键 F7
和 F8 的不同。
源代码:#include <stdio.h>
void main() { void fun(int i, int j, int k); int x,y,z; x=y=z=6; fun(x,y,z); printf("%x=%d;y=%d;z=%d\n",x,y,z); } void fun(int i, int j, int k) { int t; t=(i+j+k)*2; printf("t=%d\n",t); }
实验五
函数与编译预处理
姓名: 指导教师:
实验课程名:高级语言程序设计(C) 专业班级: 学号: 实验时间: 实验地点:
一、实验目的和要求
1. 2. 3. 4. 掌握定义函数的方法。 掌握函数实参与形参的对应关系以及“值传递”的方法。 掌握函数的嵌套调用和递归调用的方法。 掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法。
i );
printf(" i = %d \n ", i ); reset ( i / 2) ; printf(" i = %d \n ", i ); workover ( i ); printf(" i = %d \n ", i ); } int workover ( int i ) { i = ( i % i ) * (( i * i ) / ( 2 * i ) + 4) ; printf(" i = %d \n ", i ); return ( i ); } int reset ( int i ) { i = i <= CHANGE ? HIGH : LOW ; return ( i ); }
(1) 每个学生的平均分。 (2) 每门课的平均分。 (3) 按学生平均分降序排列输出学生信息。
(4) 统计不及格学生,输出其相应信息。 (5)
源代码:#include <stdio.h> #define N 10 #define M 4 void main() { int score[N][M]; char choice='1'; void input(int score[N][M],int,int); void aver_stu(int score[N][M],int,int); void aver_cour(int score[N][M],int,int); void orde_aver(int score[N][M],int,int); void failed(int score[N][M],int,int); input(score,N,M); /*显示主菜单*/ while(choice!='0') { printf(" ==========the Score Processing System ====================\n"); printf("1.print each student's average\n"); printf("2.print each course's average\n"); printf("3.Order the students by student's average decreasingly \n"); printf("4.print the failed student \n"); printf("0.Exit the system \n"); printf("===============================================\n"); printf("Please choise (0-4): \n"); choice=getchar(); switch(choice) {case '1': aver_stu(score,N,M); break; case '2': aver_cour(score,N,M); break; case '3': orde_aver(score,N,M); break; case '4': failed(score,N,M); break; case '0': exit(0); default: printf("Choice Error,Please select again(0-4)."); } } }
需
要
截
图
)
运行结果分析:素数函数 4、任务名称: 程序 c60104.c 的功能是从键盘上输入的若干个数并求出最大值。请填空完成
该程序。
源代码:#include <stdio.h>
void main( ) { int i; int s[10], max; int Findmax( int x[], int n ); printf("Input 10 number : \n"); for(i=0;i<10;i++) scanf("%d",&s[i]); max=Findmax(s,10); for (i=0;i<10; i++) printf("%4d", s[i]); printf("\nthe max is %d\n ",max); } int Findmax( int x[ ], int n ) { int max,i; max=x[0]; for ( i=1; i<n; i++) if(max<x[i]) max=x[i]; return max; }
运行结果: (需要截图) 运行结果分析:全局变量:在所函数外面定义的变量,其有效范围到整个源程序结尾; 局部变量:在函数内部定义的变量或在函数头部定义的形参 9、任务名称: 上机调试 c60202.c 程序,观察静态局部变量在调用过程中的变化 源代码:#include <stdio.h> void main( ) { int i; int f(int); for ( i = 1; i <= 5; i ++) printf( "(%d):% d\n", i,f(i)); printf(" \n"); } int f ( int n) { static int j = 1; j = j * n; return( j ); }
运行结果: (需要截图) 运行结果分析:结果符合 11、任务名称: 分析程序 c60104.c 的运行结果,上机验证。 源代码:#define POWER(x) ((x)*(x)) #define MAX(x,y) (x)>(y)?(x):(y) #define PR printf #include <stdio.h> void main() { int a,b,c,d,x; a=5;b=10;x=200; c=POWER(a+b); x=x/POWER(a+b); d=MAX(a+6,b); PR( " c=%d,d=%d,x=%d \n", c,d,x); } 运行结果: (需要截图) 运行结果分析:比较 12、任务名称: .编写:输入 10 个学生的 3 门课的成绩,分别用函数求: