从c转java——java的基本程序设计结构

从c转java——java的基本程序设计结构

参考书目: Java核心技术卷I 基础知识 Cay S.Horstmann Gray Cornell
示例代码与电子书下载

环境配置以及一个Hello程序

开发环境安装教程

教程链接for mac

导航java目录

目录描述
bin编译器与工具
demo演示
docsHTML格式类库文档
include用于编译本地方法的文件
jreJava运行环境文件
lib类库文件
src类库源文件

执行一个简单的Hello程序

进入命令行并执行以下命令
javac Welcome.java
java Welcome即可实现一个简单的Hello程序
Welcom.java内容如下:

public class Welcome
{
   public static void main(String[] args)
   {
      String greeting = "Welcome to Core Java!";
      System.out.println(greeting);
      for (int i = 0; i < greeting.length(); i++)
         System.out.print("=");
      System.out.println();
   }
}

利用applet执行java程序则键入以下两行命令
javac WelcomeApplet.java
appletviewer WelcomeApplet.html
接着加载html文件即可

Java Applet 可以大大提高Web页面的交互能力和动态执行能力。包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页。
当用户访问这样的网页时,Applet被下载到用户的计算机上执行,但前提是用户使用的是支持Java的网络浏览器。由于Applet是在用户的计算机上执行的,所以它的执行速度不受网络带宽或者Modem存取速度的限制,用户可以更好地欣赏网页上Applet产生的多媒体效果。

Java程序结构

每个java程序必须要有一个main方法,具体如下

public class ClassName
{
   public static void main(String[] args)
   {
      program statements;
   }
}

其输出语句如下:
System.out.println();或者System.out.print();
前者是输出后换行,后者是输出后不换行

数据类型

变量

总共有八种数据类型,分别是

  • int
  • short
  • long
  • byte
  • float
  • double
  • char
  • boolean
    具体与c类似,long相当于c里的long long,boolean相当于c++里的bool,byte为1个字节的整型变量

长整形数值有后缀L,十六进制有前缀0x,八进制有前缀0,前缀0b可一表示二进制数,float有后缀F,没有后缀的小数或者有后缀D代表double,同时还可以为数字字面量加下划线,只是为了让人更容易读

部分常用浮点型常量如下

常量名称含义
Double.POSITIVE_INFINITY正无穷大
Double.NEGETIVE_INFINITY负无穷大
Double.NaNNaN

其含义请参照IEEE 754

boolean类型用于判定逻辑条件,整形值和布尔值之间不能进行相互转换!

常量

利用final表示常量,若希望再一个类中的多个方法中使用,则可以用static final设置类常量,相当于c里的全局变量,需定义在main方法的外部

运算符

大体与c++类似

注意关系运算符返回的是boolean型变量,不能作为整形变量参与运算

位运算符中含有>>>运算符,将用0填充高位,没有<<<运算符

Java不使用逗号运算符

数学函数

Math中常用的方法

  • sin cos tan atan atan2
  • sqrt pow
  • exp log log10
    Math中常用的常量
  • PI E
    不必再数学方法或常量前加Math.,只需在源文件顶部加入以下代码
    import static java.lang.Math.*

数值类型转化与强制类型转化

类似c++,除boolean不能与整形相互转化

枚举类型

直接看例子

enum Size {SMALL,MEDIUM,LARGE};
Size s=Size.MEDIUM;

Size类型变量只能储存给定枚举值或者null值

字符串

应当将java中String类型看成c++的字符常量,而不是字符变量,因为其是不可改变的

运用String内的substring方法乐意提取中一个子串,以及+对字符串进行拼接,如此可以修改任意字符串,例子如下:

String greeting="Hello";
String s=greeting.substring(0,3);
greeting=greeting.substring(0,3)+"p!";

字符串s的值为"Hel";第二个greeting字符串的值为"Help!"

字符串常用方法集合

方法返回值例子解释
substringString类型str.substring(0,3);提取出字符串[0,3)的子串
equalsboolean类型str.equals(str1)检测str是否与str1相等
equalsIgnoreCaseboolean类型str.equalsIgnoreCase(str1)类似equals但是忽略大小写
length整形str.length()返回str的代码点的长度
codePointCount整形str.codePointCount(0,str.length());返回str代码点的数量
charAtchar型str.charAt(1);返回str中位置为1的代码单元

一定不能用==检测两个字符串是否相等

代码点与代码单元

关于代码点代码单元,参考此网址

想要得到第i个代码点,应该使用以下语句

int index=str.offsetByCodePoints(0,i);
int cp=str.codePointAt(index);

想要遍历一个字符串并依次查看

int cp=str.codePointAt(i);
if(Character.isSupplementaryCodePoint(cp))
   i+=2;
else
   i++;

执行以下语句进行回退

i--;
if(Character.isSurrogate(str.charAt(i)))
   i--;
int cp=str.codePointAt(i);

对codePointAt更详细的了解以及对其操作的范例请参考此网站

字符串的API

可以利用javadoc生成自己API文档
命令如下
javadoc -encoding UTF-8 -charset UTF-8 文件名.java
如此查看生成文档的string类(如果有)即可,建议新建自定义文件夹docs下面,它不会自己生成文件夹

当然也可以在网上下载全部的文档,下载界面

构建字符串

运用StringBuilder类可以更高效的构建字符串
范例

StringBuilder builder=new StringBuilder();
builder.append(ch);//append a single character
builder.append(str);//append a string
String completedString=builder.toString

StringBuilder类中的重要方法

名称含义
StringBuilder()构造一个空的字符串构建器
int length()返回构建器中代码单元数量
StringBuilder append(String str)追加字符串并返回this
StringBuilder append(char s)追加代码单元并返回this
StringBuilder appendCodePoint(int cp)追加代码点并返回this
void setCharAt(int i,char c)将第i歌代码单元设置为c
StringBuilder insert(int offset,String str);在offset位置插入新的字符串并返回this
StringBuilder insert(int offset,char c);在offset位置插入新的代码单元并返回this
StringBuilder delete(int startIndex,int endIndex);删除从[startIndex,endIndex)的代码单元并返回this
String toString()生成字符串

输入输出

读取输入

通过利用Scanner类进行读取输入输出,Scanner类定义在java.util包中,所以在使用之前要加上import java.util.*;
程序范例如下:

import java.util.*;
public class InputTest
{
   public static void main(String[] args)
   {
      Scanner in = new Scanner(System.in);

      System.out.print("What is your name? ");
      String name = in.nextLine();
      System.out.print("How old are you? ");
      int age = in.nextInt();
      System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
   }
}

相关的方法

方法解释
Scanner(InputStream in)构建一个Scanner对象
String nextLine()读取下一行内容
String next()读取下一行单词(空格作为分隔符)
int nextInt()读取并转换下一个整数字符序列
double nextDouble()读取并转换下一个浮点数字符序列
boolean hasNext()检测是否还有其他单词
boolean hasNextInt()检测是否还有整数字符序列
boolean hasNextDouble()检测是否还有浮点数字符序列

读取密码

运用Console类进行读取
范例:

Console cons=System.console();
String username=cons.readLine("User name");
char[] passwd=cons.readPassword("Password:");

创建console窗口进行操作,右侧字符串为提示符兵读取输入直到结束,建议对于passwd字符数组在读取完之后进行抹除覆盖

格式化输出

类似c可以利用格式化进行输出
范例:System.out.printf("%8.2f",x);
转化符和格式符与c有所差异,以下是转化符和格式符:

转换符说明
%s字符串类型
%c字符类型
%b布尔类型
%d整数类型(十进制)
%x整数类型(十六进制)
%o整数类型(八进制)
%f浮点类型
%a十六进制浮点类型
%e指数类型
%g通用浮点类型(和e类型中较短的)
%h散列码
%%百分比类型
%n换行符
%tx日期与时间类型(已过时)
标志说明
+为正数或者负数添加符号
-左对齐
0数字前面补0
空格在整数之前添加指定数量的空格
,以,对数字分组
(使用括号包含负数
#如果是浮点数则包含小数点,如果是16进制或8进制则添动加0x或0
<格式化前一个转换符所描述的参数
$指定要格式化的参数索引

当然也可以用String.format方法创建格式化字符串
例子String message=String.format("Hello, %s. Next year, you'll be %d",name,age);

文件输入输出

读取文件需要构造Scanner对象

Scanner in=new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);

写入文件需要构造PrintWrite对象

PrintWriter out=new PrintWriter(Path.of("myfile.txt"),StandardCharsets.UTF_8);

相对文件名例如myfile.txt../myfile.txt,文件位于相对于java虚拟机启动目录的程序,在命令行执行则是当前命令行解释器所用目录
也可以用

