1. 程式人生 > >20165218 學習基礎和C語言基礎調查

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

結構 打印數組 打印 編程語言 緩沖 讓我 質變 存在 返回值

個人技能及閱讀心得

  • 個人技能之繪畫

繪畫是我從很小便開始接觸的,從最初的簡筆畫到國畫、素描、水粉,大約也學了七八年。但是到了高中之後,就逐漸放下了。

記得當初學素描時,老師的一句話讓我記憶猶新,她說,畫素描就是要 “抄”:一是“抄”作品,也就是臨摹;而是“抄”實物,因為素描追求的是真實,什麽時候能把擺在桌子上的靜物原封不動地“抄”到紙上,那水平才算是達標。

臨摹 是一種在技術不成熟的時期裏很有效的學習方法。特別是在畫水粉畫的時候,初學者很難掌握調色技巧,比如有些綠色水果的暗面要用深紅色、靛藍處理,這對於初學者來說,很難從實物上看出來;而臨摹時,因為有作品參考,便更容易把顏色從整體的物體上剝離。臨摹不僅是單純的復制,這是一個鍛煉技巧、學習經驗、把理論知識融會貫通的過程。對於編程語言的學習來說,這就相當於開始的抄代碼,在“抄”的過程中鞏固理論知識,明白上課講的知識的用法。

  • 個人技能之閱讀與寫作

我的寫作技能不能算是出類拔萃,但至少在中學時期,這是我領先大部分人的一個加分項。閱讀與寫作,是知識的積累與運用過程,這二者在某種意義上是一體的。

同繪畫一樣,我也是在很小的時候就開始閱讀。但是到高中時期,由於學業,也由於手機的影響,我紙質書的閱讀量大大減少,到了大學才又漸漸重拾。在我多有起伏的閱讀經歷中,我最大的心得就是要找到適合自己的方法.

高中時期,閱讀常常是為了積累寫作素材、鍛煉語感,那是我讀到值得記錄的段落、句子,就直接抄下來,雖說有些費時,但摘抄的過程可以大大加深記憶、也給人進一步思考的機會,同時,這也是個練字的過程,可謂一舉多得。

而到大學時期,我看書的同時會使用一個叫 “蘿蔔書摘”

的APP,它提供掃描功能,可以把文字拍攝並掃描記錄,同時附上一個寫感想的模塊,最後生成一個完整的書摘保存。這樣一來,大大節省了摘抄的時間。同時,該APP還提供書摘整理、“蘿蔔坑”(類似讀書小組,可以一起讀書、坑主領讀等)等功能。利用這個APP,在閱讀的同時,隨手寫下感想,還能保持寫作的手感。從去年二月到現在,我一共讀了12.5本書,寫了91篇書摘、2篇隨筆。看著自己的數據,也是小有成就感,更加激勵自己堅持閱讀。

  • 閱讀心得

讀了老師的博客以後,我記憶最深刻的就是老師的做一件事時的目的性、系統性、總結性。無論減肥、學習五筆、背單詞、乒乓球,婁老師在過程中以及結束後,都會進行系統地總結,條理清晰、階段分明,這是我以前從未見到過的。

有關C語言學習的調查

  • 你是怎麽學習C語言的?

說實話,我C語言的學習做的並不好。水平止步於比較淺的程度。學習的過程就是練習;在期末復習階段,我有用筆記本整理過一些容易混淆的知識。

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

估算大概在3000行以上。理解的情況較一般,有些知識點比如指針和數組、指針和函數、文件操作等只停留在初步了解階段,幾乎沒有實際編程操作過。

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

數組指針是一個指針變量,保存一個數組的首地址;
指針數組是有若幹及類型相同的指針構成的數組,其中每個元素都是一個指針;
函數指針就是指向函數的指針,指向函數的指針變量中存儲的是一個函數在內存中的入口地址;
指針函數是一個返回值為指針的函數。

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

文件和流

計算機文件是以計算機硬盤為載體存儲在計算機上的信息集合。文件可以是文本文檔、圖片、程序等等。通常是磁盤上一段命名的存儲區。流是數據之間的傳輸操作。比如:

標準I/O流:內存與標準輸入輸出設備之間信息的傳遞;文件I/O流:內存與外部文件之間信息的傳遞;字符串I/O流:內存變量與表示字符串流的字符數組之間信息的傳遞。
——C++ 流(stream)總結

