Dylanの博客

记录生活,记录成长

0%

Week1.3_Storage Factory And Fund me

💻 Code: https://github.com/PatrickAlphaC/storage_factory

Inheritance, Factory Pattern, and Interacting with External Contracts
  • Factory Pattern
  • Imports
  • Deploy a Contract From a Contract
  • Interact With a Deployed Contract
  • Recap

Lesson 3: Fund Me

💻 Code: https://github.com/PatrickAlphaC/fund_me

Payable, msg.sender, msg.value, Units of Measure

Importing from NPM and Advanced Solidity

  • Decimals/Floating Point Numbers in Solidity
  • latestRoundData
  • Importing from NPM in Remix
  • Interfaces
    • Introduction to ABIs
  • Getting Price Feed Addresses
  • getPrice
  • Tuples
    • Unused Tuple Variables
  • Matching Units (WEI/GWEI/ETH)
  • getConversionRate
  • Matching Units (Continued)
  • SafeMath & Integer Overflow
  • Setting a Threshold
  • Require
  • Revert
  • Withdraw Function
  • Transfer
  • Balance
  • this
  • Contract Owners
  • Constructor
  • ==
  • Modifiers
  • Resetting
  • for loop
  • Array Length
  • Forcing a Transaction
  • Recap

Week1.2_Remix and Simple Storage

⌨️ (01:31:00) Lesson 1: Welcome to Remix! Simple Storage

💻 Code: https://github.com/PatrickAlphaC/simple_storage

Everything in this section can be read about in the Solidity Documentation

Basic Solidity

  • Versioning : Change the version of solidity

  • Compiling

  • Contract Declaration

  • Types & Declaring Variables

    • uint256, int256, bool, string, address, bytes32
  • Default Initializations

  • Comments

  • Functions

  • Deploying a Contract

  • Calling a public state-changing Function

  • Visibility

  • Scope

  • View & Pure Functions: View and Pure are non-state changing functions

  • Structs

  • Memory:Data will only be stored during the execution of the function

    Storage:Data will persist even after the execution of the function

    Mappings: A dictionary like data structure with I value per key

  • Arrays - Dynamic & Fixed sized: Strings are actually an object:An array of bytes

  • Compiler Errors and Warnings

  • SPDX License

  • Recap

Deploying to a “Live” network

  • A testnet or mainnet
  • Find a faucet here
  • Connecting Metamask
  • Interacting with Deployed Contracts
  • The EVM

Week1.1_Basic Blockchain

1.学会开发NFT合约(可OPEN SEA 直接发布NFT

智能合约:①建立与ETH互动的合约

​ ②NFT要能够被MINT

​ ③NFT要能够设置总量

​ ④NFT要能够设定每个地址最大持有量

​ ⑤NFT要能够限制单次的mint量

​ ⑥NFT要能够设定开关去公开发售

  1. https://faucets.chain.link/rinkeby
  2. https://fauceth.komputing.org/
  3. https://faucet.rinkeby.io/

2.Beginner to Expert Python Tutorial

This course will give you a full introduction into all of the core concepts in blockchain, smart contracts, solidity, NFTs/ERC721s, ERC20s, Coding Decentralized Finance (DeFi), python and solidity, Chainlink, Ethereum, upgradable smart contracts, and full stack blockchain development.
Follow along with the videos and you’ll be a blockchain wizard in no time!
💻 The repository with helpful links to all code, resources, and support forums is located here: https://github.com/smartcontractkit/f…
Please reference the repo for anything you need, and feel free to leave issues, jump into the discussions, and more.
⭐️ Course Contents ⭐
⌨️ (00:00:00) Introduction
⌨️ (00:06:33) Lesson 0: Welcome To Blockchain
⌨️ (01:31:00) Lesson 1: Welcome to Remix! Simple Storage
⌨️ (02:09:32) Lesson 2: Storage Factory
⌨️ (02:26:35) Lesson 3: Fund Me
⌨️ (03:26:48) Lesson 4: Web3.py Simple Storage
⌨️ (04:27:55) Lesson 5: Brownie Simple Storage
⌨️ (05:06:34) Lesson 6: Brownie Fund Me
⌨️ (06:11:38) Lesson 7: SmartContract Lottery
⌨️ (08:21:02) Lesson 8: Chainlink Mix
⌨️ (08:23:25) Lesson 9: ERC20s, EIPs, and Token Standards
⌨️ (08:34:53) Lesson 10: Defi & Aave
⌨️ (09:50:20) Lesson 11: NFTs
⌨️ (11:49:15) Lesson 12: Upgrades
⌨️ (12:48:06) Lesson 13: Full Stack Defi
⌨️ (16:14:16) Closing and Summary
✏️ Course developer by Patrick Collins, check out his YouTube channel for more great programming courses, blockchain education, and fun: https://www.youtube.com/c/patrickcollins
Follow Patrick!
🐦Twitter: https://twitter.com/PatrickAlphaC
📺YouTube: https://www.youtube.com/channel/UCn-3…
✍️Medium: https://medium.com/@patrick.collins_5…
💻GitHub: https://github.com/PatrickAlphaC
🏢LinkedIn: https://www.linkedin.com/in/patrickal…>

⌨️ (00:00:00) Introduction
⌨️ (00:06:33) Lesson 0: Welcome To Blockchain

​ Dapp =Smart Contract =Decentralized App

​ Understanding Ethereum means we will understand the majority of these platforms.

​ Bitcon was the first one to take blockchain mainstream.

​ Bitcon is like a digital gold.

​ Ethereum allows for smart contracts.

​ chainlink provides data and external computation to smart contracts.

Features and massive advantages of blockchain and smart contracts:

​ 1.decentralized

​ 2.Transparency& flexibility. We can see every changes in the chain. Everyone follow the same rules.

​ 3.Speed and efficiency

​ 4.security and immutability

​ 5.Removal of counterparty risk

​ 6.Trust minimized agreements

​ 7.Hybrid Smart Contracts combine on and off-chain

Download metamask:

1
2
3
4
5
6
7
8
9
10
11
	Gas: Measure of computation use

​ Gas Price: How much it costs per unit of gas

​ Gas Limit: Max amount of gas in a transaction

​ Transaction Fee: Gas Used x Gas Price

​ ie:21,000 gas @ 1 GWEI per gas = 21.000 GWEI

​ Ethgasstaion: https://ethgasstation.info/

How the blockchain works?

Hash: A unique fixed length string, meant to identify a piece of data. They are created by placing said data into a “hash function”

Hash Algorithm:A function that computes data into a unique hash

​ SHA256: https://andersbrownworth.com/blockchain/hash

​ The nonce is the solution to the problem(mining nonce)

​ Genesis block:the first block in the blockchain

​ demo of distributed blockchain: https://andersbrownworth.com/blockchain/distributed

Mining:The process of finding the “solution” to the blockchain “problem”.

​ In our example, the “problem” was to find a hash that starts with four zeros.

​ Nodes get paid for mining blocks.

Block: A list of transactions mined together

Decentralized: Having no single point of authority

Private Key->>>Public Key->>>>>address

Blockchain nodes keep lists o f the transactions that occur

Consenus: the mechanism used to agree on the state of a blockchain

1.Chain Selection

—Nakamoto Consensus(a combination of proof of work and longest chain rule the decentralized)

)

