20165316 技能學習心得與c語言學習


20165316 技能學習心得與c語言學習

一、技能學習經驗

我會打乒乓球,在中國,我只能說我“會”打,至於“比大多數人更好”我不敢斷言,因為我無時無刻不感受到乒乓球圈子遠比我想象的要深。但是,我覺得乒乓球學習的過程對我今后的學習有所啟發,我希望通過總結給大家,最主要還是給自己,一個方向。

像乒乓球這類運動,主要是反復練習,我記憶最深刻的是小學一年級,剛剛能在台子上打球,教練就讓我練習多球,即一次使用一個動作套路連續打200到300個球。之后每次練球都必須練習基本功。可以毫不誇張的說,基本功貫穿了一個乒乓球運動員的一生。但是,很多人會發現乒乓球運動員在比賽時經常為了救球做出一些“非套路”的動作,很多經典的照片都記錄了他們的精彩瞬間,那么,是什么讓他們能夠打出這些精彩的對抗呢?答案很簡單,是平時基本功訓練形成的“球感”。最終,運動員們又不拘泥於“型”,而是追求更加內在的東西——控球能力。據說國家級運動員可以精確到把球打到一個硬幣上,可見控球能力,換句話說就是自我控制能力,更為重要。這一點與婁老師在乒乓球訓練總結中所敘述:“任何的學習都是在增強人的可控能力”是相同的。

另外,在打乒乓球的這十幾年里,我對乒乓球的態度從“被動接受”變成了“主動學習”,很顯然,反復的訓練帶來的不一定是枯燥和無趣,反而隨着訓練難度的提高和對自身要求的嚴格,我逐漸感受到挑戰自我的樂趣。而這種樂趣,是科學的訓練方法所致:每個目標都是可以達到,但有一定難度的。這樣,我就不會放棄或者自大,日積月累,技術水平自然有所提升。這一點婁老師在乒乓球訓練總結中也有論述。其實,與不同的對手對打也有這種效果:能夠看到自己的不足,進而進行自我的,或者有教練幫助的反思和改進,最終實現自我提升。此時,比賽的勝負已經變得不再重要了。

二、c語言學習調查

1.你是怎么學習C語言的?(作業,實驗,教材,其他),與你的高超技能相比,C語言的學習有什么經驗和教訓?

我學習c語言主要是上課聽老師講,課下在網上平台練習,遇到不會的問題用百度查答案,將答案程序復制下來,進行分析和學習。在c語言學習過程中,我在自我學習方面比較欠缺,自認為掌握老師要求所學就可以,考試通過就可以,自我滿足,沒有想要進一步學習的欲望和動力,導致我c語言的學習一直停留在舒適區,簡單程序重復化,沒有嘗試過挑戰自己,沒有主動探索c語言更多的功能。簡言之,我的c語言基礎不夠牢固,對計算機語言的理解還不夠深刻。

2.目前為止估算自己寫過多少行C代碼?理解的情況如何?量變引起質變,如何平衡質和量?

代碼數量我在上一篇博客中也提到過,大概3000行左右,基本自己寫過的都理解了(現在也快忘光了)。由此可見,沒有持之以恆的練習,任何技能都會退步。所以關於質和量,我認為應該循序漸進。像我這種普通學生,理解示例程序之后不進行再創造是不行的。就是說我起碼要寫2到3個類似程序(解決方法類似)才能夠基本掌握。所以,在學完一個知識點之后,我必須自己試一下能不能使用,這就是量變的過程;然后再考慮更難的程序,即質變。我覺得量變與質變數量上2:1到3:1最為合適。用的時間上大概要反過來量變比質變大概1:2到1:3比較合適。

3.學過了C語言,你分的清數組指針,指針數組;函數指針,指針函數這些概念嗎?

這些概念主要是看名詞吧,即“指針”、“數組”、“指針”、“數組”。所以數組指針和函數指針本質上是一個指針,分別指向數組中的一個地址和某個函數的地址;而指針數組顧名思義是一組地址;指針函數就是返回指針——一個地址的函數。

參考:百度的解釋,數組指針和指針數組函數指針和指針函數

4.學過了C語言,你明白文件和流的區別和聯系嗎?如何區分文本文件和二進制文件?如何編程操作這兩種文件?

慚愧,不知道。但是我查到了文本文件和二進制文件的區別;二者的編程操作似乎是相同的,只是寫入讀取時規則不同,參閱c語言里面文本文件和二進制文件有什么區別,從側面印證了二者的編碼方式不同。

5.學過了C語言,你知道什么叫面向過程程序設計嗎?它解決問題的方法是什么?

