精华内容
下载资源
问答
  • 目前市场上面还是windows系统居多的,macbook请绕道,本期盘点已经论文使用的截图工具。 1.QQ截图 2.微信截图 3.PrtScn键 4.Windows系统自带截图 1.QQ截图 使用QQ截图的人数估计是最多的,快捷键Ctrl+Alt+A...

         目前市场上面还是windows系统居多的,macbook请绕道,本期盘点已经写论文使用的截图工具。

    1.QQ截图

    2. 微信截图

     3.PrtScn键

    4.Windows系统自带截图

    1.QQ截图

         使用QQ截图的人数估计是最多的,快捷键Ctrl+Alt+A

    可以自定义设置 ,进入QQ设置->热键设置快捷键

    2. 微信截图

    除了QQ之外微信截图功能也是特别方便的。默认快捷键Alt+A,可以自行设置。

     3.PrtScn键

    键盘的PrtScn特别适合截图全屏,特别是打网络游戏比如逆战、穿越火线、绝地大逃杀特别适合这种全屏游戏截图、方便快捷。

    4.Windows系统自带截图

    windows系统自带截图快捷键:Win+ Shitf+S,继承了windows系统快捷键的优势就是截图的时候别的窗口不会消失 

    选择一个便捷让自己的工作高校的工具即可,毕竟“方法无优劣,功力见到底”

    展开全文
  • I2C总线及AT24C02读写实验报告

    千次阅读 2016-08-18 09:58:22
    实验名称:I2C总线实验实验目的:利用定时器产生0~99秒表在数码管前两位显示 每过一秒写入到AT24C02里面,关闭实验板后 重新打开实验板,秒表从AT24C02读入数据继 续上一次的计时。

    /**************************************************

    实验名称:I2C总线实验一

    实验目的:利用定时器产生0~99秒表在数码管前两位显示

     每过一秒写入到AT24C02里面,关闭实验板后

     重新打开实验板,秒表从AT24C02读入数据继

     续上一次的计时。

    实验备注:

    **************************************************/

    #include<reg52.h>


    #define uchar unsigned char

    #define uint unsigned int


    sbit SDA = P2^0;

    sbit SCL = P2^1;

    sbit DUAN = P2^6;

    sbit WEI = P2^7;


    uchar code duan_table[]=

    {0x3f,0x06,0x5b,0x4f,

     0x66,0x6d,0x7d,0x07,

     0x7f,0x6f,0x77,0x7c,

     0x39,0x5e,0x79,0x71};


    uchar code wei_table[]=

    {0xfe,0xfd,0xfb,

     0xf7,0xef,0xdf};


    uchar num, sec;


    void delay_1us();

    void delay_1ms(uchar);

    void display(uchar);

    void at24_init();

    void at24_start();

    void at24_stop();

    void at24_respons();

    void at24_writebyte(uchar);

    uchar at24_readbyte(uchar);

    void at24_writeadd(uchar,uchar);

    uchar at24_readadd(uchar);


    void main()

    {

    at24_init();

    sec = at24_readadd(5);

    if(sec > 100)

    sec = 0;

    TMOD = 0x01;

    TH0 = (65536-46080)/256;

    TL0 = (65536-46080)%256;

    EA = 1;

    ET0 = 1;

    TR0 = 1;


    while(1)

    {

    if(num == 20)

    {

    num = 0;

    sec++;

    if(sec == 100)

    {

    sec = 0;

    }

    at24_writeadd(5,sec);

    }

    display(sec);

    }

    }


    void delay_1us()

    {

    //uchar i, j;

    //for(i = 0; i < 1; i++)

    //for(j = 0; j < 1; j++);

    ;;

    }


    void delay_1ms(uchar x)

    {

    uchar i, j;

    for(i = 0; i < x; i++)

    for(j = 0; j < 110; j++);

    }


    void display(uchar x)

    {

    DUAN = 1;

    P0 = duan_table[x/10];

    DUAN = 0;

    P0 = 0xff;


    WEI = 1;

    P0 = wei_table[0];

    WEI = 0;

    delay_1ms(5);


    DUAN = 1;

    P0 = duan_table[x%10];

    DUAN = 0;

    P0 = 0xff;


    WEI = 1;

    P0 = wei_table[1];

    WEI = 0;

    delay_1ms(5);

    }


    void at24_init()

    {

    SDA = 1;

    delay_1us();

    SCL = 1;

    delay_1us();

    }


    void at24_start()

    {

    SDA = 1;

    delay_1us();

    SCL = 1;

    delay_1us();

    SDA = 0;

    delay_1us();

    }


    void at24_stop()

    {

    SDA = 0;      //必须先把SDA拉低

    delay_1us();

    SCL = 1;

    delay_1us();

    SDA = 1;

    delay_1us();

    }


    void at24_respons()

    {

    uchar i;

    //i = 0;

    SCL = 1;

    delay_1us();

    while((SDA == 1) && (i<250))

    i++;

    SCL = 0;

    delay_1us();

    }


    void at24_writebyte(uchar dat)

    {

    uchar i,temp;

    i = 0;

    temp = dat;

    for(i = 0; i < 8; i++)

    {

    temp = temp<<1;

    SCL = 0;

    delay_1us();

    SDA = CY;

    delay_1us();

    SCL = 1;

    delay_1us();

    }

    SCL = 0;

    delay_1us();

    SDA = 1;

    delay_1us();

    }


    uchar at24_readbyte()

    {

    uchar i, temp;

    //i = 0;

    //temp = 0;

    SCL = 0;

    delay_1us();

    SDA = 1;

    delay_1us();

    for(i = 0; i < 8; i++)

    {

    SCL = 1;

    delay_1us();

    temp = ((temp<<1) | SDA);

    SCL = 0;

    delay_1us();

    }

    return temp;

    }


    void at24_writeadd(uchar address,uchar dat)

    {

    EA = 0;

    at24_start();

    at24_writebyte(0xa0);

    at24_respons();

    at24_writebyte(address);

    at24_respons();

    at24_writebyte(dat);

    at24_respons();

    at24_stop();

    EA = 1;

    delay_1ms(5);

    }


    uchar at24_readadd(uchar address)

    {

    uchar temp;

    at24_start();

    at24_writebyte(0xa0);

    at24_respons();

    at24_writebyte(address);

    at24_respons();

    at24_start();

    at24_writebyte(0xa1);

    at24_respons();

    temp = at24_readbyte();

    at24_stop();

    delay_1ms(1);

    return temp;

    }


    void Timer0() interrupt 1

    {

    TH0 = (65536-46080)/256;

    TL0 = (65536-46080)%256;

    num++;

    }


    /**************************************************

    实验名称:I2C总线实验二

    实验目的:从键盘上读取两位数值,并储存在AT24C02里,

     再从AT24C02中读取出来显示在数码管前两位。

     1,数码管显示00的时候,按下键盘输入要储存

     的两位数字。

     2.数码管显示已经储存的数字,并等待键盘的

     第二次输入。

    实验备注:

    **************************************************/

    #include<reg52.h>


    #define uchar unsigned char

    #define uint unsigned int


    sbit SDA = P2^0;

    sbit SCL = P2^1;

    sbit DUAN = P2^6;

    sbit WEI = P2^7;


    uchar code duan_table[]=

    {0x3f,0x06,0x5b,0x4f,

     0x66,0x6d,0x7d,0x07,

     0x7f,0x6f,0x77,0x7c,

     0x39,0x5e,0x79,0x71};


    uchar code wei_table[]=

    {0xfe,0xfd,0xfb,

     0xf7,0xef,0xdf};


    uchar code heng_table[]=

    {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf};


    uchar num_led, num_i2c, flag_key, ge, shi;


    void delay_4us();

    void delay_1ms(uchar);

    void display(uchar);

    uchar keyscan();

    uchar keynum();

    void i2c_init();

    void i2c_respons();

    void i2c_start();

    void i2c_stop();

    void i2c_writebyte(uchar);

    uchar i2c_readbyte();

    void i2c_writeadd(uchar,uchar);

    uchar i2c_readadd(uchar);


    void main()

    {

    flag_key = 0;

    num_led = 0;

    num_i2c = 0;

    i2c_init();

    i2c_writeadd(3, num_i2c);

    while(1)

    {

    display(num_led);

    num_i2c = keynum();

    if(flag_key == 3)

    {

    i2c_writeadd(3, num_i2c);

    flag_key = 0;

    }

    num_led = i2c_readadd(3);

    }

    }


    void delay_4us()

    {;;}


    void delay_1ms(uchar x)

    {

    uchar i, j;

    for(i = 0; i < x; i++)

    for(j = 0; j < 110; j++);

    }


    void display(uchar num)

    {

    DUAN = 1;

    P0 = duan_table[num/10];

    DUAN = 0;

    P0 = 0xff;


    WEI = 1;

    P0 = wei_table[0];

    WEI = 0;

    delay_1ms(2);


    DUAN = 1;

    P0 = duan_table[num%10];

    DUAN = 0;

    P0 = 0xff;


    WEI = 1;

    P0 = wei_table[1];

    WEI = 0;

    delay_1ms(2);

    }


    uchar keyscan()

    {

    uchar key, temp;

    key = 44;

    P3 = heng_table[0];

    temp = P3;

    temp = temp & 0xf0;

    if(temp != 0xf0)

    {

    delay_1ms(5);

    temp = P3;

    temp = temp & 0xf0;

    if(temp != 0xf0)

    {

    temp = P3;

    switch (temp)

    {

    case 0xee:

    key = 1;

    break;

    case 0xde:

    key = 2;

    break;

    case 0xbe:

    key = 3;

    break;

    case 0x7e:

    key = 4;

    break;

    }

    while(temp != 0xf0)

    {

    temp = P3;

    temp = temp & 0xf0;

    }

    }

    }


    P3 = heng_table[1];

    temp = P3;

    temp = temp & 0xf0;

    if(temp != 0xf0)

    {

    delay_1ms(5);

    temp = P3;

    temp = temp & 0xf0;

    if(temp != 0xf0)

    {

    temp = P3;

    switch (temp)

    {

    case 0xed:

    key = 5;

    break;

    case 0xdd:

    key = 6;

    break;

    case 0xbd:

    key = 7;

    break;

    case 0x7d:

    key = 8;

    break;

    }

    while(temp != 0xf0)

    {

    temp = P3;

    temp = temp & 0xf0;

    }

    }


    }


    P3 = heng_table[2];

    temp = P3;

    temp = temp & 0xf0;

    if(temp != 0xf0)

    {

    delay_1ms(5);

    temp = P3;

    temp = temp & 0xf0;

    if(temp != 0xf0)

    {

    temp = P3;

    switch (temp)

    {

    case 0xeb:

    key = 9;

    break;

    case 0xdb:

    key = 0;

    break;

    case 0xbb:

    key = 11;

    break;

    case 0x7b:

    key = 12;

    break;

    }

    while(temp != 0xf0)

    {

    temp = P3;

    temp = temp & 0xf0;

    }

    }

    }

    return key;


    }


    uchar keynum()

    {

    uchar temp;

    temp = 0;

    if(flag_key == 0)

    {

    shi = keyscan();

    if(shi != 44)

    {

    flag_key = 1;

    }


    }

    if(flag_key == 1)

    {

    ge = keyscan();

    if(ge != 44)

    {

    flag_key = 2;

    }

    }

    if(flag_key == 2)

    {

    temp = shi*10 + ge;

    flag_key = 3;

    }

    return temp;

    }


    void i2c_init()

    {

    SCL = 1;

    delay_4us();

    SDA = 1;

    delay_4us();

    }


    void i2c_respons()

    {

    uchar i;

    i = 0;

    SCL = 1;

    delay_4us();

    while((SDA ==1) && (i < 250))i++;

    SCL = 0;

    delay_4us();

    }


    void i2c_start()

    {

    SDA = 1;

    delay_4us();

    SCL = 1;

    delay_4us();

    SDA = 0;

    delay_4us();

    }


    void i2c_stop()

    {

    SDA = 0;

    delay_4us();

    SCL = 1;

    delay_4us();

    SDA = 1;

    delay_4us();

    }


    void i2c_writebyte(uchar x)

    {

    uchar i, temp;

    temp = x;

    for(i = 0; i < 8; i++)

    {

    temp = temp << 1;

    SCL = 0;

         delay_4us();

    SDA = CY;

    delay_4us();

    SCL = 1;

    delay_4us();

    }

    SCL = 0;

    delay_4us();

    SCL = 1;

    delay_4us();

    }


    uchar i2c_readbyte()

    {

    uchar i ,temp;

    SCL = 0;

    delay_4us();

    SDA = 1;

    delay_4us();

    for(i = 0; i < 8; i++)

    {

    SCL = 1;

    delay_4us();

    temp = ((temp << 1) | SDA);

    SCL = 0;

    }

    return temp;

    }


    void i2c_writeadd(uchar address, uchar dat)

    {

    i2c_start();

    i2c_writebyte(0xa0);

    i2c_respons();

    i2c_writebyte(address);

    i2c_respons();

    i2c_writebyte(dat);

    i2c_respons();

    i2c_stop();

    }


    uchar i2c_readadd(uchar address)

    {

    uchar temp;

    i2c_start();

    i2c_writebyte(0xa0);

    i2c_respons();

    i2c_writebyte(address);

    i2c_respons();

    i2c_start();

    i2c_writebyte(0xa1);

    i2c_respons();

    temp = i2c_readbyte();

    i2c_stop();

    return temp;

    }


    展开全文
  • huangjing 链表的合并,要求O(la*lb)的复杂度,实际上就是插入什么的,注意如果在链表开头和结尾的特殊情况 代码 #include #include #include typedef struct node { int data;...void creatlist(list

    huangjing

    链表的合并,要求O(la*lb)的复杂度,实际上就是插入什么的,注意如果在链表开头和结尾的特殊情况

    代码

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    
    typedef struct node
    {
    	int data;
    	struct node *next;
    }Node,*listnode;
    
    int lena,lenb;
    
    void creatlist(listnode &head,int flag)
    {
    	int x=1;
    	listnode p,xx;
        head->next=NULL;
    	xx=head;
    	while(x!=0)
    	{
    		p=(listnode)malloc(sizeof(struct node));
            scanf("%d",&x);
    		if(x==0)  break;
    		if(flag)
    			lena++;
    		else
    			lenb++;
    		p->data=x;
    		p->next=NULL;
    		xx->next=p;
    		xx=p;
    	}
    }//创建链表
    
    void forlist(listnode &head)
    {
        listnode p;
    	p=head->next;
    	while(p!=NULL)
    	{
            printf("%d ",p->data);
    		p=p->next;
    	}
    }//遍历链表
    
    void Insert(listnode &la,int val)
    {
    	listnode p,last,cur;
    	p=la->next;
    	last=p;
    	cur=(listnode)malloc(sizeof(node));
        cur->data=val;
        if(p->data>val)
        {
           cur->next=p;
           la->next=cur;
           return;
        }
    	while(p->data<val)
    	{
    		last=p;
    		p=p->next;
    		if(p==NULL)  break;
    	}
        cur->next=p;
        last->next=cur;
    }
    
    void unionlist(listnode &la,listnode &lb)
    {
    	int flag;
    	listnode xx,yy;
    	yy=lb->next;
        for(int i=1;i<=lenb;i++)
    	{
    		flag=0;
            int key=yy->data;
    		yy=yy->next;
    		xx=la->next;
    		for(int j=1;j<=lena;j++)
    		{
    			if(xx->data==key)
    			 {
    				 flag=1;
    				 break;
    			 }
    			 else
    				 xx=xx->next;
    		}
    		if(!flag)
    		{
    			Insert(la,key);
    			lena++;
    		}
    	}
    }//合并链表
    
    int main()
    {
    	lena=lenb=0;
        listnode heada,headb;
    	heada=(listnode)malloc(sizeof(struct node));
        headb=(listnode)malloc(sizeof(struct node));
    	creatlist(heada,1);
    	creatlist(headb,0);
    	printf("链表la长度 lb长度:%d %d\n",lena,lenb);
    	printf("链表ha为");
    	forlist(heada);
    	printf("\n");
    	printf("链表hb为");
    	forlist(headb);
    	printf("\n");
        unionlist(heada,headb);
    	printf("合并后的链表:\n");
        forlist(heada);
        printf("\n");
    	forlist(headb);
    	return 0;
    }
    
    
    /*
    3 4 6 18  0
    2 3 5 6 7 19 20 0
    */
    


    展开全文
  • 实验报告出调试过程的模板,和具体步骤还有应该从哪方面着重
  • 貌似阿达曾经说过:“如果爱迪生知道要写实验报告,他就不会试一千多种材料了。”深表同意啊!好了,吐槽到此为止,凭心而论,写实验报告还是有必要的。(不过没必要非得手写吧!!!) 最近就以实验报告为题来讨论...

    最近抄微机的实验报告抄得好烦啊!想必所有工科专业的哥们和姐们都没少受实验报告的摧残。貌似阿达曾经说过:如果爱迪生知道要写实验报告,他就不会试一千多种材料了深表同意啊!好了,吐槽到此为止,凭心而论,写实验报告还是有必要的。(不过没必要非得手写吧!!!)

    最近就以实验报告为题来讨论一下各种设计模式吧。今天先谈模板方法模式,因为23种设计模式中只有这个模式是我自己在写项目时完整领悟出来的(后来看书知道这叫做“模板模式”时,得意了一下,原来我悟性挺高啊)。

    首先送出我们抄实验报告的真实过程的对应代码(以静态存储器扩展实验点阵LED显示设计实验为例)

    //点阵LED显示设计实验
    
    public class DisplayInLatticeLED
    {
        public String experimentalName()
        {
            return "点阵LED显示设计实验";
        }
    
        public String experimentalPurpose()
        {
            return "学习LED点阵扫描显示程序的设计方法";
        }
    
        public String experimentalEquipment()
        {
            return "PC机适量,TD-PITE实验装置若干,示波器少许";//画外音:做菜呢这是?;
        }
    
        public String experimentalPrinciple()
        {
            return "略";//爱抄答案的我们最恨的就是这个字了!!!
        }
    
        public String experimentalContent()
        {
            return "编写程序,在8255单元控制点阵上显示字母'b'";
        }
    
        public String experimentalProcedure()
        {
            return "1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。";
        }
    
        public String experimentalResult()
        {
            return "实验运行时,LED点阵上显示的形状为字母'b'";
        }
    
        public String experimentalSummary()
        {
            return "通过本次实验,掌握了点阵LED扫描显示程序的设计方法";
        }
    
        public void fullReport()
        {
            StringBuffer report=new StringBuffer();
    
            report.append("实验名称:");
    
            report.append(this.experimentalName());
    
            report.append("\n\r");
    
            report.append("实验目的:");
    
            report.append(this.experimentalPurpose());
    
            report.append("\n\r");
    
            report.append("实验设备:");
    
            report.append(this.experimentalEquipment());
    
            report.append("\n\r");
    
            report.append("实验原理:");
    
            report.append(this.experimentalPrinciple());
    
            report.append("\n\r");
    
            report.append("实验内容:");
    
            report.append(this.experimentalContent());
    
            report.append("\n\r");
    
            report.append("实验步骤:");
    
            report.append(this.experimentalProcedure());
    
            report.append("\n\r");
    
            report.append("实验结果:");
    
            report.append(this.experimentalResult());
    
            report.append("\n\r");
    
            report.append("实验小结:");
    
            report.append(this.experimentalSummary());
    
            report.append("\n\r");
    
            System.out.println(report.toString());
        }    
    }
    
    
    //静态存储器扩展实验
    
    public class StaticMemoryExpansion
    {
        public String experimentalName()
        {
            return "静态存储器扩展实验";
        }
    
        public String experimentalPurpose()
        {
            return "了解存储器扩展的方法和存储器的读写";
        }
    
        public String experimentalEquipment()
        {
            return "PC机适量,TD-PITE实验装置若干,示波器少许";//画外音:做菜呢这是?
        }
    
        public String experimentalPrinciple()
        {
            return "存储器中,从偶地址开始存放的字成为规则字,否则成为非规则字。。。。。。";
        }
    
        public String experimentalContent()
        {
            return "编写程序,将0000H~000FH共16个数写入SRAM的从0000H其实的一段空间中。。。。。。";
        }
    
        public String experimentalProcedure()
        {
            return "1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。";
        }
    
        public String experimentalResult()
        {
            return "使用D命令可以观察到,从0000H起始的16个字的空间中内容分别为0000H~000FH";
        }
    
        public String experimentalSummary()
        {
            return "通过本次试验掌握了存储器扩展的方法和存储器的读写";
        }
    
        public void fullReport()
        {
            StringBuffer report=new StringBuffer();
    
            report.append("实验名称:");
    
            report.append(this.experimentalName());
    
            report.append("\n\r");
    
            report.append("实验目的:");
    
            report.append(this.experimentalPurpose());
    
            report.append("\n\r");
    
            report.append("实验设备:");
    
            report.append(this.experimentalEquipment());
    
            report.append("\n\r");
    
            report.append("实验原理:");
    
            report.append(this.experimentalPrinciple());
    
            report.append("\n\r");
    
            report.append("实验内容:");
    
            report.append(this.experimentalContent());
    
            report.append("\n\r");
    
            report.append("实验步骤:");
    
            report.append(this.experimentalProcedure());
    
            report.append("\n\r");
    
            report.append("实验结果:");
    
            report.append(this.experimentalResult());
    
            report.append("\n\r");
    
            report.append("实验小结:");
    
            report.append(this.experimentalSummary());
    
            report.append("\n\r");
    
            
            System.out.println(report.toString());
        }
    }
    
    //主函数
    
    public class Main
    {
        public static void main(String[] args)
        {
            StaticMemoryExpansion reportA=new StaticMemoryExpansion();
    
            DisplayInLatticeLED reportB=new DisplayInLatticeLED();
    
            
            reportA.fullReport();
    
            reportB.fullReport();
        }
    }
    


    实验结果:

    实验名称:静态存储器扩展实验

    实验目的:了解存储器扩展的方法和存储器的读写

    实验设备:PC机适量,TD-PITE实验装置若干,示波器少许

    实验原理:存储器中,从偶地址开始存放的字成为规则字,否则成为非规则字。。。。。。

    实验内容:编写程序,将0000H~000FH16个数写入SRAM的从0000H其实的一段空间中。。。。。。

    实验步骤:1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。

    实验结果:使用D命令可以观察到,从0000H起始的16个字的空间中内容分别为0000H~000FH

    实验小结:通过本次试验掌握了存储器扩展的方法和存储器的读写


    实验名称:点阵LED显示设计实验

    实验目的:学习LED点阵扫描显示程序的设计方法

    实验设备:PC机适量,TD-PITE实验装置若干,示波器少许

    实验原理:略

    实验内容:编写程序,在8255单元控制点阵上显示字母'b'

    实验步骤:1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。

    实验结果:实验运行时,LED点阵上显示的形状为字母'b'

    实验小结:通过本次实验,掌握了点阵LED扫描显示程序的设计方法

     

    面向对象的特点:可复用,可维护,可拓展,灵活性好。

    上面的代码四个方面都没做到,也不符合依赖倒转原则。也正是因为现实中我们不得不如此抄实验报告,实验报告才会让我们如此痛恨!

    可复用那是一点都没体现,从头到尾没复用过一点东西(这也是抄实验报告时赤裸裸的现实啊!!!)。

    这次的实验报告我坑爹了。我不知道黑板上已经写了实验报告的要求,结果没写实验原理和实验小结。等我已经抄了4份实验报告后才发现要写实验原理和实验小结。实验小结还好,直接在后面补上就是,可是实验原理应该写在实验步骤之前的啊!没写又能怎么办?现实生活就是这么的无可奈何,我真想活在虚拟世界里啊(原句:“我真想活在《新闻联播》里啊”,拒绝河蟹和查水表)。写程序就容易多了,因为在编辑器中插入是很容易做到的。但是,问题来了,大部分人在写刚才程序的时候都是Ctrl+C然后Ctrl+V的。那么这里就得在所有的fullReport函数里加上实验原理和实验小结了,也是挺烦的。这就是可维护性差的表现。一出错就要改好几个地方。(但是《大话设计模式》时里面认为只有类之间的耦合使得一个类的修改会引起另一个类的改动才是可维护性差。从这方面讲,由于各个实验报告类之间没有耦合,所以可维护性还是不错的。)

    可拓展指的是增加功能的时候尽量通过增加代码解决,尽量不要改动原来的代码。(增加一个实验报告类好像勉强算得上增加功能。从这方面来讲,上面的代码可拓展性还行,因为增加一个实验报告类完全不用改动到原来的代码。但是这会使可维护性更差,因为类越多,出错后要修改的地方就越多。本来只要在静态存储拓展实验和点阵LED显示实验实验报告类里的fullReport方法里添加实验原理和实验小结就行,现在还要在新加的实验报告类里改。改动的地方变多了。但是从增加实验报告本身功能来讲,上面的代码可拓展性也很差。比如老师突然要求实验报告上要标上“指导老师”,那么每个实验报告类除了加上相应的teacher函数,还得在fullReport里面添上指导老师,毫无可拓展性可言。

    灵活性嘛也完全看不出来。fullReport中数据的生成和显示都没分开,如果需要更改显示方式是十分麻烦的事情。

    改进:

    1、显示和数据的生成分离,这样不仅可以复用生成的数据,还可以轻易更改数据的显示方式(是横排显示还是竖排显示,是红色还是绿色,是宋体还是楷体)。

    2、把相同的部分抽象到父类中,让子类继承父类,把不同的操作延迟到子类实现。(这就是模板方法模式)光说这些话有些抽象,请看下面改进代码:

    //抽象出一个实验报告的虚类
    
    public abstract class ExperimentalReport
    {
        //实验名称
        abstract public String experimentalName();
    
        //实验目的
        abstract public String experimentalPurpose();
    
        //实验设备
        abstract public String experimentalEquipment();
    
        //实验原理
        abstract public String experimentalPrinciple();
    
        //实验内容
        abstract public String experimentalContent();
    
        //实验步骤
        abstract public String experimentalProcedure();
    
        //实验结果
        abstract public String experimentalResult();
    
        //实验小结
        abstract public String experimentalSummary();
    
        
        //返回完整的实验报告
        //不在fullReport直接打印到控制台的原因:
        //1、为了fullReport代码复用,万一有些地方需要得到完整实验报告却不需要打印或需要修改打印的方式,那么就可以复用代码
        //2、MVC模式要求逻辑代码和显示分离以提高可维护性(当然,也为了复用。而且这也符合单一职责原则。【不仅是对象,接口和函数都应该符合单一职责原则】)
        //另外,使用final是为了防止子类恶意复写
    
        final public String fullReport()
        {
            StringBuffer report=new StringBuffer();
    
            report.append("实验名称:");
    
            report.append(this.experimentalName());
    
            report.append("\n\r");
    
            report.append("实验目的:");
    
            report.append(this.experimentalPurpose());
    
            report.append("\n\r");
    
            report.append("实验设备:");
    
            report.append(this.experimentalEquipment());
    
            report.append("\n\r");
    
            report.append("实验原理:");
    
            report.append(this.experimentalPrinciple());
    
            report.append("\n\r");
    
            report.append("实验内容:");
    
            report.append(this.experimentalContent());
    
            report.append("\n\r");
    
            report.append("实验步骤:");
    
            report.append(this.experimentalProcedure());
    
            report.append("\n\r");
    
            report.append("实验结果:");
    
            report.append(this.experimentalResult());
    
            report.append("\n\r");
    
            report.append("实验小结:");
    
            report.append(this.experimentalSummary());
    
            report.append("\n\r");
    
            
            return report.toString();
    
            //注:不建议使用report.append(。。。).append(。。。).append(。。。)...的方式,这会使可读性变差,而且会给调试带来一定困难
        }   
    }
    
    
    //静态存储器扩展实验
    
    public class StaticMemoryExpansion extends ExperimentalReport
    {
    
        public String experimentalName()
        {
            return "静态存储器扩展实验";
        }
    
        public String experimentalPurpose()
        {
            return "了解存储器扩展的方法和存储器的读写";
        }
    
        public String experimentalEquipment()
        {
            return "PC机适量,TD-PITE实验装置若干,示波器少许";//画外音:做菜呢这是?
        }
    
        public String experimentalPrinciple()
        {
            return "存储器中,从偶地址开始存放的字成为规则字,否则成为非规则字。。。。。。";
        }
    
        public String experimentalContent()
        {
            return "编写程序,将0000H~000FH共16个数写入SRAM的从0000H其实的一段空间中。。。。。。";
        }
    
        public String experimentalProcedure()
        {
            return "1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。";
        }
    
        public String experimentalResult()
        {
            return "使用D命令可以观察到,从0000H起始的16个字的空间中内容分别为0000H~000FH";
        }
    
        public String experimentalSummary()
        {
            return "通过本次试验掌握了存储器扩展的方法和存储器的读写";
        }   
    }
    
    
    //点阵LED显示设计实验
    
    public class DisplayInLatticeLED extends ExperimentalReport
    {
        public String experimentalName()
        {
            return "点阵LED显示设计实验";
        }
    
        public String experimentalPurpose()
        {
            return "学习LED点阵扫描显示程序的设计方法";
        }
    
        public String experimentalEquipment()
        {
            return "PC机适量,TD-PITE实验装置若干,示波器少许";//画外音:做菜呢这是?;
        }
    
        public String experimentalPrinciple()
        {
            return "略";//爱抄答案的我们最恨的就是这个字了!!!
        }
    
        public String experimentalContent()
        {
            return "编写程序,在8255单元控制点阵上显示字母'b'";
        }
    
        public String experimentalProcedure()
        {
            return "1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。";
        }
    
        public String experimentalResult()
        {
            return "实验运行时,LED点阵上显示的形状为字母'b'";
        }
    
        public String experimentalSummary()
        {
            return "通过本次实验,掌握了点阵LED扫描显示程序的设计方法";
        }
    }
    
    
    //主函数
    
    public class Main
    {
        public static void main(String[] args)
        {
            ExperimentalReport reportA=new StaticMemoryExpansion();
    
            ExperimentalReport reportB=new DisplayInLatticeLED();
            
    
            System.out.println(reportA.fullReport());
    
            System.out.println(reportB.fullReport());
        }
    }
    
    

    程序运行结果不变,这里就不在显示了


    这样改的可复用性是不是强多了?不仅fullReport的复用使得子类无需出现这个函数,而且把显示和数据分离也使得在其它地方要使用生成的fullReport变得更加容易。
    可维护性似乎也强了不少。若是fullReport出错,只需改动父类即可。如我本来忘了写实验原理和实验小结,只需在父类中改动一次,而不必像原来一样见到fullReport函数就该。

    可扩展性我觉得没什么变化。如果要增加一种实验报告只需再次继承ExperimentalReport并实现其虚函数即可(原来也只需直接再写一个类)。如果需要在每个fullReport标上实验的指导老师,除了需要改fullReport以外,还需在父类中添加虚拟的teacher函数。父类一添加这函数,所有子类都必须实现这个函数,这个是很不好的。

    灵活性嘛,数据和显示分离当然也提高了灵活性(不过这和模板方法模式倒没任何关系

     

    下面来详细介绍下模板方法模式(懒得自己表达,直接抄《大话设计模式》):

    定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    优点:通过把不变行为搬移到超类,去除子类中重复代码,提供了很好的代码复用平台。

     

    后续改进:1、做了一学期的实验相信大家也发现实验设备是一样的。好,这个也应该放到父类中。

                        2、实验目的总是学会\了解……”,实验小结总是通过本次实验,掌握了……”。实验小结掌握的东西就是实验目的要了解或学会的东西,因此这里也可以复用。

                        3、大家会发现,有些实验是没有实验原理的,如果我们在子类中只是简单地让experimentalPrinciple返回空字符串"",那么在fullReport中返回的结果会出现实验原理:实验原理后面直接没有内容。这样老师看来可能会以为你在偷懒或是失误而没写实验原理。他可能没反应过来这实验本来就没实验原理。换句话说,这里的灵活性不够,没办法不在fullReport中直接不出现实验原理的字眼。怎么办?我的建议是去掉父类中fullReport函数前的final修饰符。这样子类就可以重写fullReport,灵活性提高不少。不过相应的,就不能防止子类恶意复写了。遇到类似情况怎么取舍恐怕要看个人了。我的建议是去掉final修饰符。有人想恶意破坏总有办法的,总是防着很累不是?但是,子类没有实验原理但仍然必须实现experimentalPrinciple函数,这不应该,而且也不符合里氏代换原则。怎么办?我的建议是在写个子类,这个子类是简单的实验报告类,不包括实验原理等实验报告不一定会出现的东西。(当然,我觉得这里没必要这样做。我们不能为了为了符合某个原则而使得代码变得很麻烦。原则只不过是建议而已。不过为了演示我这边还是这么做了。)

    具体的请看下面代码:

    //简单的实验报告,没有实验原理
    public abstract class EasyExperimentalReport
    {
        //实验名称
        abstract public String experimentalName();    
    
        //实验目的
        abstract public String tempExperimentalPurpose();
        public String experimentalPurpose()
        {
            return "学习"+this.tempExperimentalPurpose();
        }
    
        //实验设备
        public String experimentalEquipment()
        {
            return "PC机适量,TD-PITE实验装置若干,示波器少许";//画外音:做菜呢这是?;
        }   
    
        //实验内容
        abstract public String experimentalContent();
    
        //实验步骤
        abstract public String experimentalProcedure();
    
        //实验结果
        abstract public String experimentalResult();
    
        //实验小结
        public String experimentalSummary()
        {
            return "通过本次实验,掌握了"+this.tempExperimentalPurpose();
        }
    
        
        //返回完整的实验报告
        //不在fullReport直接打印到控制台的原因:
        //1、为了fullReport代码复用,万一有些地方需要得到完整实验报告却不需要打印或需要修改打印的方式,那么就可以复用代码
        //2、MVC模式要求逻辑代码和显示分离以提高可维护性(当然,也为了复用)
        //使用final是为了防止子类恶意复写
    
        public String fullReport()
        {
            StringBuffer report=new StringBuffer();
    
            report.append("实验名称:");
    
            report.append(this.experimentalName());
    
            report.append("\n\r");
    
            report.append("实验目的:");
    
            report.append(this.experimentalPurpose());
    
            report.append("\n\r");
    
            report.append("实验设备:");
    
            report.append(this.experimentalEquipment());
    
            report.append("\n\r");
    
            report.append("实验内容:");
    
            report.append(this.experimentalContent());
    
            report.append("\n\r");
    
            report.append("实验步骤:");
    
            report.append(this.experimentalProcedure());
    
            report.append("\n\r");
    
            report.append("实验结果:");
    
            report.append(this.experimentalResult());
    
            report.append("\n\r");
    
            report.append("实验小结:");
    
            report.append(this.experimentalSummary());
    
            report.append("\n\r");
    
            
    
            return report.toString();
    
            //注:不建议使用report.append(。。。).append(。。。).append(。。。)...的方式,这会使可读性变差,而且会给调试带来一定困难
        }   
    }
    
    
    //完整的实验报告,有实验原理
    public abstract class ExperimentalReport extends EasyExperimentalReport
    {
        //实验原理
        abstract public String experimentalPrinciple();
    
      
        //返回完整的实验报告
        //不在fullReport直接打印到控制台的原因:
        //1、为了fullReport代码复用,万一有些地方需要得到完整实验报告却不需要打印或需要修改打印的方式,那么就可以复用代码
        //2、MVC模式要求逻辑代码和显示分离以提高可维护性(当然,也为了复用)
        //使用final是为了防止子类恶意复写
    
        public String fullReport()
        {
            StringBuffer report=new StringBuffer();
    
            report.append("实验名称:");
    
            report.append(this.experimentalName());
    
            report.append("\n\r");
    
            report.append("实验目的:");
    
            report.append(this.experimentalPurpose());
    
            report.append("\n\r");
    
            report.append("实验设备:");
    
            report.append(this.experimentalEquipment());
    
            report.append("\n\r");
    
            report.append("实验原理:");
    
            report.append(this.experimentalPrinciple());
    
            report.append("\n\r");
    
            report.append("实验内容:");
    
            report.append(this.experimentalContent());
    
            report.append("\n\r");
    
            report.append("实验步骤:");
    
            report.append(this.experimentalProcedure());
    
            report.append("\n\r");
    
            report.append("实验结果:");
    
            report.append(this.experimentalResult());
    
            report.append("\n\r");
    
            report.append("实验小结:");
    
            report.append(this.experimentalSummary());
    
            report.append("\n\r");
    
            
            return report.toString();
    
            //注:不建议使用report.append(。。。).append(。。。).append(。。。)...的方式,这会使可读性变差,而且会给调试带来一定困难
        }   
    }
    
    
    //静态存储器扩展实验
    public class StaticMemoryExpansion extends ExperimentalReport
    {
        public String experimentalName()
        {
            return "静态存储器扩展实验";
        }
    
        public String experimentalPrinciple()
        {
            return "存储器中,从偶地址开始存放的字成为规则字,否则成为非规则字。。。。。。";
        }
    
        public String experimentalContent()
        {
            return "编写程序,将0000H~000FH共16个数写入SRAM的从0000H其实的一段空间中。。。。。。";
        }
    
        public String experimentalProcedure()
        {
            return "1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。";
        }
    
        public String experimentalResult()
        {
            return "使用D命令可以观察到,从0000H起始的16个字的空间中内容分别为0000H~000FH";
        }
    
        public String tempExperimentalPurpose()
        {
            return "存储器扩展的方法和存储器的读写";
        }   
    }
    
    
    //点阵LED显示设计实验
    public class DisplayInLatticeLED extends EasyExperimentalReport
    {
        public String experimentalName()
        {
            return "点阵LED显示设计实验";
        }
    
        public String experimentalContent()
        {
            return "编写程序,在8255单元控制点阵上显示字母'b'";
        }
    
        public String experimentalProcedure()
        {
            return "1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。";
        }
    
        public String experimentalResult()
        {
            return "实验运行时,LED点阵上显示的形状为字母'b'";
        }
    
        public String tempExperimentalPurpose()
        {
            return "LED点阵扫描显示程序的设计方法";
        }
    }
    
    
    //主函数
    public class Main
    {
        public static void main(String[] args)
        {
            EasyExperimentalReport reportA=new StaticMemoryExpansion();
    
            EasyExperimentalReport reportB=new DisplayInLatticeLED();
    
            
            System.out.println(reportA.fullReport());
    
            System.out.println(reportB.fullReport());
        }
    }
    
    



    程序运行结果:

    实验名称:静态存储器扩展实验

    实验目的:学习存储器扩展的方法和存储器的读写

    实验设备:PC机适量,TD-PITE实验装置若干,示波器少许

    实验原理:存储器中,从偶地址开始存放的字成为规则字,否则成为非规则字。。。。。。

    实验内容:编写程序,将0000H~000FH16个数写入SRAM的从0000H其实的一段空间中。。。。。。

    实验步骤:1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。

    实验结果:使用D命令可以观察到,从0000H起始的16个字的空间中内容分别为0000H~000FH

    实验小结:通过本次实验,掌握了存储器扩展的方法和存储器的读写


    实验名称:点阵LED显示设计实验

    实验目的:学习LED点阵扫描显示程序的设计方法

    实验设备:PC机适量,TD-PITE实验装置若干,示波器少许

    实验内容:编写程序,在8255单元控制点阵上显示字母'b'

    实验步骤:1、按图接线 2、编写实验程序,经编译连接无误后装入系统 3、运行程序 。。。。。。

    实验结果:实验运行时,LED点阵上显示的形状为字母'b'

    实验小结:通过本次实验,掌握了LED点阵扫描显示程序的设计方法


     

    点阵LED实验本来是有实验原理的,但是由于答案是,所以我们这边偷个懒,直接不写,也许可以骗过老师吧。本来LED实验的实验报告会由实验原理:略的字眼,老师一看就知道是抄的,而且还抄得很没水平。现在实验原理直接就没有,抄的水平也上了一个档次。(当然上面的代码也有缺点,就是客户端无法获得所有实验报告类的实验原理。)

    要是我们抄实验报告也能像上面的代码那样,相信实验报告也没那么讨人厌了。

    不过,上面的代码也有缺点。不同的实验报告逻辑上应该是实验报告类的不同对象而不应该直接是不同的实验报告类。这样的话类会变得很多,从这方面讲反而会提高维护的难度。如何让不同的实验报告成为对象而不是类呢?请看下集:《建造者模式》

    展开全文
  • Linux实验报告

    千次阅读 2019-09-29 00:03:46
    Linux实验报告 一、实验目的 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 UNIX 工具软件、应用程序和网络...
  • LateX练习:一份实验报告

    万次阅读 2016-05-03 09:34:06
    为了入门LaTeX,我用来简单地处理了一份实验报告。我用的是CteX套装,安装很简单。废话不说,直接上源文件代码:\documentclass[c5size,amstex,a4paper,twoside]{ctexart} \usepackage{CJK} \usepackage{CJKspace} \...
  • 数据结构实验报告

    万次阅读 多人点赞 2019-01-12 16:22:02
    转载请注明出处,代码可以直接用,实验截图未上传成功,在编译器里...实 验 名__数据结构实验报告  班 级___网络工程***________ 姓 名_____**______________ 学 号_____*******_______ 指导教师 *****...
  • Python实验报告

    万次阅读 2020-06-21 10:22:13
    实验报告中图片上传不成功,所以未上传实验图片,请自行运行代码上传。 实 验 报 告 册 课 程 Python程序设计 批阅教师签名 学 院 信息工程学院 专 业 计算机科学与技术 班 级 18计科二班 ...
  • 安徽工程大学Python程序设计实验报告班级物流192 姓名卢诗怡学号3190505207 成绩日期2020.3.4 指导老师修宇实验名称 实验一 熟悉IDLE和在线编程平台实验目的1.掌握python IDLE集成开发环境的安装与使用2.熟悉在线...
  • 贪吃蛇实验报告

    千次阅读 2018-12-19 18:14:21
    贪吃蛇实验报告 第一次博客。 这是中山大学软件工程导论的项目之一,对初学者可能有点难度,分享出来做参考。 使用的C语言。 如果你喜欢的话可以使用,就这样,直接上代码。 #include &amp;amp;lt;stdio....
  • HDFS实验报告

    千次阅读 2019-05-19 16:26:48
    HDFS实验报告一、安装配置JDK+Eclipse+Maven1、安装配置jdk2、安装配置Eclipse3、安装Maven4、Eclipse配置Maven二、2.Eclipse里新建Maven Project三、HDFS命令和Java API-课堂内容hdfs的shell命令hdfs的Java程序 ...
  • 数据压缩实验一实验报告

    千次阅读 2017-03-08 20:43:54
    数据压缩实验一实验报告
  • 二叉树实验报告

    万次阅读 2017-06-10 18:43:33
    实验报告 实验题目:二叉树 实验目的: 1、熟悉二叉树的结点类型和二叉树的基本操作。 2、掌握二叉树的前序、中序和后序遍历的算法。 3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。基本要求: 1....
  • python实验报告

    千次阅读 2019-07-18 11:27:03
    程序与分析结果实验结果栏。 import bs4 import re import requests import json headers = { 'Accept': 'text/html, application/xhtml+xml, image/jxr, */*', 'Accept - Enco...
  • 微机原理实验报告

    千次阅读 多人点赞 2019-12-17 17:43:51
    实验一 汇编语言编程实验 一、 实验目的 二、 实验所用仪器 三、 实验内容及基本原理 四、 实验数据记录 五、 实验结果分析及回答问题(或测试环境及测试结果) 实验二 数码转换实验 一、 实验目的 二、 ...
  • 操作系统实验二实验报告

    千次阅读 2017-07-31 12:18:29
    学堂在线-清华操作系统课程-实验二实验报告
  • 数据库实验报告

    千次阅读 2018-11-11 19:29:17
    学生要对课程设计的各个实验环节进行理论学习、实验分析与设计、编码实现、最后进行分析与总结,通过提交总结报告的形式进行考核,字数不少于5000字。报告占课程总成绩的10%。 本课程设计的实验环节要求每个学生...
  • 操作系统实验三实验报告

    千次阅读 2017-08-01 22:46:40
    学堂在线-清华操作系统课程-实验三实验报告
  • 管道通信实验报告

    千次阅读 2018-07-02 13:25:53
    实验目的1.熟悉管道的概念2.掌握利用管道实现进程间通信的方法编写一段程序,实现进程的管道通信:1.使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各一句话: Child 1 is sending a message! ...
  • 防火墙实验报告

    千次阅读 2020-11-01 22:11:27
    实验名称 防火墙实验 一、实验目的: 1、通过实验深入理解防火墙的功能和工作原理 2、熟悉天网防火墙个人版的配置和使用 二、实验环境: 实验室所有机器安装了Windows 2000操作系统,组成了局域网,并安装了天网...
  • hadoop安装配置实验报告

    千次阅读 2019-05-20 10:23:30
    Hadoop三种模式安装配置实验报告 2.1. Hadoop分布式文件系统(HDFS) Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但...
  • 实验报告一:一个hello world小程序

    千次阅读 2017-09-16 16:09:03
    实验一:一个hello world小程序 学号:SA172250911.实验内容一个hello world小程序: 在Linux命令行环境(实验楼)使用C语言编写,编译后执行输出”Hello,World!”; 并将测试后的代码提交到版本库github上...
  • Hadoop搭建实验报告

    千次阅读 2013-10-22 09:40:51
    Hadoop搭建实验报告
  • python实验报告

    千次阅读 2019-07-18 11:27:11
    随机生成10000个列表,列表的长度为N(N=10),列表中的元素为(0,M)(M=10)内的实数。如果两个数相差不超过1%,则称它们相等。如果一个列表中有至少三个数相等,或者有至少两组两两相等则称该列表满足相等条件。...
  • 04 用户权限管理 实验报告

    千次阅读 2018-07-30 01:05:37
    04 用户权限管理 实验报告  广州大学学生实验报告  开课学院及实验室:计算机科学与工程实验室418B室 ...
  • 05 Oracle数据库对象 实验报告

    千次阅读 2018-07-30 01:07:40
    05 Oracle数据库对象 实验报告  广州大学学生实验报告  开课学院及实验室:计算机科学与工...
  • 实验目的: 1、掌握图形界面编程及输入输出流类。 2、了解Java 系统包的结构。 3、掌握不同类型的输入输出流类,标准数据流、文件流、数据输入输出流、对象流等。 实验内容: 编写图形界面程序,接受用户输入的5个...
  • python自动生成实验报告

    千次阅读 2019-11-18 20:02:55
    python自动生成实验报告 上篇文章中已经实现了matlab实验图片的自动保存,接下来我们试试自动生成实验报告。 我所生成的是md格式的实验报告,因为个人觉得美观,也能比较方便地借助pandoc转换成其它格式。word格式的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,362
精华内容 30,944
关键字:

如何写实验报告