数组习题的整理
1.数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”,不包含就打印出“No”。
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
String [] name =new String[10];
for(int i=0;i< name.length;i++){
System.out.println("请输入一个单词");
Scanner input = new Scanner(System.in);
name[i]=input.next();
System.out.println("第"+(i+1)+"个单词为"+name[i]);
}
// String []name={"ssd","ffs","ssss"};
System.out.println("请输入一个单词");
Scanner input = new Scanner(System.in);
String danci = input.next();
for(int j=0;j<name.length;j++){
if(danci.equals(name[j])){
System.out.println("YES");
}
}
System.out.println("NO");
}
}
输出结果
上面代码不对;跑出来YES但是后面还会有NO
如下所示
请输入一个单词
1
第1个单词为1
请输入一个单词
2
第2个单词为2
请输入一个单词
3
第3个单词为3
请输入一个单词
4
第4个单词为4
请输入一个单词
5
第5个单词为5
请输入一个单词
6
第6个单词为6
请输入一个单词
7
第7个单词为7
请输入一个单词
8
第8个单词为8
请输入一个单词
9
第9个单词为9
请输入一个单词
10
第10个单词为10
请输入一个单词
5
YES
NO
Process finished with exit code 0
刚才我又拿去跑了一遍发现是错的;经过查找发现BUG存在于最后的YES于NO的判断
遍历比较完后不能直接输出;否则会出现上面是对的但是跳出来了还要输出依次NO
所以我在这里加上了计数器进行判断,遍历一次就加上一;直到符合条件则输出NO
这是错误的案例,所以修改后为这样
System.out.println("请输入一个单词");
Scanner input = new Scanner(System.in);
String danci = input.next();
int count=0;
for(int j=0;j<name.length;j++){
if(danci.equals(name[j])){
System.out.println("YES");
break;
}
count++;
if(count==10){
System.out.println("NO");
}
}
System.out.println("程序结束");
思路
首先将 输入的单词都放进数组里面,然后再用FOR循环遍历比较
是则输出YES 否则则输出NO
2.合并数组操作:现有如下一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: int newArr [] ={1,3,4,5,6,6,5,4,7,6,7,5}
import java.util.Arrays;
public class Test6 {
public static void main(String[] args) {
int count=0;
int []oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
for(int i=0;i<oldArr.length;i++){
if(oldArr[i]!=0){
count++;
}
}
int []count_s=new int[count];
int m=0;
for(int j=0;j< oldArr.length;j++){
if(oldArr[j]!=0){
count_s[m]=oldArr[j];
m++;
}
}
// Arrays.sort(count_s);
for (int k=0;k<count_s.length;k++){
System.out.print(count_s[k]+" ");
}
}
}
输出结果
1 3 4 5 6 6 5 4 7 6 7 5
Process finished with exit code 0
思路
1先用FOR遍历出来不为0的元素有多少个作为新数组元素数量定义
2再次遍历,将不为0的元素依次放入新的数组(其中使用到m作为计数器来依次赋予新数组下标)
3遍历输出新数组,如果需要排序那就来个SORT
3. 题目:输入某年某月某日,判断这一天是这一年的第几天?
分析:以3月5日为例,先把前两个月的加起来,然后再加上5天即本年第几天,特殊情况,闰年且输入月份大于3需考虑多加一天。可定义数组存储1-12月各月天数。
public class Test8 {
public static void main(String[] args) {
int []mouthDay={31,28,31,30,31,30,31,31,30,31,30,31};
System.out.println("请输入今天的年份:");
Scanner input = new Scanner(System.in);
int year = input.nextInt();//String类型后面不用写
System.out.println("请输入今天的月份");
int mouth = input.nextInt();
System.out.println("请输入今天的日子");
int day = input.nextInt();
int tianshu=0;
int sum=0;
if((year%100!=0)&&(year%4==0)||(year%400==0)){
System.out.println("该年为闰年");
if(mouth>=3){
for(int k=0;k<mouth-1;k++){
sum+=mouthDay[k];
}tianshu=sum+day+1;
System.out.println("现在是今年的第"+tianshu+"天");
}
else{
for(int m=0;m<mouth-1;m++) {
sum += mouthDay[m];
}tianshu=sum+day;
System.out.println("现在是今年的第"+tianshu+"天");
}
}else{
System.out.println("该年不为闰年");
for(int j=0;j<mouth-1;j++) {
sum += mouthDay[j];
}tianshu=sum+day;
System.out.println("现在是今年的第"+tianshu+"天");
}
}
}
输出结果
请输入今天的年份:
2000
请输入今天的月份
3
请输入今天的日子
1
该年为闰年
现在是今年的第61天
请输入今天的年份:
1999
请输入今天的月份
1
请输入今天的日子
1
该年不为闰年
现在是今年的第1天
思路整理
1先筛选出闰年的条件
2判断出闰年且为三月份以上则加一天 ,否则不加
3跳出判断,不为闰年则为正常计算,将数组里对应月份和天数加起来即可
总结
写的时候细心,注意下标的书写,否则可能出现溢出
数组中Arrays类的应用
只能说十分好用
调用方法为 Arrays.sort( );
等等。。
============================================================================
四.
m 个人的成绩存放在 score 数组中,
请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,
将低于平均分的人数放在 below 所指的数组中
import java.util.Arrays;
import java.util.Scanner;
/**
* @AUTHOR : FKU! JAVA
* @DATE 2022/7/2 17:20
* @TODO
*
*
* * m 个人的成绩存放在 score 数组中,
* * 请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,
* * 将低于平均分的人数放在 below 所指的数组中
*/
public class TTT {
public static void main(String[] args) {
int sum=0;
int avg=0;
System.out.println("请输入所需输入成绩的人数:");
Scanner input = new Scanner(System.in);
int m = input.nextInt();
int[] score = new int[m];
for (int i = 0; i < score.length; i++) {
System.out.print("第"+(i+1)+"个学生的成绩为");
int scores = input.nextInt();
System.out.println(scores);
score [i]=scores;
sum+=scores;
}
avg=sum/m;
System.out.println("========================================");
System.out.println("score[]="+Arrays.toString(score));
System.out.println("平均分为:"+avg);
int [] back=new int[5];
System.out.println(fun(score,back,avg));
int [] newback =Arrays.copyOf(back,fun(score,back,avg));
System.out.println(Arrays.toString(newback));
}
public static int fun(int[]arrBack,int[]back_s,int avg ) {
int count_k=0;
for (int k = 0; k < arrBack.length; k++) {
if (arrBack[k] < avg) {
back_s[count_k]=arrBack[k];
count_k++;
}
}
return count_k;
}
}
思路
1分为两个部分来写
第一部分主函数负责来将数据接受并放入一个数组;计算出平均分;将这些作为参数传入算法中
第二部分写FUN函数来实现将低于平均分的人数 和 他们的分数放入的数组作为返回数据;
最后将返回的数组用新的数组back来接受数据,因为刚返回数据并不知道为多少,我们大可将他定义为和score一样多的元素,接下来只需要在接到数据后再次使用copy of功能将数组的长度修改即可
输出结果
请输入所需输入成绩的人数:
6
第1个学生的成绩为20
20
第2个学生的成绩为30
30
第3个学生的成绩为40
40
第4个学生的成绩为50
50
第5个学生的成绩为60
60
第6个学生的成绩为70
70
========================================
score[]=[20, 30, 40, 50, 60, 70]
平均分为:45
3
[20, 30, 40]
Process finished with exit code 0