Java笔记3(泛型、异常、成绩评分程序)

[color=blue][size=x-large]文件结构 [/size][/color]
[img]http://images.cnblogs.com/cnblogs_com/luowei010101/201106/201106071714569221.png[/img]
[color=blue][size=x-large]泛型与异常 [/size][/color]
[img]http://images.cnblogs.com/cnblogs_com/luowei010101/201106/201106071714587420.png[/img]
[img]http://images.cnblogs.com/cnblogs_com/luowei010101/201106/201106071714595402.png[/img]
[color=blue][size=x-large]异常[/size][/color]
[img]http://images.cnblogs.com/cnblogs_com/luowei010101/201106/201106071714599796.png[/img]
Class7b / com.test1 / Test.java 

/*
* 功能:泛型的必要性
*/

package com.test1;

import java.util.ArrayList;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
//泛型
//System.out.println("a="+(1>>>2));
ArrayList<Dog> al=new ArrayList<Dog>();//将ArrayList转成对Dog的泛型
//创建一只狗
Dog dog1=new Dog();
//放入到集合
al.add(dog1);
//取出
//Dog temp=(Dog)al.get(0);
//Cat temp2=(Cat)al.get(0);//类型转换错误
Dog temp=al.get(0);//因为前定义了ArrayList对Dog泛型,所以不报错
}

}

class Dog
{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}