2.Sybil Resistance

–proof of work(ETH/Bitcon) miner

–proof of stake validators

Proof of Work uses a lot of energy

Transaction fee- first one to find the transaction

Block reward - first node to solve the problem

Gas fees are paid by whoever makes the transaction.

Two types of Attack:

1.sybil attack:when a user creates a whole bunch of pseudo-anonymous accounts to try to influence the network

2.51% attack: some one have longest chain and more than 51 percent of the rest of the network can fork

Longest chain rules: Other nodes always follow the longest chain

Proof of Stake

avalanche solana polygon polkadot and terra and Ethereum2.0 using it

How it works? —-Proof of stake nodes put up collateral as a sybil resistance mechanism

Randomness –choose the random node

Proof of stake use much less energy

Sharding:Eth2.0 implemente this new methodology called sharding to sovle the scalability problem(分片) . which can incredibly increase the number of block space and greatly increase the number of transactions on a blockchain

Layer 1: Base layer blockchain implementation

Layer 2: Any application built on top of a layer 2

Rollups: a rollup is kind of like a sharded chain they derive from the layer one like ethereum and they bulk send their transactions onto the layer one.(Unlike side chains:because side chains derive their security from their own protocols)

Conclusions:

  • ETH and BTC are Proof Of Work(at the time of recording)
  • ETH 2.0 will be Proof of Stake
  • PoW & PoS are sybil resistance mechanisms
  • The bigger the blockchain,the more secure
  • Consensus is how blockchains decide what the state of the chain
  • Sharding and rollups are scalabilityb solutions
  • Only so many transactions can fit into a block
  • Gas prices are how much it costs to perform executions on-chain

5.1 对象的定义和引用

类是对某一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)。

1637826216025

如果将对象比作汽车,那么类就是汽车的设计图纸。所以面向对象程序设计的重点是类的设计,而不是对象的设计。

5.1.1类的定义

class Person
{ int age;
void shout()
{System.out.println(“oh,my god! I am “ + age);}
}
age是类的属性 ,也叫类成员变量 。
shout是方法也叫类的成员函数。
shout方法可以直接访问同一个类中的age变量 ,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。

5.1.2对象的创建

Person p1 = new Person();

执行完后的内存状态

1637827459701

5.1.3对象的初始化

当一个对象被创建时,会通过构造方法对其中各种类型的成员变量自动进行初始化赋值,如果类没有定义构造函数,就使用缺省构造方法,缺省构造函数对不同类型的成员变量赋不同的初值。

5.1.4对象的使用

创建新的对象之后,我们就可以使用“ 对象名.对象成员 ”的格式,来访问对象的成员(包括属性和方法)
class TestPerson
{ public static void main(String[] args)
{ Person p1 = new Person();
Person p2 =new Person();
p1.age = -30;
p1.shout();
p2.shout();
}
}

程序的内存布局:

1637827652328

5.1.5对象的生命周期:

1637845764556

1637845768109

1637845823315

5.1.6对象的比较

“==”运算符与equals()方法的区别
==:同一个对象,equals():对象的内容相同

5.1.7匿名对象

我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象, 如:new Person().shout();
如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个函数调用。

5.1.8构造方法

构造方法的定义

它具有与类相同的名称;
它不含返回值;
它不能在方法中用return语句返回一个值
注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动调用了。

构造方法的作用

当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。这就好像我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。

构造方法的重载

1.和一般的方法重载一样,重载的构造方法具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new 关键字产生对象时,该调用哪个构造方法了。产生对象的格式是:new 类名(参数列表) ;
2.重载构造方法可以完成不同初始化的操作, 如:p3=new Person(“Tom”,18);语句,会做这样几件事:创建指定类的新实例对象,在堆内存中为实例对象分配内存空间,并调用指定类的构造方法,最后将实例对象的首地址赋值给引用变量p3。

p1=new Person(“Tom”,18) 的内存状态变化过程分析

1637846723427

1637846731896

1637846760042

!1637846774172](C:\Users\CYX\AppData\Roaming\Typora\typora-user-images\1637846774172.png)

1637846785714

构造方法的一些细节

•在java每个类里都至少有一个构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,这个默认构造方法没有参数,在其方法体中也没有任何代码,即什么也不做。

•由于系统提供的默认构造方法往往不能满足编程者的需求,我们可以自己定义类的构造方法,来满足我们的需要,一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。

•声明构造方法,如无特殊需要,应使用public关键字。

5.2 案例分析

