「作中學」之關於個人系列調查

此篇文章包含了博主技能、C語言、JAVA、公文寫做四個板塊的自我調查。html

博主技能小調查

若是要列舉的話,博主有什麼技能是比較好的呢?

若是必定要列舉出一個的話,算來算去,能符合要求的也就是個人柔韌度了,如今我可以維持壓腿時上身緊貼大腿的程度,最好的是側身壓的時候,其次是正面壓。java

如今的我可以保持之前小學初中上舞蹈課的柔韌程度,除了偶爾想刻意練習一下的請況之外,最主要的因素仍是來自於本身的身體緣由:如若缺少運動,個人腿將進入長期不舒服的狀態(非心理因素),躺着坐着的感覺最爲明顯,而惟一暫時緩解辦法是壓腿。拉伸韌帶的感受能大大緩解我腿不舒服的情況。由於這樣那樣的緣由,我保持了隨時壓腿的習慣,這也讓個人柔韌度維持在了一個不錯的水平上。c++

我認爲我之因此可以保持本身的柔韌,緣由在於我擁有一個「刺激源」,一個可以天天不斷提醒我並促使我作出相應練習的「源」。如若沒有須要壓腿的需求的話,或許個人柔韌度就達不到這麼高了。因此,若是要學好一門技術,關鍵在於找到那個能讓你不斷奮進,一提起來就精神百倍的事物來,能夠是你的某個興趣點,也能夠是某個「壓力點」,固然,後者若是加入一點本身的興趣的話效果會更佳。編程

你的經驗又與他人有什麼共通之處麼?

讀了婁老師的「作中學」系列博客,其中讓我印象最深入的是《優秀的學習方法--作中學(Learning By Doing)》和《「作中學(Learning By Doing)」之乒乓球刻意訓練一年總結》這兩篇文章,裏面說起的「作中學」,「刻意訓練」等概念給我留下了很深的印象,其中「刻意訓練」裏面的「走出溫馨區」這一項,令我想起了在網易公開課上看到的TalBen Shahar教授《哈佛大學公開課:幸福課》的第一集(也只看了第一集,不過如今又有動力繼續看下去了),裏面也曾說起過要走出本身的溫馨區這一言論,當時本身心裏就很震動,以爲,嗯?我是否是在本身的「溫馨區」裏待的過久了,都沒有學習的動力之類的。現在再次看到這個詞,發現我能夠作的更好去達到老師所說的「擺脫‘溫馨區’,進入‘學習區’學習,要按部就班,不能進入‘恐慌區’」這個要求。windows

言歸正傳,與老師有共通之處的大概有如下幾點:數組

  1. 都有一個可以激勵本身的方法;
  2. 走出「溫馨區」,進入「學習區」;
  3. 「一萬小時」:天天堅持不動搖。

C語言

學習C語言的方法

在上《程序設計基礎》那門課時,老師有提供一個叫「高級語言程序設計能力訓練平臺」的網站,我是經過「天天」在作上面的題目前複習預習教材的內容,再在上面作題的方法學習的。當時正是由於在前半段時間,我興致勃勃地在那上面作了大量的基礎的題,看了一遍又一遍的書及筆記,給個人C語言打下了堅實的基礎,再之後老師講課的時候,對C的熱情也愈來愈盛。比較遺憾的是我中間有一段時間沒有上那個網站作題,由於前面有不錯的基礎後面還能較好的融會貫通,渡過了那段時期,但仍是成爲了個人遺憾,作一件事最重要的仍是堅持。網絡

留存代碼行數

在電腦裏有關C的文件一共有117個,若是按照每一個最低有20行的話(大多超過這個數,有的超過了200行數),我共寫了超過2340行的代碼。模塊化

對C理解程度

當時我可以比較好的理解老師所說起的全部知識點,也曾嘗試深刻理解實踐鏈表、文件等具體編程方法,如今我所能記得的主要是指針之前的主要內容,如今較經常使用數組及一維指針(基本編程:順序、選擇、循環、函數等固然也包括在內)。如今所涉及的有關C語言編程的實驗都是我本身獨立編出來的。固然,也由於只用了C語言前半部分的內容,編的程序比較初級。函數