文件的I/O函數都是針對文件描述符進行操作的,比如說當調用open或者其他函數打開一個文件,返回一個文件的描述符fd,然後針對這個fd進行後續的I/O操作,由於需要多次反復調用對應的系統調用,效率低是自然的。
而流I/O函數的操作是圍繞流(Stream)進行的,當使用流I/O庫打開或者創建一個文件時,可以使一個流和一個文件結合,接下來的操作就是對流進行讀寫、定位等,最後關閉即可。……用戶可以簡單地把流看做一塊由操作系統分配的內存緩沖區,在該緩沖區中存放了文件對應的數據。——流和文件的區別 - CSDN博客

我個人的理解,流就是程序輸入/輸出數據過程的載體。流連接了輸入/輸出設備與程序。

文本文件和二進制文件

C語言文件有兩種類型,文本文件(也稱 ASCII碼文件)和 二進制文件。其差別在於存儲數值型數據的方式不同。在二進制文件中,數值型數據是以二進制形式存儲的,而在文本文件中,則是將數值型數據的每一位數組作為一個字符及其ASCII碼的形式存儲的。因此, 文本文件中的每一位數字都單獨占用一個字節的存儲空間。而二進制文件則是把整個數字作為一個二進制來存儲的,並非熟知的每一位數字都占用單獨的存儲空間。
——《C語言程序設計(第3版)》P373

編程編輯

字 符 含 義
“r" 以只讀方式,打開文本文件;該文件必須是已經存在的,並且只能讀出,不能寫入數據;若文件不存在,則會出錯
“w" 以只寫方式,創建並打開文本文件,已存在的文件將被覆蓋;無論文件是否存在,都需創建一個新的文本文件,只能寫入數據
“a” 以只寫方式,打開文本文件,位置指針移到文件末尾,向文件尾部添加數據,原文件數據保留;若文件不存在,則會出錯
“+” 與上面的字符串組合,表示以讀寫方式打開文本文件;既可以向文件中寫入數據,也可從文件中讀出數據
“b” 與上面的字符串組合,表示打開二進制文件

例如,

fp=fopen("D:\\demo.txt","a+");

表示以讀寫方式打開D盤的文本文件demo.txt,保留原內容,並向尾部添加數據;

fp=fopen("D:\\demo.bin","ab+");

表示以讀寫方式打開D盤的二進制文件demo.bin,保留原內容,並向尾部添加數據;

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

我以前沒有接觸過這個概念,通過查資料,我了解到“面向過程”是一種以過程為中心的編程思想。

“面向過程”(Procedure Oriented)是一種以過程為中心的編程思想。“面向過程”也可稱之為“面向記錄”編程思想,他們不支持豐富的“面向對象”特性(比如繼承、多態),並且它們不允許混合持久化狀態和域邏輯。
就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。——面向過程_百度百科

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

個人理解模塊就是函數,將主函數中一些比較繁瑣,或者使用次數較多的部分寫成函數方便隨時調用。在利用c語言編程解決密碼學數學基礎的問題時用的比較多。
我沒有寫過多個源文件的程序。

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

模塊分解的基本原則是:高聚合、低耦合,保證每個模塊的相對獨立型。 無論結構化方法還是面向對象方法,都要遵循這個原則。高聚合指的是模塊內部的聯系越緊密越好,內聚性越強越好,簡單地說就是模塊的功能要相對獨立型和單一,讓模塊各司其職,每個模塊只專心負責一件事情。低耦合指的是模塊之間的聯系越松散越好,模塊之間僅僅交換那些為完成系統功能必須交換的信息,這意味著模塊對外的接口越簡單越好,因為借口越簡單,模塊與外界打交道的變量和交換的數據就越少,這樣就會降低模塊之間的互相影響到程度。——《C語言程序設計》P171

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

  1. 把數組A的內容復制到數組B中

#include <stdio.h>
#include <stdlib.h>
# define N 6
int main()
{
    int a[N], b[N];
    int i;
    printf("輸入數組a:");
    for(i=0; i<6; i++)   //錄入數組a的值
    {
        scanf("%d",&a[i]);
    }
    for(i=0; i<6; i++)  //將數組a的值復制到數組b中
    {
        b[i]=a[i];
    }
    printf("以下是數組b:\n");
    for(i=0; i<6; i++)  //打印數組b
    {
        printf("%d\t", b[i]);
    }
}
  1. 查找整數數組A中有沒有數字5

#include <stdio.h>
#include <stdlib.h>
#define N 6

int main()
{
    int a[N], b[N];
    int i;
    printf("輸入數組a:");
    for(i=0; i<6; i++)   //錄入數組a的值
    {
        scanf("%d",&a[i]);
    }
    for(i=0; i<6; i++)  //將數組a的值復制到數組b中
    {
        b[i]=a[i];
    }
    printf("以下是數組b:\n");
    for(i=0; i<6; i++)  //打印數組b
    {
        printf("%d\t", b[i]);
    }
}
  1. 對整數數組A進行排序(從小到大,從大到小)