银行账户对象的创建,要求能够存放用户的账号、户名、密码、和个人账户余额等信息,并包含存款、取款、查询余额和修改账户密码等操作,类名为Cust,并利用Cust类类创建对象,对象的账号为100,户名为Tom,密码1111,账户余额10000.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Class Cust{
String name;
int ID;
String PWD;
int Money;
Cust(String newName,int newID,String newPWD,int newMoney){
name=newName;
ID=newID;
PWD=newPWD;
money=newMoney;
}
void getMoney(int newMoney){
money=money-newMoney}
void setMoney(int newMoney){
money=money+newMoney;
}
void search(){
System.out.println(“户名:”+name);
System.out.println(“账号:”+name);
System.out.println(“账户余额:”+name);
}
void changePWD(String newPWD){
PWD=newPWD;
}

}
1
2
3
4
5
6
7
8
Class MainDemo{
public static void main(String[] args){
Cust myCust= newCust(“Tom”,100,”1111”,1000);
myCust.setMoney(5000);
myCust.getMoney(3000);
myCust.changePWD(“Tom”);
myCust.search();
}

5.3 静态成员与实例成员

当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。

静态成员(类成员):类的所有对象共享的成员,拥有有一个固定的存储 空间,每个对象都可以访问该成员,但通常只通过类名来访问,静态成员用static修饰符来修饰。

​ 实例成员(对象成员):类的每个对象所独有的成员,不同对象的同一实例成员分别存储于不同的位置,只有通过具体的对象才能访问属于该对象的实例成员,实例成员没有static修饰符。

5.3.1静态属性与实例属性的比较

在Cust类中,增加属性bankName代表账户所属的银行,因为它是每个账户所共有的,将其定义为静态属性。再创建一个账户总数(或总编号)allNum,它代表当前一共创建了多少个账户,也不属于任何一个账户对象,而是属于Cust类的,也将其定义为静态属性。最后定义一个流水编号,它是对象所独有的,应该定义为实例属性。

5.3.2静态方法

•在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。

• 静态方法不能以任何方式引用this和super关键字(super关键字在下一章讲解)。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。

•main()方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。

5.3.3理解main方法的语法

由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

1638860706101

1
2
3
4
5
6
7
8
9
10
11
12
13
Public class StaticDemo{
static double pi=3.14; //pi为静态变量
double pix=3.14; //pix为实例变量
double getArea(){return pi*3*3;}
//实例方法访问类变量,合法
static double getArea1(){return pi*3*3;}
//类方法访问类变量,合法
double getArea2(){return pix*3*3;}
//实例方法访问实例变量,合法
static double getArea1(){return pix*3*3;}
//类方法访问实例变量,非法
}

5.3.4静态成员的加法

1
2
3
4
5
6
7
8
9
10
11
Class HasStatic{
private static int x=100;
public static void main(String args[]{
HasStatic hs1=new HasStatic();
HasStatic hs2=new HasStatic();
hs1.x++;
hs2.x++;
hs1.x++;
System.out.println(“x=“+x);
}}
X=103

5.3.4静态代码块

•一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。

•类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。

5.3.5this是什么?

除了匿名对象外,任何一个对象一经创建,就会创建一个对该对象的引用——对象名;任何一个对象名都可以通过this来代替,通过”this.成员名”的方式,可以访问该对象的每个成员方法和成员变量。有时,这个this是必不可少的。

例子:实例变量与成员变量同名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SimpleClassToShowThis{
public int a;
public void test(){
int a=50;
this.a=a+5;
System.out.println(a);
}
}

Public class TestThis{
public static void main(String[] args){
SimpleClass simple=new SimpleClass();
simple.test();
System.out.print(“simple对象中a的值为:”);
System.out.println(simple.a);
}

由于Java将局部变量与成员变量同名时的变量优先视为局部变量,所以,在成员函数test()中想要访问成员变量a就可以通过this.a来实现。如下例。

5.3.6通过this来引用成员方法

1639028879008

如果func2方法被调用 ,一定是事先已经有了一个存在的对象,func2被作为那个对象的方法被使用。

在func2内部能引用别的对象 ,同样也能引用func2所属的那个对象。

在func2中,自己所属的那个对象的引用名称是什么呢? 答案就是this! this关键字在java程序里的作用和它的词义很接近,它在函数内部就是这个函数所属的对象的引用变量。

5.3.7this引用句柄的存放位置

每个成员方法内部,都有一个this引用变量,指向调用这个方法的对象,类中的成员方法与this之间的关系如图

1639028989724

5.3.8this引用句柄的应用

•一个类中的成员方法可以直接调用同类中的其他成员,其实我们在一个方法内部使用“this.其他成员”的引用方式和直接使用“其他成员”的效果是一样的,那this还有多大的作用呢?在有些情况下,我们还是非得用this关键字不可的 。

•让类的成员变量名和对其进行赋值的成员方法的形参变量同名是必要的,这样的代码谁看了都能明白这两个变量是彼此相关的,老手看到函数的定义,就能揣摩出函数中的代码,大大节省了别人和自己日后阅读程序的时间。

•假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。

•构造方法是在产生对象时被java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。

5.4 方法的重载

方法的签名:由方法名和方法的参数类型组成,Java通过方法签名而不是方法名来区分一个方法,这意味着可以有方法名相同但参数类型不同的方法。例如,Cust类的方法签名如下:
Cust(String,int,String,int )
getMoney(int)
setMoney(int)
search()
changePWD(String)    

成员方法重载的例子

如果声明了两个或两个以上同名但参数类型不同的方法,这就称为方法的重载。例如,可以为Cust类的取款方法getMoney重载,考虑取款上限为Limited元,构造如下方法:

1
2
3
4
5
6
void getMoney(int newMoney,int Limited)
{
if(newMoney<Limited)
{money=money-newMoney}
else {money=money-Limited}
}

5.5 类的封装与访问控制

•如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。

•在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。

5.5.1访问权限修饰符

public: 定义者和使用者可以位于不同的包(存放.class文件的文件夹)中
default: 定义者和使用者可以位于相同的包(存放.class文件的文件夹)中
private: 定义者和使用者可以位于同一个类中
protected: 定义者和使用者可以位于当前类或当前类的所有子类中

Java访问控制总结:

访问权限 同一个类 同一个包 子类 跨包访问
private
default
prrotected
public

5.5.2实现类的封装性

为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。

一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。用总统指挥一支军队的例子来说明这种效果。

5.3.3类的封装所带来的优点

•隐藏类的实现细节;

•让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

•便于修改,增强代码的可维护性;

•数组是多个相同类型数据的组合,实现对这些数据的统一管理

•数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量

•数组中的元素可以是任何数据类型,包括基本类型和引用类型

4.1 一维数组

<类型> var[]; 或 <类型> [] var;

eg: int[] a; double d[]; String[] args; Person p[];

Java语言中声明数组类型的变量时不允许指定数组的长度(数组中元素的个数)

如:int a[3] //非法

创建并使用数组:

1636356184774

1636356198780

1636356215120

4.2 多维数组

多维数组可以理解为由若干个低维数组所组成的数组。

•Java中多维数组的声明和初始化应按从高维到低维的顺序进行。

•Java中多维数组不必须是规则矩阵形式。

1
2
3
4
5
6
eg:  int  a[][]= {{1,2},{3,4,0,9},{5,6,7}};
int[][] a = new int[3][4];
int[][] t = new int[3][];
t[0] = new int[4];
t[1] = new int[2];
int[][] b = new int[][4];

4.2.1多维数组初始化

静态初始化

1
2
int a[][] = {{1,2},{2,3},{3,4,5}};
int b[3][2] = {{1,2},{2,3},{4,5}}; //非法

动态初始化

1
2
3
4
5
6
7
8
int a = new int[3][]; 
a[0] = new int[2];
a[1] = new int[4];
a[2] = new int[3];
a[0][0] = 45;
a[0][1] = 87;
……
a[2][2] = 99;

实例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class test
{ public static void main(String args[])
{ int[][] myArray=new int[3][];
myArray[0]=new int[3];
myArray[1]=new int[2];
myArray[2]=new int[3];
myArray[0][0]=1;myArray[0][1]=2;
myArray[0][2]=3;
myArray[1][0]=1;myArray[1][1]=2;
myArray[2][0]=1;myArray[2][1]=2;
myArray[2][2]=3;
for(int i=0;i<3;i++)
{for(int j=0;j<myArray[i].length;j++)
{System.out.print(myArray[i][j]+" "); }
System.out.println(); //换行;
}}}

1 2 3
1 2
1 2 3

实例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class test
{ public static void main(String args[])
{ char[] s={'A','B','C','D'};
for (int i=0; i<s.length; i++ )
{ System.out.print(s[i]+" "); }
System.out.println();
int [][] dd;
dd=new int[][]{{1,2},{1,2,3},{1,2,3}};
for(int i=0;i<dd.length;i++)
{for(int j=0;j<dd[i].length;j++)
{System.out.print(dd[i][j]+" "); }
System.out.println();
}
}
}

A B C D
1 2
1 2 3
1 2 3

4.2.2数组的枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class foreachdemo
{public static void main(String args[])
{ String[] s;
s = new String[]{"A","B","C","D"};
//以上两行同String s[]={"A","B","C","D"};
for(String c : s ) {System.out.print(c+" "); }
System.out.println();
int [][] dd;
dd=new int[][]{{1,2},{1,2,3},{1,2,3}};
for(int[] p : dd)
{ for(int obj : p){ System.out.print(obj+" "); }
System.out.println();
}
}
}

A B C D
1 2
2 3
1 2 3

4.2.3数组拷贝

java.lang.System类的arraycopy()方法提供了数组元素复制功能——将一个数组的连续多个元素的值批量复制到另一个数组中。

1
2
3
4
5
6
int source[] = { 1, 2, 3, 4, 5, 6 };  //源数组
int dest[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
// 目的数组
System.arraycopy(source, 0, dest, 0, 3);
// 复制源数组中从下标0开始的3个元素
//到数组,从下标0的位置开始存储。
1
2
3
4
5
6
7
8
9
10
11
12
public class test
{ public static void main(String args[])
{int source[] = { 1, 2, 3, 4, 5, 6 }; //源数组
int newarray[]=source; // 目标数组
int dest[] = { 0, 0, 0, 0, 6, 5, 4, 3, 2, 1 };
System.arraycopy(source, 0, dest, 0,
source.length);
for(int i=0;i<dest.length;i++)
{ System.out.print(" " + dest[i]); }
}
}
1 2 3 4 5 6 4 3 2 1

4.2.4 Instanceof

instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。

这里说明下:

1.类的实例包含本身的实例,以及所有直接或间接子类的实例

2.instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误

1
2
3
4
5
6
7
8
9
10
11
public class instancedemo
{ public static void main(String args[])
{ int[] a=new int[5];
int[] b=new int[4];
int[][] c=new int[2][3];
System.out.println(a instanceof Object);
System.out.println(a instanceof int[]);
System.out.println(c instanceof int[][]);
System.out.println(c[0] instanceof int[]);
}
}

4.2.5数组初始化总结

一维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 1)  int[] a;   //声明,没有初始化
2) int[] a=new int[5]; //初始化为默认值,int型为0
3) int[] a={1,2,3,4,5}; //初始化为给定值

4) int[] a=new int[]{1,2,3,4,5}; //同(3)
int[] a=new int[5]{1,2,3,4,5}; //错误,如果提供了数组初始化操作,则不能定义维表达式

