java基础问题?不够加分。 (200分)

  • 主题发起人 主题发起人 jinmen
  • 开始时间 开始时间
J

jinmen

Unregistered / Unconfirmed
GUEST, unregistred user!
1, 用 int num 可以declare 一个 variable. 用 integer num
= new integer() 也能declare一个reference variable. 按书上
说reference variable 和 variable 的不同,在于前者有
address sort 数据,后者则直接sort 数据。 那我不太明白为什
么要有个address来 sort数据,而不能直接sort呢? 我的意思是
,为什么要有个reference variable, 而不能全部都用variable
? 同样的,在用法上,variable 的 num 和 reference
variable 的 num 有什么不同? 是否reference variable 是一
个object,而variable是一个数值?他们之间能相互转换吗?
2, static final 用于declare 固定数据, 那 static final
int =1;
和 final int =1;
这两个指令有什么不同呢?我的意思
是,有stantic和没有stantic表达的意思有什么不同?
3,我的java文件在附件中。这程序是用tokenizer读取一个txt文
件中的很多组数据。
数据的次序是:性别(m or f), course1 分数,course2 分数,
GPA值。
然后输出 M F 两种性别分别读不同COURSE的不同人数,和每个的
平均分,平均GPA。
还有找出GPA的RANGE。
我compile后没有语法错误,但我用具体文件test却不行。你能帮
我看看是什么问题吗?

附源程序studentGpa.java
import java.io.*;
import java.util.*;
import java.text.DecimalFormat;

public class studentGpa
{
public static void main (String[] args) throws IOException,FileNotFoundException
int maleCourse1 = 0;
int maleCourse2 = 0;
int maleCourse1Sum = 0;
int maleCourse2Sum = 0;
int maleCourse1Num = 0;
int maleCourse2Num = 0;
do
uble maleCourse1Mean = 0;
do
uble maleCourse2Mean = 0;
do
uble maleGpa = 0;
do
uble maleGpaMean = 0;
do
uble maleMaxGpa = 0;
do
uble maleMinGpa = 10;
do
uble totalMaleGpa = 0;
int femaleCourse1 = 0;
int femaleCourse2 = 0;
int femaleCourse1Sum = 0;
int femaleCourse2Sum = 0;
int femaleCourse1Num = 0;
int femaleCourse2Num = 0;
do
uble femaleCourse1Mean = 0;
do
uble femaleCourse2Mean = 0;
do
uble femaleGpa = 0;
do
uble femaleGpaMean =0;
do
uble femaleMaxGpa = 0;
do
uble femaleMinGpa = 10;
do
uble totalFemaleGpa = 0;
int totalStudentsCourse1;
int totalStudentsCourse2;
do
uble course1Mean;
do
uble course2Mean;
do
uble gpaMean;
do
uble maxGpa = 0;
do
uble minGpa = 0;
do
uble totalGpa = 0;
do
uble meanGpa = 0;
StringTokenizer tokenizer;
BufferedReader inFile = new BufferedReader (new FileReader("StudentData.txt"));
tokenizer = new StringTokenizer(inFile.readLine());
DecimalFormat twoDecimal = new DecimalFormat("0.00");
String inputLine = inFile.readLine();
while( inputLine != null)
{
char gender = tokenizer.nextToken().charAt(0);
switch (gender)
{
case 'M':
case 'm': maleCourse1 = Integer.parseInt(tokenizer.nextToken());
maleCourse2 = Integer.parseInt(tokenizer.nextToken());
maleGpa =do
uble.parseDouble(tokenizer.nextToken());
if (maleCourse1 <0 )
{System.out.println("Invalid grade, the line number in the file that was skipped.");
break;}
if (maleCourse2 <0 )
{System.out.println("Invalid grade, the line number in the file that was skipped.");
break;}
if (maleGpa <0 )
{System.out.println("Invalid GPA, the line number in the file that was skipped.");
break;}
if (maleCourse1 > 0)
{
maleCourse1Num++;
maleCourse1Sum = maleCourse1Sum + maleCourse1;}
if (maleCourse2 >0)
{
maleCourse2Num++;
maleCourse2Sum = maleCourse2Sum + maleCourse2;
}
totalMaleGpa = totalMaleGpa + maleGpa;
if ( maleGpa >= maleMaxGpa)
maleMaxGpa = maleGpa;
if ( maleGpa <= maleMinGpa)
maleMinGpa = maleGpa;
break;
case 'F':
case 'f': femaleCourse1 = Integer.parseInt(tokenizer.nextToken());
femaleCourse2 = Integer.parseInt(tokenizer.nextToken());
femaleGpa =do
uble.parseDouble(tokenizer.nextToken());
if (femaleCourse1 <0 )
{System.out.println("Invalid grade, the line number in the file that was skipped.");
break;}
if (femaleCourse2 <0 )
{System.out.println("Invalid grade, the line number in the file that was skipped.");
break;}
if (femaleGpa <0 )
{System.out.println("Invalid GPA, the line number in the file that was skipped.");
break;}
if (femaleCourse1 > 0)
{
femaleCourse1Num++;
femaleCourse1Sum = femaleCourse1Sum + femaleCourse1;}
if (femaleCourse2 > 0)
{
femaleCourse2Num++;
femaleCourse2Sum = femaleCourse2Sum + femaleCourse2;
}
totalFemaleGpa = totalFemaleGpa + femaleGpa;
if ( femaleGpa >= femaleMaxGpa)
femaleMaxGpa = femaleGpa;
if ( femaleGpa <= femaleMinGpa)
femaleMinGpa = femaleGpa;
break;
default: System.out.println("Invalid gender, the line number in the file that was skipped.");
}
}
totalStudentsCourse1 = maleCourse1Num + femaleCourse1Num;
totalStudentsCourse2 = maleCourse2Num + femaleCourse2Num;
course1Mean = (maleCourse1Sum + femaleCourse1Sum) / totalStudentsCourse1;
course2Mean = (maleCourse2Sum + femaleCourse2Sum) / totalStudentsCourse2;
maleCourse1Mean = maleCourse1Sum / maleCourse1Num;
maleCourse2Mean = maleCourse2Sum / maleCourse2Num;
femaleCourse1Mean = femaleCourse1Sum / femaleCourse1Num;
femaleCourse2Mean = femaleCourse2Sum / femaleCourse2Num;
if ( maleMaxGpa > femaleMaxGpa)
maxGpa = maleMaxGpa;
else
maxGpa = femaleMaxGpa;
if ( maleMinGpa < femaleMinGpa)
minGpa = maleMinGpa;
else
minGpa = femaleMinGpa;
totalGpa = totalMaleGpa + totalFemaleGpa;
meanGpa = 2 * totalGpa / (totalStudentsCourse1 + totalStudentsCourse2);
maleGpaMean = 2 * totalMaleGpa / (maleCourse1Num + maleCourse2Num);
femaleGpaMean = 2 * totalFemaleGpa / (femaleCourse1Num + femaleCourse2Num);


System.out.println(" " + "Course#1 " + "Course#2 " + "GPA");
System.out.println("Total Number of Students " + totalStudentsCourse1 + " " + totalStudentsCourse2 + " " + (int)(totalGpa));
System.out.println("Mean Grades " + course1Mean + " " + course2Mean + " " + twoDecimal.format(meanGpa));
System.out.println("GPA range " + " " + minGpa + " to " + maxGpa);
System.out.println("Number of female Students " + femaleCourse1Num + " " + femaleCourse2Num + " " + (int)(totalFemaleGpa));
System.out.println("Mean Grades(female) " + femaleCourse1Mean + " " + femaleCourse2Mean + " " + twoDecimal.format(femaleGpaMean));
System.out.println("GPA range(female) " + " " + femaleMinGpa + " to " + femaleMaxGpa);
System.out.println("Number of male Students " + maleCourse1Num + " " + maleCourse2Num + " " + (int)(totalMaleGpa));
System.out.println("Mean Grades(male) " + maleCourse1Mean + " " + maleCourse2Mean + " " + twoDecimal.format(maleGpaMean));
System.out.println("GPA range(male) " + " " + maleMinGpa + " to " + maleMaxGpa);
}
}
 
