2020.3.1

一.代码块

1、代码块:

在类中或者方法中,使用{}括起来的一段代码,就称它是代码块。

代码块分为:局部代码块、初始化代码块、静态代码块三种

2、局部代码块:

直接定义在方法内的代码块;一般结合if,while ,for等关键在这里插入代码片字一起使用,表示一块代码区域


void save() {
		{
			// 代码块当中 定义的变量,我们称它是局部变量
			int a = 10;
			System.out.println(a);
		}
		if(true)
		{
			
		}
	}

3、初始化代码块:

直接定义在类当中的代码块;初始化代码块本质上放到构造方法当中执行的,因此每次创建对象的时候,都会执行初始化代码块; 可以通过反编译查看

public class Test {
 
	// 初始化代码块是每创建一个对象,就会调用一次
	{
		int b = 10;
		System.out.println("初始化代码执行了");
	}
 
	public static void main(String[] args) {
		System.out.println("main执行了");
	}
}


4、静态代码块:

在初始化代码块前面加上一个static ,此代码块称为静态代码块。静态代码块在加载字节码时就会自动调用,在主方法之前执行的。只执行一次。静态代码块随着字节码加载也加载进了JVM 此时main方法还没有执行,因为方法需要JVM调用。 先把字节码加载进JVM,JVM再去调用main方法 用来做一次性初始化操作

public class Test {
    //静态代码块随着字节码加载也加载进了JVM;此时main方法还没有执行,因为方法需要JVM调用。先把字节码加载进JVM,JVM再去调用main方法用来做一次性初始化操作。静态代码块只执行一次。
	static {
		System.out.println("静态代码块执行了");
	}
	public static void main(String[] args) {
		System.out.println("main执行了");
	}
}

二.构造器和方法的细节

构造器特性:

1.如果我们的类当中没有定义任何构造器,系统会给我们默认提供一个无参的构造器。
2.如果我们的类当中定义了构造器,那么系统就不会再给我们提供默认的无参构造器。

作用:构建创造一个对象。同时可以给我们的属性做一个初始化操作。

下面主要学习构造器和方法的区别:

我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物。(按:老外喜欢打比喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和方法的区别。所有学习java的人,尤其是对那些要认证考试的,理解构造器是非常重要的。下面将简单介绍一下 ,最后用一个表作了些简单的总结。

1.功能和作用的不同

构造器是为了创建一个类的实例。用来创建一个对象,同时可以给属性做初始化。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus();

相反,方法的作用是仅仅是功能函数,为了执行java代码。

2.修饰符,返回值和命名的不同

   构造器和方法在下面三个方便的区别:修饰符,返回值,命名。

  和方法一样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package 和 friendly调用). 不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized。

3.返回类型

  方法必须要有返回值,能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。

4.命名

  构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。

  构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。

5.调用:

  构造方法:只有在对象创建的时候才会去调用,而且只会调用一次。

 一般方法:在对象创建之后才可以调用,并且可以调用多次。

6."this"的用法

   构造器和方法使用关键字this有很大的区别。方法引用this指向正在执行方法的类的实例。静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器,我们看看下面的代码

public class Platypus { 
 
String name; 
 
Platypus(String input) { 
name = input; 
} 
 
Platypus() { 
this("John/Mary Doe"); 
} 
 
public static void main(String args[]) { 
Platypus p1 = new Platypus("digger"); 
Platypus p2 = new Platypus(); 
} 
} 

在上面的代码中,有2个不同参数列表的构造器。第一个构造器,给类的成员name赋值,第二个构造器,调用第一个构造器,给成员变量name一个初始值 “John/Mary Doe”.

在构造器中,如果要使用关键字this,那么,必须放在第一行,如果不这样,将导致一个编译错误。

7."super"的用法

构造器和方法,都用关键字super指向超类,但是用的方法不一样。方法用这个关键字去执行被重载的超类中的方法。看下面的例子:


class Mammal { 
void getBirthInfo() { 
System.out.println("born alive."); 
} 
} 
 
class Platypus extends Mammal { 
void getBirthInfo() { 
System.out.println("hatch from eggs"); 
System.out.print("a mammal normally is "); 
super.getBirthInfo(); 
} 
} 

在上面的例子中,使用super.getBirthInfo()去调用超类Mammal中被重载的方法。

构造器使用super去调用超类中的构造器。而且这行代码必须放在第一行,否则编译将出错。看下面的例子:


public class SuperClassDemo { 
SuperClassDemo() {} 
} 
 
class Child extends SuperClassDemo { 
Child() { 
super(); 
} 
}

在上面这个没有什么实际意义的例子中,构造器 Child()包含了 super,它的作用就是将超类中的构造器SuperClassDemo实例化,并加到 Child类中。

编译器自动加入代码
编译器自动加入代码到构造器,对于这个,java程序员新手可能比较混淆。当我们写一个没有构造器的类,编译的时候,编译器会自动加上一个不带参数的构造器,例如:public class Example {}
编译后将如下代码:


public class TestConstructors { 
TestConstructors() { 
super; 
} 
} 

三.最短路径(两个方法Floyd-Warshall和Dijkstra)

1.Floyd-Warshall

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.Dijkstra

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四.图书管理系统-借书系统

1.代码

