精华内容
下载资源
问答
  • 将每行的数字单独分割出来才能够一个一个识别。1.方法 进行腐蚀操作,去除图片中杂点。 膨胀,保证一个数字中数码管相互连接(由于是数码管,有时会出现两管之间不连接情况) 使用cvFindContours查找各个数字...

    本篇介绍数字的自动分割。将每行的数字单独分割出来才能够一个一个识别。

    1.方法

    1. 进行腐蚀操作,去除图片中的杂点。
    2. 膨胀,保证一个数字中数码管相互连接(由于是数码管,有时会出现两管之间不连接的情况)
    3. 使用cvFindContours查找各个数字边缘
    4. 分别建立各个轮廓的轮廓矩
    5. 将每个矩形切割出来,并单独存为一个图像

    旋转后的行图片如图,一共有4行,这里就只贴一行了。
    RotateRow
    分割后的数字图片如图:

    Num1(1)Num1(2)Num1(3)Num1(4)Num1(5)

    2.代码

    先给出全部函数代码,之后再详细解释。

    /**************数字分割子程序**************/
    //函数名称:int CutNum(IplImage *RotateRow,int row)
    //功能:将每行的数字进行分割
    //入口参数:*RotateRow,row
    //出口参数:数字个数Num
    //生成:数字图像Num(row).1.2.3...
    /***************************************/
    int CutNum(IplImage *RotateRow,int row)
    {
        cvThreshold(RotateRow,RotateRow,50,255,CV_THRESH_BINARY);
        cvErode(RotateRow,RotateRow,0,1);
        cvDilate(RotateRow,RotateRow,0,2);
        //对每列图像查找边缘
        CvMemStorage *OutlineSto=cvCreateMemStorage();
        CvSeq *Outlineseq=NULL;
        IplImage *TmpImage=cvCloneImage(RotateRow);
        int Num=cvFindContours(TmpImage,OutlineSto,&Outlineseq,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
        //确定轮廓顺序
        int *Rect_x=new int[Num];
        int x=0;
        for (CvSeq *c=Outlineseq;c!=NULL;c=c->h_next)
        {
            CvRect RectBound=cvBoundingRect(c,0);
            Rect_x[x]=RectBound.x;
            x++;
        }
        qsort(Rect_x,Num,sizeof(int),cmp);
        //分割数字并单独存储
        for(CvSeq *c=Outlineseq;c!=NULL;c=c->h_next)
        {
            CvRect RectBound=cvBoundingRect(c,0);
            CvRect CutRect=cvRect(RectBound.x-4,RectBound.y-4,RectBound.width+8,RectBound.height+8);    
            IplImage *ImgNo=cvCreateImage(cvSize(CutRect.width,CutRect.height),IPL_DEPTH_8U,1);
            cvSet(ImgNo,cvScalar(0),0); //将图像填充为黑色
            cvSetImageROI(RotateRow,CutRect);
            cvCopy(RotateRow,ImgNo);
            cvResetImageROI(RotateRow);
            int col=0;
            for(int i=0;i<Num;i++)
            {
                if(Rect_x[i]==RectBound.x)
                {
                    col=i;
                    break;
                }
            }
            //为图像存储路径分配内存
            char *SavePath=(char *)malloc(30*sizeof(char));
            if (SavePath==NULL)
            {
                printf("分配内存失败");
                exit(1);
            }
            sprintf(SavePath,"C:\\picture\\biao2\\Num%d(%d).jpg",row,col+1);
            //表示第row行,第col+1个
            cvSaveImage(SavePath,ImgNo);
            free(SavePath);
            SavePath=NULL;
            cvReleaseImage(&ImgNo);
        }
        delete Rect_x;
        cvReleaseMemStorage(&OutlineSto);
        cvReleaseImage(&TmpImage);
        return Num;
    }

    3.解析

    (1).腐蚀膨胀

    • 首先,由于在分割每行的数字之前要读取行图片,前面已经说过,为了保险,最好重新进行二值化。
    • 另外为了消除图片上的杂点,要进行腐蚀。腐蚀可以理解为向内收缩,图片上散落的杂点会被消除。

      void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
      src:输入图像.
      dst:输出图像.
      element:用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
      iterations:腐蚀的次数

    • 为了保证一个数字上的数码管粘连,要进行膨胀操作。

      void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
      src:输入图像。
      dst:输出图像。
      element:结构元素。若为 NULL, 则使用默认的3×3 长方形,锚点在中心的结构元素,进行膨胀运算。
      iterations:膨胀的次数

        //二值化
        cvThreshold(RotateRow,RotateRow,50,255,CV_THRESH_BINARY);
        //腐蚀
        cvErode(RotateRow,RotateRow,0,1);
        //膨胀
        cvDilate(RotateRow,RotateRow,0,2);

    (2).边缘查找


    • 用cvFindContours函数查找边缘。预先需要建立存储轮廓的容器“storage”和用于指向第一个输出轮廓的“Outlineseq”。

    int cvFindContours(
    CvArr* image,
    CvMemStorage* storage,
    CvSeq** first_contour,
    int header_size=sizeof(CvContour),
    int mode=CV_RETR_LIST,
    int method=CV_CHAIN_APPROX_SIMPLE,
    CvPoint offset=cvPoint(0,0) );

    image:8比特单通道的源二值图像。
    storage:返回轮廓的容器。
    first_contour:输出参数,用于存储指向第一个外接轮廓。
    header_size:header序列的尺寸。
    如果选择method = CV_CHAIN_CODE, 则header_size >= sizeof(CvChain);
    其他,则header_size >= sizeof(CvContour)。
    mode
    CV_RETR_EXTERNAL:只检索最外面的轮廓;
    CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
    CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
    CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
    method:边缘近似方法(除了CV_RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)。可取值如下:
    CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
    CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
    CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
    CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法
    的一种。
    CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。
    offset:偏移量

        //对每列图像查找边缘
        CvMemStorage *OutlineSto=cvCreateMemStorage();
        CvSeq *Outlineseq=NULL;
        IplImage *TmpImage=cvCloneImage(RotateRow);
        int Num=cvFindContours(TmpImage,OutlineSto,&Outlineseq,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));

    (3).轮廓排序

    • 由于在后期识别的时候需要根据数字出现的顺序整合结果,所以保证获取的数字图像顺序与图中一致是很重要的。数字顺序的保证在于数字图片存储的时候按照数字x坐标的大小顺序进行有序命名和存储。首先需要确定各个轮廓外接矩形的x坐标顺序。
    • 先获取每个轮廓外接矩形x坐标,再用qsort 对数组排序。
        //确定轮廓顺序
        int *Rect_x=new int[Num];
        int x=0;
        for (CvSeq *c=Outlineseq;c!=NULL;c=c->h_next)
        {
            CvRect RectBound=cvBoundingRect(c,0);
            Rect_x[x]=RectBound.x;
            x++;
        }
        qsort(Rect_x,Num,sizeof(int),cmp);

    (4).数字分割并存储

    • 在循环中用ImgNo来临时存储从图中拷贝出来的数字图像。
    • 每个循环中为数字图像按Rect_x数组中存储的x坐标顺序为数字分配存储路径。数字所在行数也用row做出区分(row为函数输入变量之一)。
        //分割数字并单独存储
        for(CvSeq *c=Outlineseq;c!=NULL;c=c->h_next)
        {
            CvRect RectBound=cvBoundingRect(c,0);
            //设定拷贝区域的大小为CutRect。为方便识别,比外接矩形长宽各多出8像素
            CvRect CutRect=cvRect(RectBound.x-4,RectBound.y-4,RectBound.width+8,RectBound.height+8);    
            //用ImgNo临时存储
            IplImage *ImgNo=cvCreateImage(cvSize(CutRect.width,CutRect.height),IPL_DEPTH_8U,1);
            cvSet(ImgNo,cvScalar(0),0); //将图像填充为黑色
            //设定感兴趣区域
            cvSetImageROI(RotateRow,CutRect);
            cvCopy(RotateRow,ImgNo);
            cvResetImageROI(RotateRow);
            //查找该外接矩形的序号
            int col=0;
            for(int i=0;i<Num;i++)
            {
                if(Rect_x[i]==RectBound.x)
                {
                    col=i;
                    break;
                }
            }
            //为图像存储路径分配内存
            char *SavePath=(char *)malloc(30*sizeof(char));
            if (SavePath==NULL)
            {
                printf("分配内存失败");
                exit(1);
            }
            sprintf(SavePath,"C:\\picture\\biao2\\Num%d(%d).jpg",row,col+1);
            //表示第row行,第col+1个
            cvSaveImage(SavePath,ImgNo);
            free(SavePath);
            SavePath=NULL;
            cvReleaseImage(&ImgNo);
        }
    • 最后释放,返回每行数字数Num。
        delete Rect_x;
        cvReleaseMemStorage(&OutlineSto);
        cvReleaseImage(&TmpImage);
        return Num;
    展开全文
  • 由設想問題發生具體領域開始,闡述擾亂穩定狀態事件來源,經過去蕪菁並且轉化為引言來誘發讀者興趣,接著進一步導入理性診斷架構,探查因果、分門別類、假設可能,並蒐集資料佐證,利用邏輯樹產生並測試,再...
  • 棋题目内容:嗯,就是视频里说那个井棋。视频里说了它基本思路,现在,需要你把它全部实现出来啦。你程序先要读入一个整数n,范围是[3,100],...你程序要判断其中是否存在某一方获胜,获胜条件是...

    井字棋

    题目内容:

    嗯,就是视频里说的那个井字棋。视频里说了它的基本思路,现在,需要你把它全部实现出来啦。

    你的程序先要读入一个整数n,范围是[3,100],这表示井字棋棋盘的边长。比如n=3就表示是一个3x3的棋盘。然后,要读入n行,每行n个数字,每个数字是1或0,依次表示[0,0]到[n-1,n-1]位置上的棋子。1表示X,0表示O(大写字母O)。

    你的程序要判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子。如果存在,则输出代表获胜一方字母:X或O(大写字母X或O);如果没有任何一方获胜,则输出NIL(三个大写字母,中间是字母I(India的I)。

    注意:所给的棋盘上的棋子分布可能出现同一个棋子有多处满足获胜的条件,但是不会出现两种棋子都获胜的情况。

    输入格式:

    一个代表棋盘大小的数字n,后面跟上nxn个0或1的数字。

    输出格式:

    三种输出之一:

    X

    O

    NIL

    均为大写字母。

    输入样例:

    4

    1 0 0 1

    0 1 0 0

    0 0 1 0

    1 0 0 1

    输出样例:

    X

    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    int n = in.nextInt();

    int[][] num = new int[n][n];

    int count = 0;

    int temp = -1;

    for (int i = 0; i < num.length; i++) {

    for (int j = 0; j < num[i].length; j++) {

    num[i][j] = in.nextInt();

    }

    }

    for (int i = 0; i < num.length - 1; i++) { // 搜索正对角线

    if (num[i][i] != num[i + 1][i + 1])

    break;

    else

    count++;

    if (count == n - 1) //两两比较后的计数

    temp = num[0][0];

    }

    count = 0;

    for (int i = 0; i < num.length - 1; i++) { // 搜索反对角线

    if (num[n - 1 - i][i] != num[n - 2 - i][i + 1])

    break;

    else

    count++;

    if (count == n - 1)

    temp = num[n - 1][0];

    }

    count = 0;

    for (int i = 0; i < num.length; i++) { // 搜索行

    for (int j = 0; j < num.length - 1; j++) {

    if (num[i][j] != num[i][j + 1]) {

    count = 0;

    break;

    } else

    count++;

    if (count == n - 1)

    temp = num[i][0]; //等于最顶行上的数字

    }

    }

    count = 0;

    for (int i = 0; i < num.length; i++) { // 搜索列

    for (int j = 0; j < num.length - 1; j++) {

    if (num[j][i] != num[j + 1][i]) {

    count = 0;

    break;

    } else

    count++;

    if (count == n - 1)

    temp = num[0][i]; //等于最左列上的数字

    }

    }

    if (temp == 1) {

    System.out.println("X");

    } else if (temp == 0) {

    System.out.println("O");

    } else

    System.out.println("NIL");

    }

    }

    展开全文
  • 碑文右起竖式,行书阴刻,22,满14。现抄录、释文、句读如下(括号内文字为笔者注,“囗”标识原碑): 游浮山记 筠试士安庆毕事,将之六安,取道浮山。以九月七日至华严寺。日曛。自抱龙峰上金谷岩...

    此系列文章均来自于文乡枞阳,作者王乐群,特此说明。

     

    田野调查手记•浮山篇(五)

    作者:王乐群

     

    本篇为你介绍“朱筠撰、姚訏书《游浮山记》碑刻”。

    朱筠撰、姚訏书《游浮山记》碑刻,嵌于隐贤岩内的石壁间。碑为青石质,呈长方形,纵64厘米,横140厘米。碑文右起竖式,行书阴刻,22行,满行14字。现抄录、释文、句读如下(括号内文字为笔者注,“囗”标识原碑字不存):

    游浮山记

     

    筠试士安庆毕事,将之六安,取道浮山。以九月七日至华严寺。日曛。自抱龙峰上金谷岩,左窥九曲洞,仰滴珠岩,顾绿萝庵,不度。入紫霞关,折上首楞岩,以望九子,览大江。由选佛岩登最高峰,沿历金谷、滴珠之顶,呼炬,过文殊峰而下宿寺中。明日,肩舆抵石龙峰,入雷公洞,盘壁过浩笑廊。坐陆子岩,遍读宋人题壁,徘徊枕易窝侧,礼远禄公石塔。左拾级至九带堂,观指月石,下息于会圣岩。行踏莲花石,瓣丹宛然;遂跻巅,周瞰天池。乃下折行绕云梯,经张公、观音诸岩,立幻度松下久之。逾烂柯石,游佛母岩而还。又明日,出山,爰题名于会圣之石。时乾隆三十七年壬辰秋九月九日。

    同游者:上虞张凤翔方海。侍行者:宛平徐瀚文圃。迎余于山中而与俱者:石埭汪囗宝书,桐城何英标准人。大兴朱筠竹君记。桐城姚訏初谷书。怀宁王全士镌。

    调查者说

     

     

    朱筠撰、姚訏书《游浮山记》碑刻,年代为清乾隆三十七年(1772)。时为朱筠奉命提督安徽学政的第二年。

     “(与朱筠)同游(浮山)者张凤翔”,初名秉岳,字方海,清浙江绍兴人。藏书家、文学家。名入吴晗《两浙藏书家史略》。著《方海诗集》。

     “迎余(朱筠)于(浮)山中而与俱者何英标”,字慕曾,一字准人,青山何氏。文学家。清乾隆间岁贡生。官建平县训导。著《弹奕山房诗钞》。有《陪朱学使朱公游浮山》诗:“春山多白云,朝日东方悬。莺声引游人,呖呖歌喉圆。晴霞映丹谷,芳草侵花鞯。山溪窈且曲,树梢飞流泉。一径入古寺,老僧笑相延。年少索长告,高轩欢周旋。”

    书写者姚訏,字君俞,一字初谷。麻溪姚氏。礼部员外郎姚淑次子,桐城派集大成者姚鼐二弟。书法家,文学家。英年早逝。姚鼐曾作《亡弟君俞权厝铭》。

    撰文者朱筠,字竹君,号笥河,顺天大兴(今属北京)人。著名学者、教育家、考据学家、文学家、乾嘉学派领袖、《四库全书》的首倡者和参与编撰者,清代五大汉学家之一,他的幕府被称为“清代四大幕府之一”。兹录数则名家学者对他的评价:

    ——(朱筠是)乾嘉朴学的开国元勋(和)乾嘉朴学家的领袖。(姚名达)

    ——世之士能文章者,略于考证;讲经疏者,拙于为文;生(朱筠)能兼攻之……生内友兄弟,而外好交游。(姚鼐)

    ——先生好古学,于金石文字尤极留意。……生平所过郡县名山水,凡足迹可及之地无不至,至则访摩崖旧刻、古刹残碑、不惮扪萝剔鲜,每得唐以上物辄狂呼,宾从其往观之,欣赏笑乐之声穿云度。(李威)

    ——大兴朱笥河先生筠,诗古郁盘奥……古文词,真气浑厚,神似龙门也。(林昌彝)

    ——笥河(散文)长于马班,其神逸……为大家(也)。(陈寿褀)

     ——君(朱筠)之属文如江河汇不择所,流荡无外内,猋怒涛惊,复于恬靡小址澄潭。(王先谦)

    ——朱筠继承韩愈为文理念,视文为宗经载道、济世致用之具,重视文气,追求醇厚雅正的为文风格,同时力求词必己出,自成一家。(梅莹)

    ——笥河为风雅宗,天下名流出门下。(包世臣)

    ——笥河提倡《说文》,请开四库全书馆,南厓(朱筠弟朱珪)甘盘旧学,致君绎民,又宏奖士林,敦崇实学,皆乾嘉间主持风会之人,宜当世奉为泰山北斗也。(徐世昌)

    ——(朱筠)以立品读书为职业,不宜修小礼,曲意委顺于达官贵势,惟喜奖藉寒峻,见有一善者辄誉之如不及,有请益者必诚告之,惟恐不尽……一时材售,辖辏其门,多所成就,以故士心公论,皆翕然归君。(李祖陶)

    ——京师语曰:“自(朱)竹君先生死,士无谈处;自(程)鱼门先生死,士无走处。”公(朱筠)昆季以文学卓行,同翔天衢,为海内所誉服。公又束修其躬,志古人之所志,学古人之所学,士林中靡不齐其口异音同叹。(袁枚)

     

    调查者  枞阳县文物管理所

              枞阳县博物馆

    摄影:吴得华

    展开全文
  • 先 找 到 ' a ` a “ ii 码 值 97 一 > 把 97 按 照 int 类 型 进 øøøøøøøø 999eee999 99999e999 91199991 一 > 把 四 个 储 到 内 中 一 一 > 97 一 个 节 一 > 把 97 转 换 为 2 进 ...

     一.补充关键字char,short关键字

            

    /*

     1.改变整型变量占用的存储空间

     int short long long long

     

     改变一个数的符号

     signed unsigned

     */

     


     
    <span style="font-size:24px;">1).代码举例</span>
    #include<stdio.h>
     
    int main(int argc,const char * argv[]) {
       
        shortint a = 1 ;//short占用两个字节 16位
        //10000000 00000000 2字节最小负数
        //01111111 11111111 2字节最大正数
        
        short int a1 =a<<15 ;
        printf("%d\n",a1);//-32768
        
        a1 = (a << 15)-1;
        printf("%d\n",a1);//32767
        
        
        int b = 1 ;
        int b1 = b<<31;//-2147483648
        printf("%d\n",b1);//左移直接得到原码
        
        b1 = (b<<31)-1;//2147483647
        printf("%d\n",b1);
        
        
        
        long int c =1;
        long int c1 = c<<63;//-9223372036854775808
        printf("%ld\n",c1);//左移直接得到原码
        
        c1 = (c<<63)-1;//922337203685477587
        printf("%ld\n",c1);
        
        
        //改变一个数的符号
        //计算机默认为有符号数
        unsigned short d = 0 -1  ;
        printf("%u\n",d);//65535
        
        unsigned int e = 0-1 ;
        printf("%u\n",e);//4294967295
        
        //char 类型常量的存储问题
        int len = sizeof('a');//4
        printf("%d\n",len);
        char ch = 'a' ;
        len =sizeof(ch);//1
        printf("%d\n",len);


    二.数组学习

    按有序形式组织,同类型数据元素的集合,数组属于构造数据类型

    1.下标

    2.维数

    数值数组字符数组指针数组结构数组 


     

     

    注意:区别两种写法,上面的Xcode下bian'yi编译器优化可以


    int a[4]={1,2,3,4};

    1.a[0] a[2] a[1] a[3]是变量


    数组初始化

    1.int a[]={……}; //不表明数组长度

    2,int a[2]={….};

     

    int a[10]={[2]=12,[6]=9,23};

           

    先定义长度,后初始化

    1.int  a[10];

    2.a[0]=1;

    3.a[1]=2;

    ……….


    2).字符数组 

     int a[10]={[2]=12,[6]=9,23};
        for (int i = 0 ; i < 10 ; i++) {
            printf("%d\t",a[i]);
        }
        
        int num= 9;
        int b[num];
        b[0]=1;
        
       // int arr[num]={12,33,444,3};
        
        /*
        输出结果:
         1 0 1606416344 32767 0 1 0 0 1606416360 32767
        值为不确定的垃圾数
         */
        printf("\n");
        int b1[10];
        for (int i = 0; i<10; i++)
            printf("%d\t",b1[i]);
        
        //\300 \367 \277 _ \377
        char ch[10];
        printf("\n");
        for (int i = 0; i<10; i++)
            printf("%c\t",ch[i]);
     
        
        //部分初始化
        int c2[10]={12};
        printf("\n");
        for (int i = 0; i<10; i++)
            printf("%d\t",c2[i]);
        //12 0 0 0 0 0 0 0 0 0
        
        /**///a v 没显示的不是空子符
       
     char ch2[10]={'a','v'};
        printf("\n");
        for (int i = 0; i<10; i++)
            printf("%c\t",ch2[i]);
        for (int i = 0; i<10; i++)
            printf("%d\t",ch2[i]);
     
     
     

    3).数组引用

    a[1]=2;

    1.如果是先定义,后初始化,对于没有被初始化的数组元素,系统不会对没有初始化的那部分元素进行初始化0的操作。


    4).数组的存储形式

    1.从首地址开始存第一个数组元素,依次类推

    2.先定义的数组存在高地址

     

    int a[2]={12,23};
        char ch[3]={'a','d','s'};
        
        printf("a[0]地址 : %p\n",a);//低地址
        printf("a[0]地址 : %p\n",&a);//低地址
        printf("a[0]地址 : %p\n",&a[0]);//低地址
        printf("a[1]地址 : %p\n",&a[1]);//高地址
        printf("ch[0]地址 : %p\n",&ch[0]);//低地址
        printf("ch[1]地址 : %p\n",&ch[1]);//高地址
        printf("ch[2]地址 : %p\n",&ch[2]);//高地址
     
        
        /*
         
         a[0]地址 : 0x7fff5fbff7b0
         a[0]地址 : 0x7fff5fbff7b0
         a[0]地址 : 0x7fff5fbff7b0
         a[1]地址 : 0x7fff5fbff7b4
         ch[0]地址 : 0x7fff5fbff79d
         ch[1]地址 : 0x7fff5fbff79e
         ch[2]地址 : 0x7fff5fbff79f
         */15/10/23
     

    数组名和第一个数组元素地址相同,数组名即是地址

     

     int a[ ]={12,23};
        char ch[3]={'a','d','s'};
     
        //计算整型和char型数组占用的字节数
        int len = sizeof(a);
        
        int len2 = sizeof(ch);
        
        printf("a = %d , ch = %d\n",len,len2);
        
        
        //数组的长度
        len = sizeof(a)/sizeof(int);
        len2 = sizeof(ch)/sizeof(char);
        printf("a = %d , ch = %d\n",len,len2);

    函数名作为函数参数时,是地址传递而不是值传递


     5).数组名传递

     
    //
    //  Created by CHINGWEI_MACPC on 15/10/23.
    //  Copyright © 2015年 itcast. All rights reserved.
    //
     
    #include<stdio.h>
    int transArry(int arr[]){
        for (int i = 0; i< 2; i++) {
            
            arr[i]=arr[i]+1;
            printf("%d ",arr[i]);
        }
        printf("\n");
        return 0;
    }
    int main(int argc,const char * argv[]) {
        
        int a[ ]={12,23};
        //printf("%p\n",a);
        for (int i = 0; i<2; i++) {
            printf("%d ",a[i]);
        }
         printf("\n");
        //transArry(0x7fff5fbff7b0);//数祖名A存储的是地址
        transArry(a);
        
        return 0;
    }

    注意点

    1.形参和实参长度可以不相同,只传送首地址而不改变数组长度

    虽然不会报错,尽量保持形参长度和类型一致

    2.形参长度可以不写

    3.数祖名作为参数后,长度信息丢失的问题

    4.C语言所有的地址都占8个字节

     
    int transArry(int arr[]){
        //C语言中规定,不管什么类型的数据,数据的内存地址
        //在内存中占用8个字节
        //此时函数名为一个地址所以sizeof计算出来的都是8字节
        int len = sizeof(arr);
        //int len = sizeof(&arr);
        return len;
    }
    int main(int argc,const char * argv[]) {
        
        int a[ ]={12,23,12,32};
        float b[]={2.3f,23.2f,9.f,23.33f,23.344f};
        int len = sizeof(a);
        printf("%d \n",len);//16
        printf("%p\n",a);
        printf("%d \n",transArry(0x7fff5fbff780));
        printf("%d \n",transArry(a));//函数名做参数传递后为 8
        printf("%d \n",transArry(b));//8
    }
     
     
     
     
    //排序方法
    //大数下沉,小数上浮
     
    #include<stdio.h>
    void bubble(int arr[] ,int len){
        
      
        for(int i = 0 ;i < len - 1 ;i++ ){
            for (int j = 0 ; j < len - 1 -i; j++) {
                //没有必要和已经有序的数据进行比较
                if (arr[j]>arr[j+1]) {
                    int temp = arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
       
    }
    int main(int argc,const char * argv[]) {
      
        
        int a[]={99,20,39,3,12,30,76,34,1,2,32};
        int len = sizeof(a)/sizeof(int);
        bubble(a,len);
        for (int i = 0 ; i < len ; i++) {
            printf("%d ",a[i]);
        }
        printf("\n");
        
        return 0;
    }

    6).选择排序

     

    //  C9选择排序
    //
    // Created by CHINGWEI_MACPC on 15/10/23.
    //  Copyright © 2015年 itcast. All rights reserved.
    //
     
    #include<stdio.h>
    void selectSort(intarr[] ,int len){
        //每走一趟找到一个最小的数
        for(int i = 0;i < len-1 ;i++ ){
           for (intj = i+1 ; j < len; j++) {
               if (arr[i]>arr[j]) {
                   int temp= arr[i];
                   arr[i]=arr[j];
                   arr[j]=temp;
               }
           }
        }
    }
     
    int main(intargc,const char* argv[]) {
        int a[]={99,20,39,3,12,30,76,34,1,2,32};
        int len = sizeof(a)/sizeof(int);
        selectSort(a,len);
        for (int i = 0; i < len ; i++) {
           printf("%d",a[i]);
        }
        printf("\n");
        
        return 0;
    }

    7).折半查找思想

    #include<stdio.h>
    int searchItem(intkey ,int arr[] ,intlen){
        
        int low =0 ,high = len -1 , mid ;
        
        while (low <= high ) {
           mid =(low+high)/2;
           if (key > arr[mid]) {
               low = mid+1;
                       }
           else if(key<arr[mid]){
               high = mid -1;
           
           }
           else
           {
               return mid;
           }
           
        }
        return -1 ;
    }
     
    int main(intargc,const char* argv[]) {
        int a[]={1, 2 ,3 ,12 ,20 ,30 ,32, 34, 39, 76 ,99};
        int len = sizeof(a)/sizeof(int);
        int result = searchItem(32,a,len);
        
        if (result != -1) {
           printf("a[%d]= %d  \n",result,a[result]);
        }
        else {
           printf("未找到! \n");
        }
        printf("\n");
        
        return 0;
     
           
     
     
    #include<stdio.h>
    int insertItem(intkey ,int arr[] ,intlen){
        
        int low =0 ,high = len -1 , mid ;
        
        while (low <= high ) {
           mid =(low+high)/2;
           if (key > arr[mid]) {
               low = mid+1;
           }
           else if(key<arr[mid]){
               high = mid -1;
               
           }
           else
           {
               return mid+1;
           }
           
        }
        return low ;
    }
     
    int main(intargc,const char* argv[]) {
        int a[]={1, 2 ,3 ,12 ,20 ,30 ,32, 34, 39, 76 ,99};
        int len = sizeof(a)/sizeof(int);
        int result = insertItem(18,a,len);
        
        printf("在第[%d]个位置插入 = %d  \n",result,18);
        
        printf("\n");
        
        return 0;
    }<span style="font-family: Calibri; font-size: 13.5pt; background-color: rgb(255, 255, 255);"> </span><span style="font-size: 13.5pt; font-family: Menlo;"> </span>

    折半插入值

      

    三.二维数组的定义

    1).int arr[][]; 


     

    2).数组定义初始化

        

    int arr[][3]={1,2,3,4,5};
        int arr2[2][8];
        
        //地址值
        printf("%p\n",&arr);
        printf("%p\n",&arr[0]);
        printf("%p\n",&arr[0][0]);
        /*
        0x7fff5fbff74c
        0x7fff5fbff74c
        0x7fff5fbff74c
        */
        
        //计算占用的总字节数
        int len = sizeof(arr2);
        printf("%d\n",len);
        
        int len2 = sizeof(arr[1])*2;
        printf("%d\n",len2);
        
        //计算有多少列数
        //列数=行的总字节数 /每个元素占用的字节(数组类型)
        len2 = sizeof(arr2[1])/sizeof(int);
       printf("列数 = %d\n",len2);
        
        //计算行数
        //粽子结束
        len = sizeof(arr2)/sizeof(arr2[0]);
       printf("行数 = %d\n",len);


    3).二维数组中元素之间的地址是连续的


     

     N*M矩阵:

    二维数组名做参数

    注意事项:

    地址传递

    字符串以"\0"结束

    再内存中所占字节比实际多一个

     

    int main(intargc,const char* argv[]) {
        
        
        char ch[5]={'a','a','s','n','x'};
        
        char ch2[4];
        ch2[1] ='s';
        ch2[2] ='1';
        
        
        
        char ch3[2][17];
        //ch3[0] ="asdsdsdsdssad";
        //ch3[1] ="sxxsdwwewewew";
       // ch3[0] ={'a','a','s','n','x'};
       ch3[0][0] = 'a';
        
        
        char str[] = "helloworld";
        for (int i = 0; i <sizeof(str); i++) {
           printf("%c ",str[i]);
        }
        return 0;
    }
     

     

     四.多维数组和指针

    一维数组名即是一个指针常量,它代表数组第一个元素的地址,我们知道一维数组的长度,那么可以通过数组名输出一维数组的所有元素:

    #include <stdio.h>
    int main(void)
    {
        int i;
        int a[5] = {1, 2, 3, 4, 5};
        int *p = a;
        for( i = 0; i < 5; i++ )
            printf( "%d\n", *(p + i) );
        return 0;
    }


    但是在多维数组中,数组名却是第一个数组的地址,怎么理解呢?比如说定义一个二维数组:

    int a[2][5] = {1, 2, 3, 4, 5, 

                  6, 7, 8, 9, 10};

    那么数组名a就是二维数组的第一行一维数组的地址,而不要错误的认为它代表的是第一行第一个元素的地址噢,那我们应该怎么正确的申明一个指向整形数组的指针呢?

    int(*p)[5] = a;

    它使p 指向二维数组的第一行的一维数组(注意是指向的第一行一维数组)。

    #include <stdio.h>
    int main(void)
    {
        int i;
        int a[2][5] = {1, 2, 3, 4, 5, 
                      6, 7, 8, 9, 10};
        int (*p)[5] = a;
        for( i = 0; i < 5; i++ )
            printf( "%d\n", *(*p + i) );
        return 0;
    }


    上面的程序也是依次输出了1~5,这里p 是指向二维数组的第一行地址的指针,那么 *p 即是代表第一行数组,那么也就是第一行数组的地址,我们可以再通过 *(*p + i)输出第一行数组的各个元素。有点乱?呵呵,再仔细想想,或者直接说 a 是指向的第一行,那么 *a 就代表第一行的那个一维数组,但 *a 仍然是一个指针常量,而**a 才是这个一维数组的第一个元素的值。

     

    如果我们要定义一个指针可以逐个访问元素呢?下面两种方法都是正确的声明和赋值:

    int*p = &a[0][0];

    int*p = a[0];

    第一种方法,就干脆把数组的第一行第一个元素取地址给指针变量p,这可能是最直观的方法。

    第二种方法,其实原理一样,前面刚说了a 是指向的第一行,第一行是一个一维数组,那么a[0]就是这个一维数组的第一个元素的地址。特别注意这里的 a[0] 不是一个值,而是一个地址。

    #include <stdio.h>
    int main(void)
    {
        int i;
        int a[2][5] = {1, 2, 3, 4, 5, 
                      6, 7, 8, 9, 10};
        int *p = a[0];
        for( i = 0; i < 10; i++ )
            printf( "%d\n", *(p + i) );
        return 0;
    }


    上面的代码就输出了二维数组中的所有元素。

    附:这里的a[0]却输出了hello

    int main(void)
    {
        char a[2][10] = {"hello", "hi"};
        printf( "%s\n", a[0] );
        //printf( "%s\n", *a );
        //printf( "%s\n", *a + 1 ); 输出 "ello"
        //printf( "%s\n", *(a + 1) ); 输出 "hi"
        return 0;
    }


    而这又是为什么呢?这里的a[0] 仍然是一个地址,它指向的是一个字符串常量,%s 是可以打印地址的,这里跟 %d 输出值是不一样的,a[0]指向了字符串的第一个字母的地址,一直输出到 NUL 为止。

     

     

    //  C8数组名传递

    展开全文
  • 题意:判断是否有两有相同两列。 然后刚拿到这道题时候想放到哪里呢? 然后这里是放到map里面,然后每一个相同部分会对应一个常数,但是在不同列可能也有相同部分呀?所以我们定义了一个map M[maxn],对...
  • 对象声明描述 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...
  • 对象声明描述 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...
  • 对象声明描述 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...
  • 对象声明描述 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说是可见(公有部 分),而某些部分却是隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放...
  • 建立一个可存放5个人成绩成绩表,每包括两个部分:人名(2个字符)和成绩,并将其排序后输出,并在屏幕显示。 二.实现: 可以用一个变量存储成绩表,姓名(两位字符)+成绩(数字); 这里使用是冒泡排序,使用XCHG...
  • 文章目录图存储结构:比线性表和树更复杂,完全不能用顺序结构邻接矩阵(不涉及动态存储):用两个数组表示图,一个一维数组顶点,一个二维数组(即邻接矩阵)边无向图:邻接矩阵是对称矩阵,和是顶点度有...
  • C语言中宽字符

    2021-03-30 23:08:42
    在第一代码中,str1中存的内容是ASCII码,因为是中文,所以是GB2312,也就是每个字存了两个字节,最后以‘00’结尾,所以str1存放个字节。 在第二代码中,str2中存的内容是UTF-16,也是一个字存了两个...
  • 主存与cache间地址映射

    万次阅读 多人点赞 2017-12-07 11:38:01
    参考:《计算机组成原理》(第版) 白中英等著 准备工作: ①cache与主存之间数据交换是以“块”为单位进行。一个“块”中包含若干个“”,字长由实际情况...下面所提到标记(tag)于该存储器中。 ③cach
  • 实例273 使用内连接选择一个表与另一个表中行相关所有 9.14 外连接查询 实例274 LEFT OUTER JOIN查询 实例275 RIGHT OUTER JOIN查询 实例276 使用外连接进行多表联合查询 9.15 利用IN进行查询 实例277 ...
  • 前年年末(刚上大一那会),在某宝买了两个小号元件盒(如图),然后一点一点扩大自己库存,现在两个盒子已经不够了,于是我又买了个盒子(四个小号一个中号),现在一共是六个小号一个中号,现阶段还能满足...
  • PAT 1065.单身狗

    2017-05-27 18:22:36
    题目: 输入格式: 输入第一给出一个正整数N( ...如果输入小于位数数字会去掉前面0再 所以输出时候要控制格式 往前补0 思路:先配对了 一个标记情侣数组#include #inclu
  • 时尚版更适合国人需要,多元化设计,增加诸如商品尺码、商品颜色等智能选择参数,对于需要这类功能商家特别有利,时尚版适合各各业网上开店使用,配合整合BBS论坛程序,用户帐号一站式通用,时尚版是您...
  • 经典C程序220案列

    2008-10-26 11:09:36
    第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 ...220 进销管理系统
  • 用过visual C 或者Gcc开发朋友都知道,编译过程会产生大量临时文件,少也有十几兆,可以调整编译器设置,使得编译产生中间文件都到内存盘上,可以极大提高编译速度。 5、使用P2P软件下载,如edonkey...
  • 第一部分 基础篇 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 ...220 进销管理系统
  • Ramdisk绿色中文版(gavotte开发)

    热门讨论 2011-05-19 16:12:08
    用过visual C 或者Gcc开发朋友都知道,编译过程会产生大量临时文件,少也有十几兆,可以调整编译器设置,使得编译产生中间文件都到内存盘 上,可以极大提高编译速度。 5、使用P2P软件下载,如...
  • 3.在logindlg.ui 中设计下面界面:输入框为Line Edit。其中用户名后面 输入框在属性中设置其object Name 为usrLineEdit,密码后面输入框为 pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。 4.将...
  • 万维网核心语言、标准通用标记语言下一个应用超文本标记语言(HTML)次重大修改 Android 一种基于Linux自由及开放源代码操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放...
  • 19)商品显示方式支持:每多图片显示或者每单图片显示 管理员可以设置默认方式,同时可以设置每、每页显示商品数量 20)管理员可以设置首页各栏目是否显示,每栏目显示商品数量、每显示商品数量 21)前台...
  • 求Sn=a+aa+aaa+aaaa+aaaaa

    2020-02-08 20:43:49
    将第一列数看为个位,第二列看为十位,从上到下依次相加,并将结果首先进行是否大于等于10if判断,若大于等于10则进行进位,将进位与同一行下一列位置数相加并储存,若小于10于第五行原列位置。 由该思想,...
  • 第④段画下列线句子的理解是对,使用释执的一项是正确。当日合约年期结算价为期货国债,解释节码不考)为续费美元投资亏...月二十日,行字的是下列描述正确,为2/吨0元州的期货若郑绿豆六月。文件的作可以运用用...
  • 在更新维护这些黑名单同时,Google也会通知被列入网站,以避免网站持有者本身不知道网站有恶意软件。  沙盒(Sandboxing)  Chrome中每一个标签页都是一个沙盒(sandbox),以防止“恶意软件破坏用户系统...
  • EOF和feof(FILE *)

    2017-12-15 15:58:13
    举个例子,如果内存中有一个整数10000,若放在文本文件中,5为数字对应ASCⅡ码占个字节,你去查找1和0而分别对应什么ASCⅡ码,然后把ASCⅡ码值再转化为二进制,进去就了。而在二进制文件只占2个字节,因为...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 181
精华内容 72
关键字:

存字的五行