精华内容
下载资源
问答
  • 静态存储区存放所有的全局变量, 这些变量将在链接之后产生, 程序执行完成就释放, 程序执行的过程中它们占领固定的存储单元, 而不会动态的进行分配和释放 2.2. 动态存储区 存放下面数据: 函数形參 、 ...

    在c语言中,每一个变量和函数有两个属性:数据类型数据的存储类别
    C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)

    1. 从变量的作用域划分变量(即从空间)角度来分

    1.全局变量
    2.局部变量

    2. 从变量值存在的时间或存储类别(即生存期)角度来分

    2.1. 静态存储区

    存放下面数据: 代码段(text)仅仅读数据段(rodata)读写数据段(rwdata)未初始化数据段(bbs)

    静态存储区存放所有的全局变量, 这些变量将在链接之后产生, 程序执行完成就释放, 程序执行的过程中它们占领固定的存储单元, 而不会动态的进行分配和释放

    2.2. 动态存储区

    存放下面数据: 函数形參自己主动变量(未加static声明的局部变量)函数调用时的现场保护和返回地址

    对以上这些数据,在函数開始调用时分配动态存储空间。函数结束时释放这些空间。

    3. 从用户内存空间角度分为三个部分

    1. 程序区
    一行一行的等待执行的机器码 
    
    2. 静态存储区
    3. 动态存储区

    4. 从C程序执行时又可分为下面存储区

    1. 代码段 (Code | Text)

    代码段由程序中执行的机器代码组成。

    在C语言中。程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器代码。并由处理器依次执行。

    2. 仅仅读数据段(ROData)

    2.1 ROData介绍
    1. 仅仅读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式相似查表式的操作。因为这些变量不须要更改,因此仅仅须要放置在仅仅读存储器中就可以。
    2. 仅仅读数据段由程序中所使用的数据产生,该部分数据的特点是在执行中不须要改变,因此编译器会将该数据段放入仅仅读的部分中。C语言中的仅仅读全局变量仅仅读局部变量。程序中使用的常量等会在编译时放入仅仅读数据区
    3. 注意:定义全局变量const char a[100]={“ABCDEFG”};将生成大小为100个字节的仅仅读数据区,并使用“ABCDEFG”初始化。

      假设定义为:const char a[ ]={“ABCDEFG”};则依据字符串长度生成8个字节的仅仅读数据段(还有’\0’),所以在仅仅读数据段中,一般都须要做全然的初始化。

    2.2 Example
    #define A=18;       ##常量
    
    const int A = 18;     ##仅仅读全局变量
    int main(){
        const int B = 18;     ##仅仅读局部变量
    }

    3. 已初始化读写数据段(RW data)

    3.1 RWData介绍


    1. 已初始化数据是在程序中声明,而且具有初值的变量。这些变量须要占用存储器的空间。在程序执行时它们须要位于可读写的内存区域内。并具有初值。以供程序执行时读写。
    2. 全局变量所有存放在静态存储区,在程序開始执行时给全局变量分配存储区程序行完成就释放。在程序执行过程中它们占领固定的存储单元而不动态地进行分配和释放

    全局变量
    静态(static) 局部变量

    3.2 Example
    int global_init_val=1;                   ## 全局变量
    int main(int argc, char * argv[]){
        static int a=1;                      ## 静态(static) 局部变量
    }

    4. 未初始化数据段(BSS)

    4.1 BSS介绍

    未初始化数据是在程序中声明,可是没有初始化的变量,这些变量在程序执行之前不须要占用存储器的空间。

    4.1 Example
    int global_noinit_val;                   ## 全局未初始化全局变量
    char *p1;                                ## 全局未初始化全局变量
    
    int main(int argc, char * argv[]){
        ......                      
    }

    5. 堆(heap)

    5.1 堆空间介绍

    堆内存仅仅在程序执行时出现。一般由程序猿分配释放


    在具有操作系统的情况下,假设程序没有释放操作系统可能在程序(比如一个进程)结束后回收内存

    5.2 Example
    p1 = (char*) malloc(10);     ## 分配得来的10和20个字节的区域就在堆区
    p2 = (char*) malloc(20);

    6. 栈(stack)

    6.1 栈空间介绍
    1. 栈内存仅仅在程序执行时出现。在函数内部使用的变量函数的參数以及返回值使用栈空间,
    2. 栈空间由编译器自己主动分配和释放。

    3. 栈空间动态开辟回收的。在函数调用过程中,假设函数调用的层次比較多,所须要的栈空间也逐渐加大
    4. 对于參数的传递返回值,假设使用较大的结构体,在使用的栈空间也会比較大
    6.2 栈区主要用于下面数据的存储
    1. 函数内部的动态变量
    2. 函数的參数
    3. 函数的返回值
    6.3 Example
    void main(void){
      int b;                    ## 栈
      char s[] = "abc";         ## 栈
      char *p2;                 ## 栈
      char *p3 = "123456";      ## 123456\0在常量区  ## p3 在栈上。
    }


    ===================================华丽的切割线=========================

    5. 4种局部变量和全局变量的存储类别(static, extern, auto, register)

    5.1 Static

    有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。

    int f(int a)
    {
        auto int b=0;
        static int c=3;
        b=b+1;
        c=c+1;
        return(a+b+c);
    }
    int main(void)
    {
        int a=2,i;
        for(i=0;i<3;i++)
             printf("%d",f(a));
    }

    对静态局部变量的说明:

    1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个执行期间都不释放。而自己主动变量(即动态局部变量)属于动态存储类别。占动态存储空间,函数调用结束后即释放。
    2)静态局部变量在编译时赋初值,即仅仅赋初值一次;而对自己主动变量赋初值是在函数调用时进行,每调用一次函数又一次给一次初值。相当于执行一次赋值语句。
    3)假设在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自己主动赋初值0(对数值型变量)或空字符(对字符变量)。而对自己主动变量来说,假设不赋初值则它的值是一个不确定的值。

    5.2 Extern

    外部变量即全局变量)是在函数的外部定义的。它的作用域为从变量定义处開始,到本程序文件的末尾。假设外部变量不在文件的开头定义,其有效的作用范围仅仅限于定义处到文件终了。假设在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。

    表示该变量是一个已经定义的外部变量。有了此声明。就能够从“声明”处起。合法地使用该外部变量

    int max(int x,int y)
    {
        int z;
        z=x>y?x:y;
        return(z);
    }
    int main(void)
    {
        extern A,B;
        printf("%d\n",max(A,B));
    }
    int A=13,B=-8;

    说明:

    在本程序文件的最后1行定义了外部变量A。B,但因为外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量A,B。如今我们在main函数中用extern对A和B进行“外部变量声明”,就能够从“声明”处起,合法地使用该外部变量A和B。

    5.3 Auto

    函数中的局部变量。如不专门声明为static存储类别,都是动态地分配存储空间的。数据存储在动态存储区中

    函数中的形參和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自己主动释放这些存储空间。这类局部变量称为自己主动变量。自己主动变量用关键字auto作存储类别的声明。

    int f(int a)         /*定义f函数,a为參数*/
    {
        auto int b,c=3;     /*定义b,c自己主动变量*/
    }

    a是形參,b,c是自己主动变量,对c赋初值3。执行完f函数后,自己主动释放a。b,c所占的存储单元。
    关键字auto能够省略,auto不写则隐含定为“自己主动存储类别”,属于动态存储方式

    占用栈空间

    5.4 Register

    为了提高效率,C语言同意将局部变量得值放在CPU中的寄存器中,这样的变量叫“寄存器变量”,用关键字register作声明。

    int fac(int n)
    {
        register int i,f=1;
        for(i=1;i<=n;i++)
            f=f*I;
         return(f);
    }
    int main(void)
    {
        int i;
        for(i=0;i<=5;i++)
            printf("%d!=%d\n",i,fac(i));
    }

    说明:

    1) 仅仅有局部自己主动变量和形式參数能够作为寄存器变量
    2)一个计算机系统中的寄存器数目有限,不能定义随意多个寄存器变量
    3)局部静态变量不能定义为寄存器变量

    6. 总结

    1. 从变量的作用域(即从空间)角度来,能够分为全局变量局部变量
    2. 从变量值存在的作时间(即生存期)角度来,能够分为静态存储方式和动态存储方式。
    3. 代码段仅仅读数据段读写数据段未初始化数据段属于静态区域

      静态区域: 是指在程序执行期间分配固定的存储空间的方式

    4. 属于动态区域

      动态区域: 是在程序执行期间依据须要进行动态的分配存储空间的方式。

    5. 代码段仅仅读数据段读写数据段在链接之后产生

    6. 未初始化数据段在程序初始化的时候开辟
    7. 在程序的执行中分配和释放
    8. C语言程序分为映像执行时两种状态。

      在编译-连接后形成的映像中,将仅仅包括代码段(Text)仅仅读数据段(RO Data)读写数据段(RW Data)

    9. 程序执行之前。将动态生成未初始化数据段(BSS)
    10. 程序的执行时还将动态形成堆(Heap)区域和栈(Stack)区域。

      一般来说,在静态的映像文件里,各个部分称之为节(Section),而在执行时的各个部分称之为段(Segment)。假设不具体区分,能够统称为

    11. C语言在编译和连接后,将生成代码段(Text)、仅仅读数据段(RO Data)和读写数据段(RW Data)。

      执行时,除了以上三个区域外,还包括未初始化数据段(BSS)区域和堆(Heap)区域和栈(Stack)区域。

    7. 一些实例

       const char ro[ ] = {"this is read only data"}; //仅仅读数据区
    
      static char rw_1[ ] ={"this is global read write data"}; //已初始化读写数据段
    
      char BSS_1[ 100]; //未初始化数据段
    
      const char *ptrconst ="constant data"; //字符串放在仅仅读取数据段
    
      int main()
    
      {
    
          short b; //在栈上。占用2个字节
    
          char a[100]; //在栈上开辟100个字节, 它的值是其首地址
    
          char s[ ]="abcdefg"; //s在栈上,占用4个字节,"abcdefg"本身放置在仅仅读数据存储区,占8个字节
    
          char *p1; //p1在栈上。占用4个字节
    
          char *p2="123456"; //p2 在栈上。p2指向的内容不能改,“123456”在仅仅读数据区
    
          static char rw_2[ ]={"this is local read write data"};//局部已初始化读写数据段
    
          static char BSS_2[100]; //局部未初始化数据段
    
          static int c = 0; //全局(静态)初始化区
    
          p1=(char *)malloc(10 * sizeof(char ) ); //分配内存区域在堆区
    
          strcpy(p1,"xxxx"); //“XXXX”放在仅仅读数据区。占5个字节
    
          free(p1); //使用free释放p1所指向的内存
    
          return 0;
    
      }

      读写数据段包括了忆初始化的全局变量 static char rw_1[ ]以及局部静态变量static rw_2[ ].其区别在于编绎时,是在函数内部使用的还是能够在整个文件里使用。对于rw_1[] 不管有无static 修饰。其都将被放置在读写数据区。仅仅是是否能被其他文件引用与否。

    对于后者就不一样了。它是局部静态变量。放置在读写数据区,假设没static修饰,其意义全然改变,它将会是开辟在栈空间的局部变量,而不是静态变量。在这里rw_1[],rw_2[]后没具体数值。表示静态区大小同后面字符串长度决定。

      对于未初始化数据区BSS_1[100]与BSS_2[100]。其区别在于前者是全局变量。在所有文件里都能够使用;后者是局部变量,仅仅在函数内部使用。未初始化数据段不设置后面的初始化数值,因此必须使用数值指定区域的大小,编绎器将依据大小设置BSS中须要添加的长度。

    參考文章
    深入探讨C语言中局部变量与全局变量在内存中的存放位置
    C语言编程程序的内存怎样布局

    转载于:https://www.cnblogs.com/zhchoutai/p/8318451.html

    展开全文
  • Matlab同样可以制作出和VC++技术一样的基于对话框的GUI界面。在Matlab软件中编写GUI...制作好的MatlabGUI界面程序如何转化成Windows下的可执行文件(后缀名字exe)、Matlab程序如何在没有Matlab软件的电脑上运行。下...

    Matlab同样可以制作出和VC++技术一样的基于对话框的GUI界面。

    在Matlab软件中编写GUI程序的方法是:命令行中输入guide,即可进入。

    Matlab是强大的数学建模软件,我们可以通过MatlabGUI编写可视化的数学程序,方便我们的操作。

    制作好的MatlabGUI界面程序如何转化成Windows下的可执行文件(后缀名字exe)、Matlab程序如何在没有Matlab软件的电脑上运行。下面这篇文章来解决上述的问题。

    网上有很多零零散散的教程,写的乱七八糟,在此我进行了总结,总结出最全的几种方法(每一种都是亲自试过并截图)。

    一、      生成独立可执行的程序(exe文件)步骤

    注意:Matlab安装的时候尽量选择全部安装,这样会为以后省下很多事情,比如当时你没有全部安装,此时Matlab 自带的编译器你需要单独安装,这就比较麻烦了(需要找到你得版本对应的编译器,再进行安装)

    注意:对MatlabGUI程序转成可执行文件需要对Matlab程序进行编译,有两种方法,一种是使用Matlab自带的编译器LCC,但是这个不是很好用,个人不推荐。第二种是使用你电脑上的编译器,个人推荐使用VS编译器。

    注意:如果Matlab软件先安装,而VS2010后安装,这时在执行以下操作的时候会出错,Matlab会显示找不到编译器。解决办法就是首先安装VS,再安装Matlab,不过一般编程人员电脑上都有VS,这种出错机会很小。这一点错误我是亲身体验过的。

    注意:VS一定要默认路径安装,否则Matlab很有可能出现找不到编译器的,如下图:

    为了演示步骤,我们在matlab中新建一个GUI程序,也就是后缀名为fig的程序,我们的目的就是将该文件转成可执行文件。

    文件名为example。运行如图(什么都没写)

    第一种方法:

    1、安装编译器。可有多种选择,matlab自带了一个LCC,推荐使用电脑上自带的VS2010(版本是多少都无所谓),我基于VS 2010实现。

    2、设置编译器。在matlab命令行输入mbuild –setup以及mex –setup,选择安装的c编译器。如下图:

    3、mcc -m filaname, filaname为要转成exe的m文件;

    注:在以前的版本中,用编译命令mcc -B sglcpp filaname;自2006的版本后,替换为mcc -mfilaname;

    4、安装\toolbox\compiler\deploy\win32目录下的MCRInstaller到目标目标电脑上,此时我们就可以在没有matlab软件的电脑上运行该软件了。

    注意:

    脱离matlab运行可执行程序

    MCR是由matlab的运行环境,占用不到300M的对于用不同matlab版本生成的exe文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。MCR环境的设置文件存放目录如下:

    \toolbox\compiler\deploy\win32

    文件名为MCRInstaller.exe。可将其拷贝到自己的文件夹中,(7.0以前的版本是mglinstaller.exe)。

    在MATLAB里运行可执行程序的办法是在前面加一个!,比如:!picshow,后缀名可有可无。

    在其它没有安装matlab的机器上运行exe文件前:

    首先安装matlab的运行环境。在同一机器上可以并存不同版本的matlab环境(换句话说不同版本不兼容)。

    其次是要将“MCRinstaller.exe安装目录\runtime\win32”这个路径添加到该计算机的环境变量中,通常是自动加载。

    如果没有,也可手动安装,添加的方法是:

    右击“我的电脑”“属性”“高级”“环境变量”“添加”指定一个变量名,然后将上述路径复制到里面就可以了。

    注:在安装过程中会弹出让安装Microsoft.NETFramework可以不用安装。

    最后就是将编译生成的相相关文件拷贝到同一目录下,双击即可运行。

    问题:目前此方法可完全运行在没有安装MATLAB以及C/C++的电脑上,但是如果是在AMD的CPU可以运行,但是不会出现任何MATLAB编译的界面。

    美中不足就是,运行的时候dos的那个黑色地窗口一直存在。下面将实现去除黑屏的办法:

    消除运行MATLAB生成的exe程序的dos黑屏的办法

    基于MATLAB生成exe文件后,每次运行都存在dos黑屏的问题,现在可以通过以下方法解决:

    方法一: 在命令窗口输入

    cd(prefdir)

    edit compopts.bat

    在打开的文件最后添加以下语句:

    A.VC环境下:

    set LINKFLAGS=%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup

    B.LCC环境下:

    set LINKFLAGS=%LINKFLAGS% -subsystemwindows

    C. Borland:

    set LINKFLAGS=%LINKFLAGS% -aa

    保存以后,再重新编译m文件,生成的exe文件运行起来就没有dos窗口了

    展开全文
  • 从入门到精通,提供下书籍跟学习的经验 看书都很瓜,关键看源码,boost, STL,都可以,关键是看的多,看了以后理解思想,比如:vector的内存分配机制...然后,要尊重规范,形成良好的编程习惯,是重要的基础。
    从入门到精通,提供下书籍跟学习的经验


    看书都很瓜,关键看源码,boost, STL,都可以,关键是看的多,看了以后理解思想,比如:vector的内存分配机制之类的,而且STL里面的一些基本的算法比如:merge, join等等也是非常有帮助的。 


    越底层越有帮助。也许烦,但是磨刀不误砍柴功。


    1)要学会C++的基本概念,如构造函数,析构函数,静态成员,静态函数,重载,虚拟等概念(最好把代码反汇编分析,有助于理解这些概念);2)熟悉Windows下的消息处理流程,最好熟悉SDK的相关接口函数,有助于理解MFC的函数封装;3)有时间分析MFC源代码的实现;4)多练习,调试程序,知道是一回事,能自己做出来是一回事,要熟悉Debug下程序的调试。(程序调试执行和分析,是学好C++,必不可少的基本技能);5)多做一些题目,有机会最好找个熟悉这方面的导师、专家定期指导;




    其实程序语言都是相通的。真正要学好的是其运行机制,而这需要通过试验(代码试验)来理解。看书背函数没有用的。象前面同学说的,多练习,不但有助于理解,而且容易进入状态,提高兴趣。
    然后,要尊重规范,形成良好的编程习惯,是重要的基础。
    展开全文
  • 本帖最后由 tangbot 于 2018...转载请注明出处MATLAB功能强大,编程方便,是国际广泛使用的计算软件。目前已有很多书籍介绍其在工程上的应用,但很少有从程序设计语言的角度写的书或文章。MATLAB是什么+20世纪70年代...

    本帖最后由 tangbot 于 2018-9-27 12:53 编辑

    640.jpeg (17.39 KB, 下载次数: 2)

    2018-9-27 12:48 上传

    公众号:理念世界的影子

    文不可无观点,观点不可无论据。

    转载请注明出处

    MATLAB功能强大,编程方便,是国际广泛使用的计算软件。目前已有很多书籍介绍其在工程上的应用,但很少有从程序设计语言的角度写的书或文章。

    MATLAB是什么

    +

    20世纪70年代末MATLAB诞生了,新墨西哥州大学计算机系主任Cleve Moler为了让学生方便地进行矩阵计算,封装了当时代表矩阵计算最高水平的线性代数计算库LINPACK和EISPACK的接口,建立了交互式计算平台MATLAB,作为免费软件向公众开放。

    80年代初,Steve Bangert主持开发了解释器程序,Steve Kleiman完成了图形功能设计,John Little和Cleve Moler主持开发了数学分析模块,编写了用户指南,形成了MATLAB的第一个商业版。

    5.0版后,MATLAB引入了更多的数据结构,如多维矩阵等,使其更易于使用。5.3版本后,MATLAB核心由Fortran转为了C语言。

    7.2版本后,MATLAB版本采用R2006a命名,至此,MATLAB版本每年发布两次并按后缀a和b命名。

    如今MATLAB既是一门编程语言,也指一种编程环境,它是一成套集成的软件体系,并具有如下特点:

    一切皆为数组的数据类型设计,语言抽象能力大幅跨越,大大提升了代码简洁性和可读性;

    动态类型(无需显式数据类型声明)、弱类型(变量获得类型后仍可赋值为另一种数据类型)的解释型语言。MATLAB采用了一种运行期间才去确定数据类型,而且数据类型可变的语言,以程序执行效率为代价,大大解放了编程的学习成本和人力成本;

    方便、强大的图形绘制功能。MATLAB内置强大、易于使用、具备自动化控制能力的数据图形和交互界面制作功能,达到数据计算、数据展示的一体化;

    丰富、强大的工具箱支持。MATLAB始终跟踪最新的数值计算库(BLAS、LAPACK等),保证了矩阵计算函数的正确和高效;同时MATLAB吸收了工业界,尤其是控制领域的大量成果,形成了完善的工具箱支持;Simulink的引入更进一步释放了其威力。发展至今基本上可以说,对于日常工作,MATLAB内部的函数和功能,几乎没有缺的,而只有你不知道的;

    堪称典范的强大的帮助系统。

    正是以上特点的综合作用,MATLAB业已发展为国际广泛使用的计算软件。

    受众和体例

    +

    本公众号不会对MATLAB基础操作做太多介绍,由于在大多数情况下,可将MATLAB视为一种更方便的C语言,特别是针对数学运算高度优化的C语言。因此公众号着重阐述MATLAB的不同之处,较适用于有一定C语言或MATLAB语言基础,特别是对C语言感兴趣的读者。

    为了提高兴趣(和阅读量),所有篇均有至少一个示例。示例均为笔者原创编制,简单示例不超过20行,复杂示例不超过50行,并对重要行有所解释。读者可以拷贝示例运行。示例内会包含本篇重要知识点,如果对知识点熟悉可以不读。但仍建议一读,因为里面有笔者自己的理解和体会,可以不夸张地说,有着不同于任何教科书的描述。

    后续文章由于要用到数据结构的二进制解析,为表达方便,使用的是MATLAB 2010b的32位版本。几乎为10年前版本,因此和很多读者的界面可能不一致,但笔者坚信,界面再新,编程理念和核心应该不会变。

    拼图游戏示例

    +

    pintu.m

    1   function pintu

    2   pintu=[2 4 3;1 0 6;7 5 8];

    3   pintudone=[1 2 3;4 5 6;7 8 0];

    4   disppintu();

    5   assignin('caller', 'move', @move); % 点击时需使用函数

    6

    7       function move(m, n) % 嵌套函数中可使用父函数中的参数

    8           [i, j, ~]=find(pintu==0);% 找到为0的格子坐标

    9           if(norm([m-i n-j])==1)% 移动相邻格子

    10                   [pintu(m, n) pintu(i, j)]=deal(pintu(i, j), pintu(m, n)); % 交换两个值

    11                   disppintu();

    12               end

    13           end

    14

    15           function disppintu()

    16               clc; % 清空屏幕

    17               disp('拼图游戏');

    18               [m, n]=size(pintu);

    19               str=[];

    20               for i=1:m

    21                   for j=1:n

    22                       v=pintu(i,j);

    23                       if(v) str=[str sprintf('%d ', i, j, v)]; % 增加超链接

    24                       else str=[str '  '];end

    25                   end

    26                   if(i~=m) str=[str sprintf('\n')];

    27                   end

    28               end

    29               disp(str);

    30               if(all(pintu==pintudone)) disp('完成!');end % 判断是否完成

    31           end

    32

    33       end

    第2行,3×3排列的矩阵,其中0处为空格,可将任意数字移至空格,此数字处变为空格;

    第3行,为矩阵的完成形式;

    第4行,显示拼图,拼图中每个数字带有超链接,点击后运行move函数;

    第5行,由于超链接中的move函数无法访问函数内部,因此将其作为句柄导出。此处的函数句柄除可以访问move函数外,还可以访问pintu函数中的变量,它是一个带环境的闭包(后面描述);

    第7行,嵌套的move函数可以直接使用父函数中的pintu变量,而不需要传递;

    第8行,查找pintu为0的坐标,其中~表示占用符,表示这个变量不需要使用,但需要知道这儿有个变量,除了~外,也可以使用ans(MATLAB默认输出变量名);

    第9行,求n-i和n-j的平方和,确保移动的格子与空的格子相邻;

    第10行,将换空格和移动格位移,此处使用了deal函数,后续会进行说明;

    第11行,交换顺序后,再次画出拼图;

    第15行,拼图嵌套子程序,清除之前的拼图并重新绘制;

    第23行,插入超链接,点击后执行move函数,每个数字对应不同参数值,即本数字所在的坐标位置;

    第30行,如果图形对应,则输出完成。其中==返回的为矩阵,使用all保证所有矩阵元素均为1。

    运行上述程序即可进行拼图游戏,游戏中,显示的数字带有下划线,鼠标移动至其上后,MATLAB状态栏会显示点击本链接执行的命令,点击后,图形刷新显示。

    知识点(入门篇,待续...)

    +

    性能分析函数

    性能分析一般是熟悉语言后的进阶功能,但由于在进行程序分析时常会用到,因此放到最前面,它的使用很简单,使用两套函数基本就够了。

    tic/toc:TIC 启动计时器。TIC 和TOC 函数一起工作来计量逝去的时间。TIC自身存储当前时间,稍后使用TOC来计算当前与之前存储时间的间隔。可以使用tic;toc对来获取两者之间时间,也可以使用t1=tic;toc(t1)来获取当前到t1时间。

    profile:分析程序执行时间。PROFILE ON启动分析器并清除之前记录。PROFILE VIEWER图形化显示记录结果。

    数据类型

    MATLAB内部使用15种数据类型,这些类型最终组成矩阵或向量,矩阵或向量最低维数为0×0。

    在MATLAB中,所有变量都是数组,如a=3,代表a为1×1数组。MATLAB内部大多数函数均是操作数组并返回数组,如[3 4]==[3 4]并不是返回1,而是[1 1]。

    变量赋值与字符显示

    1   a=3  % 赋值3到变量a并显示结果到命令窗口

    2   b=4; % 赋值4到变量b,输入分号后结果不显示

    3   disp(b) % 显示变量b的值

    MATLAB自带了一些基本命令。

    who显示当前变量,含更多信息的形式为whos。 如b=whos('a')

    clear清除工作空间变量,后可接一些控制参数。如clear global

    length显示数值各维度大小的最大值,含更多信息的形式为size。如b=length(a)

    vertcat/horzcat/cat垂直/水平/根据需要拼接矩阵。如前两者[a;b]/[a,b]等价,cat(2,a,b)与[a,b]等价,cat(1,a,b)与[a;b]等价

    exist变量或函数等是否存在。如exist(‘a’)

    isempty变量是否为空。如isemtpy([])

    disp显示变量值,更具有定制化的形式为sprintf。如disp('abc')

    disp有个特殊的功能,它可以显示超链接,包括HTML链接、FTP链接,以及MATLAB命令(使用matlab:前缀)。如

    1   disp('hyperlink')

    将在窗口显示hyperlink,点击后会执行a=3, b=4命令。

    速查手册

    +

    常用操作符

    操作符是语言中最多使用的方法的助记符,对操作符掌握的程序代表了对一种语言掌握的程度。MATLAB自身定义了丰富的操作符,且不少操作符含有多重含义。需要在MATLAB使用中反复体会。

    操作符名称含义

    @生成λ函数/类文件夹

    :冒号生成矩阵、矩阵切片等

    ,逗号元素分隔/数组列分隔符

    !感叹号调用操作系统命令

    ()圆括号数组下标/函数

    +加号正数/包文件夹

    []中括号数组生成、拼接

    ;分号不显示变量/数值行分隔符/分隔多条命令

    '   '单引号字符串

    *星号在某些命令中用于模式匹配

    .点号小数/结构体/类方法

    ..点点上层文件夹

    …省略号续行

    .()结构体动态访问

    %百分号注释/输出格式控制

    %{%}多行注释

    ~波浪号函数调用中忽略的参数

    {}大括号元胞数组生成

    空格字符行中元素分隔符/函数输出分隔符

    /或\斜杆或反斜杆访问文件夹

    MATLAB中:单行注释符号是“%”,多行注释为%{ %}(但相信大多数人不会用它,因为还有什么比选中行,然后按ctrl+R快捷键更方便的呢);

    续行符号是“…”;

    字符串使用单引号',而不是双引号”;

    在命令后使用分号;可关闭显示变量;

    数字采用()访问,下标从1开始。

    MATLAB帮助下,Programming Fundamentals/Basic Program Components/Symbol Reference可以看到关于MATLAB这些符号的帮助。

    常用运算符

    运算符含义

    []/()/{}数组生成、访问

    ;不显示变量

    :生成矩阵、矩阵切片

    +加

    -减

    *乘(矩阵运算)

    .*点乘(逐元素运算)

    /除(矩阵运算)

    ./点除(逐元素运算)

    \左除(矩阵运算)

    .\左点除(逐元素运算)

    ^指数(矩阵运算)

    .^点指数(逐元素运算)

    '转置/字符串

    .结构体访问

    ,分隔

    >小于

    <=小于等于

    >=大于等于

    ==等于

    ~=不等于

    &与(逐元素运算)

    |或(逐元素运算)

    ~非(逐元素运算)

    &&标量与

    ||标量或

    注:由于判断矩阵相等时返回矩阵,因此判断算符常联合any(所有都为0则返回0),all(所有都为1则返回1)使用。

    操作符和运算符优先级

    优先级(从大到小)符号备注

    1()

    2. '   .^  '   ^

    3+   -   ~+-分别代表正负号,为单目运算符

    4.*   ./  .\   *   /   \

    5+   -

    6:

    7   >=   ==  ~=

    8&

    9|

    10&&

    11||

    其中,冒号操作符优先级比加减乘除都要小,在使用时需尤其注意。

    微信扫一扫

    关注“理念世界的影子”

    版权声明:

    本文是"洞穴之外"作者原创文章,欢迎转载,须署名并注明来自“理念世界的影子”公众号。

    展开全文
  • 这是我们每一个编程人员都曾经思考,或正在思考的问题,正如怎样做人是一个永恒的话题一样。  提起做人我们会想到许多许多,但我想问何为做人?对于这个问题我想首先应该想到的是,做人就是从事一系列社交活动,...
  • 怎样编程 .

    2011-10-24 21:28:14
    试想,当我们熟知了C语言了的规则了以后,却还是连一个使用的程序都写不出来,甚至不能看懂别人写的一个播放器程序,那么这些关于c规则的学习又有什么意义呢。所以要用,一定要在用的过程中专研。所...
  • 怎样学好编程

    2014-02-23 08:59:39
    作为一的编程人员,掌握该怎样编写一个好程序是非常重要的,那么该如何编写好程序呢,我觉应注意夏季点: 一、明确学习目的。学习编程还能锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,因为程序...
  • 程序猿们都知道目前的各种编程语言指令都是英文单词,有一天我突然想到一个问题:中文能用来编写程序么,这将会是一种怎样的体验呢? 看了一下还真有,以下内容来自百度百科 上世纪七十年代,中国开发了一个DOS下...
  • 怎样学习编程

    2017-11-15 12:12:00
    如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些... (2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。 (3)众多的控件让编程变得象垒积木...
  • 大神门帮忙看看我这个程序怎么不能运行呢?谢谢!%清空环境变量clcclear%输入输出数据P = [2.46 131 0.482 0.737; 2.40 103 0.351 0.795; 2.69 112 0.474 0.892; 2.17 92 0.390 0.729; 2.19 114 0.395 0.762; 2.29 ...
  • 让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇。-- David Both(作者)Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理...
  • 推荐阅读《程序怎样跑起来的》,感觉写得不错,没基础的可以读一下 本文参照了百度百科、网上内容、加上自己理解整理而成 一、程序是怎么跑起来的 1.1 什么叫程序 我们写的代码叫程序,这种是源代码只适合...
  • 以我的从业经验给大家分享怎样系统的学习编程开发,刚入坑的程序猿菜鸟注意了,迅速占据高地。迅速收藏了。 整体大致分为下面几类: A.教材上的知识 这部分内容来自计算机专业的课程教材。也有可能会涉及一部分...
  • 我们该怎样编程

    2011-05-20 00:13:09
    从这次会中我学到了很多道理,尤其是编程上面。有哪些道理呢?请听我慢慢的讲解。第一,做项目难免会在copy别人好的代码,但是我们在copy别人代码之后。我们应该对这些代码进行理解,最好是能够对其进行改造,变成更...
  • 本文引用地址:http://www.eepw.com.cn/article/201808/388132.htm程序接口新版本的MATLAB可以...允许用户编写可以和MATLAB进行交互的C或C++语言程序。另外,MATLAB网页服务程序还容许在Web应用中使用自己的MATLAB数...
  • 展开全部importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;/***@authorHardneedl*/finalclassDeskDemoextendsJFrame{publicStringgetTitle(){return"DeskDemo";}staticpri...
  • 展开全部比如myeclipse,那么32313133353236313431303231363533e59b9ee7ad9431333365646264就是创建一个类,然后敲入main,alt+/可以导出main函数(Java程序的入口就是main)。如果没有用工具,需要配置环境变量的,...
  • 那么我们怎样利用C语言提供的库函数获取一个应用程序的各阶段的执行效率,通过数据分析出该程序的瓶颈而且做出对应的优化。本文给大家解说的clock()函数。2.我们首先看一看C/C++标准文档对于clock()函数的解说3.函.....
  • 执行程序: 菜单字体,状态栏字体,工具栏的标题,文档标题,字体看着小且不舒服,怎样改变? 与CMFCBaseVisualManager CMFCVisualManagerOfficeXP CMFCVisualManagerVS2008 有关吗? [img=...
  • 今天在消化一个服务器对应多个客户端的网络编程。接下来还有一个问题,就是 “ 一个C#网络程序怎样编程才能做到服务器端,客户端可以同时工作。”
  • 原标题:Python入门学习的计算机程序设计语言是怎样的?你可能已经听说过很多种流行编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Java语言。那么,关于Python你又有...
  • ·怎样理解应用程序协议和网络通讯... ·怎样区分ASP、JSP与网络编程的概念。 ASP、JSP是用于产生网站内容的一种语言,这些内容需要通过网络程序来传输。网络程序可以传输 的对象不单单是这些网站
  • 在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字符串等功能的系统调用的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,952
精华内容 1,580
关键字:

怎样编程程序