class Cat
{
private String color;
private int age;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Class7b / com.test1 / Test2.java

/*
* java的反射机制,泛型的经典应用
*/

package com.test1;

import java.lang.reflect.Method;

public class Test2 {

/**
* @param args
*/
public static void main(String[] args) {
//
Gen<String> gen1=new Gen<String>("aaa");
gen1.showTypeName(gen1);
Gen<Integer> gen2=new Gen<Integer>(1);
gen2.showTypeName(gen2);

Gen<Bird> gen3=new Gen<Bird>(new Bird());
gen3.showTypeName(gen3);
}

}

//定义一个类
class Gen<T> //定义的一种未知类型T,即泛型
{
private T o;//用泛型定义一个变量(或对象)
//构造函数
public Gen(T a)
{
o=a;
}

//得到T的类型名称
public void showTypeName(Gen<T> obj)//参数是泛型
{
System.out.println("类型是:"+o.getClass().getName());
//通过反射机制,可以得到T这个类型的很多信息
Method[] m=o.getClass().getDeclaredMethods();//得到某个类型的函数
//打印
for(int i=0;i<m.length;i++)
{
System.out.println(m[i].getName());
}
}
}

//定义一个Bird
class Bird
{
public void test1()
{
System.out.println("aa");
}
public void count(int a,int b)
{
System.out.println(a+b);
}
}

/*
*泛型的优点
*1.类型安全
*2.向后兼容
*3. 层次清晰
*4.性能较高,用Gj编写的代码可以为java编译器和虚拟机带来更多的类型信息。
*
*泛型主要解决安全和代码重用的问题
*在没有泛型之前,通过对类型Object的引用来实现参数的"任意化","任意化"
*带来的缺点是要做显式的类型转换,而这种转换是要求开发者对实际参数类型
*可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示
*错误 ,在运行时才出现异常,这是一个安全隐患。
*泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐
*式的,提高代码的重用率。
*/
Class7b / com.test1 / Test3.java

/*
* 异常
*/

package com.test1;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Test3 {

/**
* @param args
*/
public static void main(String[] args) {
//检查异常
//1.打开文件
FileReader fr=null;
try {
fr=new FileReader("d:\\1.txt");
//在出现异常的地方,就终止执行代码,然后进入到catch
System.out.println("继续!");
Socket s=new Socket("192.168.111.111",78);
} catch (Exception e1) {//采用Exception可以捕获所有异常,因为它是父类
//把异常的信息输出,利于排除bug
System.out.println("\nException 内部");
System.out.println("message:="+e1.getMessage());
//System.exit(-1); //退出JVM
e1.printStackTrace();
//处理
}
finally //这个语句块,不管有没有异常都会执行
{
System.out.println("\n进入finally!");
//一般说,把需要关闭的资源[文件,连接,内存....]
if(fr!=null)
{
try {
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

//2.连接一个192.168.12.12 ip的端口号4567
try {
Socket s=new Socket("192.168.1.23",78);
} catch (UnknownHostException e) {
System.out.println("\nUnknownHostException 内部");
e.printStackTrace();
} catch (IOException e) {
//如果有多个catch语句,则进入匹配异常的那个
System.out.println("\nIOException 内部");
e.printStackTrace();
}

//3.运行异常
try
{
int a=4/0;
}catch(ArithmeticException e)
{
e.printStackTrace();
}
System.out.println("ok1");
}
}
Class7b / com.test1 / Test4.java

package com.test1;

import java.io.FileNotFoundException;
import java.io.FileReader;

public class Test4 {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//异常抛给JVM去处理
//创建一个Father
Father father=new Father();
father.test1();
}

}

class Father
{
private Son son=null;
public Father()
{
son=new Son();
}
public void test1() throws Exception
{
//异常抛给调用者(main函数)去处理
System.out.println("1");
/*
try {
son.test2();
} catch (Exception e) {
System.out.println("\n父亲在处理!");
e.printStackTrace();
}
*/
son.test2();
}
}

class Son
{
public void test2() throws FileNotFoundException
{
//异常抛给调用者(Father.test1函数)去处理
FileReader fr=null;
fr=new FileReader("d:\\dd.txt");
}
}
两个练习

HomeWork / com.test1 / Test1.java

/*
* 跳水比赛,8个评委打分。运动员的成绩是8个成绩取掉一个最高分,
* 去掉一个最低分,剩下的6个分数的平均分就是最后得分。使用一维
* 数组实现打分功能。
* 找出最佳与最差评委
*/

package com.test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {
//
Judge judge=new Judge();
System.out.println("平均分是:"+judge.lastFen());
System.out.println("最差的裁判是:"+(judge.getWorst()+1));
}

}

class Judge
{
//定义可以存放8个小数的数组
float fens[]=null;
int size=3;
//构造函数
public Judge()
{
fens=new float[size];
//初始化
InputStreamReader isr=new InputStreamReader(System.in);//读取控制台数据存到输入流
BufferedReader br=new BufferedReader(isr);//将数据从输入流存到Buf流中
try {
for(int i=0;i<fens.length;i++)
{
System.out.println("请输入第"+(i+1)+"裁判的分数:");
fens[i]=Float.parseFloat(br.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
finally //关闭IO流
{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//1.去掉最低分(目的找到最低分的下标)
public int getLowFenIndex()
{
//选择法
//认为第一个就是最低
float minFen=fens[0];
int minIndex=0;
for(int i=1;i<fens.length;i++)
{
if(minFen>fens[i]);
{
//修改最低分
minFen=fens[i];
minIndex=i;
}
}
return minIndex;
}
//2.去掉最高分(目的找到最高分的下标)
//2.去掉最高分(目的找到最高分的下标)
public int getHighFenIndex()
{
//选择法
//认为第一个就是最高
float maxFen=fens[0];
int maxIndex=0;
for(int i=1;i<fens.length;i++)
{
if(maxFen<fens[i])
{
//修改最高分
maxFen=fens[i];
maxIndex=i;
}
}
return maxIndex;
}
//3.得到平均分
//3.得到运动员的最后得分
public float lastFen()
{
float allFen=0;
int minIndex=this.getLowFenIndex();
int maxIndex=this.getHighFenIndex();
for(int i=0;i<fens.length;i++)
{
if(i!=minIndex&&i!=maxIndex)
{
allFen+=fens[i];
}
}
return allFen/(fens.length-2);
}
//4.得到最差评委
public int getWorst()
{
//假设第一个评委是最差的
int worstIndex=0;
float tempCai=0f;
float cai=Math.abs(fens[0]-lastFen());
for(int i=1;i<fens.length;i++)
{
tempCai=Math.abs(fens[0]-lastFen());
if(cai<tempCai)
{
worstIndex=i;
cai=tempCai;
}
}
return worstIndex;
}
}
HomeWork / com.test1 / Test2.java

/*
* 三个同学考试,共考三门课:语文、数学、英语。使用二维整数
* 数组存放三个同学的学号和所有科目的考试成绩。如下表:
* 学号 语文 数学 英语
* 1002 78 92 76
* 1003 67 88 80
* 1007 90 95 80
*/

package com.test1;

public class Test2 {

/**
* @param args
*/
public static void main(String[] args) {
//定义一个二维数组
int[][] stus=
{{1002,78,23,56},{1003,23,89,34},{1007,78,89,90}};
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
if(i==0&&j==0)
{
System.out.println("学号\t语文\t数学\t英语\t");
}
System.out.print(stus[i][j]+"\t");
}
System.out.print("\n");
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM/ICPC比赛成绩会按照一定的规则计算各位参赛者的名次并实时显示排行榜,计算规则主要参考解题的数量及罚时,解题数量越多,罚时越少,则排名越高。 解题数量很容易计算,只需考察比赛中标记为“Accepted”的题数即可。罚时计算则相对复杂,对于提交到竞赛系统中的每道题目,系统会给出一个罚时,为从比赛开始到该题提交的代码第一次被“Accepted”的时间。请注意,只是第一次“Accepted”。对于“Accepted”之前的每次提交,都有20分钟的罚时,但如果该题目最终未解出,则不计罚时。 先在有一个比赛的题目通过情况记录,请生成该比赛的排行榜。 示例输入: 2008-04-25 18:00:00 2008-04-25 23:30:00 1000 1001 1002 1003 1004 38 602203621 1002 Accepted 756K 30MS C++ 2008-04-25 18:04:59 37 liheyuan 1002 Wrong_Answer 768K 10MS C++ 2008-04-25 18:28:05 36 ftest 1000 Accepted 888K 10MS C++ 2008-04-25 21:30:32 35 ftest 1000 Accepted 904K 10MS C++ 2008-04-25 21:30:55 34 gaojianwei 1000 Accepted 768K 10MS C 2008-04-25 22:15:58 33 gaojianwei 1001 Wrong_Answer 904K 10MS C 2008-04-25 22:18:01 32 gaojianwei 1004 Accepted 768K 10MS C 2008-04-25 22:24:23 31 lzz 1000 Accepted 904K 10MS C++ 2008-04-25 23:29:27 30 lzz 1001 Wrong_Answer 904K 10MS C++ 2008-04-25 23:30:17 示例输出: Rank Name Solved 1000 1001 1002 1003 1004 Penalty 1 gaojianwei 2 4:15:58 -1 0 0 4:24:23 8:40:21 2 602203621 1 0 0 0:04:59 0 0 0:04:59 3 ftest 1 3:30:32 0 0 0 0 3:30:32 4 lzz 1 5:29:27 0 0 0 0 5:29:27 5 liheyuan 0 0 0 -1 0 0 0:00:00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值