1. 程式人生 > >20165318 預備作業二 學習基礎和C語言基礎調查

20165318 預備作業二 學習基礎和C語言基礎調查

第六章 post 教學 風雨無阻 但是 隨著 文本文件 快速 學習經驗

20165318 學習基礎和C語言基礎調查

技能學習經驗

我們這一代人,或多或少的都上過各種興趣班,舞蹈鋼琴畫畫書法,我也是如此。可這些技能中,唯一能拿的出手的就是舞蹈了。按照《優秀的教學方法---做教練與做中學》中的標準:一項技能的掌握程度分為:新手/高級初學者/合格者/精通/專家。我認為自己尚且只達到合格者的程度,並不能說自己的水平淩駕於大多數人之上。

從4歲學到14歲,這些年的學習,還是帶給我很多啟發,要學好一項技能,要具備以下幾點:

  • 興趣:興趣是最好的老師。我小時候就對舞蹈很有興趣,看著電視上的舞蹈節目,總會跟著音樂跳起來,4歲的時候便參加了舞蹈班,進行系統的學習。隨著學習的進程,我更加深入的體會到民族舞的韻味,對其的興趣也愈發深厚,現在到了大學,我依然對舞蹈興趣不減,加入了學校的舞蹈隊,在校慶等舞臺上展現風采。
    毅力
    不要只看時鐘,要效仿時鐘,一直前行。《每天一萬步,每周減十斤》中說到:限制你每天完成一萬步的障礙是什麽?生病了?遇到臺風了?下大雨了?霧霾了?其實什麽都不是,就是你的毅力和決心。就像我練習舞蹈的那段日子,不管是下雨還是下雪,我都沒有遲到過。從9歲開始,由於當時縣城裏師資不足,媽媽便每個周末都帶我到市裏上舞蹈課,風雨無阻。練舞蹈最重要的是基本功,而基本功的訓練總是痛苦的,每次拉腰,擴肩都很痛苦,在這段時間中,我也曾有過退縮的念頭,但最終都咬咬牙堅持了下來,直到初三時不得不放棄。
  • 刻意訓練:《「做中學(Learning By Doing)」之乒乓球刻意訓練一年總結》一文中說到:邁出 「舒適區」,只在 「學習區」 學習,註意循序漸進,不能進入 「恐慌區」 。例如基本功的訓練,在做動作時不能憑著自己的感覺,怎麽舒服怎麽來,而要記住動作的要領,在訓練時,根據要領做動作。基本功的訓練是每節課都要重復練習的,從而擁有肌肉記憶

    。民族舞最動人的地方在於韻味,聲韻練習也是民族舞基本功的組成部分,經過長期的刻意練習,舞蹈動作才會有其特有的韻味。

    套路(Kata)指針對某一種特定技術或技能進行重復性的練習,從而將其熟練掌握。這個概念借鑒於武術,指的是可以獨自或多人共同練習的一系列動作、招式。
    體育運動的初學者練習時候都需要重復動作,比如「學習打乒乓球時」要練習揮拍,揮拍成千上萬遍之後動作就會定型,也就是教練常說的「肌肉有了記憶能力」,以後實戰中可以不假思索地做出來。
    -- 引用自《優秀的教學方法---做教練與做中學》

  • 及時反饋:舞蹈動作有很多要領,做得不標準有時會影響總體效果,在我學習的過程中,我的老師總能及時糾正我的錯誤,使我得到及時反饋,進而循序漸進,獲得更高的水平。

    我認為Java學習也是如此:

  • 要培養對Java的興趣
  • 擁有學好Java的決心,並堅持下去
  • 每天進行刻意的練習,要熟練掌握基本技能,進入學習區
  • 即時總結自己的問題,並及時反饋,向老師或同學提問

C語言基礎調查

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

我學習C語言主要是上課聽講,有時候會進行課前預習和課後練習,但由於當時對C語言重視程度不夠,平時並沒有堅持日常練習,是在接近期末的時候才進行了大量練習。在C語言學習過程中,我一直停留在舒適區,對於一個問題,只停留在能夠解決,而沒有深入探索,導致我僅僅只是通過考試,並沒有很熟練的掌握C語言。坦誠的說,我的C語言基礎並沒有打牢,對其探索程度還不夠,這是很大的教訓。優秀的教學方法---做教練與做中學中提到,
對技能要有個期許,不能有了高級初學者的水平就滿足了,要有當專家的夢想。要想做好一件事情,對自己的要求不能太低,並且要有規劃的去學習。

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

代碼數量我估計自己大概寫過3000行左右,基本上都能理解,一些簡單的程序能熟練掌握,但難一些的程序,只能理解並基本掌握。我覺得,量變引起質變,質和量是循序漸進,不是一蹴而就的。例如一個知識點,不是練一遍就能掌握的,要至少三次以上的刻意練習,融會貫通,才算基本掌握,這個過程中,我這些刻意練習是量變的積累,我掌握這個知識點並能將它靈活應用,這是質變,量變的逐次積累,循環漸進,最終達到質變。

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