面向過程顧名思義就是以過程為中心,主要關注一句話里的“動詞”的解決問題辦法。把需要的步驟一步一步實現。

參考:楊靜遠學長的博客知乎的解答

6.在C語言里面,什么是模塊?你寫過多個源文件的程序嗎?

我個人理解為把一個程序的不同步驟拆分成一個一個的模塊,分別調用,進而實現預期效果。慚愧的是,我沒有寫過多個源文件的程序。

7.學過了C語言,你知道什么是“高內聚,低耦合”嗎?這個原則如何應用到高質量程序設計中?

根據之前對錢老師的話的模糊記憶和我的理解,“高內聚,低耦合”是指一個程序的各個模塊之間的聯系盡量少,模塊的泛用性盡量高的一種狀態。在高質量程序設計中,我們應盡量使用現成的函數和模塊,用盡量少的語言將幾個模塊連接起來,達到預期的目的。

參考:百度百科

8.學過了C語言,你如何把數組A的內容復制到數組B中?如何查找整數數組A中有沒有數字5?如何對整數數組A進行排序(從小到大,從大到小)?寫出相應的程序。

解答如下

#include <stdio.h>
#include <stdlib.h>

void maxnumber(int a[30],int n)//從大到小排序
{
    int i, j, max, temp;
    for(i=0; i<n; i++)
    {
        max = i;
        for(j=i; j<n; j++)
        {
            if(a[max]<a[j])
            {
                max=j;
            }
        }
        if(max!=i)
        {
            temp=a[i];
            a[i]=a[max];
            a[max]=temp;
        }
    }
}
void minnumber(int a[30],int n)//從小到大排序
{
    int i, j, min, temp;
    for(i=0; i<n; i++)
    {
        min = i;
        for(j=i; j<n; j++)
        {
            if(a[min]>a[j])
            {
                min=j;
            }
        }
        if(min!=i)
        {
            temp=a[i];
            a[i]=a[min];
            a[min]=temp;
        }
    }
}
int main()
{
    int i,n,a[30],b[30];
    printf("how many numbers?\n");
    scanf("%d",&n);
    if(n>30&&n<1)
    {
        printf("too many!\n");
    }
    else
    {
        printf("please input numbers:\n");
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];//數組內容復制
        }
        maxnumber(a,n);
        for(i=0; i<n; i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");
        minnumber(a,n);
        for(i=0; i<n; i++)
        {
            printf("%d ",a[i]);
        }
    }
    return 0;
}

根據老師對去年作業的指導,我查找了strcpy、qsort和bsearch函數的使用方法,實際上我們上課學過strcpy函數,這里之所以不引用是因為該函數適用於字符串的復制,而我在這里規定的變量是整數數組形式,在查找中,我發現了另一個函數strncpy,此函數可以實現將一個字符串復制到另一個字符串的某個位置,並能檢測是否溢出。

關於qsort這個函數

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

顯然,base是數組地址,num是數組的量,size是每個數占內存大小,comparator是一個函數指針,這個函數需要自己去寫,假設是對int排序的話,如果是升序,那么就是如果a比b大返回一個正值,小則負值,相等返回0,如果是降序反過來即可。const是指保證只讀變量不被意外改變。

關於bsearch這個函數

void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *));

key是關鍵詞指針,base是整個要查找的數組,nmem數組中元素的數量,size每個元素長度(占內存大小),最后一個和上文qsort函數基本相同。

參考:CSDN博客一枚程序員的博客

9.寫一個程序,統計自己C語言共寫了多少行代碼。

慚愧,不會寫,只能放一段我改過的別人的代碼。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv)
{
    FILE* rf = fopen("f:\\main.txt","r");
    char a[1024][128];
    int i=0;
    while(fgets(a[i],128,rf))i++;
    int n=i;
    printf("行數:%d\n",n);
    fclose(rf);
    i=0;
    system("pause");
    return 0;
}

這個代碼可以統計一個txt文檔當中的代碼,但是每行必須小於128字節,而且無法統計是否會溢出,有些文件(比如這里的main.txt是我用圖片base64編碼得到很長一段代碼),就會導致崩潰,可以說只能進行簡單的統計工作。

參考:百度知道

10.你知道什么是斷點嗎?給出自己調試程序的例子。

斷點就是程序調試是自動中斷的地方,比如說我在調試第9問的程序時查找崩潰的原因就是把斷點設置在主程序第五行的時候程序崩潰,表明在打開文件進行循環時數據溢出導致崩潰。

