1、《 C语言程序设计 》 实验报告 实验时间: 6月7号 实验班级: 计算机双学位1501 实验报告总份(片)数: 1 份(片) 实验教师: 饶东宁 计算机 学院 工一 实验室 广东工业大学 《 C语言程序设计 》 实验报告 实验题目: 实验10 实验时间: 6月7号 实验班级: 双学位1501 实验人学号: 3213010359 实验人姓名: 梁雪卿 实验教师: 饶东宁 计算机 学院 工一 实验室 广东工
2、业大学
实验10 指针2
1 实验目得
(1) 进一步掌握指针得应用
(2) 能正确使用数组得指针与指向数组得指针变量
(3) 能正确使用字符串得指针与指向字符串得指针变量
(4) 了解指向指针得指针得用法
2 实验内容
根据题目要求,编写程序(要求用指针处理),运行程序,分析结果,并进行必要得讨论分析。
(1) 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3得人退出圈子,问最后留下得就是原来得第几号得人。
输入人数n
算法说明:
指针指向数组开头
for i=0 to i=n1
当m 3、
输出结果
*(p+i)=i+1
i=0 k=0 m=0
真 *(p+1)≠0 假
k++
真 k=3 假
*(p+i)=0
k=0
m++
i++
真 i=n 假
i=0
当*p=0
p++
程序清单:
#i 4、nclude 5、
return 0;
}
运行结果:
分析与思考:
以1到n为序给每个人编号,i为每次循环时计数变量,k为按1,2,3报数时得计数变量,m为退出人数,当退出人数比n1少时执行循环体,对推村恩编号为0,报数到尾i恢复为0,循环继续。
(2) 将一个5*5得矩阵(二维数组)中最大元素放在中心,4个角分别放4个最小得元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
算法说明:
定义a[5][5],*p,I,j
for i=0 to i=4
for j=0 to j=4
输入a[i][j]
p=&a[0] 6、[0]
调用函数change(p)
for j=0 to j=4
for i=0 to i=4
输出a[i][j]
change(int *p)
定义 i,j,temp,*pmax,*pmin
pmax=p
pmin=p
for i=0 to i=4
for j=i to j=4
temp=*(p+12) *(p+12)=*pmax *pmax=temp
temp=*p *p=*pmin *pmin=temp pmin=p+1
for i=0 to i=4
/
真 7、 *pmax<*(p+5*i+j) 假
pmax=p+5*i+j
真 *pmin>*(p+5*i+j) 假
pmin=p+5*i+j
for j=0 to j=4
continue
真 i==0&&j==0 假
真 *pmin>*(p+5*i+j) 假
pmin=p+5*i 8、j
temp=*pmin *pmin=*(p+4) *(p+4)=temp pmin=p+1
for i=0 to i=4
for j=0 to j=4
真 (i==0&&j==0)||(i==0&&j==4) 假
temp=*pmin *pmin=*(p+20) *(p+20)=temp pmin=p+1
pmin=p+5*i+j
真 *pmin>*(p+5*i+j) 假
continue
for i=0 to i=4
for j=0 to j=4 9、
continue
真 (i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0) 假
真 *pmin>*(p+5*i+j) 假
temp=*pmin
*pmin=*(p+24)
*(p+24)=temp
pmin=p+5*i+j
程序清单:
#include 10、5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
q=&a[0][0];
change(q);
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
void change(int *p)
{
int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(*pmax<*(p 11、i*5+j)) pmax=p+i*5+j;
if(*pmin>*(p+5*i+j)) pmin=p+i*5+j;
}
}
temp=*(p+12);
*(p+12)=*pmax;
*pmax=temp;
temp=*p;
*p=*pmin;
*pmin=temp;
pmin=p+1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{if(i==0&&j==0) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}
}
temp=*pmin;
*pmin=*(p+4);
*(p+4)=tem 12、p;
pmin=p+1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{if((i==0&&j==0)||(i==0&&j==4)) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}
}
temp=*pmin;
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{if((i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0)) continue;
if(*pmin>*(p 13、5*i+j)) pmin=p+5*i+j;}
}
temp=*pmin;
*pmin=*(p+24);
*(p+24)=temp;
}
运行结果:
分析与思考:
change函数实现元素值交换。找出最大最小之,最大值与中心元素呼唤,最小值与左上角得元素互换。找出全部元素中得次小值,第三小值,第四小值,分别与剩下得三个角互换。元素地址均以元素做单位得地址。
(3) 有一个班4个学生,5门课程。
1, 求第一门课程得平均分。
2, 找出有两门以上课程不及格得学生,输出她们得学号与全部课程成绩及平军成绩。
3, 找出平均成绩在90分以上或全部课程成绩在85分以上得学生。 14、分别编3个函数实现以上3个要求。
定义score[4][5],aver[4],*pscore,*paver,course[5][10],(*pcourse)[10]
pcourse=course
for i=0 to i=4
算法说明:
输入course[i]
for i=0 to i=4
输出course[i]
pscore=&score[0][0]
pnum=&num
for i=0 to i=3
输入pnum+i
for j=0 to j=4
输出pscore+5*i+j
paver &aver[0]
调用avsco( 15、pscore,paver)
调用avcour1(pcourse,pscore)
调用fali2(pcourse,pnum,pscore,paver)
调用good(pcourse,pnum,pscore,paver)
avsco
sum=0、0
for j=0 to j=4
定义I,j,sum,average
for i=0 to i=3
average=sum/5
*(paver+i)=average
sum=sum+(*(pscore+5*i+j))
avcour1
定义I,sum,average1
sum=0、0
for i= 16、0 to i=3
sum=sum+(*(pscore+5*i))
average1= sum/4
输出*pcourse,average1
fali2
定义I,j,k,label
for i=0 to i=4
输出course[i]
for i=0 to i=3
label=0
for j=0 to j=4
真 *(pscore+5*i+j)<60、0 假
label++
真 label>=2 假
输出num[i]
for 17、k=0 to k=4
输出*(pscore+5*i+k)
输出aver[i]
good
定义I,j,k,n
for i=0 to i=4
输出course[i]
for i=0 to i=3
n=o
for j=0 to j=4
真 *(pscore+5*i+j)>85、0 假
n++
真 n==5||(aver[i]>=90) 假
输出num[i]
for k=0 to k=4
输出*(pscore+5*i+k) 18、
输出aver[i]
程序清单:
#include 19、[4][5],aver[4],*pscore,*paver;
char course[5][10],(*pcourse)[10];
printf("input course:\n");
pcourse=course;
for(i=0;i<5;i++)
scanf("%s",course[i]);
printf("input NO、 and scores:\n");
printf("NO、");
for(i=0;i<5;i++)
printf(",%s",course[i]);
printf("\n");
pscore=&score[0][0];
pnum=&num[0 20、];
for(i=0;i<4;i++)
{scanf("%d",pnum+i);
for(j=0;j<5;j++)
scanf("%f",pscore+5*i+j);}
paver=&aver[0];
printf("\n\n");
avsco(pscore,paver);
avcour1(pcourse,pscore);
printf("\n\n");
fali2(pcourse,pnum,pscore,paver);
printf("\n\n");
good(pcourse,pnum,pscore,paver);
return 0;
}
void avsco( 21、float *pscore,float *paver)
{
int i,j;
float sum,average;
for(i=0;i<4;i++)
{sum=0、0;
for(j=0;j<5;j++)
sum=sum+(*(pscore+5*i+j));
average=sum/5;
*(paver+i)=average;
}
}
void avcour1(char (*pcourse)[10],float *pscore)
{
int i;
float sum,average1;
sum=0、0;
for(i=0;i<4;i++ 22、)
sum=sum+(*(pscore+5*i));
average1=sum/4;
printf("course 1:%s average score:%7、2f\n",*pcourse,average1);
}
void fali2(char course[5][10],int num[],float *pscore,float aver[4])
{
int i,j,k,label;
printf(" ==============Student who is fail in two course========== \n");
printf("NO 23、 ");
for(i=0;i<5;i++)
printf("%11s",course[i]);
printf(" average\n");
for(i=0;i<4;i++)
{label=0;
for(j=0;j<5;j++)
if(*(pscore+5*i+j)<60、0) label++;
if(label>=2)
{printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%11、2f",*(pscore+5*i+k));
printf("%11、2f\n",aver[i]);
24、}
}
}
void good(char course[5][10],int num[4],float *pscore,float aver[4])
{
int i,j,k,n;
printf(" ==========Students whose score is good====== \n");
printf("NO、 ");
for(i=0;i<5;i++)
printf("%11s",course[i]);
printf(" average\n");
for(i=0;i<4;i++)
{n=0;
for( 25、j=0;j<5;j++)
if(*(pscore+5*i+j)>85、0) n++;
if((n==5)||(aver[i]>=90))
{printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%11、2f",*(pscore+5*i+k));
printf("%11、2f\n",aver[i]);
}
}
}
运行结果:
分析与思考:
num就是存放4个学生学号得一维数组,course就是存放5门课名字得二维字符数组,score就是存放4 个学生5门课成绩得二维数组,aver就是存放每个学生平 26、时成绩得数组。pnum就是指向num数组得指针变量,pave就是指向aver数组得指针变量。
(4) 用指向指针得指针得方法对n个字符串排序并输出。要求将排序单独写成一个函数。n与各整数在主函数中输入。最后在主函数中输出。
把n个字符串定义为二维数组str[N][LINEMAX]
定义指针数组pstr[N]
for i=0 to i=N1
算法说明:
pstr[i]=str[i]
for i=0 to i=N1
输入字符串
p=pstr
for i=0 to i=N1
输出排序后得字符串
调用函数sort(p,N)
27、
sort
定义i,j,*temp
for i=0 to i=x1
for j=i+1 to j=x1
真 strcmp(*(p+1),*(p+j)>0) 假
temp=*(p+i)
*(p+i)=*(p+j)
*(p+j)=temp
程序清单:
#include 28、 i;
char **p;
char *pstr[N];
char str[N][LINEMAX];
printf("输入5个字符串: ");
for(i=0;i