數組指針是一個指向數組的指針,其本質是指針;
指針數組是一個由指針為元素組成的數組,其本質是數組;
函數指針是一個指向函數的指針,其本質是指針;
指針函數是一個返回值為指針的函數,其本質是函數。

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

我不太清楚文件和流的區別和聯系,但通過查資料,我了解到:文件是計算機管理數據的基本單位,同時也是應用程序保存和讀取數據的一個重要場所。流是字節序列的抽象概念,提供一種向後備存儲器寫入字節和從後備存儲器讀取字節的方式。當流到磁盤而成為文件時,要啟動磁盤寫入操作,這樣流入一個字符或者流入一個字節均要啟動磁盤操作,將大大降低傳輸效率,並且影響磁盤的使用壽命。
文本文件是以一些常用字符編碼方式編碼的,每個字符都對應相應的編碼,獨自占用一個字節的存儲空間,是定長的;二進制文件是用二進制進行編碼的,可以自定義編碼,是不定長的。在C中,文本文件操作是通過庫函數完成的;二進制文件是通過fopen,fread,fwrite三個函數完成的。

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

面向過程是指以過程為中心,通過構建過程,自頂而下,逐步求精,模塊化的解決一個問題。它通過分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用來解決問題。

在C語言裏面,什麽是模塊?你寫過多個源文件的程序嗎?

把程序要解決的總目標分解為若幹目標,再進一步分解為具體的小目標,把每個目標稱為一個模塊。很慚愧,我並沒有寫過多個源文件的程序。

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

高內聚是指每個模塊是由相關性很強的代碼組成,只負責一項任務,獨立性強。低耦合是:一個完整的系統,各個模塊相互獨立,模塊與模塊之間的接口,盡量的少而簡單。在高質量的程序設計中,要遵循“高內聚,低耦合”的原則,具有相同功能的模塊盡量整合在一起,不同模塊間的嵌套要盡可能的少。

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

利用strcpy函數將數組A的內容復制到數組B中:

#include <stdio.h>
#include <string.h>
#define N 50

int main()
{
    char a[N],b[N];
    printf("The string A is:");
    gets(a);
    strcpy(b,a);
    printf("The string B is:");
    puts(b);
    return 0;
}

查找整數數組A中有沒有數字5,並對整數數組A進行排序(從小到大,從大到小)

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

int search(int a[],int n)//查找整數數組A中有沒有數字5
{
    int i;
    int flag=0;
    for(i=0;i<20;i++)
    {
        if(a[i]==5)
            flag=1;
    }
    return flag;
}

void min(int a[],int n)//整數數組A進行排序(從小到大)
{
    int i,j,k,temp;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i;j<n;j++)
        {
            if(a[k]>a[j])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}

void max(int a[],int n)//整數數組A進行排序(從大到小)
{
    int i,j,k,temp;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i;j<n;j++)
        {
            if(a[k]<a[j])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}

int main()
{
    int n,i,a[50];
    printf("How many numbers?\n");
    scanf("%d",&n);
    printf("Please input numbers:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(search(a,n)==1)
    {
        printf("數組中有 5 !\n");
    }
    else
    {
        printf("數組中沒有 5 !\n");
    }
    min(a,n);
    printf("從小到大排序:");
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
    }
    printf("\n");
    printf("從大到小排序:");
    max(a,n);
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
    }
    return 0;
}

qsort(對數組進行排序):

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

其中base是數組首地址,num是數組中元素數量,width是元素所占空間,comparator是函數指針,需要自己定義。
bsearch(對數組進行查找):

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

key是關鍵詞指針,base是整個要查找的數組,nmem數組中元素數量,width每個元素所占內存,comp是函數指針,需要自己定義。
參考:qsort(百度百科)
這兩個函數我通過查閱資料有了最初的了解,也嘗試了編程,但最終結果沒有調試出來,便還是用了之前學過的方法解決的問題。

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

這個我沒有獨立寫出來,下面是在別人代碼基礎上寫出來的。

#include <stdio.h>
#include <string.h>

int  main()
{
    int    all=0;
    FILE   *fp;
    char   filename[100];
    char   str[4096];
    printf("Enter a filepath/filename:\n");
    gets(filename);
    fp=fopen(filename, "rt");//打開文件
    if(fp==NULL)//判斷文件是否正確打開
    {
        printf("Failure to open. \n");
        exit(0);//如果錯誤終止程序
    }
    while (fgets(str,4096,fp))  //讀取一行,並判斷文件是否結束
    {
        all++;
    }
    fclose(fp);
    printf("filename:%s 代碼行數:%d",filename,all);
}

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

