实验五 函数与编译预处理(题目)
函数与编译预处理

函数与编译预处理一、函数的定义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语言程序设计》实验报告实验五函数与编译预处理学号姓名一、实验目的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 分析本次实验出现的主要错误最直接原因。
学习情境五函数与编译预处理习题

学习情境五函数与编译预处理习题一、选择题1.以下正确的函数定义是()。
A.double fun(int x, int y) B.double fun(int x,y) { z=x+y; return z ; } { int z; return z;} C.fun (x,y) D.double fun (int x, int y) { int x, y; double z ; { double z ;z=x+y; return z;} return z;}2.若调用一个函数,且此函数中没有return语句,则正确的说法是()。
A.该函数没有返回值B.该函数返回若干个系统默认值C.能返回一个用户所希望的函数值D.返回一个不确定的值3.以下不正确的说法是()。
A.实参可以是常量,变量或表达式B.形参可以是常量,变量或表达式C.实参可以为任意类型D.如果形参和实参的类型不一致,则以形参类型为准4.C语言规定,简单变量做实参时,它和对应的形参之间的数据传递方式是()。
A.地址传递B.值传递C.有实参传给形参,再由形参传给实参D.由用户指定传递方式5.C语言规定,函数返回值的类型是决定于()。
A.return语句中的表达式类型B.调用该函数时的主调函数类型C.调用该函数时由系统临时D.在定义函数时所指定的函数类型6.若用数组名作为函数调用的实参,传递给形参的是()。
A.数组的首地址B.数组中第一个元素的值C.数组中的全部元素的值D.数组元素的个数7.如果在一个函数中的复合语句中定义了一个变量,则该变量()。
A.只在该复合语句中有定义B.在该函数中有定义C.在本程序范围内有定义D.为非法变量8.下面程序的输出是()。
int i=2;printf("%d%d%d",i*=2,++i,i++);A.8,4,2 B.8,4,3 C.4,4,5 D.4,5,6 9.已知一个函数的定义如下:double fun(int x, double y){ }则该函数正确的函数原型声明为()。
函数和编译预处理

函数和编译预处理(第五章)一、单项选择题1.关于函数,以下正确的描述是( B)A. 函数的定义可以嵌套,但函数的调用不可以嵌套B. 函数的定义不可以嵌套,但函数的调用可以嵌套C. 函数的定义可以嵌套,函数的调用也可以嵌套D. 函数的定义和函数的调用都不可以嵌套2.关键字inline用于定义内联函数,定义时,是将该关键字( D )A. 取代定义函数的类型标识符B. 取代被定义的函数名C. 加在类型标识符之后D. 加在类型标识符之前3.以下不正确的描述为( B )A. 在函数之外定义的变量称为外部变量,外部变量是全局变量。
B. 在函数之内说明的外部变量是局部变量,仅在本函数中有效。
C. 在函数之外说明的静态变量也是全局变量,其作用域是文件作用域。
D. 文件作用的域范围是一个程序文件,但必须符合“定义在前,使用在后”的规则。
4.以下正确的描述为( C )A. 每个C++程序必须在开头用预处理命令#include <iostream.h>B. 预处理命令必须位于C++源程序的首部C. 在C++中,预处理命令都以#开头D. C++语言的预处理命令只能实现宏定义和条件编译的功能5.在下面的函数原型说明中,存在着语法错误的是( D )A.void BC(int a,int);B.void BD(int , int);C.void BE(int , int=5);D.int BF(int x ; int y);6.下列哪个不是重载函数在调用时选择的依据( C )A. 形参类型B. 形参个数C. 函数返回值类型D. 函数名7.在一个源程序文件中有以下函数定义,其中( D )是重载函数。
A.ABC B. BCDC. ACDD. 全部A) int sum(float x,int y) B) float sum(float x,int y,char z){...} {...}C) float sum(float x,float y) D) int sum(int x,int y,char z){...}{...}8.有一个函数原型abc(float x,float y);该函数的返回值类型为( C )A. voidB. doubleC. intD. float9.在程序中,函数声明语句正确位置是( D )A. 随便任何位置B. 不包含在另一函数中的任何位置。
实训五 函数程序设计和答案