5) int[] a;
a=new int[5]; //正确,同(2)一样
​ int[] a;
a={1,2,3,4,5}; //错误,数组常量只能在初始化操作中使用,如(3)
6) int a[];
a[0]=1; //错误,因为数组没有初始化,不能赋值
a[1]=2;

二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1)  int[][] a;  //声明,没有初始化

2) int[][] a=new int[2][3]; //初始化为默认值,int型为0

3) int[][] a={{1,2},{2,3},{3,4}}; //初始化为给定值
int[][] a={{1,2},{2,3},{3,4,5}};//没有错,数组空间不是连//续分配的,所以不要求每一维的大小相同

4) int[][] a=new int[2][];
a[0]=new int[3]; //a[0]其实就是一个数组
a[1]=new int[4]; //每一维的大小可以不一样;
5) int[][] a=new int[][]{{1,2},{2,3},{3,4,5}}; //同(3) int[] a=new int[5]{{1,2},{2,3},{3,4,5}}; //错误,如果提供了数组初始化操作,则不能定义维表达式
int[][] a=new int[2][];
a[0]={1,2,3,4,5}; //错误,数组常量只能在初始 //化操作中使用
6) int[][] a=new int[2][];
a[0][1]=1; //错误,第二维没有初始化,不能赋值,java.lang.NullPointerException异常

4.2.6 Array类

该类提供了很多对数组进行操作的方法,如:

equals(): 比较两个数组是否相同,只有两个数组容量相同,且每个对应元素都一样时,才为true。

fill(): 向数组中填充数据。

sort(): 将数组元素按升序排列。

binarySearch(): 在数组中各元素已经按升序排列的条件下,从数组中查找指定的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.*;
public class ArrayDemo
{ public static void main(String args[])
{String[] s1={"zhangsan","lisi","wangwu","liliu","yaoqi"};
String[] s2={"zhangsan","lisi","wangwu","liliu","yaoqi"};
System.out.println(Arrays.equals(s1,s2));
Arrays.sort(s1);
for(int i=0;i<s1.length;i++)
{System.out.println(s1[i]); }
}
}
True
Liliu
Lisi
Wangwu
Yaoqi
zhangsan

4.3 字符数组

4.3.1字符串的声明与创建

声明字符串的格式是:String stringName;

字符串的创建格式: stringName = new String(字符串常量);

或者 stringName =字符串常量;

举例:str= new String ( “student” );

​ str= “student” // 内存位置在专用的字符串区内

用一个已创建的字符串创建另外一个字符串:

s=“abc123”;

String t=String(s);

用字符数组创建:

char a[]={“W”,”H”,”U”,”T”};

String b=new String(a);

4.3.2与字符串有关的方法

确定字符串的长度 :

public int length()

取得字符:

public char charAt(int index)

取得子串:

public String substring(int beginIndex)

public String substring(int beginIndex,int endIndex)

字符串内容的比较

public int compareTo(String stringName2)

public int compareToIgnoreCase(String stringName2)

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String args[]){
String s = new String("武汉理工大学计算机学院");
System.out.println(s + " 的长度:" + s.length());
System.out.println(s + " 第三个字:" + s.charAt(2) );
System.out.println(s + " 的子串: " + s.substring(6));
String s1 = new String("ABCDE");
String s2 = new String("ABCED");
System.out.println("\"ABCDE\"和\"ABCED\"比较结果:"+s1.compareTo(s2));
}
武汉理工大学计算机学院 的长度:11
武汉理工大学计算机学院 第三个字:理
武汉理工大学计算机学院 的子串: 计算机学院
"ABCDE"和"ABCED"比较结果:-1

字符串连接:

public String concat(String stringName2)

字符串检索:

​ public int indexOf(int ch)
​ public int indexOf(int ch,int fromIndex)
​ public int indexOf(String stringName2)
​ public int indexOf(String stringName2,int fromIndex)

字符数组转换为字符串:

​ public static String copyValueOf(char []ch1)
​ public static String copyValueOf(char []ch1,int cBegin,int cCount)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	public static void main(String args[]){
String s = new String("武汉理工大学计算机学院");
String s1 = "09级软件工程";
String s2 = s.concat(s1);
System.out.println(s + " 追加 " + s1 + " 是: ");
System.out.println(s2);

System.out.println(s2+"首次出现‘学’字符的位置"+s2.indexOf("学"));

char[] Str1 = {'h', 'e', 'l', 'l', 'o', ' ', 'r', 'u', 'n', 'o', 'o', 'b'};
String Str2 = "";
Str2 = Str2.copyValueOf( Str1 );
System.out.println("返回结果:" + Str2);
Str2 = Str2.copyValueOf( Str1, 2, 6 );
System.out.println("返回结果(偏移量2,长度6):" + Str2);
}
武汉理工大学计算机学院 追加 09级软件工程 是:
武汉理工大学计算机学院09级软件工程
武汉理工大学计算机学院09级软件工程首次出现‘学’字符的位置5
返回结果:hello runoob
返回结果(偏移量2,长度6):llo ru

字符串转换为字符数组

public char[] toCharArray()

将其他数据类型转换为字符串

public static String valueOf(boolean b)
public static String valueOf(char c)
public static String valueOf(int i)
public static String valueOf(long L)
public static String valueOf(float f)
public static String valueOf(double d)

字符串大小写转换

public String toUpperCase()
public String toLowerCase()

字符串内容的替换:

public String replace(char oldChar,char newChar)

删除字符串的前导空白和尾部空白:

public String trim()

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String args[]){
String s = new String("武汉理工大学计算机学院");
String s1 = "";
String s2 = "ABCDEFG";
char a[] = s.toCharArray() ;
int i =1000;
System.out.println("字符串转换为字符数组并输出第一位: "+a[0]);
System.out.println(s1.valueOf(i));
System.out.println(s2.toLowerCase());
}
字符串转换为字符数组并输出第一位: 武
1000
abcdefg

4.3.3字符串缓冲区

StringBuffer的构造

public StringBuffer()

构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。

public StringBuffer(int capacity)

构造一个不带字符,但具有指定初始容量的字符串缓冲区。

public StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。该字符串的初始容量为 16 加上字符串参数的长度。

有关方法:

字符串缓冲区数据转换为字符串:public String toString()

添加字符:public StringBuffer append(int iv)

插入字符:public StringBuffer insert(int insertP,char cv)

替换字符:public StringBuffer replace(int start, int end, String stringv)

删除字符:public StringBuffer delete(int start,int end)
public StringBuffer deleteCharAt(int index)
清空字符串:public void setLength(int newLength)
取子串:1.public String substring(int start)

返回一个新的 String,它包含此字符序列当前所包含的字符子序列。该子字符串始于指定索引处的字符,一直到此字符串末尾。
2.public String substring(int start, int end)

返回一个新的 String,它包含此序列当前所包含的字符子序列。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符。

字符串反转:public StringBuffer reverse()

String与StringBuffer的区别

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
不能通过赋值符号对他进行赋值.
sb = “welcome to here!”;//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法sb.append(“hello”);

字符串连接操作中StringBuffer的效率要比String高。String的连接操作就比StringBuffer多出了一些附加操作,效率低一些.

由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

判断回文对联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.swing.JOptionPane;

public class Hello {
static boolean palindromeCouplet (String s) {
StringBuffer s1 = new StringBuffer(s);
return((s.compareTo(new String(s1.reverse()))==0) ? true :false) ;
}
public static void main(String[] args) {
while(true){
String str=JOptionPane.showInputDialog( null,
"请输入一行汉字!\n结束程序按取消。",
"判断是否可作回文联",
JOptionPane.QUESTION_MESSAGE);

if (str == null) {
System.out.println("再见!");
break;
}
System.out.println("是否可作回文联:" +palindromeCouplet(str));
}
}
}