String dir=System.getProperty("user.dir");

找到这个目录的位置

控制流程

块作用域

大括号括起来为块作用域,类似于c,但不同于c的是不能在两个块中声明同名变量

条件语句

与c类似(if else if else)

循环语句

与c类似(while, do while, for)

多重语句

与c类似(switch case)

中断控制语句

与c类似(break,continue)

大数

利用java.math包中的BigInteger和BigDecimal可以实现高精度运算

高精度基础用法
BigInteger方法合集
BigDecimal方法合集

补充几个常用的静态方法

返回值等于x的大整数

static BigInteger valueOf(long x);

返回值等于x或x/pow(10,scale)的一个大整数

static BigDecimal valueOf(long x);
static BigDecimal valueOf(long x,in scale);

数组

java数组中的方法类

声明数组与初始化数组

声明数组的方式

int[] a;
int a[];

运用new操作进行初始化数组

int[] a=new int[100];

提供创建数组的简单的方式

int[] smallPrimes={2,3,5,7,11,13,};

最后一个值后面允许加逗号以方便为数组不断增加值

创建一个数组后所有的元素都会初始化为0

也可以声明匿名数组可以重新初始化一个数组而无需创建变量

smallPrimes=new int[]{17,19,23,29,31,37};

注:可以声明长度为0的数组,它与null的含义不一样

访问数组元素

大体与c类似,可以用array.length来获得数组的元素的个数

for each

增强的for each语句能够像python那样依次处理每个元素而不必考虑下标值
例子:

for(int element : a)
   System.out.println(element);

当然也可以利用Arrays里的toString类进行快速打印

System.out.println(Arrays.toString(a));

数组拷贝

直接用的等号类似c一样将会两个数组共用一片地址
若要拷贝数值,则要用Arrays.copyOf方法,例子如下

int[] numA=Arrays.copyOf(numB,numB.length);

也可以用此方法增加数组的大小

int[] numA=Arrays.copyOf(numA,2*numA.length);

命令行参数

类似于c

数组排序

调用Array.sort()方法即可进行排序
Java中实现降序排序的方法:网址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
农夫过河问题是一个经典的逻辑问题,它的描述如下: 农夫要把一只狼、一只羊和一棵白菜都带到河的对岸。农夫有一条小船,但船只能容纳农夫和另外一件物品(狼、羊或白菜)。如果农夫不在,狼会吃羊,羊会吃白菜。请用 C 语言编写程序,输出农夫过河的步骤,使得农夫能够安全地把狼、羊和白菜都带到河的对岸。 以下是 C 语言实现的代码: ```c #include <stdio.h> void printState(int farmer, int wolf, int sheep, int cabbage) { printf("%d %d %d %d\n", farmer, wolf, sheep, cabbage); } int isSafe(int farmer, int wolf, int sheep, int cabbage) { if (farmer != wolf && farmer != sheep && farmer != cabbage && wolf != sheep) { return 1; } return 0; } void solve(int farmer, int wolf, int sheep, int cabbage) { if (wolf == 0 && sheep == 0 && cabbage == 0) { printState(farmer, wolf, sheep, cabbage); return; } if (isSafe(farmer, wolf, sheep, cabbage)) { if (farmer == 1) { solve(0, wolf, sheep, cabbage); } else { solve(1, wolf, sheep, cabbage); } } if (farmer == wolf) { if (farmer == 1) { solve(0, 0, sheep, cabbage); } else { solve(1, 1, sheep, cabbage); } } if (farmer == sheep) { if (farmer == 1) { solve(0, wolf, 0, cabbage); } else { solve(1, wolf, 1, cabbage); } } if (farmer == cabbage) { if (farmer == 1) { solve(0, wolf, sheep, 0); } else { solve(1, wolf, sheep, 1); } } } int main() { solve(1, 1, 1, 1); return 0; } ``` 该程序使用递归方式解决农夫过河问题。其中,`printState` 函数用于输出当前状态,`isSafe` 函数用于判断当前状态是否安全,`solve` 函数用于解决问题,其中包括递归过程和状态移过程。在 `main` 函数中调用 `solve` 函数,并传入初始状态 `(1, 1, 1, 1)`,即农夫、狼、羊和白菜都在河的起点。程序输出的结果即为农夫安全地带着狼、羊和白菜到达河的终点的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值