Linux C 指针数组 数组指针 函数指针 的使用实例



实现功能:

1.用二维数组Sorce【6】【4】保存学生的数学、英语、C和总成绩;

2.用一维数组存放姓名并和二维下标一一对应

3.输入各科成绩,自动求出总分并存入数组

4.输出各门功课的分数及总分,最高分,最低分和平均值

5.分数最高和分数最低学生的姓名及各科成绩

实现要求:

使用Makefile、函数指针、数组指针、指针数组传参

</pre><p></p><p></p><p><span style="font-size:18px;">一.通用的头文件</span></p><pre name="code" class="cpp"><span style="font-size:18px;">#ifndef _SETMSG_H
#define _SEGMSG_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STUS 6      //学生总数
#define CLASS 4     //总科目数

#define M 0         //数学标记
#define E 1         //英语标记
#define C 2         //C语言标记
#define S 3         //总分标记

void SetMsg(float (*Sor)[CLASS],char *Sname[STUS]);
void EverClass(float (*Sor)[CLASS],char *Sname[STUS]);
void FirstOne(float (*Sor)[CLASS],char *Sname[STUS]);

#endif

</span>

二、主函数C文件Main.c

<span style="font-size:18px;">#include "Main.h"
int main()
{
	float Sorce[STUS][CLASS] = {{0,0,0,0}};
	char *Sname[STUS];
	void (* Common)(float (*)[CLASS],char **);    //函数指针
	Common = SetMsg;         //函数指针指向SetMsg函数
	Common(Sorce,Sname);     //调用SetMsg函数
	Common = EverClass;      //函数指针指向EverClass函数
</span><pre name="code" class="html"><span style="font-size:18px;">	Common(Sorce,Sname);     //调用EverClass函数
</span>
Common = FirstOne; //函数指针指向FirstOne函数
Common(Sorce,Sname); //调用FirstOne函数
return 0;
}
 

三、实现输入成绩自动求和并存入数组的函数  SetMsg
<span style="font-size:18px;">#include "Main.h"
void SetMsg(float (*sor)[CLASS],char *Sname[STUS])
{
	int i;
	float sum;
	char *Name[STUS] = {"Stu1","Stu2","Stu3","Stu4","Stu5","Stu6"};
//	printf("Please Input Students Name!\n");
	for(i=0;i<STUS;i++)
	{
		//printf("Student Name %d:\t",i+1);
		//scanf("%s",Name);
		*(Sname+i) = *(Name+i);
	}
	for(i=0;i<STUS;i++)
	{
		printf("Please input %s Sorce :\n",*(Sname+i));
		printf("Math :\t");
		scanf("%f",(*(sor+i)+M));
		printf("English :\t");
		scanf("%f",(*(sor+i)+E));
		printf("C :\t");
		scanf("%f",(*(sor+i)+C));
		*(*(sor+i)+S) = *(*(sor+i)+M) + *(*(sor+i)+E) + *(*(sor+i)+C);
	}
}
</span>
四、.输出各门功课的分数及总分,最高分,最低分和平均值函数 DoMsg.c
<span style="font-size:18px;">#include "Main.h"

void DoMsg(float (*Sor)[CLASS],float *Sum,float *Max,float *Min,int s )
{
	int i;
	*Sum = *Max = *Min = 0;
	for(i=0;i<STUS;i++)
	{
		if( *(*(Sor+i)+s) < *Min)
			*Min = *(*(Sor+i)+s);
		else if ( *(*(Sor+i)+s) > *Min)
			*Max = *(*(Sor+i)+s);
		*Sum += *(*(Sor+i)+s);
	}
}

void EverClass(float (*Sor)[CLASS],char *Sname[STUS])
{
	float Sum=0;
	float Max=0;
	float Min=0;
	float Ave=0;
	int i=0;
	for( i=0 ; i<CLASS-1 ; i++ )
	{
		switch(i)
		{
		case 0:printf("This About Math:\n");break;
		case 1:printf("This About English:\n");break;
		case 2:printf("This About C:\n");break;
		}
		DoMsg(Sor,&Sum,&Max,&Min,i);
		printf("Account : %6.2f\nMax : %6.2f\nMin : %6.2f\nAve : %6.2f\n",
			Sum,Max,Min,Sum/STUS);
	}
}
</span>
五、.分数最高和分数最低学生的姓名及各科成绩SleMsg.c
<span style="font-size:18px;">#include "Main.h"
void FirstOne(float (*Sor)[CLASS],char *Sname[STUS])
{
	int first=0,last=0;
	int i=0;
	for(;i<STUS;i++)
	{
		if( *(*(Sor+i)+S) > *(*(Sor+first)+S) )
			first = i;
		if( *(*(Sor+i)+S) < last)
			last = i;
	}
	printf("The First One Is %s :\t",*(Sname+first));
	printf("Math : %6.2f\tEnglish : %6.2f\tC : %6.2f\tSum : %6.2f \n",
		*(*(Sor + first)+M),*(*(Sor + first)+E),*(*(Sor +first)+C),*(*(Sor+first)+S));
	printf("The Last One Is %s :\t",*(Sname+first));
	printf("Math : %6.2f\tEnglish : %6.2f\tC : %6.2f\tSum : %6.2f \n",
		*(*(Sor + last)+M),*(*(Sor + last)+E),*(*(Sor + last)+C),*(*(Sor+last)+S));
}
</span>

六、Makefile文件

a.o:Main.c
	gcc -c Main.c -o a.o
b.o:SetMsg.c
	gcc -c SetMsg.c -o b.o
c.o:DoMsg.c
	gcc -c DoMsg.c -o c.o
d.o:SleMsg.c
	gcc -c SleMsg.c -o d.o
run:a.o b.o c.o d.o
	gcc a.o b.o c.o d.o -o run
clean:
	rm -rf *.o run




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值