C语言上机报告4.docx
《C语言上机报告4.docx》由会员分享,可在线阅读,更多相关《C语言上机报告4.docx(14页珍藏版)》请在冰豆网上搜索。
C语言上机报告4
一、实验内容
1.函数的定义与说明
2.函数的调用
3.数组作为函数参数
i.局部变量
ii.全局变量
4.指针变量
5.指针与字符串
6.指针与函数
7.指针数组
二、实验目的
1.熟悉函数的定义形式
2.了解函数调用的一般形式及调用方式
3.了解数组作为函数参数
4.熟悉变量的作用域和变量的存储类别
5.理解指针的概念,熟悉指针变量的用法
6.了解字符串指针作函数参数
7.了解指向函数的指针和指针函数
8.了解指针数组的概念
9.知道指向指针的指针的概念
三、代码及实现
习题七
1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
解:
#include
intmain()
{
inta,b,max,min;
intyue(intx,inty);
intbei(intx,inty);
printf("请输入任意两个数:
");
scanf("%d,%d",&a,&b);
max=yue(a,b);
min=bei(a,b);
printf("max=%d,min=%d\n",max,min);
return0;
}
intyue(intx,inty)
{
inti,t;
for(i=1;i<=x&&i<=y;i++)
if(x%i==0&&y%i==0)
t=i;
return(t);
}
intbei(intx,inty)
{
intj;
if(x>=y)j=x;
elsej=y;
for(;!
(j%x==0&&j%y==0);j++);
return(j);
}
3.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。
解:
#include
intmain()
{
intsushu(intm);
inta,s;
printf("请输入要判定的数:
");
scanf("%d",&a);
s=sushu(a);
if(s==1)
printf("%d是素数\n",a);
elseprintf("%d不是素数\n",a);
return0;
}
intsushu(intm)
{
inti,t;
for(i=2;i<=m;i++)
if(m%i==0&&iif(m-i==0)t=1;
elset=0;
returnm;
}
4.写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。
解:
#include
intmain()
{
intzhuangzhi(intb[3][3]);
inta[3][3];
inti,j;
printf("请输入一个三维数组:
");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d",a[i][j]);
printf("\n");
}
zhuangzhi(a);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d",a[i][j]);
printf("\n");}
return0;
}
intzhuangzhi(intb[3][3])
{
inti,j,t;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;
}
return(b[3][3]);
}
6.写一函数,将两个字符串连接。
解:
#include
intmain()
{
voidlianjie(charstring1[],charstring2[],charstring[]);
chars1[100],s2[100],s[100];
printf("请输入两个字符串:
");
scanf("%s",s2);
lianjie(s1,s2,s);
printf("\nThenewstringis%s\n",s);
return0;
}
voidlianjie(charstring1[],charstring2[],charstring[])
{
inti,j;
for(i=0;string1[i]!
='\0';i++)
string[i]=string1[i];
for(j=0;string2[j]!
='0';j++)
string[i+j]=string2[j];
string[i+j]='\0';
}
8.写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。
如输入1990,应输出"1990"。
解:
#include
intmain()
{
charf(charb);
inti;
chara[]={1,9,9,0}
f(a);
for(i=0;i<4;i++)
printf("%c",a[i])
return0;
}
charf(charb)
{
inti=0;
for(;i<4;i++)
printf("");
printf("%c",b[i]);
printf("\n");
}
9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出以上的结果。
解:
chartongji(charstr0[100];,charb)
intb[4];
{inti;
for(i=0;str0[i]!
='\0';i++)
{if(str0[i]>=65&&str0[i]<=90||str0[i]>=97&&str0[i]<=122)
b[0]++;
elseif(str0[i]>=48&&str0[i]<=57)
b[1]++;
elseif(str0[i]==32)
b[2]++;
elseb[3]++;}
}
#include
intmain()
{chartongji(charstr0[100],charb);
charstr1[100];
staticinti,a[4];
gets(str1);
tongji(str1,a);
printf("zimuShuziKonggeQita\n");
for(i=0;i<4;i++)
printf("%-8d",a[i]);
printf("\n");
return0;
}
13.用递归方法求n阶勒让德多项式的值递归公式为:
1
解:
floatp(floatx0,intn)
{floaty;
if(n==0||n==1)
if(n==1)y=x0;
elsey=1;
elsey=((2*n-1)*x0*p(x0,n-1)-(n-1)*p(x0,n-2))/n;
return(y);
}
#include
intmain()
{floatx,y0;inta,i;
scanf("%f,%d",&x,&a);
y0=p(x,a);
printf("y0=%.3f\n",y0);
return0;
}
14.输入10个学生5门课的成绩,分别用函数实现下列功能:
①计算每个学生的平均分
②计算每门课的平均分
③找出所有50个分数中最高的分数所对应的学生和课程;
④计算平均分方差:
其中,
为某一学生的平均分。
解:
15.写几个函数:
①输个10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
解:
17.用递归法将一个整数n转换成字符串。
例如,输入483,应输出字符串"483"。
n的位数不确定,可以是任意位数的整数。
解:
18.给出年月日,计算该日是该年的第几天。
解:
#include
intmain()
{
intsum_day(intmonth,intday);
intleap(intyear);
intyear,month,day,days;
printf("输入日期(年,月,日):
\n");
scanf("%d,%d,%d",&year,&month,&day);
printf("%d%d%d",year,month,day);
days=sum_day(month,day);
if(leap(year)&&month>=3)
days=days+1;
printf("是第这一年的%d天。
\n",days);
return0;
}
intsum_day(intmonth,intday)
{
intday_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inti;
for(i=1;iday+=day_tab[i];
return(day);
}
intleap(intyear)
{
intleap;
leap=year%4==0&&year%100!
=0||year%400==0;
return(leap);
}
习题八
1.输入3个整数,按由小到大的顺序输出。
解:
#include
intmain()
{
voidswap(int*p1,int*p2);
inta1,a2,a3;
int*p1,*p2,*p3;
printf("请输入三个整数:
a1,a2,a3:
\n");
scanf("%d,%d,%d",&a1,&a2,&a3);
p1=&a1;
p2=&a2;
p3=&a3;
if(a1>a2)swap(p1,p2);
if(a1>a3)swap(p1,p3);
if(a2>a3)swap(p2,p3);
printf("结果输出顺序为:
%d,%d,%d\n",a1,a2,a3);
return0;
}
voidswap(int*p1,int*p2)
{
intp;
p=*p1;
*p1=*p2;
*p2=p;
}
2.输入3个字符串,按由小到大的顺序输出。
解:
#include
#include
intmain()
{
voidf(char*,char*);
charstr1[40],str2[40],str3[40];
printf("输入三个字符串:
\n");
gets(str1);
gets(str2);
gets(str3);
//引用标准库函数,对字符串进行比较
if(strcmp(str1,str2)>0)f(str1,str2);
if(strcmp(str1,str3)>0)f(str1,str3);
if(strcmp(str2,str3)>0)f(str2,str3);
printf("结果输出顺序为:
\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
return0;
}
voidf(char*p1,char*p2)
{
charp[40];
strcpy(p,p1);
strcpy(p1,p2);
strcpy(p2,p);
}
3.上输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
写3个函数:
①输入10个数;②进行处理;③输出10个数。
解:
#include
intmain()
{
voidinput(int*);
voidmax_min_value(int*);
voidoutput(int*);
intnumber[10];
input(number);//调用输入10个数的函数
max_min_value(number);
output(number);
return0;
}
voidinput(int*number)
{
inti;
printf("输入10个数:
\n");
for(i=0;i<10;i++)
scanf("%d",&number[i]);
}
voidmax_min_value(int*number)
{
int*max,*min,*p,temp;
max=min=number;
for(p=number+1;pif(*p>*max)max=p;
elseif(*p<*min)min=p;
temp=number[0];
number[0]=*min;
*min=temp;
if(max==number)max=min;
temp=number[9];
number[9]=*max;
*max=temp;
}
voidoutput(int*number)
{
int*p;
printf("结果是:
\n");
for(p=number;pprintf("%d\t",*p);
printf("\n");
}
7.有一个字符串,包含n个字符。
写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
解:
#include
#include
intmain()
{
voidcopystr(char*,char*,int);
intm;
charstr1[20],str2[20];
printf("输入字符串:
\n");
gets(str1);
printf("从哪一个字符开始复制?
\n");
scanf("%d",&m);
if(strlen(str1)printf("输入错误!
\n");
else
{
copystr(str1,str2,m);
printf("结果是:
%s\n",str2);
}
return0;
}
voidcopystr(char*p1,char*p2,intm)
{
intn;
n=0;
while(n{
n++;
p1++;
}
while(*p1!
='\0')
{
*p2=*p1;
p1++;
p2++;
}
*p2='\0';
}
15.有一个班4个学生,5门课程。
求第一门课程的平均分;找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;找出平均成绩在90分以上或全部课程成绩在85分以上的学生。
分别编3个函数实现以上3个要求。