C++第17周项目6——指针版多科成绩计算

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565

【项目6(选做)- 指针版多科成绩计算】(接15周项目4)用二维数组score[][4]保存同学们的高数、英语、C++成绩及总成绩。在此基础上,尽量用指针法访问数组,完成下面的操作:(1)设计输入成绩的函数,输入3科成绩后可以自动求出总分,并将数据全保存到数组中;(2)输出各门课及总分的最高成绩、最低成绩、平均成绩和成绩的标准偏差;(3)作为拓展,自行建立一个文本文件存储这些成绩,完成上面的工作。
  提示:各具体功能请设计函数完成,下面的函数原型可以作为参考

void input(double (*s)[4],int n); //输入成绩,n是学生人数
double max(double (*s)[4],int n,int i); //求第i门课的最高成绩,i=3时是总分,下类似
double min(double (*s)[4],int n,int i);
double avg(double (*s)[4],int n,int i);
double stdev(double (*s)[4],int n,int i);
void output(double (*s)[4],int n);

注:我在原题的提示中出错,double max(double (*s)[4],int n,int i)中的s应该是指向一维数组(这个一维有4个double型元素)的指针double (*s)[4],而不是有4个元素的数组(其元素是指向double的指针)double *s[4]。题目中已经更正,特此表示歉意。

参考解答:

#include <iostream>
#include <Cmath>
#include <string>
using namespace std;
double max(double (*a)[4],int m, int j);
double min(double (*a)[4],int m, int j);
double avg(double (*a)[4], int m,int j);
double stdev(double (*a)[4],int m, int j );
void output_result(double (*s)[4],int n);
void input(double (*a)[4],int n); //输入成绩,n是学生人数
void output(double (*a)[4],int n);
int main ()
{

	int num;
	double score[50][4];
	cout<<"请输入同学人数"<<endl;
	cin>>num;
	input(score,num);
	output(score,num);
	return 0;
}
/*
函数部分
*/
void input(double (*a)[4],int n) //输入成绩,n是学生人数
{
	int i;
	for(i=0;i<n;i++)
	{
		cout<<"请输入学号为"<<i<<"的成绩(高数 英语 C++)"<<endl;
		cin>>*(a[i])>>*(a[i]+1)>>*(a[i]+2);//或cin>>a[i][0]>>a[i][1]>>a[i][2];
		*(*(a+i)+3)=a[i][0]+a[i][1]+a[i][2];//a[i][3]=a[i][0]+a[i][1]+a[i][2];
	}
	return ;
}
void output(double (*a)[4],int n)
{
	int i;
	string course[4]={"高等数学","英语","C++","总分"};
	/*输出成绩
	*/
	cout<<"输入的学生成绩为:"<<endl;
    cout<<"学号\t高数\t英语\tC++\t总分"<<endl;
    for(i=0;i<n;++i)
    {
		cout<<i<<'\t'<<a[i][0]<<'\t';
		cout<<a[i][1]<<'\t';
		cout<<a[i][2]<<'\t';
		cout<<a[i][3]<<endl;
    }
	/*输出各种成绩
	*/
	for(i=0;i<4;i++)
	{
        cout<<course[i]<<"的最高成绩是"<<max(a,n,i)<<", ";
        cout<<"最低成绩是"<<min(a,n,i)<<", ";
        cout<<"平均成绩是"<<avg(a,n,i)<<", ";
        cout<<"成绩的标准偏差是"<<stdev(a,n,i)<<endl;
    }
	output_result(a,n);
    return ;
}

double max(double (*a)[4],int m, int j)
{
	double p=*(a[0]+j);//或p=a[0][j];
	for(int i=1;i<m;i++)
		if(p<a[i][j])
			p=a[i][j];
		return p;
} 

