求大佬解决C语言问题 5
(1)在用户输入学生序号以后,能在主函数输出该学生的全部成绩;
(2)找出其中有不及格的课程的学生并输出他们的成绩。 展开
题目要求用指针函数,既返回值为指针类型的函数。
在主函数接收返回值并输出打印。
从输入的学生中找出有不及格的学生,并输出其不及格的课目成绩。(在打印所有学生的同时就筛选出存在不及格的学生,可减少循环次数,本题只有3个学生,假设更多的话)。
下面是代码:
#include <stdio.h>
#include <malloc.h>
#define JG 60//及格分数线
#define MS 3//学生人数
#define MC 4//课程数量
int **input();
int main()
{
int i,j,*p[MS]={NULL},cnt=0;
int **stus=NULL;
printf("输入的%d个学生%d科成绩分别为:\n",MS,MC);
stus=input();//1、输入
if(!stus) return 1;
for(i=0;i<MS;printf("\n"),i++)//2、输出成绩
{
for(j=1,printf("学生编号%d:",stus[i][0]);j<MC+1;printf("%d ",stus[i][j]),j++)
if(stus[i][j]<JG) p[cnt]=stus[i];//打印输出数组的同时,计算不及格的学生,减少循环次数
if(p[cnt]!=NULL) cnt++;
}
for(i=0,printf("\n其中存在课程不及格的学生:\n");i<cnt;i++)
{
for(j=1,printf("学生编号%d,不及格的课程有:\n",p[i][0]);j<MC+1;j++)
if(p[i][j]<JG) printf("--课程%d不及格,分数为:%d\n",j,p[i][j]);
printf("\n");
}
//malloc申请的内存需要手动释放,这里可写free释放,因为程序到此结束,自动释放 了,我就不写了。
return 0;
}
int **input()
{
static int id=1;//stus数组第1列为学生编号(唯一的),id是学生编号自增序列
int **stus=NULL,*p=NULL,i,j;
p=(int *)malloc(sizeof(int)*MS*(MC+1));
if(!p) return NULL;
stus=(int **)malloc(sizeof(int *)*MS);
if(!stus) return NULL;
for(i=0;i<MS;i++)
{
stus[i]=p,p+=MC+1;
printf("请输入学生的%d科成绩:\n",MC);
for(j=1,stus[i][0]=id++;j<MC+1;scanf("%d",&stus[i][j]),j++);
}
printf("\n");
return stus;
}