PTA 实验二:JAVA语言基础刷题(二)--方法和数组

目录

7-1 作品评分

输入格式:

输出格式:

输入样例:

输出样例:

7-2 求某位同学的平均分

输入格式:

输出格式:

输入样例:

输出样例:

7-3 整理队伍

输入格式:

输出格式:

输入样例:

输出样例:

7-4 图片旋转

输入格式:

输出格式:

输入样例:

输出样例:

7-5 求前N天

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

7-6 求一元二次方程

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

7-7 编程题:选修课成绩统计问题

输入格式:

输出格式:

输入样例:

输出样例:


7-1 作品评分

输入格式:

输入数据包括两行: 第一行为n,表示n个评委,n>2。
第二行是n个评委的打分,分数之间有一个空格。打分是可以带有小数部分的。

输出格式:

输出平均分,结果保留两位小数。

输入样例:

6
10 9 8 7.9 9 9.5

输出样例:

8.88

我的代码:

import java.util.*;
import java.util.ArrayList;
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        float sum = 0;
        List<Float> nums = new ArrayList<>();
        String[] line = in.nextLine().split(" ");
        for (String str : line) {
            nums.add(Float.valueOf(str));
        }
        Collections.sort(nums);
        nums.remove(0);
        nums.remove(nums.size() - 1);
        for (double num : nums) {
            sum += num;
        }
        System.out.println(String.format("%.2f", sum / (n - 2)));
    }
}

7-2 求某位同学的平均分

 

教师需要计算不同年级、班级学生的平均分,因此需要在Main类中,写一个方法,帮教师可以求一个同学的,所有课程成绩的平均分,方法首部为:

public int getAvg(String name, int... scores)
在main方法中使用该方法求两个学生的平均分,第一个学生有3门课程,第二个学生有4门课程,分别输入某位学生的姓名,以及各门课程的分值,调用getAvg方法求得平均分并显示。

输入格式:

每一行输入某个学生的姓名,各门课程的分值

输出格式:

每一行输出一个学生的姓名和平均分

输入样例:

在这里给出一组输入。例如:

tom 78 99 98
mary 88 99 98 97

输出样例:

在这里给出相应的输出。例如:

tom:91
mary:95

我的代码:

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        String name1,name2;
        int score1,score2,score3,score4;
        int score_1,score_2,score_3,score_4;
        //同学1
        name1 = scanner.next();
        score1 = scanner.nextInt();
        score2 = scanner.nextInt();
        score3 = scanner.nextInt();
        //同学2
        name2 = scanner.next();
        score_1 = scanner.nextInt();
        score_2 = scanner.nextInt();
        score_3 = scanner.nextInt();
        score_4 = scanner.nextInt();
        //输出
        System.out.println(name1 + ":" + getAvg(name1,score1,score2,score3));
        System.out.println(name2 + ":" + getAvg(name2,score_1,score_2,score_3,score_4));
    }
    public static int getAvg(String name,int... scores){//求取平均分
        int sum = 0;//总和
        for(int i : scores){//遍历数组scores
            sum += i;
        }
        return sum/scores.length;//返回平均数
    }
}

7-3 整理队伍

 

体育课上,教数学的体育老师怎么看这个队伍都不大对劲,于是对队伍进行了调整。张三,你和李四换一下位置......经过几次调整,队伍终于变得有条不紊了。

输入格式:

输入第一行包括一个整数n,表示班级里总共有n个人(1<=n<=100);第二行包括n个整数,表示同学们原来的顺序。第三行包括一个数m(m>=0),表示体育老师总共进行了m次调换;下面包括m行,每行包括两个数x,y,表示x位置的同学和y位置的同学调换位置。

输出格式:

输出调换之后的队伍,每两个同学的编号之间有一个空格。

输入样例:

5 
1 2 3 4 5 
3 
1 2 
1 5
3 4 

输出样例:

5 1 4 3 2

