实验六 函数与编译预处理

合集下载

函数与编译预处理

函数与编译预处理

函数与编译预处理一、函数的定义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、形参是变量,但函数被调用时才被分配内存,调用完毕,所占内存将被释放。

实验6 函数与编译预处理(参考答案)

实验6 函数与编译预处理(参考答案)

实验六函数与编译预处理(参考答案)[实验任务一]:程序跟踪调试实例6-1:error6_1.c参考答案程序跟踪调试实例6-2:error6_2.c参考答案程序跟踪调试实例6-3:error6_3.c参考答案[实验任务二]:程序填空实例6-1:blank6_1.c参考答案程序填空实例6-2:print1.c参考答案程序填空实例6-3:reverse.c参考答案[实验任务三]:编程实例6-1:primefun.c参考答案(第一种方法)编程实例6-1:primefun.c参考答案(第二种方法)编程实例6-1:primefun.c参考答案(第三种方法)编程实例6-2:printnum.c参考答案编程实例6-3:printa.c参考答案编程实例6-4:power.c参考答案(第一种方法)编程实例6-4:power.c参考答案(第二种方法)编程实例6-5:Taile.c参考答案编程实例6-6:value.c参考答案编程实例6-7:LeRangDe.c参考答案编程实例6-8:multifac.c参考答案[实验任务四]:程序1参考答案:#include <stdio.h>/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0 */int Add(int a, int b){int answer;printf("%d+%d=", a, b);scanf("%d", &answer);if (a+b == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。

函数参数:整型变量flag,标志结果正确与否函数返回值:无*/void Print(int flag){if (flag)printf("Right!\n");elseprintf("Not correct!\n");}main() /*主函数*/{int a, b, answer;printf("Input a,b:");scanf("%d,%d", &a, &b);answer = Add(a, b);Print(answer);}程序两次测试的运行结果分别如下:①Input a,b:1,2↙1+2=3↙Right!②Input a,b:1,2↙1+2=4↙Not correct!程序2参考答案:#include <stdio.h>/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0*/int Add(int a, int b){int answer;printf("%d+%d=", a, b);scanf("%d", &answer);if (a+b == answer)return 1;elsereturn 0;}/* 函数功能:打印结果正确与否的信息。

C语言 函数与编译预处理

C语言 函数与编译预处理
return z; }
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; }

函数与编译预处理实验报告

函数与编译预处理实验报告

函数与编译预处理实验报告一、实验目的本次实验旨在通过编写程序,掌握函数与编译预处理的相关知识,了解函数的调用和返回机制以及编译预处理的作用。

二、实验环境操作系统: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语言中一项重要的功能,在编译过程中会对源代码进行一些预处理操作。

C语言程序设计实验报告——实验六

