江苏网友来相约

江苏的网友,不如来这里相约吧,我是江苏省海门市人,这里也许能找到你知心朋友。

103 成员713 主题4,022 回复0 张照片

实验五

@
@南方
2001-02-19 08:17
实验五:函数和编译预处理


一.实验目的
1. 掌握定义函数的方法及函数实参与形参的对应关系,以及“值传递“的方法;
2. 掌握函数的嵌套调用和递归调用的方法;
3. 掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法;
4. 掌握宏定义的方法、文件包含处理方法以及条件编译的方法。

二.实验环境
CPU:P133; RAM:48M; OS:WINDOWS98; SOFTWARE:TURBO C2。0

三.实验过程

程序一
写一个判素数的函数,在主函数输入一个整数输出是否素数的信息。

程序如下:
main()
{
int number;
printf("\n请输入一个正整数:");
scanf("%d",&number);
if(prime(number))
printf("%d是素数",number);
else
printf("%d不是素数",number);
}

int prime(number)
int number;
{
int flag=1,n;
for(n=2;n<number/2&&flag==1;n++)
flag=0;
return(flag);
}

运行结果一:
请输入一个正整数:2↙
2是素数

运行结果二:
请输入一个正整数:10↙
10不是素数

程序第11行的末尾不能有分号,这一行是用来定义函数类型的。

程序二:
用一个函数来实现将一行字符患中最长的单词输出。此行字符患主函数传递给该函数
程序如下:
int all(c)
char c;
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(c);
else
return(0);
}

int longest(string)
char string[];
{
int len=0,i,length=0,flag=1,place,point;
for(i=0;i<=strlen(string);i++)
if(all(string[i]))
if(flag)
{
point=i;
flag=0;
}
else
len++;
else
{ flag=1;
if(len>length)
{ length=len;
place=point;
len=0;
}
}
return(place);
}

main()
{
int i;
char line[100];
printf("请输入一行文本\n");
gets(line);
printf("\n最长的单词是:");

for(i=longest(line);all(line[i]);i++)
printf("%c",line[i]);
printf("\n");
}

运行结果:
请输入一行文本
i am stud5ts↙

最长的单词是:stud


程序三:
用递归法将一个整数N转换成字符串输出。例如,输入483,应输出字符串“483“。N的位数不确定,可以是任意的整数。

程序如下:
#include<stdio.h>
void convert(n)
int n;
{
int i;
if((i=n/10)!=0)
convert(i);
putchar(n%10+'0');
}

main()
{ int number;
printf("\n输入一个整数:");
scanf("%d",&number);
printf("\n输出是:");
if(number<0)
{ putchar('-');
number=-number;
}
convert(number);
}

运行结果:
输入一个整数:-3430↙

输出是:-3430


程序四:
求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数。用另一个函数根据求出的最大公约数求最小公倍数。
(1) 用全局变量的方法。将两个整数的最大公约数.最小公倍数都设为全局变量。
(2) 不用全局变量,两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再与两个整数一起作实参传递给函数2,以求出最小公倍数,返回到主函数输出最大公约数和最小公倍数。
程序如下:
(1) 参数说明:
A:最大公约数;H:最小公倍数;hcflcd是求两个整数的最大公约数和最小公倍数的函数。
int A,H;
hcflcd(u,v)
int u,v;
{int b,t,r;
if(u>v)
{t=u;u=v;v=t;}
A=u;b=v;
while((r=b%A)!=0)
{b=A;A=r;}
H=u*v/A;
return(A);
}

main()
{int u,v;
printf("input:");
scanf("%d,%d",&u,&v);
hcflcd(u,v);
printf("big is%d:\n",A);
printf("small is%d\n",H);
}

(2)参数说明:
hcf :求最大公约数的函数;H:最小公倍数; lcd:求最小公倍数的函数。
hcf (u,v)
int u,v;
{int a,b,t,r;
if(u>v)
{t=u;u=v;v=t;}
a=u;b=v;
while((r=b%a)!=0)
{b=a;a=r;}
return(a);
}

lcd(u,v,h)
int u,v,h;
{
return(u*v/h);
}

main()
{int u,v,h;
printf("请输入两个整数:");
scanf("%d,%d",&u,&v);
h=hcf(u,v);
printf("这两个整数的最大公约数是%d。\n",hcf(u,v));
printf("这两个整数的最小公倍数是%d。\n",lcd(u,v,h));
}

运行结果:
请输入两个整数:12,24↙
这两个整数的最大公约数是12。
这两个整数的最小公倍数是24。



程序五
写一函数,输入一个十六进制数,输出相应的十进制数。