我的代码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner s = new Scanner(System.in);
		//System.out.println("请输入人数:");
		int x = s.nextInt();
		int []locate = new int[x];
		//System.out.println("请输入位置");
		for(int i = 0; i < x; i++)
			{locate[i] = s.nextInt();}
		//System.out.println("请输入要修改位置的对数:");
		int m = s.nextInt();
		//System.out.println("请输入要修改的位置对:");
		for(int i = 1; i <= m; i++)  //每对元素进行交换
			{
			int a = s.nextInt();
			int b = s.nextInt();
			int c;
			c = locate[a-1];      
			locate[a-1] = locate[b-1];
			locate[b-1] = c;
			}
		//System.out.println("请输出排好的位置:");
		for(int i = 0; i < x-1; i++)
			System.out.printf("%d ",locate[i]);
		System.out.printf("%d",locate[x-1]); //最后一个元素后无空格
		
		s.close();
		
		}
}

7-4 图片旋转

 

二维图片由一个个像素点组成,目前灰度图像使用一个0-255之间的整数表示某个像素点的像素值。编程完成图片旋转控制程序。

本题目要求读入2个整数m和n(<=20),作为图片的长宽尺寸。输入1个整数r,作为旋转角度(只能输入90 180 -90中的一个,90表示图形向左旋转90度,-90表示图形向右旋转90度)。然后按照行列输入图片像素值,

输入格式:

第一行:2个整数m和n(<=20)

第二行:2个整数r(只能是90 180 -90中的一个,否则提示:angle data error

第三行以后:输入m行n列的整数数据,必须在0-255之间,否则提示:matrix data error

以上输入的都是整数,若有非整数的数据输入,统一提示:data type error

输出格式:

按要求旋转后的图片矩阵数据

输入样例:

在这里给出一组输入。例如:

3 4
90
1 2 3 4
5 6 7 8
9 10 11 12

输出样例:

在这里给出相应的输出。例如:

4 8 12
3 7 11
2 6 10
1 5 9

 我的代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        /*定义*/
        int n,m;
        int r;
        int i,j;
        
        n=in.nextInt();
        m=in.nextInt();
        r=in.nextInt();
        if(r!=90 && r!=-90 && r!=180){//注意:这条判断语句只能放在【输入r语句】的后面,否则程序不予通过。
            System.out.println("angle data error");
            System.exit(0);
        }
        int[][] arr= new int[n][m];
        
        /*输入*/
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                if(in.hasNextInt()){//注意:in.hasNextInt()只进行判断,不读取
                    arr[i][j]=in.nextInt();
                    if(arr[i][j]<0 || arr[i][j]>250){//判断是否超出范围
                        System.out.println("matrix data error");
                        System.exit(0);
                    }
                }else{
                    System.out.println("data type error");
                    System.exit(0);
                }
            }
        }
        
        /*计算并输出:三种情况*/
        if(r==90){
            for(i=m-1;i>=0;i--){
                for(j=0;j<n;j++){
                    if(j==n-1)System.out.print(arr[j][i]);//注意:注意格式,行末不要有空格
                    else System.out.print(arr[j][i]+" ");
                }
                System.out.println();
            }
        }else if(r==-90){
            for(i=0;i<m;i++){//4
                for(j=n-1;j>=0;j--){
                    if(j==0)System.out.print(arr[j][i]);
                    else System.out.print(arr[j][i]+" ");
                }
                System.out.println();
            }
        }else if(r==180){
            for(i=n-1;i>=0;i--){
                for(j=m-1;j>=0;j--){
                    if(j==0)System.out.print(arr[i][j]);
                    else System.out.print(arr[i][j]+" ");
                }
                System.out.println();
            }
        }
        in.close();
    }
}

7-5 求前N天

 

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“n days ago is:年-月-日”

输入样例1:

在这里给出一组输入。例如:

2018  6 19 8 

输出样例1:

在这里给出相应的输出。例如:

8 days ago is:2018-6-11

输入样例2:

在这里给出一组输入。例如:

2018  6 19 -8 

输出样例2:

在这里给出相应的输出。例如:

-8 days ago is:2018-6-27

 我的代码:

import java.util.Scanner;
public class Main {


	public static void main(String[] args)//主方法
	{
	
		Scanner in = new Scanner(System.in);
		int a,year,month,day;
		
		year = in.nextInt();
		month = in.nextInt();
		day = in.nextInt();
		a = in.nextInt();
		
		if(checkInputValidity ( year, month, day))
		{
			
			
			
			 nextDate( year, month,day, a);
		}
		else
		{
			System.out.println("Wrong Format");
		    System.exit(0);
		}
		
	}
	public static boolean isLeapYear (int year) //判断year是否为闰年,返回boolean类型 
	{
		if(year %400==0||(year%4==0&&year%100!=0))
			return true;
		else 
			return false;
	}


	public static boolean  checkInputValidity (int year,int month,int day)
	{
		
		int[] qz = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(year<1820||year>2020)
		    return false;
		else if(month<1||month>12)
		 return false;
		else if(day<1||day>31)
			return false;
		else
		{
			if(month==2&&isLeapYear(year))
			{
				if(day>qz[2]+1)
				{
					return false;
				}
				else
				{
					return true;
				}
			}
			else
			{
				if(day>qz[month])
				{
					return false;
				}
				else
				{
					return true;
				}
			}
		}
	}
	public static void nextDate(int year,int month,int day,int a)
	{
		int[] qz1 = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		int[] qz2= {0,31,29,31,30,31,30,31,31,30,31,30,31};
		if(a>0)
		{
			for(int i=0;i<a;i++)
			{
				
				if(isLeapYear(year))
				{
					if(day==1)
					{
						month--;
						if(month==0)
						{
							year--;
							month=12;
						}
						day=qz2[month];
					}
					else
						day--;
				}
				else
				{
					if(day==1)
					{
						month--;
						if(month==0)
						{
							year--;
							month=12;
						}
						day=qz1[month];
					}
					else
						day--;
				}
			}
		}
		else
		{
			for(int i=-a;i>0;i--)
			{
				if(isLeapYear(year))
				{
					if(day==qz2[month])
					{
						day=1;
						month++;
						if(month==13)
						{
							year++;
							month=1;
						}
						
					}
					else
						day++;
				}
				else
				{
					if(isLeapYear(year))
					{
						if(day==qz2[month])
						{
							day=1;
							month++;
							if(month==13)
							{
								year++;
								month=1;
							}
							
						}
						else
							day++;
					}
                    else
                    {
                        if(day==qz1[month])
						{
							day=1;
							month++;
							if(month==13)
							{
								year++;
								month=1;
							}
							
						}
						else
							day++;
                    }
				}
			}
	
		}
		System.out.println(a + " days ago is:" + year + "-" + month + "-" + day);
	}	
}


7-6 求一元二次方程

 

编程求解一元二次方程ax^2 + bx + c = 0的根,要求a、b、c从键盘输入。
要求Main类中必须有如下方法:

public static void main(String[] args);//主方法
public static int solveQuadratic(double[] eqn, double[] roots);//eqn存储输入的三个系数a、b、c,然后将两个实数根存储进roots中,该方法返回实数根的个数。

输入格式:

从键盘输入一元二次方程的三个系数的值(均为实型数),可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入数据非法时,输出“Wrong Format”
  2. 当无实数根时,输出如下字符串“The equation has no roots”;
  3. 当只有一个根时,输出如下格式“The equation has one root: 值”;(注意,输出的值必须保留四位小数,且值前面有一个空格)
  4. 当有两个根时,输入如下格式“The equation has two roots: 值1 and 值2”;(注意,输出的值必须保留四位小数,且值前面均有一个空格)

输入样例1:

在这里给出一组输入。例如:

2 6 -554

输出样例1:

在这里给出相应的输出。例如:

The equation has two roots: 15.2108 and -18.2108

输入样例2:

在这里给出一组输入。例如:

300.0 0.0 0.00

输出样例2:

在这里给出相应的输出。例如:

The equation has one root: 0.0000

 我的代码:

import java.util.*;
public class Main{
    public static void main(String[] args)//主方法
    {
        Scanner in = new Scanner(System.in);
        double[] eqn = new double[3];
        double[] roots = new double [2];
        int cnt=0;
        int i;
        
        for(i=0;i<3;i++){
            if(!(in.hasNextDouble())){
                System.out.println("Wrong Format");//判断是否是实型
                System.exit(0);
            }else{
                eqn[i]=in.nextDouble();
                if(eqn[0]==0){
                    System.out.println("Wrong Format");//判断是否是一元二次方程,即a不能为0
                    System.exit(0);
                }
            }
        }
        
        cnt=solveQuadratic(eqn,roots);
        if(cnt==0){
            System.out.println("The equation has no roots");
        }else if(cnt==1){
            System.out.printf("The equation has one root: %.4f",roots[0]);
        }else if(cnt==2){
            System.out.printf("The equation has two roots: %.4f and %.4f",roots[0],roots[1]);
        }
    }
    static int solveQuadratic(double[] eqn, double[] roots)//eqn存储输入的三个系数a、b、c,然后将两个实数根存储进roots中,该方法返回实数根的个数。
    {
            double  sq;
            double dt=eqn[1]*eqn[1]-4*eqn[0]*eqn[2];
            if(dt<0){
                return 0;
            }else if(dt==0){
                roots[0]=(-eqn[1])/(2*eqn[0]);
                if(roots[0]==0)roots[0]=0;
                return 1;
            }else if(dt>0){
                sq=Math.sqrt(dt);
                roots[0]=((-eqn[1])+sq)/(2*eqn[0]);
                roots[1]=((-eqn[1])-sq)/(2*eqn[0]);
                return 2;
           }
        return 0;
    }
}

7-7 编程题:选修课成绩统计问题

 

学生选修课成绩统计问题

选修课格次成绩使用字母表示,规则为:A=5,B=4,C=3,D=2,E=1

编写程序统计每个同学两门选修课的分数成绩

输入格式:多个学生的格次成绩使用西文逗号分开,整理为一行;每个学生姓名在前面,格次成绩在后,之间均使用空格分开

数据统计:将每个学生的两门课格次成绩,转换为分数成绩并求和

输出格式:结果为一行,姓名在前总分在后,之间空格分开;不同学生的记录之间使用西文逗号分开,注意最后的记录末尾没有逗号

输入格式:

多个学生的格次成绩使用西文逗号分开,整理为一行;每个学生姓名在前面,格次成绩在后,之间均使用空格分开

输出格式:

结果为一行,姓名在前总分在后,之间空格分开;不同学生的记录之间使用西文逗号分开,注意最后的记录末尾没有逗号

输入样例:

在这里给出一组输入。例如:

zs A B,ls A C,ww B C

输出样例:

在这里给出相应的输出。例如:

zs 9,ls 8,ww 7

  我的代码:

import java.util.Scanner;
public class Main 
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		String str[] = sc.nextLine().split(",");//把单个学生分离出来
		String stu[][] = new String[str.length][3];//二位数组存放学生与成绩

		for (int i = 0; i < str.length; i++) 
		{
			stu[i] = str[i].split(" ");//分离成绩
		}
		
		for (int i = 0; i < str.length; i++) //遍历计算成绩
		{
			int grade = 0;
			for (int j = 0; j < 3; j++) 
			{
			    if(stu[i][j].equals("A")) {grade+=5;}                
			    else if(stu[i][j].equals("B")) {grade+=4;}                
			    else if(stu[i][j].equals("C")) {grade+=3;}                
			    else if(stu[i][j].equals("D")) {grade+=2;}                
			    else if(stu[i][j].equals("E")) {grade+=1;} 
			    else {grade=grade+0;} 
			}
			if (i == str.length - 1)
				System.out.println(stu[i][0] + " " + grade);
			else
				System.out.print(stu[i][0] + " " + grade + ",");
		}
	}
}

我们下个文章见~

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值