目录
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的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“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中,该方法返回实数根的个数。
输入格式:
从键盘输入一元二次方程的三个系数的值(均为实型数),可以用一个或多个空格或回车分隔。
输出格式:
- 当输入数据非法时,输出“Wrong Format”
- 当无实数根时,输出如下字符串“The equation has no roots”;
- 当只有一个根时,输出如下格式“The equation has one root: 值”;(注意,输出的值必须保留四位小数,且值前面有一个空格)
- 当有两个根时,输入如下格式“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 + ",");
}
}
}
我们下个文章见~