实训五函数程序设计(附:答案在后面)班级:姓名:学号:一、实训目标熟练掌握函数的定义、调用和调试方法。
1、学会函数的接口设计,能够快速构建函数框架。
2、掌握函数的定义和调用方法。
3、掌握函数的调试方法(step into)。
4、理解函数的形参、实参、返回值的概念。
二、语法基础1、函数是一个完成特定工作的独立程序模块,包括和两种。
2、对于用户自定义函数,用户需要完成函数的定义、函数的声明及函数的调用三部分内容;而对于库函数用户只需要完成及头文件的包括。
3、以下说法中正确的是。
A)C语言程序总是从第一个定义的函数开始执行B)在C语言程序中,要调用的函数必须在main( )函数中定义C)C语言程序总是从main( )函数开始执行D)C语言程序中的main( )函数必须放在程序的开始部分4、程序填空。
下列两个函数模块,请完成函数体部分内容。
1) 函数功能:求两个数的较大值。
/*函数功能:求两个数的最大值函数入口参数:双精度浮点型 x 表被比较的第一个数双精度浮点型 y 表被比较的第二个数函数返回值:较大的数 (类型为double)*/double max(double x, double y){2) 函数功能:输入一个整数n 的值,从屏幕显示n 个星号(‘*’)。
5、函数调用时的实参和函数定义时的形参可以是相同的变量名吗? ;如果两者变量名完全相同,那么它们代表的同一内存空间吗? ;写出下面程序的输出结果。
/*函数功能:输入一个数n ,输出n 个星号函数入口参数:整型 n 表星号的个数 函数返回值:无 */void printstar(int n) { }#include <stdio.h> int main(void) { int a,b;int even(int a); /*函数声明*/ printf(“input 1 integers : \n”); scanf(“%d”,&a );b=even(a); /*函数调用*/ printf(“2: a=%d,b=%d\n ”,a,b); return 0; }int even(int a) {a=a+1;printf(“1: a=%d\n ”,a); if(a%2==0)return 1; /*偶数返回1*/ elsereturn 0; /*奇数返回0*/ } 预期输出结果:实际运行结果:思考:在调用even 函数时main 函数中的a 变量作为实参,将其值传递给even 函数的形参a ;而在even 函数执行完后返回到main 函数时,形参a 的值会传递给实参a 吗?三、实训内容和步骤1、改错(教育在线上需改错的程序文件夹中error05_1.cpp ),程序功能为:输入一个正整数n ,计算n!,要求定义和调用函数实现。
5--函数和编译预处理

一、选择题1、函数调用语句int fun( ) { return 50,60; },则函数调用后返回值为()。
A、50B、60C、50,60D、编译错2、设有函数定义调用语句“f((e1,e2),(e3,e4,e5));”,则实参个数是()。
A、2B、3C、4D、53、若用下列程序f(char a){ float b=5;b+=a/b;return b;}则函数返回值的类型是()。
A、intB、charC、voidD、float4、若定义函数int f(int x) { x++; return x; }执行以下语句:int a=5; f(a)+f(a);则a的值是()。
A、5B、6C、7D、85、下列程序的运行结果是()。
fun1(int a, int b){ return fun2(a++, --b); }fun2(int a, int b){ return a/b; }void main( ){ int x=5, y=6;cout<<fun1(x,y);}A、1B、1.6C、2D、语法错6、以下程序执行后输出结果是()。
int f(int x,int y){ return (y-x)*x; }void main( ){ int a=3, b=4, c=5, d;d=f(f(a,b),f(a,c));cout<<d;}A、3B、8C、9D、67、设有宏定义和语句#define P(x, y) x/y#define PP(a,b) a*bint c=P(2+3, 2+3)+PP(2+3, 2+3);则变量C的值是()。
A、26B、17C、17.5D、318、若有定义int k=3,以k+1作为参数,对下列宏定义进行宏展开,则最终结果不为7的是()。
A、#define s(x) x*xB、#define s1(x) (x)*(x)C、#define s2(x) (x*x)D、#define s4(x) (x*(x))9、下列编译预处理指令没有语法错误的是()。
函数与编译预处理实验报告

