写了一个Java练习题
已知每个学生这次成绩(0~100)范围内的整数
* 1.求平均、最高和最低成绩
* 2.统计考试成绩的分布率
最后判读成绩分布规律 变量设置较多 有没有什么办法优化
import java.util.Scanner;
public class Studentgrade_out {
/**
* 需求:
* 已知每个学生这次成绩(0~100)范围内的整数
* 1.求平均、最高和最低成绩
* 2.统计考试成绩的分布率
*/
class studentgrade_in{ //学生成绩内部类
int[] grede;
public void grade(int number){ //接收成绩方法
grede=new int[number]; //定义数组 给定长度
Scanner scanner = new Scanner(System.in);//键盘输入成绩
System.out.println("请输入"+number+"位学生成绩(百分制):");
for (int i = 0; i <number; i++) {
grede[i]=scanner.nextInt(); //给数组赋值
}
// for (int i = 0; i < grede.length; i++) {
// System.out.println(grede[i]);
// }
}
public void judge(int number){ //判读数据的最大和最小数
/**
* 冒泡排序 比较相邻数据元素大小 把数组从大到小排序
*/
for (int i = 0; i < grede.length; i++) {
for (int j = 0; j < grede.length-1-i; j++) {
if (grede[j]>grede[j+1]) {
/**
* 引用中间变量 交换前后数据 将较大后移
*/
int temp =grede[j];
grede[j]=grede[j+1];
grede[j+1]=temp;
}
}
}
//此时数组顺序从小到大排序,第一个数据是最小值,最后一个数据是最大值
System.out.println("最小值是:"+grede[0]);
System.out.println("最大值是:"+grede[grede.length-1]);
}
public void sum(int number) { //平均成绩
int sum=0; //number个数据相加总和
for (int i = 0; i < number; i++) {
sum+=grede[i];
}
//成绩总和/人数 平均成绩
System.out.println("这次测试平均成绩是:"+sum/number);
}
public void stage(int number){ //统计考试成绩分布规律
int l=0,j=0,k=0,g=0,f=0,d=0,q=0; //定义变量记录每个分数段的人数
for (int i = 0; i < number; i++) { //遍历数组
int a=grede[i]; //接收数组元素进行判断
if (a < 60) {
l++;
}else if (a>=60) {
d++;
}
if (a >=60&&a<70 ) {
k++;
}else if (a >=70&&a<80) {
g++;
}else if(a>=80&&a<90){
f++;
}else if (a>=90&&a<=100){
q++;
}
}
System.out.println("不及格人数有"+l+"个");
System.out.println("及格人数有"+d+"个");
System.out.println("60-70的人数有"+k+"个");
System.out.println("70-80的人数有"+g+"个");
System.out.println("80-90的人数有"+f+"个");
System.out.println("90-100的人数有"+q+"个");
}
}
/*
外部类方法
*/
public void get(int number){ //实例化内部类调用方法(内部类非静态;main方法不能直接调用)
studentgrade_in si = new studentgrade_in();
si.grade(number);
si.judge(number);
si.sum(number);
si.stage(number);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请问有少位学生成绩输入:");
int number = scanner.nextInt();
/**
* main() 只能调用静态方法
*
* 也可以将 get 方法写成静态方法
*/
Studentgrade_out so = new Studentgrade_out(); //实例化外部类
so.get(number); //调用get();方法
}
}
int max = 0;
for(int i = 0; i < n; i++){
max = Math.max(nums[i],max);
}
按你思路写的,精简了一点点,不保存输入,直接算结果,看看行不?另加了数据检查,增强健壮性。
看不懂可以问我。希望给个采纳。
输出计算:时间O(n) 空间O(1)
import java.util.Scanner;
//不要混用驼峰命名和匈牙利命名!所有单词首字母大写!
public class StudentCalculate {
int max = 0;//最大
int min=100;//最小
int sum = 0;//求和
int cnt = 0;//数量
int[] addIndex;//统计对应索引
int[] calculates;//统计数组
String[] strs;//统计提示文字
public StudentCalculate(){
addIndex = new int[]{0,0,0,0,0,0,1,2,3,4,4};
calculates = new int[5];//0:不及格,1:60-70,2:70-80,3:80-90,4:90-100(包含100)
strs = new String[]{"不及格","60-70","70-80","80-90","90-100"};
}
public void addNum(int num) throws Exception{
if(num < 0 || num > 100)
throw new Exception("非法数据,请重新输入!");
sum += num;
++cnt;
max = Math.max(num,max);
min = Math.min(num,min);
++calculates[addIndex[num/10]];
}
public void getResult() throws Exception{
if(cnt == 0){
throw new Exception("不存在有效的学生成绩!");
}
System.out.println("最大值:"+max);
System.out.println("最小值:"+min);
System.out.println("平均值:"+sum/cnt);
for(int i = 0; i < 5; i++){
System.out.println(strs[i]+"人数:"+calculates[i]);
}
}
public static void main(String[] args){
StudentCalculate sc = new StudentCalculate();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if(n < 0){
System.out.println("非法数据,程序结束!");
return;
}
for(int i = 0; i < n; i++){
try{
sc.addNum(scanner.nextInt());
}catch (Exception e){
System.out.println(e.getMessage());
//假设数据不合法,就要求重新输入
i--;
}
}
try{
sc.getResult();
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
1.除了第一个 grade(int number) 需要参数int number,其他几个方法都可以不用,给了参数可能会统计不全或出错,可以直接用grede.length;
2.最大最小没必要对所有的做排序,遍历一次得到最大最小就行了;
3.求平均这样写问题不大,但是sum一般是表示求和;