數組指針與指針數組、函數指針與指針函數的區分

關於數組指針與指針數組、函數指針與指針函數的區分我仍是大體能分清的:學習

數組指針與指針數組

數組指針,例如int (*p)[10];,指的是指針變量指向了一個類型爲int型的數組,數組裏面每一個元素都是int型的,不是指針。

指針數組,例如int *p[10];,指的是數組p中每一個元素都是指針,而這些指針所指向的類型是int型,至關於定義了10個指向int型的指針變量。

函數指針與指針函數

函數指針,例如int (*fx)(int a[], int n);,指的是指針指向了一個返回值爲int型的函數,定義的是一個指針變量。

指針函數,例如int *fx(int a[], int n);,指的是定義了一個返回值爲int型指針的函數,定義的是一個函數。

文件與流、文本文件與二進制文件

文件與流

查了一下相關教材與PPT,其中說起文件與流的有這些內容:

  • 綜上所述,不管一個C語言文件的內容是什麼,它一概把數據當作是由字節構成的序列,即字節流。對文件的存取也是以字節爲單位的,輸入/輸出的數據流僅受程序控制而不受物理符號(如回車換行符)的控制。因此,C語言文件又稱爲流式文件。
  • ANSI C進一步對I/O的概念進行了抽象。就C程序而言,全部的I/O操做只是簡單地從程序移進或移出字節的事情。所以,絕不驚奇的是,這種字節流便被稱爲流(stream)。
  • 文件是由許多個字節數據組成的數據流。

-- 分別引用自《 C語言程序設計(第3版)》、《C和指針》、課堂PPT

網上對於流以及文件的解釋分別爲(摘取):

  • 流(stream)是一個理想化的數據流,實際輸入或輸出映射到這個數據流。
  • 電腦外設控制,磁盤文件輸入輸出,只要是輸入或者輸出所產生的數據都是流。
  • 流是由輸入輸出產生的,是用於數據交換或轉換的統一的標準(特指這一類的數據)。
  • 流能夠想象水從水管裏出來,這就是一股水流。c語言中流動的再也不是水,而是有順序的,有排列結構的數據。好比100001111100001(二進制)。
  1. 文件
  • 存儲在外部介質上數據的集合。
  • C語言將文件看做是一個字符(字節)的序列,即一個一個字符(字節)的數據順序組成。

-- 分別引用自知乎百度知道1百度知道1百度知道2百度百科

如此看來,在C語言中,流是指輸入輸出所產生的數據,而文件是指由字節構成的序列,也便是數據流。因此說,二者的聯繫是文件是一種數據流。

文本文件與二進制文件

區分

文本文件是數字中的每一位都以ASCII碼值的形式存儲,而二進制文件是數字做爲一個總體以二進制的形式存儲。

例如「12」,用文本文件的形式存儲就是「00110001 00110010 0001」('1'所對應的ASCII碼值位00110001,'2'所對應的ASCII碼值00110010),用二進制文件形式存儲就是「00000000 00001100」(12所對應的二進制形式爲1100)。

編程操做

二者編程的基本程序是:

文本文件 二進制文件
打開文件 文件後綴名爲.txt 文件後綴名爲.bin
打開文件 文件打開方式爲"r"、"w"、"a"等 文件打開方式爲"rb"、"wb"、"ab"等
讀寫文件中的文本 按字符讀寫(字符/字符串)、按格式讀寫、按數據塊讀寫 同左
其餘操做 搜索等 同左

面向過程程序設計

什麼叫面向過程程序設計?其解決問題的方法又是什麼?

我的印象

對於這個問題,我知道的主要是它區別於面向對象程序設計,其基本原則是「自頂向下,逐步求精,模塊化,限制使用goto語句」。

資料總結

