//
// main.c
// 编程题2--改进为通过定义结构体返回多个值
// Created by LongMa on 15/8/16.
// Copyright (c) 2015年 itcast. All rights reserved.
//2. 请用户从控制台输入班级的总人数,然后让用户依次输入每一位学生的成绩并保存(20分)
//1). 将分数从高到底的打印来.
//2). 显示总分数和平均分.
//3). 去掉3个最低分再显示总分数和平均分.
#include <stdio.h>
#define Dast1_Debug 1
#if Dast1_Debug
#define LOG1(str1,str2) printf(str1,str2)
#else
#define LOG1(str1,str2)
#endif
#define LOG(str1,str2) printf(str1,str2)//有参宏定义,方便输出
/**
* 让用户依次输入每一位学生的成绩并保存
*/
void userInputScores(int num, float *a);
/**
* 将分数从高到底排序.
*/
void sortScorsHighTolow(int num, float *a);
/**
* 输出分数
*
* @param num 人数
* @param a 存成绩的数组的首地址
*/
void showScore(int num,float* a);
/**
* 求总分和平均分
*
* @return 总分,平均分通过返回结构体成员的值进行修改
*/
//自定义 struct Score 类型含两个参数的结构体 score。不必用指针也可以用结构体多个元素的特点返回多个值!
typedef struct //匿名结构体,省去了结构体的名字,在用typedef自定义时,可以省略的!
{
float totalS;
float avgS;
}score;
score totalScore(int num, float *a);
int main(int argc, const char * argv[])
{
int num = 0;
LOG("请输入学生总人数:",NULL);//str2无参可传,传NULL
scanf("%d",&num);
float a[num];
userInputScores(num, a);
sortScorsHighTolow(num, a);
// float avgScore1; //用结构体,省略了这些和下面减除3的多次定义!
// float* avgS = &avgScore1;
score score2;
score2 = totalScore(num, a);
LOG ("学生总分为:%20.1f\n",score2.totalS);
LOG ("学生平均分为:%18.1f\n",score2.avgS);
score score3 = totalScore(num - 3, a);
LOG("------------------------------------------------\n",NULL);
if (num >3)
{
LOG ("去掉3个最低分后学生总分为:%7.1f\n",score3.totalS);
LOG ("去掉3个最低分后学生平均分为:%6.1f\n",score3.avgS);
}else
{
printf("学生人数不大于3个,无法实现去掉3个最低分的功能!\n");
}
LOG("------------------------------------------------\n",NULL);
LOG ("The end!\nWish you love it!\n", NULL);
LOG("\t\t\t\t- By Dast1\n", NULL);
LOG("------------------------------------------------\n",NULL);
return 0;
}
void userInputScores(int num, float *a)
{
for (int i = 0; i < num; i++)
{
LOG ("请输入第%d个学生的成绩:", i + 1);
rewind(stdin);
scanf("%f", (a + i));
}
LOG1("------------------------------------------------\n",NULL);//LOG1(),可通过 Dast1 来控制是否输出下面的用于调试的内容。
LOG1("您输入的学生成绩如下:\n",NULL);//验证是否存储正确
showScore(num, a);
}
void sortScorsHighTolow(int num, float *a)
{
for (int i = 0; i <= num - 2; i++)//冒泡降序排序
{
for (int j = 0; j <= num - 2 - i; j++)
{
if (a[j] < a[j + 1])
{
float temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
LOG("------------------------------------------------\n",NULL);
LOG("学生成绩从高到低输出如下:\n",NULL);
showScore(num, a);
}
void showScore(int num,float* a)
{
for (int j = 0; j < num; j++)
{
LOG1 ("%.1f\t\t",a[j]);
}
LOG1 ("\n",NULL);
}
score totalScore(int num, float *a)//只是声明了函数的类型,函数里面肯定要定义新的此类型的变量啊!
{
score score1;//先定义!
score1.totalS = 0.0f;
for (int i = 0; i < num; i++)
{
score1.totalS += a[i];
}
score1.avgS = score1.totalS / num;
return score1;//返回结构体变量里面的 成员 的值!
}
c测试最后一题(改进:通过定义结构体返回多个值)
最新推荐文章于 2024-05-20 07:54:55 发布