第二周学习问题总结

第二周学习问题总结

.关于print & printf & println

1.问题:print & printf & println概念不清

解释:printf:f就是format的意思,也就是格式化,是对输出文字做格式化后再显示在文本模式中。后面常用%d,%f,%b…这些格式控制符号,一般在输出变量类型比较多的时候使用,也用在需要计算机计算或判断后再输出的情形。
print:将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后
println:将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始。相当于在print中加了一个%n换行符。当输出信息比较单一简单时,一般采用println,但println也可以用于多种变量类型的输出

2问题:使用System.out.printf()和System.out.print()、System.out.println()有什么区别?

解决:printf是按照格式输出,print是单纯的输出,println是在输出后换行。

3.问题:使用printf和println的写法

解释:两种显示方法的使用格式是不一样的。使用printf时,格式为("XXX",X),其中可以使用加减运算。而使用println时,格式为("XXX")。

4.问题:学习中我对“%n”与“/n”的区别不是很明白

解释:其实只是运行平台的问题。也就是说,在windows平台上,这两者是可以通用的。

5.问题:调试中有遇到“Cannot resolve method println”的错误

解决:通过修改println为printf解决,Too many character in charater literal错误,通过修改代码解决。

6.问题:逻辑运算代码中System.out.println(number>70 && number<80);里为什么括号里不用加引号?

解决:这是一个含变量的逻辑运算

7问题:System.out.println()发现不加引号的时候输出的都是单个变量值,比如ture或1,是否输出单个变量值时不用加引号,输出字符串时需要?

解决:不加引号表示的是这是一个变量,加引号里面为字符串,可以原封不动地输出

8、问题:printf("0 AND 0 %5d%n",0 & 1),感觉逗号后内容和C语言的略有不同,为什么?

解释:猜测为教材错误