double min(double (*a)[4],int m, int j)
{
	double s=a[0][j];
	for(int i=1;i<m;i++)
		if(s>a[i][j])
			s=a[i][j];
		return s;
}
double avg(double (*a)[4], int m,int j)
{
	double sum=a[0][j];
	for(int i=1;i<m;i++)
		sum=sum+a[i][j];
	return sum/m;
}
double stdev(double (*a)[4],int m, int j )
{
	double s,x,sum=0;
	s=avg(a,m,j);//平均成绩
    for(int i=0;i<m;i++)
    {
        x=a[i][j]-s;
        sum+=x*x;
    }
    return sqrt(sum/(m-1));
}
//输出考得总分最高、最低同学的人数及对应的学号。
void output_result(double (*s)[4],int n)
{
    double m=max(s,n,3);
    int i,c=0;
    bool first=true;
    cout<<"总分最高分为"<<m;
    for(i=0;i<n;++i)
	{
        if(s[i][3]==m)//直接用s[i][3]==m可能会因精度而错误
            ++c;
    }
    cout<<",有"<<c<<"人达到最高分,他们的学号是:";
    for(i=0;i<n;++i)
    {
        if(s[i][3]==m)
			if(first)
            {
                cout<<i;
                first=false;
			}
            else
            {
                cout<<"、"<<i;
			}
    }
    cout<<endl;
    //关于最低成绩
    m=min(s,n,3);
    c=0;
    first=true;
    cout<<"总分最低分为"<<m;
    for(i=0;i<n;++i)
    {
        if(s[i][3]==m)
            ++c;
    }
    cout<<",有"<<c<<"人达到最低分,他们的学号是:";
    for(i=0;i<n;++i)
    {
        if(s[i][3]==m)
            if(first)
            {
                cout<<i;
                first=false;
            }
            else
            {
                cout<<"、"<<i;
            }
    }
    cout<<endl;
	return ;
}
时间: 2024-09-20 18:03:20

C++第17周项目6——指针版多科成绩计算的相关文章

2013-C++第17周项目参考解答链接集

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-体会函数参数传递] 设计一个程序,输入3个整数,将其按从大到小的顺序输出,要求 (1)排序功能通过函数实现 (2)写出两个版本的函数,一个采用传地址值的方法,另一个采用引用类型作参数 参考解答在:http://blog.csdn.net/sxhelijian/article/details/8362289(2012级第17周项目1) [项目2-用指针玩字符串]指

2013级C++第17周项目——字符串、指针应用

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-体会函数参数传递] 1.下面三段程序都试图通过定义函数,实现实际参数在必要时的交换,哪些能够实现,哪些不能实现?通过运行程序和单步执行,让自己对这一过程更加清楚,然后请在博文中给出明确的回答,并用你自己的话展开描述.) (1) #include <iostream> using namespace std; void jiaohuan(int x, int y

C++第17周项目2——用指针玩字符串(1)连接

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-用指针玩字符串]神奇的指针哟,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:指向指针的指针可以操作二维数组.更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换. 本项目试图通过编制操作字符串的函数,实现字符串的操作. 请编制函数,其功能是对字符串的进行操作

C++第17周项目2——用指针玩字符串(6)去多余空格

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-用指针玩字符串]神奇的指针哟,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:指向指针的指针可以操作二维数组.更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换. 本项目试图通过编制操作字符串的函数,实现字符串的操作. 请编制函数,其功能是对字符串的进行操作

C++第17周项目2——用指针玩字符串(3)求字符串长度

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-用指针玩字符串]神奇的指针哟,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:指向指针的指针可以操作二维数组.更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换. 本项目试图通过编制操作字符串的函数,实现字符串的操作. 请编制函数,其功能是对字符串的进行操作

C++第17周项目2——用指针玩字符串(5)去前导空格

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-用指针玩字符串]神奇的指针哟,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:指向指针的指针可以操作二维数组.更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换. 本项目试图通过编制操作字符串的函数,实现字符串的操作. 请编制函数,其功能是对字符串的进行操作

C++第17周项目2——用指针玩字符串(2)删除字符

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-用指针玩字符串]神奇的指针哟,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:指向指针的指针可以操作二维数组.更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换. 本项目试图通过编制操作字符串的函数,实现字符串的操作. 请编制函数,其功能是对字符串的进行操作

C++第17周项目2——用指针玩字符串(7)比较

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2-用指针玩字符串]神奇的指针哟,指向整型的指针int *p1,可以操作整型数组int a[]:指向字符型的指针char *p2,可以操作字符数组(字符串)char str[]:指向指针的指针可以操作二维数组.更灵活的是,在函数的传递中,指针.数组名在一定程度上可以互换. 本项目试图通过编制操作字符串的函数,实现字符串的操作. 请编制函数,其功能是对字符串的进行操作

C++第17周项目5——数组排序指针版

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目5-数组的排序]按给定部分程序的要求,用指向数组的指针变量作为形式参数编写函数,完成排序.重点体会:(1)排序算法,可以是冒泡,也可以是选择:(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变:(3)形式参数中不指定数组大小,实际数组的大小也一并作为参数传递. 参考解答 #inclu