折腾代码真是个无比耗时的东西啊,不知不觉,十分钟,二十分钟,三十分钟。。。
课后编程题,让读入数目不确定的考试分数,并且判断有多少个分数高于或等于平均分,有多少个分数低于平均分。输入一个负数标志输入结束。假设最高分为100.。。。
先有鸡蛋还是先有鸡?让我从生物学角度太好回答了,但是编程的话。。。额。
先初始化一个数组list,数组长度就定了,就不能满足数目不确定的考试分数了。但是想先输入分数再初始化数组呢,先输入的分数又没处存了,所以,小弟对策是先定义并初始化一个很长的数组,长度n,再根据输入的分数的数目初始化另一个数组list2,来把有效输入转存到新数组。再对新数组进行操作。
PS:前边,那个n,可以写很大很大,不管怎么写,都是个确定的数,而不是无穷吧,貌似这个数组长度也没上限吧?
那这就太局限了,只要不是无限,你定义多大的n,总有不够用的时候,总会有溢出的风险啊。。
PS:如果定义一个很大的数组,再加手动输入那些成绩的话,可能手抽筋也写不到他溢出的时候,但是这里讨论的是理论,理论上会溢出
不知道有没有更好的方法,暂时就想这么多。
我只是一个看书看到第六章并且没做全练习题的菜鸟,勿鄙视。。。。。。
package java06.ProgramTest;
//课后题4,输入数目不确定的数组
import javax.swing.JOptionPane;
public class Program_6_4 {
public static void main(String[] args){
int n=1000;
//尴尬啊,想通过计算输入的成绩的总数来给Index赋值,用来初始化数组,但是不初始化数组又没处存输入的成绩
int[] myList=new int[n];//我暂时通过一个手动赋值来初始化数组把
int number=0;
int i=0;
for(i=0;number>=0;i++){
String inputString=JOptionPane.showInputDialog("Enter a score. /n"+
"Negative number to end~!!!/nThe allowable max score is 100.");
number=Integer.parseInt(inputString);
if(number>=0)
myList[i]=number;
}
i--;
System.out.println("Score's amount is "+i);
//直接用原来那个数组有风险,输入的数量刚好和定义的数组相等固然是好,
//但是你输入的不够n的话,那些0,就全算平均值了,所以要把没输入的默认0的都给屏蔽掉
//这里我们采用的方法是,在这new一个,把前边数组的值赋过来
int[] myList2=new int[i];
int index=i-1;
for(int k=0;k<=index;k++){
myList2[k]=myList[k];
}
System.out.println("/nTest:average "+computeAverage(myList)+"一千个数的平均值");
System.out.println("/naverage"+computeAverage(myList2));
System.out.println("/nTest: 大于等于平均值: "+
computeCountAboveAverage(computeAverage(myList),myList)+"一千个数中大于等于平均值的");
System.out.println("/n大于等于平均值: "+computeCountAboveAverage(computeAverage(myList2),myList2));
System.out.println("/nTest: 小于平均值: "+
computeCountBelowAverage(computeAverage(myList),myList)+"一千个数中小于平均值的");
System.out.println("/n小于平均值: "+computeCountBelowAverage(computeAverage(myList2),myList2));
}
//计算平均值
public static double computeAverage(int[] list){
int sum=0;
double average=0;
for(int i=0;i<list.length;i++){
sum+=list[i];
}
// average=sum/list.length;//bug 先Mark了,以后注意
average=(double)sum/list.length;
return average;
}
//计算获得平均成绩以上的成绩数目
public static int computeCountAboveAverage(double average,int[] list){
int count=0;
for(int i=0;i<list.length;i++){
if(list[i]>=average)
count++;
}
return count;
}
//计算获得平均成绩以下的成绩数目
public static int computeCountBelowAverage(double average,int[] list){
int count=0;
for(int i=0;i<list.length;i++){
if(list[i]<average)
count++;
}
return count;
}
}
后记。类的实例变量和静态变量称为类属变量或数据域。定义在方法内部的变量称为局部变量。不管在何处声明,类属变量的作用域是整个类。类属变量和方法在类中可以按任何顺序声明。
例外:一个数据域需要引用另一个数据域来进行初始化,另一个数据域必须先声明(严格的顺序限制,书上有明文规定了)。