斷點就是程序運行過程中自動中斷的地方,以便住不檢查調試程序。當時練習C語言代碼時,程序不能運行時,常常找不到錯誤,這時候就可以通過設置斷點,監視程序運行過程,進而找到問題出現的地方,並進行改正。在婁老師對去年預備作業的總結中提到調試器不光用來除錯,還是很好的學習工具。這個我之前並沒有探索過,我以後會盡力去學習這種用法。技術分享圖片

章節提問(參考怎樣快速閱讀一本書我的提問如下)

  1. 第一章中提到Java源文件中類可以自己編寫,也可以引入類庫中的類。我的困惑是:如果源文件中有public類,這個類必須是自己編寫的嗎?如果是引入類庫中的類,這個類又該如何表示呢?
  2. 在類型轉換運算的例子中,有以下程序

    float f =123456.6789f ;
    double d=123456789.123456789;
    f=(float)d;
    運行結果是f=1.23456792E8。我的困惑是:ppt中有說,float型變量存儲是要取8位有效數字,而這個結果卻有9位有效數字。而且我不是很明白如果將級別高的變量賦給級別低的變量時,小數部分是如何取舍?四舍五入?全部舍去?全部進位?
  3. 關於switch開關語句的介紹中提到“break語句是可選的”,但下面又解釋“這裏面必須要有break語句”,且按我們之前學過的內容,如果沒有break語句,程序就會在switch語句中從變量匹配的地方一直執行到結束。所以,“break語句是可選的”中的“可選”是什麽定義?
  4. public class A{
    void f(){
    int m=10,sum=0;//成員變量,在整個類中有效
    以上程序中m和sum是在f的方法體中進行的定義,它們為什麽是A的成員變量?
  5. 第五章中提到“除了Object類,每個類都有且僅有一個父類”,那麽是否存在一個類,它的父類還有自己的父類,也就是是否包含多重的父子關系?而且有“子類可以通過繼承的方法來操作子類未繼承的變量和方法”的說法,既然子類沒有繼承這些變量和方法,有為什麽能操作它們?而且又該如何操作?
  6. 第六章主要在講接口,我覺得接口和abstract類較為類似,它們有什麽區別?接口體中只能定義常量嗎?這在我之後看ppt的過程中得到了解答。但是為什麽接口體中只能定義常量呢?為什麽要有這樣的限制?
  7. 內部類有什麽優點,一般用它解決什麽情況?關於斷言,如何讓它在調試代碼階段發揮作用,又在程序正常運行是關閉呢?
  8. 第八章中說,“String對象的字符序列是不可修改的,StringBuffer類獨享試題的內存空間可以自動的改變大小。”我比較疑惑String類和StringBuffer類在使用時有沒有特定的環境?這一章中類比較多,該如何更為明確的區分它們?
  9. 第九章中提到“直接子類”和“間接子類”,我對這兩個的概念不是很明白。如果我在第五章中的問題“是否包含多重的父子關系”成立的話,那麽一個子類是它父類的直接子類,是它父類的父類的間接子類呢?
  10. 第十章中提到了“文件鎖”的概念,文件鎖一般使用在什麽情況下?

前四章的內容我基本上都能理解,第五章往後只能理解大部分,第十章以後的內容理解的不是很好,感覺自己不能通過自己的思考提出什麽滿足怎樣快速閱讀一本書中要求的問題。因為在看ppt的時候沒有進行相應的練習,有些定義經常會混淆,只能一次次回頭看,這樣浪費了一些時間。以上是我閱讀ppt後的問題,有的還不夠完善,以後會繼續補充。

Java學習目標與實現方法

  • 通過下學期Java課程的學習,理論上,我希望能夠了解這種面向對象的程序設計語言的設計思想;實踐上,我希望能熟練的掌握這門語言,並利用它解決一些問題。同時,我希望能夠發揮主觀能動性,養成良好的學習習慣,提高自學能力。

  • 首先,我必須邁出[舒適區],在[學習區]中學習,並且克服恐懼心理。其次,要給自己制定小目標,例如每天練習一些代碼,並堅持下去;同時,對自己的薄弱點進行針對練習,通過不斷的練習,把那些低層次的問題都解決了,變成不用經過大腦的自動操作,然後才有時間和腦力來解決較高層次的問題。並且在練習的過程中要集中註意力,這樣長期的堅持,就能提高程序設計能力和培養計算思維。

  • 《做中學》一文中說到:“學習是要思考的,僅僅實踐是不夠的: 不光會動手,還要理解背後的原理,不光會用工具,還要理解支撐的理論。”由此可見,在Java學習中,要理論與實踐相結合,學習理論的同時進行大量的練習,在練習中進行總結。“做中學”是學生為主體、老師為主導的學習方式,我希望能提高自己的自學能力,借助博客園和碼雲這些平臺,努力自己解決問題;同時也要與老師互動,獲得及時反饋。

20165318 預備作業二 學習基礎和C語言基礎調查