C语言程序设计实验报告——实验六
实验心得
c=add(a,b);
printf("sum is %f\n",c);
}
float add(float x,float y)
{
float z;
z=x+y;
return(z);
}
2.调试运行以下程序,分析调用函数前后程序中变量a和b的值是否发生改变?为什么?
void main( )
{
int a=3,b=6;
/*04*/ {
/*05*/ int a=14, b=15, temp;
/*06*/ temp=a/b;
/*07*/ #ifdef DEBUG
/*08*/ printf("a=%d, b=%d \n", a, b);
/*09*/ #endif
/*10*/ printf("temp =%d \n", temp);
#include <stdio.h>
#define NL printf("\n")
#define PRINT(F,V) printf("V=%F\t",V)
#define PRINT1(F,X1) PRINT(F,X1);NL
#define PRINT2(F,X1,X2) PRINT(F,X1);PRINT(F,X2);NL
main( )
{
int a,b,c,d;
float e,f,g,h;
long i,j;
char n,m;
a=1;b=2;c=3;d=4;e=1.5;f=2.5;g=3.5;h=4.5;
i=10;j=100;n='x';m='y';

c语言 第六章 函数与编译预处理2

c语言 第六章 函数与编译预处理2

#elif和#else可以 #elif和#else可以 没有
如果条件1为真就编译程序段1 如果条件1为真就编译程序段1, 否则如果条件2 否则如果条件2为真就编译程序段 2,…,如果各条件都不为真就编译 #endif必须存在 #endif必须存在,它 必须存在, 程序段n 程序段n。 #if命令的结尾 是#if命令的结尾 #if和#elif常常与 #if和#elif常常与defined命令配合 常常与defined命令配合 使用,defined命令的格式为 命令的格式为: 使用,defined命令的格式为:
预编 译处 理后
a = 3.14; * 2 * 2;
错误! 错误!
宏可以被重复定义 宏可以被重复定义。 重复定义。 #define N 10 /*第一次宏定义 第一次宏定义*/ 第一次宏定义 fun( ) 输出结果: 输出结果: { 2010 printf(“%d”,N ); /* 输出 */ 输出10 } #define N 20 /*第二次宏定义 第二次宏定义*/ 第二次宏定义 void main ( ) { printf ("%d", N ); /* 输出 */ 输出20 fun( ); }
例:下面的程序利用ACTIVE_COUNTRY定义货币的名称 下面的程序利用ACTIVE_COUNTRY定义货币的名称
#define #define #define #define USA 0 ENGLAND 1 FRANCE 2 ACTIVE_COUNTRY USA
#if ACTIVE_COUNTRY == USA char *currency = “dollar”; //有效 //有效 #elif ACTIVE_COUNTRY == ENGLAND char *currency = "pound" ; #else char *currency = "france" ; char *currency = “dollar”; #endif

实验6 函数与编译预处理

实验6 函数与编译预处理

实验六函数与编译预处理(4学时)实验前必须做的操作...............——..新建文件夹:1、先在对应的K:盘上建立一个父文件夹(用来存放本人整个学期的作业),格式为:“专业+班级+学号+姓名”,如:工业1091班、学号为05的匡珍春同学,其父文件夹名称为:工业109105匡珍春,然后在此父文件夹下建立子文件夹,名称为:实验6(用来存放实验6需要上交的文件)。

2、在E:盘上建立一个以本人姓名为名称的文件夹(本次实验的工作文件夹),例如:E:\匡珍春【实验目的】1、掌握自定义函数的一般结构及定义函数的方法;2、掌握函数的形式参数、实际参数、函数返回值等重要概念;3、掌握函数实参与形参间的“值传递”方式;4、掌握函数声明、函数调用的一般方法;5、掌握模块化程序设计思想,会采用C语言中函数进行模块化程序设计;6、掌握全局变量和局部变量作用域以及全局变量和局部变量的使用方法;7、掌握函数的嵌套调用的程序的执行过程,会使用嵌套调用设计程序;8、掌握使用函数递归调用的程序的执行过程,会使用递归程序解决实际问题;9、理解宏的概念,掌握宏定义。

了解文件包含的概念,掌握其用法;10、学习对多文件程序的编译和运行;11、熟练掌握VC程序调试方法,包括断点的设置和取消,以及单步执行跟踪进入函数和跳出函数的方法。

【实验内容】[实验任务一]:断点的设置和取消、单步执行跟踪进入函数和跳出函数方法练习程序跟踪调试实例6-1:调试示例(请仔细按以下各步骤进行操作):从键盘输入一个正整数n,计算n! 的值,要求定义和调用函数fact(n),计算n!。

Input n: 1010! = 3628800说明:实验五中我们使用了程序运行到光标位置调试程序,本次实验需要掌握设置断点,以及单步调试进入函数和跳出函数的方法。

【操作步骤】:(1)输入源程序,并以error6_1.c文件名最终保存在实验6文件夹里,编译程序,出现警告信息:双击该警告信息,箭头指向“f=fact(n);”这一行,警告信息指出函数“fact”没有定义,而函数“fact”实际上已经定义了,这是为什么呢?因为函数在调用之前,必须先声明。

实验六 函数与编译预处理

实验六  函数与编译预处理

实验六函数与编译预处理1.void main(){float a,b,c;scanf("%f%f",&a,&b);c=add(a,b);printf("sum is %f\n",c);}float add(float x,float y){float z;z=x+y;return(z);}//错误的地方,(1)没有包含头文件<stdio.h> (2)函数定义应该在函数调用的前面. 更正后的程序:#include<stdio.h>float add(float x,float y){float z;z=x+y;return(z);}void main(){float a,b,c;scanf("%f%f",&a,&b);c=add(a,b);printf("sum is %f\n",c);}2.void main(){int a=3,b=6;printf("a=%d,b=%d\n",a,b);exchange1(a,b);printf(:a=%d,b=%d\n",a,b);}void exchange1(int x,int y){int t;t=x;x=y;y=t;printf("x=%d,y=%d\n",x,y);}//错误的地方,(1)没有包含头文件<stdio.h> (2)函数定义应该在函数调用的前面.更正后的程序:#include<stdio.h>void exchange1(int x,int y){int t;t=x;x=y;y=t;printf("x=%d,y=%d\n",x,y);}void main(){int a=3,b=6;printf("a=%d,b=%d\n",a,b);exchange1(a,b);printf("a=%d,b=%d\n",a,b);}3.long int fac(int n){long int p;int i;p=1;for(i=1;i<=n;i++)p=p*i;return(p);}int cmn(int m,int n){int x;x=fac(m)/(fac(n)*fac(m-n));return(x);}void main(){int m,n,c;scanf("%d%d",&m,&n);c=cmn(m,n);printf("c=%d\n",c);}//应该加个#include<stdio.h> 头文件4.int a=7,b=9;void main(){int i,a=5,x=80,y=60;for(i=1;i<4;i++){printf("a=%d,b=5d,max=%d\n",a,b,max(a,b));b+=6;}printf("result_sum=%d\n",sum(x,y));}int sum(int x,int y){extern int m,n;int temp;temp=x+y+m+n+a+b;return(temp);}int m=12,n=25;int max(int 1,int b){return(a>b?a:b);}程序更正:#include<stdio.h>int a=7,b=9;void main(){int i,a=5,x=80,y=60;int max(int a,int b);int sum(int x,int y);for(i=1;i<4;i++){printf("a=%d,b=5d,max=%d\n",a,b,max(a,b));b+=6;}printf("result_sum=%d\n",sum(x,y));}int sum(int x,int y){extern int m,n;int temp;temp=x+y+m+n+a+b;return(temp);}int m=12,n=25;int max(int a,int b){return(a>b?a:b);}5.调试运行以下程序.#include<stdio.h>int fun(int a){int b=0;static int c=2;b+=c;c+=1;return(a+b-c);}void main(){int a=3,i;for(i=0;i<3;i++) printf("%4d",fun(a));}6.略7.略8.#include<stdio.h>#define DEBUGvoid main(){int a=14,b=15,temp;temp=a/b;#ifdef DEBUGprintf("a=%d,b=%d",a,b);#endifprintf("temp=%d\n",temp);}程序结果为:a=14,b=15,temp=0(1)第二行中,宏定义是可以没有具体的值的,在这里只是定义了一个宏名.DEBUG没有值.(2)第7~9行为:#ifdef DEBUGprintf("a=%d,b=%d",a,b);#endif会被编译,因为种种原因DEBUG已经被定义过.(3)如将第2行删除,程序运行结果为:temp=0 因为没有定义DEBUG,所以原来第7~9行的程序没有执行.(4)第9行不能删除,因为#ifdef 和#endif必须成对出现.9.编程题#include<stdio.h>long int fac(int n){long int p;int i;p=1;for(i=1;i<=n;i++)p=p*i;return(p);}void main(){int m,n,c;scanf("%d%d",&m,&n);c=fac(n)/(fac(n-m)*fac(m));printf("c=%d",c);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六函数与编译预处理
实验六函数与编译预处理
1.
void main()
{
float a,b,c;
scanf("%f%f",&a,&b);
c=add(a,b);
printf("sum is %f\n",c);
}
float add(float x,float y)
{
float z;
z=x+y;
return(z);
}
//错误的地方,(1)没有包含头文件<stdio.h> (2)函数定义应该在函数调用的前面. 更正后的程序:
#include<stdio.h>
float add(float x,float y)
{
float z;
z=x+y;
return(z);
}
void main()
{
float a,b,c;
scanf("%f%f",&a,&b);
c=add(a,b);
printf("sum is %f\n",c);
}
2.
void main()
{
int a=3,b=6;
printf("a=%d,b=%d\n",a,b);
exchange1(a,b);
printf(:a=%d,b=%d\n",a,b);
}
void exchange1(int x,int y)
{
int t;
t=x;x=y;y=t;
printf("x=%d,y=%d\n",x,y);
}
//错误的地方,(1)没有包含头文件<stdio.h> (2)函数定义应该在函数调用的前面.
更正后的程序:
#include<stdio.h>
void exchange1(int x,int y)
{
int t;
t=x;x=y;y=t;
printf("x=%d,y=%d\n",x,y);
}
void main()
{
int a=3,b=6;
printf("a=%d,b=%d\n",a,b);
exchange1(a,b);
printf("a=%d,b=%d\n",a,b);
}
3.
long int fac(int n)
{
long int p;
int i;
p=1;
for(i=1;i<=n;i++)
p=p*i;
return(p);
}
int cmn(int m,int n)
{
int x;
x=fac(m)/(fac(n)*fac(m-n)); return(x);
}
void main()
{
int m,n,c;
scanf("%d%d",&m,&n); c=cmn(m,n);
printf("c=%d\n",c);
}
//应该加个#include<stdio.h> 头文件
4.
int a=7,b=9;
void main()
{
int i,a=5,x=80,y=60;
for(i=1;i<4;i++)
{
printf("a=%d,b=5d,max=%d\n",a,b,max(a,b));
b+=6;
}
printf("result_sum=%d\n",sum(x,y));
}
int sum(int x,int y)
{
extern int m,n;
int temp;
temp=x+y+m+n+a+b;
return(temp);
}
int m=12,n=25;
int max(int 1,int b)
{
return(a>b?a:b);
}
程序更正:
#include<stdio.h>
int a=7,b=9;
void main()
{
int i,a=5,x=80,y=60;
int max(int a,int b);
int sum(int x,int y);
for(i=1;i<4;i++)
{
printf("a=%d,b=5d,max=%d\n",a,b,max(a,b));
b+=6;
}
printf("result_sum=%d\n",sum(x,y));
}
int sum(int x,int y)
{
extern int m,n;
int temp;
temp=x+y+m+n+a+b;
return(temp);
}
int m=12,n=25;
int max(int a,int b)
{
return(a>b?a:b);
}
5.调试运行以下程序.
#include<stdio.h>
int fun(int a)
{
int b=0;
static int c=2;
b+=c;
c+=1;
return(a+b-c);
}
void main()
{
int a=3,i;
for(i=0;i<3;i++) printf("%4d",fun(a));
}
6.略
7.略
8.
#include<stdio.h>
#define DEBUG
void main()
{
int a=14,b=15,temp;
temp=a/b;
#ifdef DEBUG
printf("a=%d,b=%d",a,b);
#endif
printf("temp=%d\n",temp);
}
程序结果为:a=14,b=15,temp=0
(1)第二行中,宏定义是可以没有具体的值的,在这里只是定义了一个宏名.DEBUG没有值.
(2)第7~9行为:
#ifdef DEBUG
printf("a=%d,b=%d",a,b);
#endif
会被编译,因为种种原因DEBUG已经被定义过.
(3)如将第2行删除,程序运行结果为:temp=0 因为没有定义DEBUG,所以原来第7~9行的程序没有执行.
(4)第9行不能删除,因为#ifdef 和#endif必须成对出现.
9.编程题
#include<stdio.h>
long int fac(int n)
{
long int p;
int i;
p=1;
for(i=1;i<=n;i++)
p=p*i;
return(p);
}
void main()
{
int m,n,c;
scanf("%d%d",&m,&n);
c=fac(n)/(fac(n-m)*fac(m));
printf("c=%d",c); }。

相关文档
最新文档