函数与编译预处理实验报告一、实验目的本次实验旨在通过编写程序,掌握函数与编译预处理的相关知识,了解函数的调用和返回机制以及编译预处理的作用。
二、实验环境操作系统: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)。
max=x[i];
return max;
}
相关知识:练习形参是数组的函数申明、调用格式;复习数组的输入方法。
5.程序c60105.c的功能是从键盘上输入的若干个数按升序排序。请调试检查该程序中的错误,程序如下:
#include <stdioபைடு நூலகம்h>
void main( )
{int i , k;
printf("(1)in main :x=%d,y=%d\n",x,y);
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);
int i = HIGH ;
reset ( i / 2) ;
printf(" i = %d \n ", i );
reset ( i = i / 2) ;
printf(" i = %d \n ", i );
reset ( i / 2) ;
printf(" i = %d \n ", i );
workover ( i );
#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)
{ n++ ; printf ("%d\n",n); }
printf("\n");
}
11.分析程序c60104.c的运行结果,上机验证。
#define POWER(x) ((x)*(x))
#define MAX(x,y) (x)>(y)?(x):(y)
#define PR printf
#include <stdio.h>
scanf("%d",&m);
printf( "\nPlease input a number in (2,8,16):");
scanf("%d",&k);
dtoo(m,k);
}
void dtoo( int n ,int r )
{ if(n>=r) dtoo(n/r,r);
printf("%d",n%r);
注意:for (i = 0; scanf("%f",&j); i++)这一行中for语句第二个表达式的使用形式,此处用了scanf()函数的出错来结束输出循环。请读者查一下教材后面的附录,看看什么时候scanf()函数返回0,此时就可以结束循环。
6.编写程序,实现由主函数输入m、n,按下述公式计算并输出 的值。
; /*调用求素数函数*/
}
void prime(int n)
{ int i,k;
k=sqrt(n);
for(i=2;i<=k;i++)
if (n%i==0) break;
if(i>=k+1)
printf("This is a prime number");
else printf("This isn’t a prime number");
temp=m;m=n;n=temp;
printf("(3)in main :m=%d,n=%d\n",m,n);
}
把用户自定义函数swap()中的形式参数m和n对应改成x和y,使其与实参变量同名,再用F7跟踪程序的运行,看看有什么变化。
相关知识:形参具有“用之则建,用完则撤”的特点。在函数定义时,函数名后面圆括号内的参数称为形参;在函数调用时,函数名后面圆括号内的参数称为实参。对于实参,在调用函数中对其进行定义时,不仅指明它的类型,而且系统还为其分配存储单元。而对于形参,定义时仅仅只是指明它的类型,并不在内存中为它们分配存储单元,只是在调用时才为其分配临时存储单元,函数执行结束,返回调用函数时,该存储单元立即撤销。
{ int i, j, temp,min;
for ( i=0; i<n-1; i++)
{ min=i;
for(j=i+1;j<n;j++)
if ( x[j] < x[min])
min=j;
if(min!=i)
{ temp=x[i];
x[i]=x[min];
x[min]=temp;
}
}
}
错误提示:形参和实参的数据类型不一致;一般形参数组在说明时不指定数组的长度,而仅给出类型、数组名和一对方括号;用户自定义函数sort()没有申明过。
(2)每门课的平均分。
(3)按学生平均分降序排列输出学生信息。
(4)统计不及格学生,输出其相应信息。
(5)编写一菜单主函数,菜单内容包括以上4部分。
分析:本题要求完成的操作有录入数据、求平均分、排序、统计。这些操作分别用函数来实现。先分析表示这些数据的数据结构,可用如下结构来表示学生的成绩:
课程1
课程2
实验五
一、实验目的及要求
1.掌握函数定义的方法;
2.掌握函数实参与形参的对应关系以及“值传递”的方式;
3.掌握函数的嵌调用和递归调用的方法;
4.掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
5.学习对多文件程序的编译和运行。
二、实验学时
4学时
三、实验任务
1.阅读c60101.c程序,通过调试该程序,熟悉函数的调用方法及单步跟踪键F7和F8的不同。
}
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 i );
;
/*调用Findmax函数*/
;
for (i=0;i<10; i++)
printf("%4d", s[i]);
printf("\nthe max is %d ",max);
}
int Findmax( int x[ ], int n )
{ int max,i;
max=x[0];
for ( i=1; i<n; i++)
{ i = i <= CHANGE ? HIGH : LOW ;
return ( i );
}
相关知识:“变量用之不尽,一写就走”。在main()主函数中reset(i/2)和reset(i=i/2)不同,第一个reset的i没有被赋值到,所以该函数调用结束后还保持原来的值;而第二个reset的i被赋值了,所以函数调用结束后以前的值就没有。全局变量:在所函数外面定义的变量,其有效范围到整个源程序结尾;局部变量:在函数内部定义的变量或在函数头部定义的形参,其有效范围只在所定义的函数,局部变量具有“用之则建,用完则撤”的特点。在不同函数内定义的变量同名互不干扰。如果一个源程序中的局部变量和全局变量同名,则局部变量优先。
10.预习程序c60203.c,分析在程序运行前宏NUM的值,并上机运行,比较一下的预习结果和实际结果。
#include "stdio.h"
#define N 2
#define M N+1
#define NUM (M+1)*M/2
main()
{ int i,n=0;
for (i=1; i<=NUM; i++)
提示:定义一个求阶层的函数,然后在主函数中调用三次即可求得。
7.阅读如下递归程序c60107.c,其功能是什么?上机调试。
#include <stdio.h>
void main( )
{int m, k;
void dtoo( int n ,int r );
printf("Pleae input the decimal number:");
3.程序c60103.c是实现求素数的,请填空完成该程序,并上机运行测试。
#include <math.h>
#include <stdio.h>
void main()
{ int m;
; /*申明求素数函数*/
printf("Please input a data m=:");
scanf("%d",&m);
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));