查閱了一下相關資料,對此的解說總結以下:
面向過程程序設計是一種以過程爲中心的編程思想,具體說就是分析出解決問題所須要的步驟,而後用函數把這些步驟一步一步實現,它是經過主函數來調用一個個子函數,其方法由順序、選擇和循環這三種基本控制結構來表達。

-- 參考資料:

《全國計算機等級考試二級教程---公共基礎知識(2016年版)》 高等教育出版社

百度知道:什麼是面向過程的程序設計?

百度知道:面向對象的編程和麪向過程的編程有什麼區別?

模塊與源文件

在C語言裏面,什麼是模塊?

在C語言裏面模塊指的是一個一個函數,一個函數就表明一個模塊。

你寫過多個源文件的程序嗎?

若是多個源文件的程序指的是一個程序裏調用多個本身編寫的.c文件的話,我並無寫過,我調用的都是C裏面自己自帶的頭文件。

高內聚,低耦合

學過了C語言,你知道什麼是「高內聚,低耦合」嗎?

知道,指的是一個函數裏面的聯繫緊密,而函數與函數之間的聯繫不大(除了一個函數調用了另外一個函數的時候)。並不會有由於一個函數的內部變化致使連鎖反應,其餘函數都變了的這種狀況。

這個原則如何應用到高質量程序設計中?

在一個程序中,不一樣的任務儘可能用不一樣的子函數來編寫,即將一個大型任務分紅一小塊一小塊,分模塊進行,這樣能較好的維護調試程序。

數組的複製、查找與排序

  1. 數組的複製:元素逐個複製;
  2. 數組的查找:遍歷數組中元素進行查找;
  3. 數組的排序:交換法排序、選擇法排序、冒泡法排序等,主要是經過查找及交換來實現。

程序

#include <stdio.h>
#include <windows.h>
#define N 40
void Copy(int a[N], int b[N], int n);
void Search(int a[N], int n);
void Sort(int a[N],int n);
int main(void)
{
    int i,n,ret;
    int a[N],b[N];
    printf("How many elements do you want to input:");
    ret = scanf("%d",&n);
    if(n<=0 || ret!=1)
    {
        printf("Wrong! Please input a positive integer.\n");
        return 0;
    }
    printf("Please input a[N]:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    Copy(a,b,n);
    Search(a,n);
    Sort(a,n);
    system("pause");
    return 0;
}
/*函數功能:數組複製*/
void Copy(int a[N], int b[N], int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        b[i] = a[i];
    }
    printf("result of copy:\n");
    printf("a[N]:\t");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
    printf("b[N]:\t");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
}
/*函數功能:數組元素查找*/
void Search(int a[N], int n)
{
    int i,flag=0;
    for(i=0;i<n;i++)
    {
        if(a[i]==5)
        {
            flag = 1;
            break;
        }
    }
    printf("\nresult of searching:\n");
    if(flag)  printf("Found 5.\n");
    else    printf("Not found 5!\n");
}
/*函數功能:數組排序(交換法排序)*/
void Sort(int a[N], int n)
{
    int i,j,k;
    for(i=0;i<n-1;i++)
    {
        k = i;
        for(j=i+1;j<n;j++)
        {
            if(a[j]>a[k]) k = j;  //由大到小排序,若是想由小到大排序的話,將「>」變爲「<」
        }
        if(k!=i)
        {
            a[i] = a[i]^a[k];
            a[k] = a[k]^a[i];
            a[i] = a[i]^a[k];
        }
    }
    printf("\nresult of sorting:\n");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
}

程序截圖

統計代碼行數

完成版

思路

用_findfirst、_findnext、_findclose函數查找硬盤E下的全部.c文件(留存代碼都在E盤有備份)。

大體思路展現

注意

代碼中的空白、製表符、註釋不計入代碼行,也即代碼中的空白行、註釋行不計入代碼行部分。