3.1 程序流程控制

程序可分为三种基本结构——顺序性结构、分支结构和循环结构。

3.2 选择结构

1.if-else语句。其中的else子句不是必须的

2.switch语句。1636186516663

3.条件表达式程序格式:

Expression?Expression2:expression3

1
2
3
a=30;

b=a>16?160:150

3.3 循环结构

1.for 循环

2.while 循环

3.do-while 循环

4.for-each循环

3.4 跳转语句

1.break

语句的作用是终止所在的switch语句或循环语句的运行。

2.continue

语句用于结束所在的循环语句的本次运行,即跳过其后的循环体语句,开始下一次循环。

2.1面向对象的基础概念

是一种程序设计方法和设计规范。从对象出发来构造软件系统,并在系统架构过程中京可能的运用热泪的自然思维方式。

2.1.1类和对象

•把相似的对象划归成一个类。

•在软件中,类就是一个模板,定义了通用于一个特定种类的所有对象的状态(变量)和行为(方法)。对象是实际存在的该类事物的每个个体。

•类是创建对象的模板,对象是类的实例。

2.1.2属性和方法

2.1.3对象的继承

•理解继承是理解面向对象程序设计的关键。

•在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。

•在Java中,不允许多继承。

2.1.4对象的重用

1.创建新对象的时候,应该以继承现有对象为前提,而不是创建新对象

2.尽量以现有对象来架构程序。

2.1.5对象的封装

Java中通过将数据封装、声明为私有的(private),再提供一个或多个公开的(public)方法实现对该属性的操作,以实现下述目的:

1.隐藏一个类的实现细节;

2.使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

3.便于修改,增强代码的可维护性;

2.1.6对象的多态性

在一般类中定义的属性或者方法被特殊类继承后,可以具有不同的数据类型或者表现出不同的行为。

2.2Java语言中类的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person 
{
public int age ;
public String name;
public String sex;

public void show()
{
System.out.println("name="+name);
System.out.println("age="+age);
System.out.println("sex="+sex);
}
}

2.2.1类的属性

属性成员是具有某种数据类型的变量或者常量,当创建一个对象是,它会包含类中定义的所有变量。

2.2.2类的方法

1.方法的定义

2.main()方法,包含主方法的类称为主类,它是程序执行的入口点。java文件中,可以有多个类,但只能有一个public类,且与java文件同名。

3.方法的调用

2.3常量与变量

2.3.1 常量

在程序运行过程中其值保持不变的量,如1,true, “WHUT”, 6.5等等。

1.用final定义的符号常量位于方法定义之内,只能在方法内使用,

2.如果希望一个符号常量被本类的其他方法使用,就必须用static
final声明,并将声明语句放到main()方法外部。

3.如果用public static final 来声明,该符号常量还可以被其他类使用

2.3.2 变量

定义:变量(Variable)用于表示其值在程序运行过程中可以改变的数据。变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。根据所存储的数据类型的不同,有各种不同类型的变量。变量名代表这块内存中的数据。

分类:

1.按所属数据类型划分:基本类型变量和引用类型变量

2.按声明的位置划分:

局部变量——方法或语句块内部定义的变量

成员变量——方法外部、类的内部定义的变量

变量的生存期

局部变量的生存期就是其所在方法或语句块单次执行的期间——在程序每一次调用方法或运行进入到一个语句块中时,其中的局部变量才被创建并可用,随方法/语句块的退出,局部变量将被销毁。

成员变量的生存期与其所属的对象相同,随着对象的创建而创建、随对象的销毁而销毁。

2.3.3 标识符与关键字

java中的包、类、方法、参数和变量的名字,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是关键字。

2.4数据类型

2.4.1基本数据类型

Java中定义了四类/八种基本数据类型

Ø逻辑型 – boolean

Ø文本型 – char

Ø整数型 – byte, short, int, long

Ø浮点型 – float, double

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//整数拓展: 二进制0b 八进制0 十进制 十六进制0x
int i = 10;
int i2 = 010; //八进制0
int i3 = 0x10; //十六进制0x
10
8
16

//浮点数拓展:银行业务怎么表示
//使用BigDecimal 数学工具类

//float 有限 离散 舍入误差 大约 接近但不等于
//double
//最好完全避免使用浮点数进行比较

float f = 0.1f; //0.1
double d = 0.1; //0.1
System.out.println(f==d); // false
float d1 = 23131312312312313f;
float d2 = d1 + 1;
System.out.println(d1==d2); //True

//字符拓展
char c1 = 'a';
char c2 = '中';
System.out.println(c1); //a
System.out.println((int)c1); //97
System.out.println(c2); //中
System.out.println((int)c2); //20013
//所有的字符本质还是数字
//编码 Unicode 表:(97=a 65=A) 2字节 65536
char c3 ='\u0061';
//char c3 ='\141';
System.out.println(c3); //a

//转义字符
//八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377' \0:空字符
//Unicode转义字符:\u + 四个十六进制数字;0~65535 \u0000:空字符
// \t制表符 \n 换行

2.4.2各类型之间的相互转换

自动类型转换:在某种条件下,系统自动完成类型转换

1.两种类型兼容 •例如:int 和 double 兼容

2.目标类型大于源类型 •例如:double 型 大于 int 型

强制类型转换:(target_type)value

1
2
3
int a:
byte b;
b=(byte)a;

2.5运算符和表达式

1636185590914

1636185760593

运算符的优先级:

1636185849650

区别:执行顺序不同

int a=2; int b= a + 3 * a++; 8

int a=2; int b= (a ++)+ 3 * a; 11

1.1java语言特点

1.JAVA是简单的。无C和c++中复杂的操作符重载,多继承,自动的强制类型转换。 没有指针,还提供自动的内存收集。

2.面向对象。只支持类之间的单继承,但支持接口之间的多继承,并支持类和接口之间的实现机制。

3.分布式的。JAVA.net提供了网络编程库,包括URL,URLconnection,socket,serversocket等。

JAVA的RMI机制也是开发分布式应用的重要手段。

