Java编程练习
1、字符串的拼接。从键盘输入两个字符串,将两个
字符串拼接。
程序示例代码:
package day0911;
import java.util.Scanner;
public class Pinjie {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
String s1 = s.next();
System.out.println("请输入第二个字符串:");
String s2 = s.next();
System.out.println("两个字符串合并后:\n"+s1+s2);
}
}
运行结果:
分析:
Eclipse编程实现字符串的拼接,实际上是比较容易的,从键盘输入任
意的两个字符串,对这两个字符串进行“+”运算,即可实现两个字符串
的拼接。
2、从键盘读取7个1-50之间的整数值,每输入
一个值,打印出该值个“*”。
程序示例代码:
import java.util.Scanner;
public class TestPrint {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个数:");
int s1 = s.nextInt();
System.out.println("请输入第二个数:");
int s2 = s.nextInt();
System.out.println("请输入第三个数:");
int s3 = s.nextInt();
System.out.println("请输入第四个数:");
int s4 = s.nextInt();
System.out.println("请输入第五个数:");
int s5 = s.nextInt();
System.out.println("请输入第六个数:");
int s6 = s.nextInt();
System.out.println("请输入第七个数:");
int s7 = s.nextInt();
for(int i = 0; i < s1; i++){
System.out.print("*");
}
System.out.println();
for(int i = 0; i < s2; i++){
System.out.print("*");
}
System.out.println();
for(int i = 0; i < s3; i++){
System.out.print("*");
}
System.out.println();
for(int i = 0; i < s4; i++){
System.out.print("*");
}
System.out.println();
for(int i = 0; i < s5; i++){
System.out.print("*");
}
System.out.println();
for(int i = 0; i < s6; i++){
System.out.print("*");
}
System.out.println();
for(int i = 0; i < s7; i++){
System.out.print("*");
}
}
}
运行结果:
3、从键盘输入一个奇数,作为行数,打印出如下效
果图,中间一行最长;前半部分每行比前一行多两
个,第一行有一个;后半部分,每行比前半部分少
两个,最后一行有一个。
*
***
*****
*******
*********
*******
*****
***
*
程序示例代码:
import java.util.Scanner;
public class Xinghao {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入一个数:");
int n = s.nextInt();
if(n % 2 == 0){
System.out.println("请输入奇数!");
}else{
for(int i = 1; i <= (n-1)/2+1; i ++){
for(int j = 0; j < 2 * i -1;j ++){
System.out.print("* ");
}
System.out.println();
}
for(int i = (n-1)/2 + 2; i <= n; i ++){
for(int j = 0; j < 2 * (n-i+1) - 1; j++){
System.out.print("* ");
}
System.out.println();
}
}
}
}
运行结果:
分析:
在本程序中,前半部分比较容易计算,每行的星号个数为:2*行数-1,
行数:从第一行到(行数-1)/2+1,即:
(int i = 1; i <= (n-1)/2+1; i ++)
每行星号的个数为:(2*行数)-1;
后半部分,行数从(行数-1)/2+2开始,直到第 n行,即:
(int i = (n-1)/2 + 2; i <= n; i ++)
每行的星号个数为: 2 * (n-i+1) - 1,(或者 2 * (n-i)+1)
后半部分每行星号的个数可以这样计算:
最后一行为一个,倒数第二行为三个,......以此类推,
行号 个数 计算 归类
n(i)-------1---(2*1-1)(或2*0+1)----2*(n-i+1)-1(或2*(n-i)+1)
n-1(i-1)---3---(2*2-1)(或2*0+1)----2*(n-i+1)-1(或2*(n-i)+1)
n-2(i-2)---5---(2*3-1)(或2*0+1)----2*(n-i+1)-1(或2*(n-i)+1)
......
其中i表示第i行
故求得后半部分每行星号的个数为。
4、某个公司采用公用电话传递数据,数据是四位的
整数,在传递过程中是加密的,加密规则如下:每
位数字都加上5,然后用和除以10的余数代替该数字,
再将第一位和第四位交换,第二位和第三位交换。
示例代码:
package day0911;
import java.util.Scanner;
public class TestCode {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个数:");
int a1 = s.nextInt();
int a11 = a1 +5;
a11 = a11 % 10;
System.out.println("请输入第二个数:");
int a2 = s.nextInt();
int a22 = a2 + 5;
a22 = a22 % 10;
System.out.println("请输入第三个数:");
int a3 = s.nextInt();
int a33 = a3 + 5;
a33 = a33 % 10;
System.out.println("请输入第四个数:");
int a4 = s.nextInt();
int a44 = a4 + 5;
a44 = a44 % 10;
System.out.println("加密后的数为:" + a44 + a33 + a22 + a11);
}
}
运行结果:
验证:
原数: 7 4 5 5
+5:12 9 10 10
%10: 2 9 0 0 (除以10的余数)
交换: 0 0 9 2
注意:在该程序中,加密完成后需要输出加密后的四位数,刚开始我
习惯拿千位数乘1000,百位数成100,十位数乘10,最后再将其相加,
运行程序后,发现了一个问题:如果有哪个数算得的最后结果为0,则
这个数将会被忽略,导致错误的发生。
如将上述程序代码中最后一条输入语句改成如下语句:
int b = a44 * 1000 + a33 * 100 + a22 * 10 + a11 * 1;
System.out.println("加密后的数为:" + b);
其运行结果为:
分析:
可以发现其结果不是四位数,而是两位数。
后来经过思考,想到整型变量在输出语句中运用“+”运算符的两种结果
情况:
①如果“+”运算不加(),则只会将这两个整型变量值拼接在一起,而
不会执行加法运算。
②“+”运算加(),才会认为是需要将两个整型变量值进行加法运算。
故将两条有问题的语句改成下面的输出语句:
System.out.println("加密后的数为:" + a44 + a33 + a22 + a11);
再输出语句中直接将数字交换即可。
5、计算一个字符串中某个子串出现的次数
import java.util.Scanner;
public class TestString {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = s.next();
System.out.println("请输入要查找的子串:");
String st1 = s.next();
int count = 0;
boolean flag = false;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == st1.charAt(0)) {
for (int j = 0; j < st1.length(); j++) {
if (str.charAt(j) == st1.charAt(j)) {
flag = true;
} else {
flag = false;
break;
}
}
if (flag) {
count++;
}
}
}
System.out.println("字符串中子串的个数为:" + count);
}
}
程序运行结果:
分析:
在这个程序中,我认为比较困难的事,怎样循环遍历查找字符
串中与子串匹配的子串。
这个程序,就循环这儿让我思考了老一会儿,考虑思路:
①外层循环:原字符串
在原字符串中的字符依次与子串的第一个字符进行比较:
定义一个boolean型变量,用于判断是否相等,初始值为false;
②内层循环:子串
A:若相等,将原字符串中与子串第一个字符相等的字符后面的字符依
次与子串的第二个、第三个…字符进行比较,直到子串的最后一个字
符;若都相等,boolean赋值true,则计数器加一;
B:若不相等,boolean值不变,跳出这层循环,到外层循环,接着比
较原字符串的下一个字符与子串的第一个字符。这里指原字符串的下
一个字符,即外层循环继续执行。
6、有五个学生,每个学生有3门课的成绩,从键盘
输入以上数据(包括学生号,姓名,三门课
成绩),计算出平均成绩,况原有的数据和计算出
的平均分数存放在磁盘文件”stud”中。
学生类Student:根据题目需求在学生类中定义学生的属性和相应的方
法,以便测试主类使用。
public class Student {
private int no;
private String name;
private double[][] grade;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int no, String name, double grade[][]) {
super();
this.no = no;
this.name = name;
this.grade = grade;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double[][] getGrade() {
return grade;
}
public void setGrade(double[][] grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student [no=" + no + ", name=" + name + ", grade=" + grade + "]";
}
}
学生测试类TestStu:完成题目中要求。
import java.util.Scanner;
public class TestStu {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Student[] stu = new Student[5];
double[][] grade = new double[5][3];
for(int i = 0; i < 5; i++){
System.out.println("第" + (i+1) + "个学生的信息:");
System.out.println("请输入学生学号:");
int no = s.nextInt();
System.out.println("请输入学生姓名:");
String name = s.next();
System.out.println("请输入学生的成绩:");
for(int j = 0; j < 3; j++){
grade[i][j] = s.nextDouble();
}
stu[i] = new Student(no, name, grade);
}
for(int i = 0; i < stu.length; i++){
double g = 0;
System.out.println("第" + (i+1) + "个学生的信息为:");
System.out.print("学号:" + stu[i].getNo() + ",姓名:" + stu[i].getName() + ",成绩:" );
for(int j = 0; j < 3; j++){
System.out.print(grade[i][j] + ",");
g = g + grade[i][j];
}
System.out.println("平均成绩为:" + g/3);
}
}
}
运行结果:
分析:
定义Student[]类型的引用数组,其中成绩也为一个数组,为了实现题
目要求,可以将成绩定义为一个二维数组,每个学生有三个成绩:
for(int j = 0; j < 3; j++){
grade[i][j] = s.nextDouble();
}
grade[i][j]表示第[i]个学生的第[j]门课的成绩。
将每个学生的三个成绩,放在数组中,输出时循环输出三个成绩,并
求出三个成绩的总和。
for(int j = 0; j < 3; j++){
System.out.print(grade[i][j] + ",");
g = g + grade[i][j];
}
以上程序只是自己的一种解决办法,如有更好的方法,还请赐教。