void bls_menu() //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示借书系统主菜单
{
	system ("cls");

	printf("\n 				`~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` ");
	printf("\n\n						1.借书登记\n\n");
	printf("\n\n						2.还书登记\n\n");
	printf("\n\n						3.借阅情况查看\n\n");
	printf("\n\n						4.返回上一层\n\n");
	//printf("\n\n					^~^请按键选择and回车确定哦 *·*\n");
	printf("\n 				`~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~`\n ");

	return ;
}
void lbs()//library booking system借书系统
{
    void borrow();//借书系统
    void turn();//还书系统
    void rinfor();//借书的信息
    char choose;
    bls_menu();

    getchar();
    scanf("%c",&choose);

    for(;;)
        switch(choose)
        {
            case '1': borrow();
                      break;
            case '2': //turn();
                      break;
            case '3': rinfor();
                      break;
            case '4': main1();
                      break;
        }
}


void borrow()
{
    FILE *fp,*fp2;
    char tname[20]={'\0'};     //图书的名字
    char tauthor[20]={'\0'};   //作者
    char tpublisher[20]={'\0'};//出版商
    char tkind[20]={'\0'};     //种类
    char tnumber[20]={'\0'};   //书号
    int tstock=0;         //库存
    float tprice=0;      //单价
    struct library *head=NULL,*p1,*p2,*q;


    int tid=0;
    char trname[20]={'\0'};
    char tdate[20]={'\0'};
    char tbname[20]={'\0'};
    char hit=0;

    char target[20]={'\0'};//要借的书的名字
    int k=0,i=0,n=0,flag=0,loop=0;

    system("cls");
    if((fp=fopen("library.txt","r"))==NULL)//判断文件是否存在
    {
        system("cls");
        printf("\n图书馆无任何库存,按任意键退出。\n");
        getch();
        exit(0);
    }
    else
    {
        printf("\n请输入要借阅的书籍的名称:\n");
        scanf("%s",target);//获得要借的书的名字
        k=sum();//库存的总量
        for(i=0;i<k;i++)//将文件中的数据存入链表
        {
            fscanf(fp,"%s%s%s%s%s%d%f",tnumber,tname,tauthor,tpublisher,tkind,&tstock,&tprice);
            n++;
            if(n==1)
            {
                p1=p2=(struct library*)malloc(Len_L);
                head=p1;
            }
            else
            {
                p2->next=p1;
                p2=p1;
                p1=(struct library*)malloc(Len_L);
            }
            strcpy(p1->number,tnumber);
            strcpy(p1->name,tname);
            strcpy(p1->author,tauthor);
            strcpy(p1->publisher,tpublisher);
            strcpy(p1->kind,tkind);
            p1->stock=tstock;
            p1->price=tprice;
        }


        if(n==0)//没有库存的情况
        {
            head=NULL;
        }
        else//封链表
        {
            p2->next=p1;
            p1->next=NULL;
            fclose(fp);
        }
    }
    q=head;//从链表的头开始
    for(;q!=NULL;)//循环链表,和目标比较
    {
        if(!strcmp(q->name,target))//相同返回0.不同返回1
        {
            //找到目标的情况
            flag=1;//标记
            loop=q->stock;//记录此时的库存
            (q->stock)--;//库存减一,因为被借走了
        }
        q=q->next;
    }

    if(flag&&(loop>0))//将更改后的数据写入文件
    {
        fp=fopen("library.txt","w");
        fclose(fp);
        fp=fopen("library.txt","a");
        q=head;
        for(;q!=NULL;)
        {
            fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",q->number,q->name,q->author,q->publisher,q->kind,q->stock,q->price);
            q=q->next;
        }
        free(q);
        fclose(fp);
    }

    if(flag&&(loop>0))//
    {

        if((fp2=fopen("reader.txt","r"))==NULL)
        {
            fp2=fopen("reader.txt","w");//打开读者文件
            fclose(fp2);
        }


        fp2=fopen("reader.txt","a");//打开读者文件,添加
        if(n!=0)
        {
            printf("\n请按以下格式输入读者信息:\n证号 姓名 归还日期 借书书名\n请输入:");
        }
        scanf("%d %s %s %s",&tid,trname,tdate,tbname);//获得读者信息*****************************
        fprintf(fp2,"%-8d%-23s%-18s%-10s\n",&tid,trname,tdate,tbname);//将信息写入读者文件************************
        fp=fopen("library.txt","w");//删除图书馆文件信息
        fclose(fp);


        fp=fopen("library.txt","a");//重新追加信息
        q=head;
        for(;q!=NULL;)
        {
            fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",q->number,q->name,q->author,q->publisher,q->kind,q->stock,q->price);
            q=q->next;

        }
        fclose(fp);
        fclose(fp2);
        printf("\n借书登记成功,按任意键返回\n");
        getch();
        lbs();
    }
    else
    {
        printf("\n此书暂无库存,按任意键返回!\n");
    }
    getch();
    lbs();

}
void rinfor()
{
    FILE *fp2;
    int id=0,n=0,i=0,k=0;
    char rname[20]={'\0'};
    char date[20]={'\0'};
    char bname[20]={'\0'};

    if((fp2=fopen("reader.txt","r"))==NULL)
    {
        system("cls");
        printf("\n文件不存在,按任意键返回\n");

    }
    k=sum2();
    if(k==0)
    {
        system("cls");
        printf("\n无任何信息,按任意键返回\n");

    }

    fp2=fopen("reader.txt","r");
    system("cls");
    printf("\n证号\t读者姓名\t\t还书日期\t书名\n");



    for(i=0;i<k;i++)
    {
        fscanf(fp2,"%d%s%s%s",&id,rname,date,bname);
        printf("\n%-8d%-23s%-18s%-10s\n",id,rname,date,bname);
    }
    fclose(fp2);
    printf("查询完毕,按任意键返回\n");
    getch();
    lbs();
}
发布了5 篇原创文章 · 获赞 0 · 访问量 81

猜你喜欢

转载自blog.csdn.net/qq_45336632/article/details/104586800