大家好,我是一童,今天继续分享比较完整的指针实例,花了5个多小时(ps:我是小白,hhh),不断写bug,改bug,一直到比较满意的状态,好累,要去写作业了,欢迎下方留言讨论!!!
- 指向数组的指针作函数参数
输入n名学生,m门课程及成绩,计算总平均成绩,查询第n位学生各科成绩,查询第n位学生平均成绩,输出不及格学生所有成绩,用switch语句写选择结构;重点注意还是(*p)[COLS];
#include <stdio.h>//输入n名学生,m门课程及成绩
#include <stdlib.h>
#define ROWS 100
#define COLS 100
void Re();
void AllAverage(float(*p)[COLS],int n,int m);//总平均成绩
void Search1(float (*p)[COLS],int n,int m);//查询第n位学生各科成绩
void Average(float (*p)[COLS],int n,int m);//查询第n位学生平均成绩
void Search2(float (*p)[COLS],int n,int m); //输出不及格学生所有成绩
void main()
{
int n,m,i,j,ni;
float a[ROWS][COLS],(*p)[COLS];
char ch1,ch2;
p=a;
puts("\n\n");
puts("\t\t\t\t===============欢迎使用本系统==============");
puts("\n");
printf("\t\t\t输入学生数:n= ");
scanf("%d",&n);
while(n<=0||n>ROWS)
{
printf("\t\t输入的学生数范围应为1-10000,请重新输入!\n");
printf("\t\t\t输入学生数:n= ");
scanf("%d",&n);
}
printf("\n");
printf("\t\t\t输入课程数:m= ");
scanf("%d",&m);
while(m<=0||m>COLS)
{
printf("\t\t输入的课程数数范围应为1-10000,请重新输入!\n");
printf("\t\t\t输入课程数数:m= ");
scanf("%d",&m);
}
printf("\n");
for(i=0;i<n;i++)
{
printf("\t\t\t输入第%d位学生的每门课成绩:",i+1);
for(j=0;j<m;j++)
scanf("%f",*(p+i)+j);
printf("\n");
}
printf("\n\t\t\t输出学生成绩二维表:\n");
printf("\n");
printf("\t\t\t\t\t\t ");
for(j=0;j<m;j++)
printf("科目%d ",j+1);
printf("\n");
for(i=0;i<n;i++)
{
printf("\t\t\t\t\tStudent NO.%d ",i+1);
for(j=0;j<m;j++)
printf("%f ",*(*(p+i)+j));
if(j%m==0)
printf("\n");
}
printf("\n\t\t\t总平均成绩: ");
AllAverage(a,n,m);
puts("\t\t\t不及格学生: ");
Search2(a,n,m);
printf("\n");
while(1)
{
printf("\t\t\t是否要继续进行查询操作(输入Y代表是,N表退出)\n");
do{
ch1=getchar();
}while(ch1!='Y'&&ch1!='y'&&ch1!='N'&&ch1!='n');
switch(ch1)
{
case'Y':
case'y':printf("\t\t\t输入你要查询第ni位学生! ni= ");
scanf("%d",&ni);
printf("\n");
puts("\t\t\t1 表示查询第ni位学生各科成绩!\n");
puts("\t\t\t2 表示第ni位学生平均成绩!\n");
puts("\t\t\t3 表示退出!\n");
puts("\t\t\t输入你要查询内容:");
do{
ch2=getchar();
}while(ch2!='1'&&ch2!='2'&&ch2!='3');
switch(ch2)
{
case'1':Search1(a,ni,m);break;
case'2':Average(a,ni,m);break;
case'3':Re();exit(0);break;
default:printf("\t\t\t输入错误!重新输入!!\n");
}break;
case'N':
case'n':Re();exit(0);break;
default:printf("\t\t\t输入错误!重新输入!!\n");
}
}
}
void Re()
{
printf("\t\t\t退出本程序!\n");
}
void AllAverage(float (*p)[COLS],int n,int m)
{
float sum=0,aver;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
sum=sum+(*(*(p+i)+j));
}
aver=sum/(m*n);
printf("Allaver = %f\n",aver);
printf("\n");
}
void Search1(float (*p)[COLS],int n,int m)
{
printf("\t\t\tStudent NO.%d: ",n);
for(int i=0;i<m;i++)
printf("%f ",*(*(p+n-1)+i));
printf("\n");
}
void Average(float (*p)[COLS],int n,int m)
{
float sum=0.0,aver;
for(int i=0;i<m;i++)
sum=sum+(*(*(p+n-1)+i));
aver=sum/n;
printf("\n\t\t\tStudent NO.%d 平均成绩为:Aver= %f\n",n,aver);
printf("\n");
}
void Search2(float (*p)[COLS],int n,int m)
{
int flag;
for(int i=0;i<n;i++)
{
flag=0;
for(int j=0;j<m;j++)
if((*(*(p+i)+j))<60)flag=1;
if(flag==1)
{
printf("\t\t\t\t Student NO.%d不及格,其所有成绩为:",i+1);
for(j=0;j<m;j++)
printf("%f ",*(*(p+i)+j));
printf("\n");
}
}
}
指针太 j b 灵活,确实很难掌握,注释写的比较少,有写错或者看不懂的地方,欢迎大家留言!!