程序如下:
#include<stdio.h>
#define MAX 1000
main()
{int c,i,flag,flag1;
char t[MAX];
i=0;
flag=0;
flag1=1;
printf("\n请输入十六进制数:");
while((c=getchar())!='\0'&&i<MAX&&flag1)
{ if(c>='0'&&c<='9'||c>='a'&&c<='f'||c>='A'&&c<='F')
{ flag=1;
t[i++]=c;
}
else if(flag)
{ t[i]='\0';
printf("十进制数是%d\n",htoi(t));
printf("继续吗?");
c=getchar();
if(c=='N'||c=='n')
flag1=0;
else
{ flag=0;
i=0;
printf("\n请输入十六进制数:");
}
}
}
}

htoi(s)
char s[];
{ int i,n;
n=0;
for(i=0;s[i]!='\0';i++)
{ if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}
return(n);
}

运行结果:
请输入十六进制数:20↙
十进制数是32
继续吗? y↙

请输入十六进制数:fF↙
十进制数是255
继续吗?Y↙

请输入十六进制数:a11↙
十进制数是2577
继续吗?n↙


程序六
定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个数作为使用宏的实参,输出已交换的两个值。
说明:在程序主函数使用宏时只能用两个实参,如SWAP(a,b),不能用三个实参。
程序如下:
#define SWAP(a,b)t=b;b=a;a=t
main()
{
int a,b,t;
printf("请输入两个整数a,b:");
scanf("%d,%d",&a,&b);
SWAP(a,b);
printf("交换结果为:a=%d,b=%d\n",a,b);
}

运行结果:
请输入两个整数a,b:100,99↙
交换结果为:a=99,b=100

程序七
设计输出实数格式,包括:(1)一行输出一个实数;(2)一行内输出二个实数;(3)一行内输出三个实数。实数用”%6.2f”格式输出.
用一个文件”print-format.h”包含以上用#define命令定义的格式。在自己的文件(自己命名)中用#include命令将”print-format.h”文件包含进来.在程序中用scanf函数读入三个实数给f1,f2,f3.然后用上面的三种格式分别输出(1) f1,;(2)f1,f2;(3)f1,f2,f3.

先编写头部文件:
#define PR printf
#define NL "\n"
#define Fs "%f"
#define F "%6.2f"
#define F1 F NL
#define F2 F "\t" F NL
#define F3 F"\t" F"\t" F NL
把它以print-fo.h文件名保存。.

主程序如下:
#include"print-fo.h"
main()
{
float a,b,c;
PR("请输入三整数:\n");
scanf(Fs,&a);
scanf(Fs,&b);
scanf(Fs,&c);
PR(NL);
PR("每行输出一个数:\n");
PR(F1,a);
PR(F1,b);
PR(F1,c);
PR(NL);
PR("每行输出二个数:\n");
PR(F2,a,b);
PR(F1,c);
PR(NL);
PR("每行输出三个数:\n");
PR(F3,a,b,c);
}

运行结果:
请输入三整数:
2.4↙
5.9↙
9.1↙

每行输出一个数:
2.40
5.90
9.10

每行输出二个数:
2.40 5.90
9.10

每行输出三个数:
2.40 5.90 9.10

在这里应注意两点:
1. 当把头部文件以print-format.h为名保存时,实际存在的文件是print-fo.h因为DOS只能支持最长八位的文件名。
2. 在#include命令中,文件名可以用双引号或尖括号括起来。用尖括号时,系统只到C库函数头文件所在目录查找;用双引号时头部文件可以存在C库函数头文件所在目录中,也可存在于用户当前目录。

程序八
用条件编译方法实现以下功能:
输入一行电报文字,可以任选两种输出,一为原文;一为将字母变成其下一字母(如’a’变成‘b’,… ‘z’ 变成 ‘a’。其它字符不变)。用#define命令来控制是否要译成密码。
例如:
#define CHARGE 1
则输出密码。若
#define CHARGE 0
则不译成密码,按原码输出。
用条件编译方法来处理。

程序如下:
#include"stdio.h"
#define MAX 80
#define CHANGE 1
main()
{
char str[MAX];
int i;
printf("\n请输入文本行:\n");
scanf("%s",str);
#if(CHANGE)
{
for(i=0;i<MAX;i++)
{
if(str[i]!='\0')
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')
str[i]+=1;
else if(str[i]=='z'||str[i]=='Z')
str[i]-=25;
}
}
#endif
printf("输出电码为:\n%s",str);
}

运行结果:

请输入文本行:
WEsdfweef24fc↙
输出电码为:
XFtegxffg24gd

将程序第三行改为#define CHANGE 0
结果为:
请输入文本行:
WEsdfweef24fc↙
输出电码为:
WEsdfweef24fc
1 / 1

登录后回复。