程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<io.h>
#include<windows.h>
#define DOUBLE 2
#define N 260
const char *head_name="E:";             //搜索硬盤E下全部文件
void Sumc(char name[N], int *count);
int Searchdotc(char a[N]);
void Deepsearch(int *count, char name[N], char search_name[N], char search_namedd[N], long handle, struct _finddata_t fileinfo);
void Judge(int *count, char name[N], char search_name[N], char search_namedd[N], long *handle, struct _finddata_t *fileinfo);
int main(void)
{
    int count=0;
    char name[N];            //文件目錄名
    char search_name[N];    //搜索目錄名,不加後綴
    char search_namedd[N];    //搜索目錄名,加後綴
    long handle;
    struct _finddata_t fileinfo;
    strcpy(search_name,head_name);   //賦初值給search_name
    strcpy(search_namedd,head_name);
    strcat(search_namedd,"\\*.*");       //搜索目錄名,加後綴
    if((handle=_findfirst(search_namedd,&fileinfo))!=-1L)   //第一個目錄下的查詢
    {
        if((fileinfo.attrib==16 || fileinfo.attrib==32 || fileinfo.attrib==17)
               && (strcmp(fileinfo.name,".")!=0 && strcmp(fileinfo.name,"..")!=0))    //排除一切"."和".."文件夾所帶來的影響
        {
            strcpy(name,search_name);    //將文件目錄名整理後賦給name
            strcat(name,"\\");
            strcat(name,fileinfo.name);
            if(Searchdotc(fileinfo.name))  //若是是.c文件的話,統計行數
            {
                Sumc(name,&count);     //根據文件目錄名name統計文件代碼行數
            }
            else if((fileinfo.attrib==16 || fileinfo.attrib==17)
               && (strcmp(fileinfo.name,".")!=0 && strcmp(fileinfo.name,"..")!=0))   //若是是文件夾則深刻到它的子目錄繼續調查
            {
                _findclose(handle);              //結束這個目錄的句柄
                Deepsearch(&count,name,search_name,search_namedd,handle,fileinfo);
            }
            //if-else區域結束
        }
        while(_findnext(handle,&fileinfo)==0)//繼續搜索這個目錄的下一個文件名
        {
            if((fileinfo.attrib==16 || fileinfo.attrib==32 || fileinfo.attrib==17)
               && (strcmp(fileinfo.name,".")!=0 && strcmp(fileinfo.name,"..")!=0)) //簡化運算,搜索範圍在文件屬性是文件夾+正常、存檔+正常、文件夾+正常+只讀
            {
                strcpy(name,search_name);    //將文件目錄名整理後賦給name
                strcat(name,"\\");
                strcat(name,fileinfo.name);
                Judge(&count,name,search_name,search_namedd,&handle,&fileinfo);
            }
        }
        _findclose(handle);            //第一個目錄查詢結束
    }
    printf("The total lines is %d\n",count);
    system("pause");
    return 0;
}
/*統計一個.c文件的代碼行數(去掉註釋、空白行的影響)*/
void Sumc(char name[N], int *count)
{
    int k=0,flag=0,begin1=0,begin2=0,blank=0,c=0;    //c判斷是否爲行頭
    char ch[DOUBLE]={'0','0'};  //初始化
    FILE *fp;
    //printf("%s\n",name);   可用做查找展現
    if((fp=fopen(name,"r"))==NULL)
        {
            printf("Failure to open %s!\n",name);
            exit(0);
        }
    while((ch[k]=fgetc(fp))!=EOF)
    {
        if(ch[k]==' ')        //**防空格,製表符也防了,由於在文本文件中,製表符至關於4個空格(已試驗)**
        {
            ch[k]='\n';      //忽略空格和製表符,將之改成'\n',使得下面判斷/*是否在行頭提供便利
            blank = 1;      //但爲了防止與後面的防空白行判斷相沖,加一個改動標誌,並在後面每一個分支里加一個消除改動標誌的語句,這樣改動標誌的有效期就變爲了一個循環時間
        }
        else if(ch[k]=='/' && c==0) //判斷/是否在行頭!!!編程需注意有多種狀況
        {
            begin1 = 1;      //判斷/(/*)行頭標誌
            blank = 0;
        }
        else if(ch[k]=='*' && ch[!k]=='/' && begin1==1)
        {
            flag = 1;        //防/*註釋標誌
            begin1 = 0;      //取消/(/*)行頭標誌
            blank = 0;
        }
        else if(ch[k]=='/' && ch[!k]=='/' && begin1==1)
        {
            begin2 = 1;      //判斷//行頭標誌
            begin1 = 0;      //取消/(/*)行頭標誌
            blank = 0;
        }
        else if(ch[k]=='/' && ch[!k]=='*' && flag==1)
        {
            flag = 2;        // /**/型註釋結束,但不取消防/*註釋標誌flag
            blank = 0;
        }
        else if(ch[k]=='\n' && ch[!k]!='\n' && blank==0 && flag==0 && begin2==0)  //防空白行
        {
            *count = *count+1;
            flag = 0;
            //blank = 0;
        }
        else blank = 0;
        if(flag==2 && ch[k]=='\n') flag = 0;   //取消防/(/*)註釋標誌,下一行可開始繼續計數
        if(begin2==1 && ch[k]=='\n') begin2 = 0;//取消防//註釋標誌,下一行可開始繼續計數
        if(ch[k]=='\n' && blank==0) c = 0;//c等於0代表下一個字符在行頭
        else            c++;             //c不等於0代表下一個字符不在行頭
        k = !k;
    }
    fclose(fp);
}
/*搜索倒數兩個是否爲「.c」,是則返回1,不是則返回0*/
int Searchdotc(char a[N])
{
    int n;
    n = strlen(a);
    if(n!=1 && a[n-2]=='.' && a[n-1]=='c') return 1;
    return 0;
}
/*子目錄查詢*/
void Deepsearch(int *count, char name[N], char search_name[N], char search_namedd[N], long handle, struct _finddata_t fileinfo)
{
    long handle1;
    struct _finddata_t fileinfo1;
    char name1[N],search_name1[N],search_namedd1[N];
    handle1 = handle;
    fileinfo1 = fileinfo;
    strcpy(name1,name);
    strcpy(search_name1,search_name);
    strcpy(search_namedd1,search_namedd);

    strcpy(search_name1,name1);   //賦初值給search_name
    strcpy(search_namedd1,name1);
    strcat(search_namedd1,"\\*.*");       //搜索目錄名,加後綴
    if((handle1=_findfirst(search_namedd1,&fileinfo1))!=-1L)   //這個子目錄下的查詢
    {
        if(strcmp(fileinfo1.name,".")==0 || strcmp(fileinfo1.name,"..")==0) ;  //空目錄下需排除"."和".."文件夾,不然會無限循環,但爲何?"."和".."又是什麼?
        else if(fileinfo1.attrib==16 || fileinfo1.attrib==32 || fileinfo1.attrib==17)
        {
            strcpy(name1,search_name1);    //將文件目錄名整理後賦給name
            strcat(name1,"\\");
            strcat(name1,(fileinfo1).name);
            if(Searchdotc(fileinfo1.name))  //若是是.c文件的話,統計行數
            {
                Sumc(name1,count);     //根據文件目錄名name統計文件代碼行數
            }
            else if((fileinfo1.attrib==16 || fileinfo1.attrib==17)
               && (strcmp(fileinfo1.name,".")!=0 && strcmp(fileinfo1.name,"..")!=0))       //若是是文件夾則深刻到它的子目錄繼續調查
            {
                _findclose(handle1);              //結束這個目錄的句柄
                Deepsearch(count,name1,search_name1,search_namedd1,handle1,fileinfo1);  //除count外其餘變量不混用
            }
            //if-else區域結束
        }
        while(_findnext(handle1,&fileinfo1)==0)//繼續搜索這個目錄的下一個文件名
        {
            if((fileinfo1.attrib==16 || fileinfo1.attrib==32 || fileinfo1.attrib==17)
               && (strcmp(fileinfo1.name,".")!=0 && strcmp(fileinfo1.name,"..")!=0))
            {
                strcpy(name1,search_name1);    //將文件目錄名整理後賦給name
                strcat(name1,"\\");
                strcat(name1,(fileinfo1).name);
                Judge(count,name1,search_name1,search_namedd1,&handle1,&fileinfo1);
            }
        }
        _findclose(handle1);            //這個子目錄查詢結束
    }
}
/*判斷這個文件是.c仍是文件夾*/
void Judge(int *count, char name[N], char search_name[N], char search_namedd[N], long *handle, struct _finddata_t *fileinfo)
{
    strcpy(name,search_name);    //將文件目錄名整理後賦給name
    strcat(name,"\\");
    strcat(name,(*fileinfo).name);
    if(Searchdotc((*fileinfo).name))  //若是是.c文件的話,統計行數
    {
        Sumc(name,count);     //根據文件目錄名name統計文件代碼行數
    }
    else if(((*fileinfo).attrib==16 || (*fileinfo).attrib==17)
               && (strcmp((*fileinfo).name,".")!=0 && strcmp((*fileinfo).name,"..")!=0)) //若是是文件夾則深刻到它的子目錄繼續調查
    {
        Deepsearch(count,name,search_name,search_namedd,*handle,*fileinfo);
    }
}