PS:Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

4.健壮性。Java的强类型机制、异常处理、内存空间的自动收集、安全检查机制等是健壮性的重要保证。

5.安全性。JAVA除了有许多安全特性,java对通过网络下载的类有安全防范机制(ClassLoader),比如分配不同的名字空间以防替代本地的同名类、字节代码检查,还提供安全管理机制(SecurityManager)设置安全哨兵。

6.可移植性。硬件无关。一次编译,到处运行。

7.编译解释型。java源文件—java平台—》字节码—JAVA解释器(JVM)—》解释执行

8.高性能的,动态的

9.多线程的。java支持多个线程的同时运行,还提供多线程之间的同步机制。

1.2Java平台和应用方向

Java平台:1.Java SE 2.Java EE 3.Java ME

开发领域:

1.web网页动态设计、网站管理

2.嵌入式系统开发与应用

3.交互式、可视化图形软件的开发

4.分布式计算系统的开发与应用

5.电子商务系统的开发与应用

6.多媒体系统的设计与实现

1.3Java的运行机制和JVM

hello.java–>编译–>hello.class–>解释–>二进制指令集

JVM:定义Java字节代码在给定的计算机系统中如何被处理的一组规范。

1.Java解释器功能是用JVM来实现的,Java的解释器是在JVM中运行的

2.JVM存在的意义实际上就是屏蔽掉底层平台的差异,实现字节码跨平台

3.字节码不与当前OS相关,结构中立的,是二进制文件。任何平台编译生成的字节码都是一样的。字节码文件不能直接执行,必须需要JVM的差异,为上层结构中立的字节码统一运行的环境,而JVM会将字节码转化成相应的底层平台的机器码执行

1.4Java相关术语

•JDK:Java Development Kit,是开发Java程序的开发环境,包括Java 运行环境(JRE)、Java工具库

• JRE: JavaRuntime Environment, 是运行Java程序所必需的环境集合,包括JVM、Java的核心类库(API)。

•JDK包含JRE,JRE包含JVM

1.6Java程序的编写和运行

1
2
3
4
5
public class hello{
public static void main(String[] args){
System.out.println("Hello world!");
}
}

PS: 一个Java源文件中可以有多个类,但只能有一个public类

1.7Java程序的一些特殊语句

1.输出语句System.out.println(“d”,age);

d十进制,x十六进制,o八进制,s字符串,c字符,b布尔,f定点浮点数,e指数浮点数,tx日期时间

2.注释语句

1./* */

2.// 单行

3./** */ 文档注释

计算机导论第十五周课后总结

4.1程序设计语言简介

定义:程序设计语言是一组用来定义计算机程序的语法规则
1.三元素:语法、语义、语用
2.基本成分:数据成分、运算成分、控制成分、传输成分

4.2程序设计语言的分类及编程模式

(1)分类:
a.机器语言:用二进制代码表示的计算机能直接识别和执行的机器指令的集合
注意:计算机唯一能识别的语言是机器语言
b.汇编语言:采用助记符来编写程序,是机器语言的符号化。用指令助记符来代替指令的二进制操作码,用符号代替二进制地址码。
特点:通用性差,但占用内存空间少,运行速度快
c.高级语言:面向用户,与自然语言更接近,而与硬件功能相分离(彻底脱离了具体的指令系统)
高级语言程序的处理过程:
在这里插入图片描述 编译程序:
在这里插入图片描述
汇编程序:将编译程序运行得到的目标程序翻译成二进制机器代码

(2)编程模式:a.过程式编程:模块化、结构化 顺序很重要
特征:以函数为中心,用函数来作为划分程序的基本单位
b.面向对象编程:软件系统设计与实现的新方法 封装继承多态
c.函数式编程:输入>>>函数>>>输出
d.说明式编程:依据逻辑推理

4.3高级编程语言介绍

1.BASIC语言:入门语言,其他高级语言的基础
2.PASCAL语言:一种结构程序设计语言
3.C语言:适用于作为系统描述语言,也是同用的程序设计语言
4.C++语言:改进了C语言中的不足
5.Java语言:简单,与机硬件无关,具有较强的可移植性、安全性、鲁棒性
6.Ada语言:美国国防部指定唯一一种可用于军用系统开发的语言
7.Logo语言:绘图是其主要功能
8.脚本语言:又称扩建的语言或动态语言,以纯文本方式来保存的程序

4.4并行程序设计

一种用于并行程序设计的语言
(1)分类:
a.显式并行语言
b.具有并行编译功能的串行语言
(2)并行编译的过程:词法和语法分析、优化、并行代码生成
(3)并行程序设计语言的编译过程:
在这里插入图片描述

5.1数据

(1)定义:用文字、数字、图形、图像、声音的方式对人、事件、事物等进行的描的数据是指能输入计算机并能被计算机程序处理的符号的总称
(2)形式:数字、文本、音频、图形、视频
(3)与信息的区别:数据是供计算机处理的,信息是供用户使用的
(4)计算机常用的编码方式:
ASCII、扩展ASCII、Unicode、UTF-8、GB-2312、音频编码、图像编码

5.2数据结构:

由元素数据依据某种逻辑联系组织起来的
(1)分类:逻辑上的数据结构和物理上的逻辑结构
(2)主要研究对象:数据表示、数据逻辑结构、数据存储方式、对数据的操作方法
(3)数据的逻辑结构:
a.集合:与数学中集合的概念一致
b.线性结构:数据元素一对一关系
c.树形结构:数据元素一对多关系
d.图形结构:数据元素多对多关系
(4)数据的物理结构:
a.顺序存储:一组地址
b.链式存储:数据存放的没有连续性的要求
c.索引存储:数据元素存储在连续的地址,且需建立索引表
(5)常见的数据结构
a.线性表:顺序存储、链式存储
b.栈:顺序栈、链栈
c.队列:先进先出的线性表
d.树:UINX、DOS许多长荣操作系统的目录结构
e.图:由一组顶点和一组顶点之间的连线构成的一种抽象数据类型

5.3算法

(1)定义:由基本的运算及规定的运算顺序所构成的完整解题步骤
(2)特性:输入、输出、有穷性、确定性、可行性

5.4数据库

