本周学习了Java的基本语法:
标识符、变量类型、关键字
包括几种结构:顺序结构、选择结构、循环结构。
选择结构的if{}else{}和switch多分支选择结构。
循环结构的while、do…while、for。
输出System.out.print和输入要引用实例化类static Scanner input= new Scanner(System.in);
除输入输出和一些变量的定义外语法基本与C语言相同。
本周学习总结主要是回顾本周做的两个小练习的思路走向,当初是如何一步一步直到完善整个程序。
1.万年历
万年历从1900年1月1日星期一开始计算,计算输入的年份月份的第一天到1900年1月1日有多少天,再用天数判断是星期几,则在前面相应输出几个空格代表该月1日从星期几开始,再判断该月有多少天。
先定义要输入的年份月份,然后创建一个循环从1900年开始计算到输入年份有多少年每年有多少天
for (int i = 1900; i < year; i++) {
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
sum += 366;
}
else{
sum+=365;
}
}
这里要注意循环条件不能等于输入年份,该年要输出的月份要另外计算。
接下来是判断年头1月1日到输入月份的1日有多少天
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
switch (month) {
case 1: sum+=0;break;
case 2: sum+=31;break;
case 3:sum+=60;break;
case 4:sum+=91;break;
case 5:sum+=121;break;
case 6:sum+=152;break;
case 7:sum+=182;break;
case 8:sum+=213;break;
case 9:sum+=244;break;
case 10:sum+=274;break;
case 11:sum+=305;break;
case 12:sum+=335;break;
}
}
else{
switch (month) {
case 1: sum+=0;break;
case 2: sum+=31;break;
case 3:sum+=59;break;
case 4:sum+=90;break;
case 5:sum+=120;break;
case 6:sum+=151;break;
case 7:sum+=182;break;
case 8:sum+=212;break;
case 9:sum+=243;break;
case 10:sum+=273;break;
case 11:sum+=304;break;
case 12:sum+=334;break;
}
}
用天数取余判断本月第一天是星期几
System.out.println("当前输入的天数距1900年"+sum+"天");
int temp=sum%7+1;
switch (temp) {
case 1:System.out.println("星期一");
break;
case 2:System.out.println("星期二");
break;
case 3:System.out.println("星期三");
break;
case 4:System.out.println("星期四");
break;
case 5:System.out.println("星期五");
break;
case 6:System.out.println("星期六");
break;
case 7:System.out.println("星期日");
break;
}
判断条件+1是不断调试的结果,若7刚好被整除余0就会无匹配项。
然后把输入月份的天数通过switch提出来存到天数变量day
最后是输出
for (int j = 1; j <=42; j++) {
if(jishu%7==0){System.out.println("\n");}
if(temp!=0){
System.out.print("\t");temp--;
}
else{
System.out.print("\t"+count);
count++;
}
jishu++;
if(count>day) break;
}
这里j小于等于42是代表要输出的格子数,因为试了很多遍单凭一个J变量无法完成输出的同时换行并且刚好在等于day的情况下跳出循环,所以这里用到了另外两个变量 count要输出的天数,每输出一次自增1,jishu换行变量 每输出满7次换行。
(PS:以上代码只是粗略的贴出来的,有些外部自增自减的调试细节没有贴上去)
2.管理系统
要求:该系统要有新增、删除、修改、借出、归还、查找功能。
在主类中先定义好要用来存放表格形式数据的二维数组,数组要有四个字段,编号、名称、状态、日期。
首先,因为要有六个功能,这里准备用switch创建六个分支,一个分支代表一个功能,为了代码条理分明主方法的switch只调用写六个功能对应的六个方法。
首先是新增的写法
String name; //需要输入的名字
boolean state=true; //1可借 0已借出
Date date =new Date(); //日期
System.out.println("输入一个名称");
name = input.next();
for (int i = 0; i <=count; i++) {
str[count][0] = String.valueOf(id[count]=count);
str[count][1] = name;
if(state){
str[count][2] = "可借";}
else{ str[count][2] = "已借出";}
str[count][3] =String.valueOf(date);
}
System.out.println("添加完成");
count++;
因为定义的数组是String类型的所以这里编号用到强制转换String.valueOf。因为日期的转换代码太多而且百度有就不贴出来饿了,count是在所有方法外定义的公共自增变量每次执行完新增方法进行自增。
下一个是查找,这里查找只是显示所有字段信息
System.out.println("\t序号\t名称\t状态\t日期\t次数");
for (int i = 1; i <=count-1; i++) {
if(str[i][0]!=null){
for (int j = 0; j < 4; j++) {
System.out.print("\t"+str[i][j]);
}
System.out.println("");
}
}
这段代码很简单,只是嵌套两层循环输出二维数组信息,因为定义的数组是一百行的所以加个条件,输出不为空的行。
接下来是写删除,删除想要删除的行,其实是将这一行的数据都换成空值,并将下一行的数据往上移一次,用循环直至将该行之后的所有数据向前移一行,又因为查找不会输出空的行就可以完美的实现删除。
System.out.println("输入要删除的行号");
int del = input.nextInt();
if(str[del][2]=="已借出"){System.out.println("已借出不可删除");}
else{
for(int i=1 ;i<count;i++)
{if(del==id[i])
{
for (int j = 0; j < count-1; j++) {
str[del][0] = null;
str[del][1] = null;
str[del][2] = null;
str[del][3] = null;
}
}
}
for(int j2=0;j2<=count;j2++){
if (str[j2][0]==null) {
str[j2][0]=String.valueOf(id[j2+1]-1) ;
str[j2][1]=str[j2+1][1];
str[j2][2]=str[j2+1][2];
str[j2][3]=str[j2+1][3];
}
if(str[j2+1][0]==str[j2][0]){
str[j2+1][0]=null;
str[j2+1][1]=null;
str[j2+1][2]=null;
str[j2+1][3]=null;
}
}
count--;
System.out.println("删除成功");
}
写到这里时发现要执行删除操作要将前面的编号减一,执行count–可能会造成所有行编号的变动所以特意新加了一个一维数组id[]用来存放编号。后面的借出、归还、修改的寻找方式与删除功能的主要代码基本相同就不贴出来了。
就此,本周两个练习的思路回顾到此结束。