public static void main (String[] args) throws IOException,FileNotFoundException 在这句code里你少了“{“吧,我觉你要仔细检查一下你的If statement.我发现有点不对劲。。。先解答你上面的问题吧
1)int num = 1,你declare 一个variable of int type, num 的值就是1,当你用integer num = new integer();
你只是creat了一个variable of integer 叫 num,你还没赋任何值给num,而num只会store这个integer的一个地址,这个地址是指向这个值的位置,num不会store 这个integer 的值。
2) static final int CONSTANT1 = 2;
final int CONSTANT1 = 2;
因为这两个variable 都是定值,所以它的名字为大写字母,有static 跟没static 的分别就是当你有一个class的时候,打个比方说ball class吧,
static int radius = 3;
在ball 这个class里面会有不同的method对吧。你可以在每个不同的method里面都用到radius 这个static variable..当一旦radius的值改变了的时候,所有method里面radius 的值都会改变。。。如果 你declare 一个variable像 int radius = 3...一旦你在其中一个method里改变了radius 的值,在别的method 里面radius 的值是不会变的。。希望能解答上你的问题。
 
就第一个问题说一下偶的理解。
首先声明一下,偶是半路出家,计算机的基础课未免有没学好的地方,希望大家指正。
说到句柄(reference)和地址(address),偶最早是在学C++时遇到的,java是从c++上演化过来的,偶想在内存处理方面一定有类似的地方,有空的话偶准备学习一下JVM的内部机理。
偶在程序中声明一个变量(variable),比如int i = 1;则编译器把这段代码编译成机器码,其效果是在内存中申请一段空间来存放这个值,根据操作系统和编程语言决定这块空间的大小,然后把1这个值写到这个内存空间中。在c++/windows环境中,由编程者手动申请一块内存空间,但是在java里JVM将自动处理这个过程,同样,JVM也不需要你做C++程序员必须做的释放内存的操作。
现在看看为什么要用到句柄。我们都只到,既然这个i=1放到了内存中,我们就必须记住把他放在哪儿了,以备今后调用。比较简单的办法是记下这个地址的值,就是c++中指针的概念。指针记住了这个地址的值,下次要找i时,根据这个指针找到这段内存,读出其中的值,然后转成int值使用。所以如果地址002上保存了一个int值时,一个显而易见的问题是偶就不能申请000-003这段地址来存放一个double值,因为这样会把那个int值冲掉了。所以操作系统在处理内存申请的时候就必须注意要避开这些以被申请的内存段,直到这段内存被程序释放,才能再使用这段内存(java里用的是垃圾回收机制)。这种内存使用方式会带来一个问题是,如果002、005、007这三段地址被放了三个int值,那么从000到007就放不下大一点的对象了,某些地址就被浪费了。
所以我们需要指向指针的指针,就是句柄。句柄指向一个指针,指针再指向实际的地址(句柄也可以指向一个表什么的复杂结构)。这样操作系统只要保证句柄指向的这个指针或表的地址不改动,而可以把实际的对象到处移动,以更好的分配内存。
偶想上面的一堆罗嗦大致能说明为什么要用地址来sort数据,甚至要用句柄来sort数据。
 
第二个问题,要从java的类装载机制说起。
当程序里运行到 MyClass some = new MyClass();时,运行环境知道这是要创建一个对象,于是他先找到这个类MyClass,如果这个类已经被载入了,就根据指明的这个类的一个构造函数创建一个对象,如果这个类还没有被载入,那就要找到这个类先。找到这个类的步骤就不说了。
那么我们要使用某个类的时候就必须生成一个对象么?未必,我们可以用static,static可以用来申明一个静态的变量或者方法。静态,说明这个变量和方法并不因对象的变动而变动。我们知道,如果我们new两个新的对象,MyClass some1 = new MyClass();
MyClass some2 = new MyClass();那么some1和some2两个对象在内存上有不同的内存存放地址,相应的在MyClass里有
public class MyClass{
int i;
}
则some1.i和some2.i也是放在两个不同的地方的。向some1.i赋值绝不会影响some2.i。
但是如果i是静态的。有
public class MyClass{
static int i;
}
则some1.i和some2.i指向的内存地址是同一个,虽然some1和some2的地址仍然是不同的。改动some1.i就会改动some2.i。
其实,我们在装入某个java类的时候,就已经把这个静态域给分配好地方了,即使我们不生成任何这个类的实例,我们也可以通过MyClass.i来访问这个域。
这个就是static的用处啦。
至于用static final来申明类似全程变量的东东,是编程方法上的问题,可以看看Effective Java之类的书。
 
第三个问题,你能不能把StudentData.txt的内容弄上来看看,还有具体报的错误。
and:偶可能不常来大富翁,如果有兴趣和我讨论的话,欢迎mail到andjia@citiz.net
 
接受答案了.
 
后退
顶部