(1)定义:一个组织内被应用程序使用的逻辑相一致的相关数据的集合
(2)特点:数据结构化、数据共享性高,冗余度低,易扩充、数据独立性高、数据由数据库管理系统统一管理和控制
(3)体系结构:
a.三级模式:一个数据库只有一个内模式
b.二级映射:外模式/概念模式映射、概念模式内模式映射
(4)数据库模型:
a.层次模型
b.网状模型
c.关系模型
(5)关系的操作及结构化查询语句
(6)数据库管理系统:是定义、创建、维护数据库得的一种工具
(7)主流数据库

5.5数据中心

(1)定义:是在一个物理空间内实现数据集中处理、存储、传输、交换、管理的一整套复杂的设施
(2)主要目的:通过运行应用程序来处理组织的数据
(3)组成:核心计算机机房和其他支持空间
(4)传统数据中心的困惑
(5)新一代数据中心

第十一周课后总结

在这次的计算机导论课上,首先呢,老师简单的回顾了一下第一次上课的内容,就是有关计算机领域需要的一些能力,其中数学对我们来很重要,然后还有就是有关上次人工智能和深度学习话题的一个再谈谈看法。

这次上课上的主要内容是第一章-信息。包括信息,计算机信息处理,几个例子,最后还讲了一点点图灵机

信息

首先,就是信息,有维纳的控制论定义,阿希贝的差异论,钟义信从本体论和认识论角度的认识,香农对信息的主观性的高度重视,还有种加属定义。

我个人比较喜欢香农的定义,所以查阅了一些资料,下面这些是一些解释:

1948 年,香农提出了“信息熵” 的概念,所以叫香农熵。 香农不是用钱,而是用 “比特”(bit)这个概念来度量信息量。 一个比特是一位二进制数,计算机中的一个字节是八个比特。在上面的例子中,这条消息的信息量是五比特。 信息量的比特数和所有可能情况的对数函数
log 有关。 (log32=5, log64=6。) 对于任意一个随机变量 X,它的熵定义如下:
变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。
有了“熵”这个概念,我们就可以回答本文开始提出的问题,即一本五十万字的中文书平均有多少信息量。我们知道常用的汉字(一级二级国标)大约有
7000 字。假如每个字等概率,那么我们大约需要 13 个比特(即 13 位二进制数)表示一个汉字。但汉字的使用是不平衡的。实际上,前
10% 的汉字占文本的 95% 以上。因此,即使不考虑上下文的相关性,而只考虑每个汉字的独立的概率,那么,每个汉字的信息熵大约也只有 8-9
个比特。如果我们再考虑上下文相关性,每个汉字的信息熵只有5比特左右。所以,一本五十万字的中文书,信息量大约是 250
万比特。如果用一个好的算法压缩一下,整本书可以存成一个 320KB 的文件。如果我们直接用两字节的国标编码存储这本书,大约需要 1MB
大小,是压缩文件的三倍。这两个数量的差距,在信息论中称作“冗余度”(redundancy)。 需要指出的是我们这里讲的 250
万比特是个平均数,同样长度的书,所含的信息量可以差很多。如果一本书重复的内容很多,它的信息量就小,冗余度就大。

然后呢,关于计算机信息处理方面,老师讲的比较简略,但是,说实话,我数字逻辑没学好,没咋懂!我真的有点憨!。。。

随机生成迷宫地图

我对老师展示的几个例子比较感兴趣,所以在网上看了一下算法, 发现运用我们在数据结构里的知识可以完成,主要是利用最小生成树,下面就贴出来。

绝大多数的编程问题都可以用数学工具解决,当然我们的迷宫生成算法也不例外。 数学中最适合表达迷宫的符号莫过于
图,下面两个算法是迷宫生成中应用最普遍的理论之二。首先我们需要将地图转换为便于数学表达的形式。 之前两个算法在处理地图时都是以 方块
为单位的,即每一个方块不是墙就是路。 而 图 的基本组成是 点 与 边 ,对于一个待处理的迷宫,我们做如下转换。
在这里插入图片描述
迷宫大小10*10,其中白块代表 点,红块代表 边,而黑块代表 虚无,只是填充物质罢了。如果一个 图 中,任意两 点 都能通过 边 组成的路径联通,称之为 连通图。而如果一个 连通图 上没有回路,则我们可以称之为 树,因为没有回路,所以每对点之间有且仅有一条路径联通。可以看到,树 与我们完美迷宫的概念不谋而合,所以现在我们的任务是找到包含所有点的一棵 树。最小生成树生成树,顾名思义,就是从给定的 点,边 集合中生成一棵符合要求的树。
下面介绍的两种最小生成树算法都可以胜任。虽然写作最小生成树,但这两个算法其实可以做到“按一定条件生成树”。
“最小”是算法的典型描述,即在有权边的集合中找出权值最小的树。原算法使用贪心算法求解。而在这里,我们的条件就是:随机。下面简单介绍一下这两个算法的步骤:两个算法都需要 点 的集合E,与 边 的集合V。对于上图,E代表所有白块,V代表所有红块Kruskal:
一开始每个点将自己作为单独的一棵树。从V中随机选出一条边v判断v两端的e1,e2是否属于一棵生成树 是,无动作否,绘制e1,v,e2并合并树从V中删除v当V不为空,则返回 1. ,V为空则完成ps:判断与合并两点所在树可以使用并查集相关算法,因为最近有点忙(懒),还没研究透,我代码里用了比较笨的全图标记,应该会在近期更新代码到并查集===============Prim:初始V为空,所有e∈E标记为0随机选一个点e将与e相连的边的集合{Ve}并入入V,e标记为1从V中随机选一条边v判断v两端情况 均为1:无动作一个0一个1:将为0的点e标记为1,绘制v,e,将e连接的边并入V均为0:不可能从V中删除v当所有e∈E均被标记为1,结束,否则返回 3. 。ps:可以维护一个包含所有v∈V的标记表,防止被重复并入V,提高效率以上为算法步骤,建议配合代码食用更佳。

然后其他的图灵机只讲了一点点,就是在讲关于可以无限执行这个特点,就不讲了。

以上就是本周的个人总结
______________________________________ blog by 软工zy1801陈宇曦