9.问题:在视频学习中,发现有这样一段代码:System.out.println(60);运行结果是打印出60
这个数字,于是产生困惑,为什么不用加双引号呢?就像System.out.println(“Hello World");

解决:60为int型的纯数字,可以直接打印,“Hello World”为字符串,引号内的内容也可以直接打印

11.问题:System.out.printf("%d%d=%2d",i,j,ij);这样的是不是不可以用println表示了?

解决:使用println时,格式为("XXX"),所以不可以

12.问题:我在运行代码的时候,因为想要显示的结果显得清楚,使用了换行,在C语言中换行“\n”在java中是错误的?

解决:JVM不支持“/n”格式,将“\n”改为“%n”,程序就可以正常运行了。可以成功编译,且在代码中含有println时,后面内容不能出现%n,否则就重复换行。

13.看书时发现有这样一段代码:System.out.println(10);运行结果是打印出10这个数字,为什么不用加双引号呢?就像System.out.println(“Hello World")。
解决:问了同学再仔细看了书知道字符或者字符串应该要加双引号,而数字不用。

14.问题:不清楚显示九九乘法表代码中

public class operator{
public static void main(String[] args){
for(int j=1; j < 10; j++){
for(int i=2; i < 10; i++){
System.out.printf("%d*%d=%2d  ", i,j,i*j);
}
System.out.println();
}
}}

的System.out.println();有什么作用

解决:打印空格

15.问题:什么时候用printf(),什么时候用println()?

解决:如果输出的是字符串就用printf()好,但如果输出的是单个字符就用println()好。

例如:

`int i = 1, j = 2, k = 3;      
System.out.printf("%d的值 + %d的值 是 %d \n", i, j, k);    //如果是输出字符串用printf好          
System.out.println(i + "的值 " + "+ " + j + "的值 是 " + k);
int m = 47;
System.out.printf("%d\n", m);
System.out.println(m);         //如果是输出单个字符用 println好`

16.问题:在运行以下代码时:

 public class Comparison
 {
 public static void main(String[] args)
  {
    System.out.println("10 > 5 结果 %b%n",10 > 5);
    System.out.println("10 >= 5 结果 %b%n",10 >= 5);
    System.out.println("10 < 5 结果 %b%n",10 < 5);
    System.out.println("10 <= 5 结果 %b%n",10 <= 5);
    System.out.println("10 == 5 结果 %b%n",10 == 5);
    System.out.println("10 != 5 结果 %b%n",10 != 5);
}
}

弹出了错误:Coparisonm.java:5:对于println(String.boolean),找不到合适的方法

解决:后来通过查阅资料发现println是用于输出参数内容,然后换行,其参数个数固定为一个,而printf是用于输出带各种数据类型的占位符的参数,其参数个数是不定的,所以上面的代码只能用printf,而不能用println。

17问题:java语言和c语言中有许多地方都存在相似之处,但是在c语言中printf("%0.2lf", d);表示把double定义的d精确到两位小数输出,但在java语言中printf("0 and 0 %5d%n", 0&0);表示在输出“0 and 0”之后空五格输出0&0的答案,不知道在java语言中,想要将答案精确到某一位小数后输出应该怎么表示?

解决:%6.2d

break、continue

问题:课本中switch条件式的default语句中没有加上break,如果加上break对运行结果会不会有影响?

解决:尝试之后发现没有影响,因为break是结束区块执行,而程序执行完default之后也会自动跳出区块。

问题:不太了解continue的用法

解决:通过看书了解到break是跳出循环执行循环之后的语句,而continue则是跳出本次循环,直接进行下一次循环。

问题:break、continue配合标签使用

解决:书上的描述并不是很能让人理解,不大能明白break、continue和标签组合的区别所在,所以只能自己编写程序实验,反复编译后才弄明白它们之间的区别

问题:continue和break?

解决:通过实际操作还是弄清楚了continue和break与标签组合之间的区别。如,continue中back必须设定在进入循环的前一步……,如果是continue back1,没有任何输出结果。但如果是continue back2,输出“hello world”九次。这里虽然没有展示break的情况,但是break与continue结合标签使用时,back标签都要在for之前!

代码托管

问题:在git的代码推送过程中,有很多细枝末节的小问题,写好了HelloWorld代码,想要推送到Git上,按照教程上的进行推送时,先是在Git上执行了一条一条语句后,按照教程的说法应该生成相应的文件夹,但是却没有找到,程序调试出现了中断
解决:我没有打开查看隐藏文件夹的选项,所以才找不到。后来我找到了相应的.Git文件夹,找到了ssh文件夹并添加到了git@osa上的公钥最后终于把项目推送到了git@osc上,完成了对git上代码的推送。

问题:关于for循环的问题一直很困扰我,那个该套那个,谁在前,谁在后,他们是如何一层一层运行的?
解决:for也是有优先级的,一般先循环最里层的语句,循环结束后再循环次里层,for的实质其实就是穷举,然后找出需要的值

输入

问题:输入的语法与用户自主输入,没能分清楚它们的区别

解决:当我定义a的类型是char时,我用的输入依然是scanner.nextInt(),于是出现了编译错误,后来查了知道scanner.nextInt()是接收一个整型字符,于是我改用了scanner.nextLine()但依然显示错误,后来继续找原因,发现scanner.nextLine()是读入字符串,于是我把a的类型改为String。

问题:scanner.nextInt()工作原理

解决:scanner.nextInt() 接收一个整型字符,但"\n"留在了缓存区中,scanner.nextline()读入一行文本,会读入"\n"字符,如下代码:

int n = Scanner.nextInt();

 String s1 = Scanner.nextLine();

 String s2 = Scanner.nextLine();

假设输入:

20

I

am xiaoming

在这种情况下,n的值为20,s1设置为空白字符,s2设置为I
因为nextInt()读入20,但并没有读入"\n",因此S1调用20所在行的剩余部分,而不是读取I。
于是我在用户读入猜的数据后输入了一行scanner.nextLine(),用于读取缓存区的回车。

问题:float和double的区别?小数怎么算字节?

解决:我编译执行之后出现了以下结果发现19.234超出了float的精度,并知道了float的精度,float占4个字节,double占8个字节,小数点算一个字节

问题:不懂%5d中的5是什么意思。

解决过程:后来问了同学发现是空5个格的意思。

问题:back的用法不清楚
解决:具体讲不懂,通过尝试理解了back的用法。

其他

问题:byte b=2;这个赋值语句,2默认为int型,按理来说不能赋值给byte型啊,这样会丢失精度的
解决过程:一般程序不允许,但是坚持使用的话可以在前面加(byte)强制转换,让程序闭嘴

问题:教材中说会分别输出true、false、true,但是语句里并没有格式控制符号%b,为什么会输出true和false?

解决:逻辑运算符有返回值,返回为布尔型

问题:连接符“+”的运用

解决:它可以输出一个表达式的形式,而不是最终的结果。

问题:教材P55给出了求各个类型可储存的数值范围,代码如下

public class Range {
 public static void main(String[]args) {
 System.out.printf("%d~%d%n",Byte.MIN_VALUE, Byte.MAX_VALUE);
 System.out.printf("%d~%d%n",Short.MIN_VALUE, Short.MAX_VALUE);
 System.out.printf("%d~%d%n",Integer.MIN_VALUE, Integer.MAX_VALUE);
 System.out.printf("%d~%d%n",Long.MIN_VALUE, Long.MAX_VALUE); 
System.out.printf("%d~%d%n",Float.MIN_EXPONENT, Float.MAX_EXPONENT);
 System.out.printf("%d~%d%n",Double.MIN_EXPONENT, Double.MAX_EXPONENT);
 System.out.printf("%h~%h%n",Character.MIN_VALUE, Character.MAX_VALUE);
 System.out.printf("%b~%b%n",Boolean.TRUE, Boolean.FALSE);
 } }

让我不解的是代码中并没有给出具体求范围的方法,只是打出一些字符串而已,更没有定义。但结果还是正确的。还有一个问题就是我依葫芦画瓢,照搬教材代码时,执行时,会出现汉字乱码现象。

解决:首先看到乱码错误还是第一次,完全看不懂电脑在说什么,只好自己找原因了。后来发现原来对于Float和Double来说,他们的特定范围专称后缀是.MIN_EXPONENT和.MAX_EXPONENT.这要和其他的后缀.MIN_VALUE和.MAX_VALUE区别开来。

问题:书上p63位运算中示例程序:

byte number = 0;

System.out.println(~number);

为什么显示结果为-1

解决过程:~表示补码运算,补码运算是将所有位0变1,1变0,byte占内存1字节,number储存 的0在内存中是位00000000,经补码运算就变成11111111,这个数在计算机中用整数表示则为-1。

问题:第一次编写该代码时,漏写了语句"%d*%d=%2d"中的“2”有什么意义?

解决方法:上网查找了资料,得到以下解释:
System.out.printf("%d*%d=%2d",x,y,z);

%d按照十进制整数的形式输出,%2d则是至少输出占有两个字符的十进制整数。
运行结果:
如果x=1,y=2,z=2时,12= 2(注意最后的一个2占有两个字符长度)
如果x=2,y=5,z=10时,2
5=10

问题:书上的Byte与byte两种符号是否是一种?
解决:
上网搜了一下,原来分属于基本类和包装类,但对网上解释也并没有理解太多,分享一下网上解释:
+、在Java中,一切皆对象,但八大基本类型却不是对象。(其实到现在我还是不理解为什么java面向对象)
+、声明方式的不同,基本类型无需通过new关键字来创建,而包装类型需new关键字。
+、存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。(堆?数据结构吗?)
+、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false。
+、使用方式的不同,比如与集合类合作使用时只能使用包装类型。

问题:偶然发现变量的定义在main前和main后都能不会报错,但是之后使用时会出现无法从静态上下文中引用非静态变量的错误
解决:上网查了一下,网上有大神解释说:“因为main是static修饰的静态方法,只能访问静态变量,所以你可以用static修饰变量a。”

问题:使用IDE运行第一个程序时没有问题,运行第二个程序的时候控制台仍旧显示的是第一个程序的结果,怎么换到第二个上面?

解决:由于在新建第二个程序时还在第一个程序的页面,工作空间中只是位置还在第一个程序的src中,忘记调过来了,鼠标点在第二个程序的位置就好了。

问题:2147483647 + 1 = ?书中P69页写到:court + 1变为11111111 11111111 11111111 11111111,感觉应该变为10000000 00000000 00000000 00000000,毕竟这个才是-2147483648的补码形式,这也就是当2147483647 + 1 = -2147483648的计算机补码解释。

解释:对于int型(4字节32比特),算上符号位,一共可表示的数有2^32个,当11111111 11111111 11111111 11111111 + 00000000 00000000 00000000 00000001后,低32位会全被置为0,相当于也就是“轮回”了,回到了所能表示的第一个数-2147483648。

问题:不知道“&”和“&&”的区别?
解决:通过看视频才明白:&时,左边无论真假,右边都进行运算;&&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 “|”和“||”的区别同理,双或时,左边为真,右边不参与运算。

问题:显示有非法字符
解决:经过检查才发现有字符没有用英文的,所以导致编译不成功。把符号打错或者是大小写没有分清楚都是很严重的,在以后的练习中最重要是的还是要细心,毕竟错了一个符号就不能成功的运行。

问题2:Byte与byte有什么区别

解决:通过询问同学和进行百度,Byte是包装类型,byte是基本类型,两个可以互相转换。包装类型默认是null。

问题:不理熟悉布尔类型表达式的输出结果

解决:通过看书上逻辑运算部分理解了布尔类型表达式输出只有两种结果即:true、false,在Java语言中System.out.println(3>4)和System.out.printf("%b%n",3>4)显示结果都是false即逻辑判断的结果。

问题:如何用最有效率的方式计算2*8?

解决:要是直接计算的话需要转换成二进制计算,2*8相当于2乘以2的三次方,即:2<<3,这样就简化了运算。

问题:如何在不用第三个变量的情况下对两个整数变量进行互换?

解决过程:定义两个变量m、n,n=n+m;m=n-m;n=n-m;(eg:11=8+3;m=11-3;n=11-8;)

问题:System.out.println("5+5="+5+5);//显示"5+5=55",结果不是我们想要的怎么解决?

解决:System.out.println("5+5="+(5+5))//显示"5+5=10",通过提高运算优先级来实现。

问题:IDEA使用问题对书上代码进行了编译,首次编译出现了问题
解决:原因是没有定义SDK,后经设定SDK,

九九乘法表

1.代码:

public class TimeTable{
public static void main(String[] args){
    int i,j;
    for(j = 1; j < 10; j++){
        for(i = 1; i <= j ; i++){
            System.out.printf("%d*%d=%2d ",i,j,i*j);
        }
        System.out.println();
    }
}
}

为什么选择控制为%2d?
解决:两个for循环的嵌套使用,使打印形式呈现乘法口诀表的格式。由于前面几条口诀乘法(3*3之前)的结果为个位数,与后面的十位数相比差一位,为了左右能对整齐显得美观,故选择控制为%2d,使得不论结果是几位数,都使其占用2个字符的宽度。

尤其是格式,空格什么的。所以在每次写代码的时候一定要注意细节。毕向东老师说当看到错误越多越高兴,经验是由错误得来的,错误越多,解决的问题越多,经验也就越丰富,我觉得非常有道理。

还有很多程序书上在开头写了pack cc.openhome编译可以通过,但是在运行java的时候总是说找不到或无法加载主类,查资料说是类别的原始代码开头的定义,但是不是特别理解为什么运行不了。之后直接就删了这句就可以运行了。

问题:发现break的作用仅仅是跳出当前的这个循环,也就是内循环,然而这是一个嵌套for循环,如何利用break跳出任意指定的循环呢?
解决:根据视频我学到了一个新的语法,就是给循环带上标签,利用break语句跳出任意循环了,这是我在C语言的学习里没有使用过的一个小技巧。

问题:看教材时不明白java保留字是什么意思。
解决:百度一下,明白Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用的字。
有byValue, cast, false, future, generic, inner, operator, outer, rest, true,var ,goto ,const,null 。

问题:在IDEA创建程序时,我不小心没有将项目创建到专门放java程序的文件夹,结果在编译程序时,点击“Run…”后没有出现我的类名称。

解决:我将文件夹直接拖入专门盛放java程序的文件夹,结果IDEA中就没有代码了,而且原先文件夹仍然在,只是里面的东西少了,我用IDEA执行了一下.iml

问题:对于数据类型间的转换(数据类型的强专和丢失精度不能理解)
解决:理解不了为什么强制转换或者会丢失精度,从根源解决问题,看了视频发现各种数据类型的存储空间不同,数据类型不同会发生溢出(overflow)或者无法运算等错误情况,记住了每种数据类型的存储空间,就从根本上解决了类型强转换的方式和计算机如何提升数据类型以防止溢出情况发生

问题:java变量找不到或无法加载主类
解决:将类名称和文件名改成相同的名称

问题:教材第64页代码有错
解决:纠正后代码如下:

public class Shift
{
public static void main(String[] args)
{
int number=1;
System.out.printf("2 的 0 次方: %d%n",number);
System.out.printf("2 的 1 次方: %d%n",number << 1);
System.out.printf("2 的 2 次方: %d%n",number << 1);
System.out.printf("2 的 3 次方: %d%n",number << 1);
}
}

纠正后的运行结果与课本上的结果一致

问题:不明白书上说的类型转换是什么意思?
解决:观看视频后知道了因为每种变量的占字节数不一样,所以赋值时,低字节的会自动升为高字节,输出时就会显示超出精度,所以要强制转换类型

问题:
boolean a1,b1,c1,d1,e1 = true, condition = false;
int flag=0;
while(true)
{if(a1&b1&c1&d1&e1)

这一段中,if中出现了问题,我很费解,按我的思路。布尔型的变量进行相与,应该是没有问题的。但是,为什么会出现问题呢。
解决:我发现了程序的问题,赋值问题,因此有了两种改法:

问题:有时我们在赋值时会遇到,所赋的值超过定义的范围,例如假如我们在定义为byte时就很容易超过其上限127;或者精度不对,例如利用float在定义时我们所赋的值会超过其精度,从而出错
解决:自己定义最大值

问题: 在求char的Unicode范围的时候,为什么结果并没有显示?

解决: 将由println求char的Unicode范围,换成了由print求
`public class Count{
public static void main(String[]args){
int count=Integer.MAX_VALUE;
System.out.println(count+1);
}

    }

`

boolean a1=b1=c1=d1=e1 = true 或boolean a1= true,b1= true,c1= true,d1= true,e1 = true;

问题:Eunm是什么?

解决:为数值型的值取个别名,方便以后代码的维护以及增加可读性。eunm和class只能用其中一个。用搜索引擎搜索出这种情况是计算机在保存时,多加了符号,人看不出来,但计算机能读出来,所以也查证不了是哪儿的错误,重新建project以后重新写就好了。

问题:什么时候定义变量

解决:当数据不确定的时候,需要对数据进行存储时,就定义一个变量来完成存储动作。

问题:看到代码中b=a++和b=++a的运行结果不同

解决:通过观看学习视频得知b=a++是先将a的值赋给b,然后在计a+1的值并且赋值给a,而b=++a是先计算a+1的值算出a,然后将计算出的a的值赋给b。

问题:代码中int x=4270;x=x/10001000;计算出来的结果却是4000

解决:因为是int型的数字,所以肯定是整数,4270/1000结果是4.27,但是被int强制实现为4,所以41000=4000

问题:不理解为什么‘a’+1的运算结果是数字

解释:字符a在ASCII码中也代表了一个数字,后来知道是系统默认计算的精度为int,所以代码错误,解决时需要将计算结果定义为byte型(计算结果在byte的范围之内),代码即可成功

问题:这个九九表刚做出来一看和书上的不一样,看着很别扭

解决:发现是%2d后面少了一个空格

问题:在学习for循环的过程中,我在编程方面遇到了问题,当我在dos命令中运行的时候老是编译错误

解决:因为没有新建包文件,package cc.openhome电脑在编译的过程中找不到这个,文件 于是我在代码中删除了package cc.openhome,于是程序便可以运行了,我在想为什么书中的程序可以运行是怎么更改的,于是我在java文件中新建了新文件夹cc 然后在cc文件夹里面又新建了openhome文件夹,最后在代码中编译 -d c:\java OneToten.java 编译过程中创建class文件,于是就编译成功了

问题:对于在编译的时候不知道如何预留出字符的宽度
解决:采用常用格式控制符+数字可以预留出相应的字符宽度。

问题:最后在看书有关于类型转换部分的知识存在疑问。其中在表达式中包括不同类型,则运算时会以最长的类型为主,例如short a=1 long b=2 int c=a+b;会存在精度遗失的问题。

解决:一开始说的很乱,不太好理解,还有关于两种处理精度遗失的解决办法存在问题。后来照着书上的操作的方法,用电脑进行简单操作掌握了相应的知识。

问题:分不清楚<<和<<<的区别。

解释:
<<:最高位补什么由原有数据的最高位置而定。如果最高位0,右移后,用0补空位。如果最高位是1,则用1补位。
<<<:无论最高值是什么,右移后都用0补位(不知道哪来的框框。。。)

问题:Enum是什么?Enum用法?

解决:Enum 一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。

问题:如何使用 Java Enum

解决:简单的用法: JavaEnum 简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。如:
//性别
public enum SexEnum {
male , female ;
}
//颜色
public enum Color {
RED , BLUE,GREEN,BLACK ;
}
eunm和class只能用其中一个。

同一个变量只需要定义一次。把后面的int 删去就成功了。、

感悟

看了同学们的问题,感觉自己又重新学了一遍,问题总是有的,总结更多的错误,才能更接近正确一点,掌握更多一点的知识,感觉大家都是刚入门,许多东西理解的还比较浅,但是觉得大家都很认真,期望共同进步。

转载于:https://www.cnblogs.com/jdy1453/p/5300132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值