一、实验目的
掌握 Java 语言的基本语法、基本数据类型的使用方法,掌握从键盘 输入基本类型的数据,熟练运用分支、循环等语句控制程序流程。
二、实验内容
1、编写一个 Java 应用程序,用户从键盘输入十名学生的信息,至少包括姓名、年龄、出生年月日、java课程实验成绩,成绩使用浮点数,年龄使用整型,程序将输出年龄、java 课程实验成绩的平均值。提示:Scanner 对象调用nextDouble()或 nextFloat()可以获取用户从键盘输入的浮点数。
2、使用 Arrays 类实现数组排序:使用java.util 包中的 Arrays 类的类方法 public static void sort(double a[])可以把参数 a 指定的 double 类型数组按升序排序;public static void sort(double a[], int start , int end)可以把参数a 指定的 double 类型数组中从位置 start 到 end位置的值按升序排序。给定数组 int a[]={12,34,9,-23,45,6,90,123,19,45,34};
从键盘读入一个整数,使用折半查找判断该整数是否在这个数组中,并将结果输出。*3、输出 100~200 之间的所有素数。
*4、采用 for 循环求 1 至 1000 之内的所有“完全数”。所谓“完全数”是指一个数,恰好等于它的因子之和。例如,6 是一个完全数,因为 6 的因子为 1、2、3,而6=1+2+3。
*5、已知 XYZ+YZZ=532,其中 X、Y 和 Z为数字,编程求出 X,Y 和 Z 的 值。
三、实验程序源代码
1、
import java.util.Scanner;
class Student{
public static void main(String args[])
{
int n=10;
int i;
String name[]=new String[n];
int age[]=new int[n];
double score[]=new double[n];
String birthday[]=new String[n];
int total_age=0;
double total_score=0.0;
int average_age=0;
double average_score=0.0;
Scanner stu=new Scanner(System.in);
System.out.println("请按顺序输入学生信息:姓名 年龄 Java实验成绩 出生日期");
for(i=0;i<n;i++){
name[i]=stu.next();
age[i]=stu.nextInt();
score[i]=stu.nextDouble();
birthday[i]=stu.next();
total_age+=age[i];
total_score+=score[i];
}
average_age=total_age/n;
average_score=total_score/n;
System.out.println("平均年龄为:"+average_age);
System.out.println("平均成绩为:"+average_score);
stu.close();
}
}
2、
import java.util.Arrays;
import java.util.Scanner;
class Arr{
//折半查找法(二分法)
public static int search(int A[],int n,int key){
int low=0,high=n-1,mid;
if(A[low]==key)//如果关键字key与第一个数据相等,直接跳出输出low
return low;
if(A[high]==key)//如果关键字key与最后一个数据相等,直接跳出输出high
return high;
else{
mid=(low+high)/2;
while(low<=high){
if(A[mid]==key)
return mid;
if(A[mid]<key)
low=mid+1;
else
high=mid-1;
}
return -1;//实际上没有得到-1的输出,只是给方法search一个整型数据的返回值而已,把没有输出看作是数据不存在!
}
}
public static void main(String args[]){
int n;
Scanner scan=new Scanner(System.in);
System.out.print("请输入数组长度:");
n=scan.nextInt();
int a[]=new int[n];
System.out.print("请输入数组元素:");
for(int i=0;i<n;i++){
a[i]=scan.nextInt();
}
Arrays.sort(a);
System.out.print("输出排序后的数组:");
System.out.println(Arrays.toString(a));
int key;
System.out.print("请输入查询的数据:");
key=scan.nextInt();
System.out.print("输出查询结果的位置或者查询失败(-1):");
System.out.println(search(a,n,key));
scan.close();
}
}
3、
class Prime{
public static void main(String args[]){
boolean p=false;
int i,j;
for(i=100;i<201;i++){
p=false;
for(j=2;j<i;j++){
if(i%j==0){
p=true;
break;
}
}
if(!p){
System.out.print(i+" ");//输出素数
}
}
}
}
4、
class Perfect{
public static void main(String args[]){
for(int i=1;i<1001;i++){
int a=0;
for(int j=1;j<i;j++){
if(i%j==0){
a+=j;
}
}
if(a==i){
System.out.println(i+"是完全数");
}
}
}
}
5、
import java.util.Scanner;
class XYZ{
public static void main(String args[]){
int i,j,k;
int n;
Scanner scan=new Scanner(System.in);
System.out.print("输入要计算的数据:");
n=scan.nextInt();
for(i=1;i<10;i++){
for(j=1;j<10;j++){
for(k=0;k<10;k++){
if(n==k+k+(j+k)*10+(i+j)*100){
System.out.println("输出:X="+i+",Y="+j+",Z="+k);
}
}
}
}
}
}
四、实验结果
1、
2、
(1)题目中所给数据:
(2)自己输入的数据:
(3)查询数据首(low)的数据,直接跳出,返回low:
(4)查询数据尾(high)的数据,直接跳出,返回high:
(5)查询重复数据,返回第一个重复数据的位置:
3、
纵向输出: 语句改为System.out.println(i);
横向输出: 语句改为System.out.print(i+” “);
4、
5、
(1)输入本题数据:
(2)输入其他数据:
但是显然并不是输入所有数据都有结果,有些数据不满足表达式就没有输出:
五、实验总结分析
1、在键盘中输入学生信息时出现了以下问题:
显示是我输错了第二个数据的数据类型,但是实际我没有输错。 后来我发现应该一行一行输入才能有正常的输出结果:
Scanner输出是先输入在显示。在异常处理的程序中试验了一下发现也是这样:
2、动态创建字符串数组和一维数组:
int n=10;//维度
String arr[]=new String[n];
int s[]=new int[n];
Double m[]=new double[n];3、方法只能声明局部变量,对于局部变量不能使用访问权限(public、private、protected)来修饰。
4、在试验Array数组复制的用法过程中,
我误写了整型数据09,出现了以下错误:
原来Java认为以数字0开头的整数是八进制数,只允许0~7的数字,因此09是无效的。 改正之后得到正确结果:
5、查询数组中是否存在我输入的数据时,其他情况都没有问题,但是当我输入不存在的数据时,原本想要输出整型数据-1,但实际上却没有输出结果,我没有想到好的解决办法,因此将不输出结果的情况看作是数据在数组中不存在。
6、在输出100-200之间的素数时,我发现输出的语句不能放在最里面的循环语句内,否则输出就会重复多次,不利于查看,因此把输出语句放在第一层循环内直接输出一遍素数。