#include <stdio.h>
#include <stdlib.h>
void upsort(int a[],int m);
void printa(int a[],int m);
void downsort(int a[], int m);

int main()
{
    int a[7]={12,67,3,78,36,90,40,2};
    upsort(a,8);
    printf("升序為:");
    printa(a,8);
    downsort(a,8);
    printf("\n降序為:");
    printa(a,8);
}

void upsort(int a[],int m)//用選擇排序法實現生序排序
{
    int i,j;
    int k;
    int temp;
    for(i=0; i<m-1; i++)
    {
        k=i;
        for(j=i+1; j<m; j++)
        {
            if(a[j]<a[k])
                k=j;
        }
        if(i!=k)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}

void printa(int a[], int m)//打印數組
{
    int i;
    for(i=0; i<m; i++)
        printf("%d\t",a[i]);
}

void downsort(int a[], int m)//用冒泡排序法實現降序排序
{
    int i,j;
    int temp;
    int flag=0;
    for(i=0; i<m; i++)
    {
        for(j=0;j<m-1-i; j++)
        {
            if(a[j]<a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                flag=1;
            }
        }
    }
}
  • 寫一個程序,統計自己C語言共寫了多少行代碼。

很抱歉我不會寫這個程序。我在網上也找到了很過類似的程序,但是文件操作這一部分是我的薄弱之處。參考過其他人的代碼後,我認為該程序大致思路應是

graph LR
A[遍歷一個目錄下所有.c的文件]-->B[分別統計行數]
B-->C[分別相加]
  • 你知道什麽是斷點嗎?給出自己調試程序的例子。

斷點,調試器的功能之一,可以讓程序中斷在需要的地方,從而方便其分析。

斷點也可以在一次調試中設置斷點,下一次只需讓程序自動運行到設置斷點位置,便可在上次設置斷點的位置中斷下來,極大的方便了操作,同時節省了時間。

斷點模式可以看作一種超時。所有元素(例如,函數、變量和對象)都保留在內存中,但它們的移動和活動被掛起了。在中斷模式下,您可以檢查它們的位置和狀態,以查看是否存在沖突或 bug。您可以在中斷模式下對程序進行調整。例如,可以更改變量的值。可以移動執行點,這會改變執行恢復後將要執行的下一條語句。在 C++、C# 和 Visual Basic 中,甚至可以在中斷模式下對代碼本身進行更改(使用一種稱為“編輯並繼續”的強大功能)。
——斷點-百度百科

個人理解,斷點就是在調試程序的過程中,程序運行到該處可以暫停,所有數據保留。而後通過逐行分析數據變化,檢查程序的錯誤。

斷點調試的例子有很多,比如上學期密數實驗:求一個數的生成元中,我就曾使用過斷點調試測試程序。技術分享圖片

  • 參考怎樣快速閱讀一本書,快速閱讀一下雲班課中有PPT,每章提出一個問題

  1. 如何理解類?
  2. 標識符由字母、下劃線、美元符號和數字組成

為什麽例子中會有這樣的代碼,出現了中文?

byte x= -12,  tom=28,  漂亮=98
  1. 何謂“boolean型數據”,這與用一個實數的1、0判斷邏輯有何不同?
  2. 各個類之間有執行順序的先後嗎?如果如果需要先後執行,如何實現?
  3. 什麽叫做“子類和父類在/不在一個包中”?“包”是什麽?
  4. 將接口類比為C語言函數中的“形參”可以嗎?
  5. C語言中,斷點調試是設置斷點,而後從斷點開始逐行調試,Java中斷言是否類似?
  6. 實用常用類中的特定的類是不是就是Java已經設定好的,針對特定對象的?
  7. GUI是什麽?
  8. 流在何處使用?不能直接操作文件嗎?
  9. 數據庫是什麽?
  10. wait()方法和sleep(int millsecond) 有什麽區別?
  11. Java網絡編程除了傳輸數據、遠程調用之外還可以實現哪些功能?
  12. Java是否可以實現多種圖形編輯功能?
  • 對比C語言的學習,你對《Java程序設計》的學習有什麽具體目標?如何通過刻意訓練提高程序設計能力和培養計算思維?如何通過“做中學”實現你的目標?

    對比C語言的學習,我希望Java我能學的更深入,不止停留於淺層知識。對於提高程序設計能力和培養計算思維,除了堅持練習和及時反饋外,我認為應逐漸接觸一些比自身水平更難一點的程序,由淺入深,不能“知難而退“,只停留在學習的舒適區。

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