此篇文章包含了博主技能、C語言、JAVA、公文寫做四個板塊的自我調查。html
若是必定要列舉出一個的話,算來算去,能符合要求的也就是個人柔韌度了,如今我可以維持壓腿時上身緊貼大腿的程度,最好的是側身壓的時候,其次是正面壓。java
如今的我可以保持之前小學初中上舞蹈課的柔韌程度,除了偶爾想刻意練習一下的請況之外,最主要的因素仍是來自於本身的身體緣由:如若缺少運動,個人腿將進入長期不舒服的狀態(非心理因素),躺着坐着的感覺最爲明顯,而惟一暫時緩解辦法是壓腿。拉伸韌帶的感受能大大緩解我腿不舒服的情況。由於這樣那樣的緣由,我保持了隨時壓腿的習慣,這也讓個人柔韌度維持在了一個不錯的水平上。c++
我認爲我之因此可以保持本身的柔韌,緣由在於我擁有一個「刺激源」,一個可以天天不斷提醒我並促使我作出相應練習的「源」。如若沒有須要壓腿的需求的話,或許個人柔韌度就達不到這麼高了。因此,若是要學好一門技術,關鍵在於找到那個能讓你不斷奮進,一提起來就精神百倍的事物來,能夠是你的某個興趣點,也能夠是某個「壓力點」,固然,後者若是加入一點本身的興趣的話效果會更佳。編程
讀了婁老師的「作中學」系列博客,其中讓我印象最深入的是《優秀的學習方法--作中學(Learning By Doing)》和《「作中學(Learning By Doing)」之乒乓球刻意訓練一年總結》這兩篇文章,裏面說起的「作中學」,「刻意訓練」等概念給我留下了很深的印象,其中「刻意訓練」裏面的「走出溫馨區」這一項,令我想起了在網易公開課上看到的TalBen Shahar教授《哈佛大學公開課:幸福課》的第一集(也只看了第一集,不過如今又有動力繼續看下去了),裏面也曾說起過要走出本身的溫馨區這一言論,當時本身心裏就很震動,以爲,嗯?我是否是在本身的「溫馨區」裏待的過久了,都沒有學習的動力之類的。現在再次看到這個詞,發現我能夠作的更好去達到老師所說的「擺脫‘溫馨區’,進入‘學習區’學習,要按部就班,不能進入‘恐慌區’」這個要求。windows
言歸正傳,與老師有共通之處的大概有如下幾點:數組
在上《程序設計基礎》那門課時,老師有提供一個叫「高級語言程序設計能力訓練平臺」的網站,我是經過「天天」在作上面的題目前複習預習教材的內容,再在上面作題的方法學習的。當時正是由於在前半段時間,我興致勃勃地在那上面作了大量的基礎的題,看了一遍又一遍的書及筆記,給個人C語言打下了堅實的基礎,再之後老師講課的時候,對C的熱情也愈來愈盛。比較遺憾的是我中間有一段時間沒有上那個網站作題,由於前面有不錯的基礎後面還能較好的融會貫通,渡過了那段時期,但仍是成爲了個人遺憾,作一件事最重要的仍是堅持。網絡
在電腦裏有關C的文件一共有117個,若是按照每一個最低有20行的話(大多超過這個數,有的超過了200行數),我共寫了超過2340行的代碼。模塊化
當時我可以比較好的理解老師所說起的全部知識點,也曾嘗試深刻理解實踐鏈表、文件等具體編程方法,如今我所能記得的主要是指針之前的主要內容,如今較經常使用數組及一維指針(基本編程:順序、選擇、循環、函數等固然也包括在內)。如今所涉及的有關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(二進制)。
- 文件
- 存儲在外部介質上數據的集合。
- 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裏面自己自帶的頭文件。
知道,指的是一個函數裏面的聯繫緊密,而函數與函數之間的聯繫不大(除了一個函數調用了另外一個函數的時候)。並不會有由於一個函數的內部變化致使連鎖反應,其餘函數都變了的這種狀況。
在一個程序中,不一樣的任務儘可能用不一樣的子函數來編寫,即將一個大型任務分紅一小塊一小塊,分模塊進行,這樣能較好的維護調試程序。
#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盤裏),因此去掉註釋的話代碼行數較少。)
爲了寫這個程序,我有如下收穫:
編寫的程序仍是有點繁瑣,有待改進。
斷點的意思是在某行代碼處設置斷點的話,調試程序時會直接從頭運行到你所設置的地方中止,方便調試以後的程序。
幾乎每個較長的程序我都單步調試過。
鼠標左鍵點擊紅點所在位置,出現紅點。
點擊Run to cursor鍵 ,黃色三角形光標將出如今紅點處。
Tip1:初次運行這個軟件的話,須要先點擊,選擇下拉列表裏的Watches,顯示變量變化過程。
Tip2:注意若是想實現這一步的話,需一開始將文件建立在沒有中文名的目錄下,不然不能實現,若是想建立在有中文名的目錄下又想單步調試的話,能夠跳過這一條直接執行下一個步驟。
點擊 程序運行到下一行,點擊 進入到子函數裏面。
天天可以堅持學習又或是編寫一點JAVA。
個人寫做能力若是是認真完成一項公文的話,仍是能夠的,不過還須要磨練。
因此,若要提升個人公文寫做能力,當務之急是多積累見識,涉獵面廣了,興趣天然也就上來了,不至於面對一項工做而茫然不知,感到「前途漫漫而遠之,吾將上下而求索」。