截圖

(由於硬盤中有比較多的.c文件是以全註釋的形式存在(程序都在註釋裏,這些文件的原存放地址在練習網站上,以註釋的形式保存在E盤裏),因此去掉註釋的話代碼行數較少。)

體會

爲了寫這個程序,我有如下收穫:

  1. 初步掌握如何使用_findfirst、_findnext、_findclose函數;
  2. 回顧基本文件操做編程方法;
  3. 嘗試遍歷硬盤文件;
  4. 瞭解文本文件;
  5. 嘗試編寫如何讓空白行、註釋行不計入代碼行數;
  6. 藉助網絡學習掌握新的知識。

不足

編寫的程序仍是有點繁瑣,有待改進。

參考資料

斷點

你知道什麼叫斷點嗎?給出本身調試程序的例子。

斷點的意思是在某行代碼處設置斷點的話,調試程序時會直接從頭運行到你所設置的地方中止,方便調試以後的程序。

例子

幾乎每個較長的程序我都單步調試過。

1.設置斷點

鼠標左鍵點擊紅點所在位置,出現紅點。

2. 調試程序

點擊Run to cursor鍵 ,黃色三角形光標將出如今紅點處。

Tip1:初次運行這個軟件的話,須要先點擊,選擇下拉列表裏的Watches,顯示變量變化過程。

Tip2:注意若是想實現這一步的話,需一開始將文件建立在沒有中文名的目錄下,不然不能實現,若是想建立在有中文名的目錄下又想單步調試的話,能夠跳過這一條直接執行下一個步驟。

3. 繼續調試

點擊 程序運行到下一行,點擊 進入到子函數裏面。

JAVA

學習目標

具體目標

天天可以堅持學習又或是編寫一點JAVA。

如何經過刻意訓練提升程序設計能力和培養計算思惟

  1. 刻意培養本身的學習氛圍,經過塑造良好的學習氛圍推進本身走出「溫馨區」,進入「學習區」;
  2. 天天練習一小部分;
  3. 與他人進行有效的溝通,促使本身不斷前進。

如何經過「作中學」實現你的目標

  1. 實踐與理論相結合,既不能一味編程,也不能只讀書本;
  2. 及時反饋問題;
  3. 進行大量基礎練習。

公文寫做

個人寫做能力

個人寫做能力若是是認真完成一項公文的話,仍是能夠的,不過還須要磨練。

因此,若要提升個人公文寫做能力,當務之急是多積累見識,涉獵面廣了,興趣天然也就上來了,不至於面對一項工做而茫然不知,感到「前途漫漫而遠之,吾將上下而求索」。

相關文章
相關標籤/搜索