三、閱讀PPT提出問題

  1. 在針對JAVA平台無關性的介紹中,特別強調了JAVA根據不同平台需要搭建運行環境,而c卻不用搭設環境,直接生成針對不同平台的運行文件。但是我之前在學習c的時候,出現過因為環境沒有搭設好而產生的無法編譯的情況,請問這個該如何解釋,如何通過幾個淺顯易懂的例子來說明兩種語言在編譯到運行過程中的差異?
  2. 在“把級別高的變量的值賦給級別低的變量”這一段,使用了“顯示類型轉換運算”,那么類型轉換運算之后數值會有怎樣的變化?比如在“int x=(int)34.89;”這個例子中,x最后應該是多少?
  3. 在程序
class Test
{   public static void main(String args[])
   {     int x,y=10;
         if( ((x=0)==0) || ((y=20)==20) ) 
        {  
              System.out.println("現在y的值是:"+y);
       }
   }
} 

我不太理解“((x=0)0) || ((y=20)20)”的意思,難道x=0也是一個值嗎?如果是,它應該等於?a=(x=0)是一個連等的構造,a的值取決於x的值。問題已解決。

4. 在程序

public class A {
    void f() {
      int m = 10,sum = 0;  //成員變量,在整個類中有效
……

明明定義m和sum是在f的方法體中進行的聲明,為什么它們還是A的成員變量?怎樣區分成員變量和局部變量?
5. 在學習上轉型對象時,在把上轉型對象強制轉化為子類的對象的過程中,是不是必須滿足子類和父類一個子類新增了一個變量導致父類一個變量被隱藏的關系?
6. 面向接口的類里面的方法一定要用public修飾嗎?接口產生的class文件又是指什么?
7. 在程序

public void loading(int m) throws DangerException {
       realContent += m;
       if(realContent>maxContent) {
          throw new DangerException(); 
       }
       System.out.println("目前裝載了"+realContent+"噸貨物");
     }

第一行的throws是什么意思?DangerException();又在整個類中扮演什么演的角色?是一個方法還是子類?
8. “常量池中的數據在程序運行期間再也不允許改變”這句話的意思時放入字符序列的內存空間不允許改變,還是放入字符的內存空間和引用(地址)都不允許改變?那么,是不是“String s = new String("we are students");
String t = new String("we are students");
”和“String s = new String("we are students");
String t = s;”是不同的語句?
9. 程序中

    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

是什么意思?
10. 重寫接口中的方法語句

public boolean accept(File dir,String name) {
      return name.endsWith(extendName);
   }

是什么意思?創建一個目錄是在文件類中創建還是用“public boolean mkdir()”語句創建?二者有什么不同?
11. 通配符在預處理中有什么作用?事物描述前后關閉和開啟自動提交模式有什么作用?一定要把開始事務處理放在行為描述之后嗎?
12. 垃圾實體是怎樣產生的?是否說明一個線程可以被分配多個實體?如何避免這種情況?
13. 服務器建立一個ServerSocket對象時,必須知道客戶的IP地址或者端口號,有什么方法能夠在不知道以上兩個信息的時候與客戶連接?
14. Ellipse2D類中,括號里的四個變量分別表示什么?set類中setArc方法括號里的六個變量又分別表示什么?
15. 怎樣實現樹集中“大小”的比較?樹集是怎樣引用對象中的比較方法的?對象必須有Comparable接口和compareTo方法嗎?

四、JAVA學習的目標與途徑

和我之前在第一篇博客中寫的一樣,在課程內容的學習中,基礎上,我希望能夠掌握這門語言,並使用它編寫簡單的應用程序;深層次上,既然JAVA被稱作“面向對象的程序設計”,我認為相對c來講,一定有它的獨到之處,在思維方式上也一定有所不同,我希望能夠了解掌握這門計算機語言的設計思路和思維模式。從而能夠舉一反三,觸類旁通。

我認為,我應該勇敢地從“舒適區”走出來:在學習上,勇於挑戰難題,平時多關注行業前沿動態,在博客園這個平台上,利用它豐富的資源,挑戰難關,尋求解答;在生活中,調整自己的心態,磨練自己的意志,擠出更多時間用以提升自我價值,進而養成良好習慣,使終身受益。

寫程序主要是實踐,光看書是不可能有所突破,婁老師在做中學一文中提到“不光要動手,還要理解背后的原理;不光要會用工具,還要理解支撐的理論”“學習提升要有反饋”。誰都想成為“專家”,但是最終實現夢想的能有幾人?因此,我計划這學期充分利用時間,進行有益的、大量的學習,在前期盡量積累經驗,通過博客園增長自己的見識,讓自己不至於陷入“疲於應付”的境地中,同時,通過多種方式與老師、同學們交流,甚至可以通過網絡學習一些“大神”的操作。簡而言之,仰望星空,腳踏實地,相信在老師“做中學”的正確思想引導下,我能夠實現目標。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM