學習基礎和C語言基礎調查
學習基礎和C語言基礎調查
一、一種比大多數人(超過90%以上)更好的技能
說句實話,我還沒有那種特別特別自信的、說我能拿得出手的、所謂能超過百分之九十以上的人的技能。畢竟人外有人,天外有天。
姑且算上象棋吧,能下的過一些人,碰上一些每天都在下的那種老爺爺可能還是不太招架得過來。
至於說我所積累的經驗,總結一下,大量的實戰經驗和靈活的思維模式。
首先說這頭一點吧,實戰經驗就是大量的練習。有的人下棋就喜歡背棋譜,不過我覺得紙上得來終覺淺,或者說,我覺得真刀真槍地幹上一局比背棋譜進步得快。其實......我小時候也沒想這麽多,這都是我現在瞎bb的。我的象棋算是野路子學來的,小時候和爺爺奶奶下,一點點啟蒙的技巧還是會的。再後來,上小學了,和班裏同學下,參加比賽等等。從始至終沒有上過正兒八經的培訓班之類的,所以,到底應該怎麽學我也不知道。
但是我覺得下的多,還是有幫助的。見的套路多,中的招多了,自然能長記性。
所以我現在把這個經驗總結為:大量的實戰經驗。小時候打下的底子,縱觀全局,不可或缺。
第二,死腦筋還是不行的,思維要靈活。對局時動腦子想想幾步之後走到哪裏了,有沒有便宜可占,猜對手想幹什麽,其中有沒有殺機;對局後動腦子,這個對手棋路風格如何,剛才有沒有失誤,等等。如果不動腦子,那麽進步就是一種奢望。
勤能補拙,靜能生慧。我覺得這是與老師博客中的學習經驗的最大共通之處,也是所有求學道路上的秘訣。
二、有關C語言學習的調查
你是怎麽學習c語言的?與你的高超技能相比,C語言的學習有什麽經驗和教訓?
剛剛開始的時候,基礎的知識了解一點,一些基本的語句。
然後就是刷題刷題刷題......老師給的那個c語言在線題庫。
之後慢慢開始學會看錯誤信息,找錯,學會用debug等等,再後來幫同學改程序,一些易錯的地方越來越熟練,到最後慢慢地開始和大佬們交流,看看其他人是怎麽寫的。
總而言之就是不斷進步嘛,自己發現問題解決問題,查書,問同學,問度娘,問老師。這就是我的,最大的收獲。
目前為止估算自己寫過多少行C代碼?理解的情況如何?量變引起質變,如何平衡質和量?
(老師對不起寫了多少行C語言代碼我是真的心裏沒數啊)
等等啊,我們現在一個實驗寫程序大概100~200行,這樣算下來,我們做了這麽多大大小小的實驗,應該有個小幾千行了。
目前寫的代碼都還是能理解的,畢竟都是自己寫的,應該不存在看不懂的問題;其他人的代碼也還是看得懂,只是要多看兩眼,多琢磨琢磨,可能是代碼看少了,不太熟練吧。
量變引起質變,這是必然的規律。我覺得我們只要慢慢積累,自然集腋成裘,沒有必要刻意追求質變的發生。也許有一天,我們回過頭來,看見自己從最開始的“Hello world!”到後來能自己編個小應用,我們就會感嘆不知不覺中質變的發生。
學過了C語言,你分的清數組指針,指針數組;函數指針,指針函數這些概念嗎?
也不知道我記的是不是對的。
數組指針,說白了是指針嘛,指向一個數組的指針;指針數組是一個數組,數組裏儲存的是指針。
函數指針類似,函數指針是指向一個函數的指針;指針函數是一個函數,函數返回值是一個指針。
學過了C語言,你明白文件和流的區別和聯系嗎?如何區分文本文件和二進制文件?如何編程操作這兩種文件?
第一個問題只知道一點點......
文件指的是電腦儲存設備上的數據信息,流簡單的說應該是字節序列,文件的輸入輸出控制,外部輸入輸出設備等等。關系:流是一種向文件寫入字節和從文件讀取字節的方式。
第二個問題......我覺得廣義上講,文本文件本質就是二進制文件的......所以二者的區別並不是物理上的,而是邏輯上的。二進制文件可以存儲char/int/short/long/float/……各種變量值。作為特殊的二進制文件,文本文件只能存儲char型字符變量。因此,文本文件每條數據通常是固定長度的,而二進制文件不是。
文本文件編輯器就可以讀寫,比如記事本;二進制文件需要特別的解碼器。
學過了C語言,你知道什麽叫面向過程程序設計嗎?它解決問題的方法是什麽?
C語言是面向過程的程序設計。所謂過程就是,酒一口一口喝,步子一步一步走,先幹嘛再幹嘛,順序很重要,對於計算機而言只需要一個一個地實現就行了。
解決問題的辦法就是把一個程序模塊化,從上往下步步求精即可。
在C語言裏面,什麽是模塊?你寫過多個源文件的程序嗎?
在設計一個較大的程序時,可以把它分成若幹個程序模塊,每一個模塊包括一個或多個函數,每一個函數實現一個特定的功能。C語言通過函數來實現其模塊化功能的。
多個源程序倒沒有寫過,目前只寫一個源程序的。
學過了C語言,你知道什麽是“高內聚,低耦合”嗎?這個原則如何應用到高質量程序設計中?
“高內聚,低耦合”其實按字面意思也很好懂,程序的模塊與模塊之間的耦合度要低,接口處盡量簡單;模塊內部要做得精細,模塊內的函數功能聯系要緊密。
應用上主要的問題在於模塊的劃分。一方面要考慮耦合性:為了提高模塊的獨立性,模塊與模塊之間的聯系應該盡可能的減少,盡量在主函數裏調用,實現非直接耦合;另一方面要考慮內聚:盡可能實現一個模塊對應一個功能。
學過了C語言,你如何把數組A的內容復制到數組B中?如何查找整數數組A中有沒有數字5?如何對整數數組A進行排序(從小到大,從大到小)?寫出相應的程序。
(假設數組char型,長度為5,數組a是1,2,a,b,c)
把數組A的內容復制到數組B中:最簡單就是腳標循環,一個一個對應著寫。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[5]={‘1‘,‘2‘,‘a‘,‘b‘,‘c‘};
char b[5];
int i;
for (i=0;i<5;i++)
{
b[i] = a[i];
}
return 0;
}
如何查找整數數組A中有沒有數字5?腳標循環查找。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[5]={‘1‘,‘2‘,‘a‘,‘b‘,‘c‘};
int i;
int flag = 0;
for (i=0;i<5;i++)
{
if (a[i]==‘5‘)
{
flag = 1;
break;
}
}
if (flag)
printf("Bingo!");
else
printf("Not Found!");
return 0;
}
如何對整數數組A進行排序(從小到大,從大到小)?冒泡排序。
下面是從大到小排序(按照ASCII碼排序)。從小到大只需要將判斷條件,由“if (a[j]<a[j+1])”
改為“if (a[j]>a[j+1])”
。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[5]={‘2‘,‘1‘,‘b‘,‘a‘,‘c‘};
int i,j;
int temp;
for (i=0;i<4;i++)
{
for (j=0;j<4-i;j++)
{
if (a[j]<a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for (i=0;i<5;i++)
{
printf("%c",a[i]);
}
return 0;
}
寫一個程序,統計自己C語言共寫了多少行代碼?
這個是大二上做中國剩余定理實驗的代碼,前前後後敲了一周吧。
//中國剩余定理實驗
#include <stdio.h>
#include <stdlib.h>
#define N 10000
#define M 10
struct equa //方程:bx = a mod n;
{
int a;
int b;
int n;
};
int modni(int a,int b);
//模逆運算 m = a^(-1) mod b
int gcd(int a,int b);
//求最大公因子
int gcd(int a,int b)//輾轉相除法求最大公因子
{
int temp;
if (a<b)
{
temp = a;
a = b;
b = temp;
}
while (b!=0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
}
int modni(int a,int b)//模逆運算 m = a^(-1) mod b
{
int v1=0,v2=1,q,temp;
if (a>b)
{
a = a % b;
}
while (a!=0)
{
q = b/a;
v1 = v1-v2*q;
temp = b % a;
b = a;
a = temp;
temp = v1;
v1 = v2;
v2 = temp;
}
return v1;
}
int main()
{
int x,xn; //方程總個數
struct equa E[M],B[M]; //兩個方程組,互寫(bx = a mod n)
int m0 = 1; //m0 是中國剩余定理的 m
int m[M]; //m 是中國剩余定理的 M
int mm[M]; //mm 是中國剩余定理的 M‘
int shit = 0; //最終結果 x = shit mod m0
int i = 0,j,k; //角標
int g1,g2; //互素分解的臨時儲存位置
printf("Please input the number of equations:\n");
scanf("%d",&x);
xn = x; //數據保留
if (x>M)
{
printf("Error!\nx>%d\n",M);
exit(0);
}
while (x--)
{
printf("Please enter b,a,n:\n(bx = a mod n)\n");
if (scanf("%d",&E[i].b)&&scanf("%d",&E[i].a)&&scanf("%d",&E[i++].n))
continue;
else
{
printf("\nError!");
exit(0);
}
}
for (i = 0;i<xn;i++) //計算m
m0 *= E[i].n;
for (i = 0;i<xn;i++) //計算M
m[i] = m0/E[i].n;
for (i = 0;i<xn;i++) //計算M‘
mm[i] = modni(m[i],E[i].n);
for (i = 0;i<xn;i++)
shit += m[i]*mm[i]*E[i].a;
shit = shit % m0;
printf("x = %d mod %d",shit,m0);
//程序測試部分
/*for (i = 0;i<xn;i++)
{
printf("%dx = %d (mod %d)\n",E[i].b,E[i].a,E[i].n);
}*/
}
原來的那個程序太長了,我就改了一下,現在這段代碼只能解很簡單的那種方程了。這個程序掐頭去尾共有91行代碼。
你知道什麽是斷點嗎?給出自己調試程序的例子。
斷點就是程序運行時會自動停止的地方,準確來說應該是在調試過程中,程序運行到斷點位置會停止。
程序調試如圖所示。
程序運行結果如圖所示。
三、參考怎樣快速閱讀一本書,快速閱讀一下雲班課中有PPT,每章提出一個問題
第1章
Java的動態特征不太理解。
第2章
為啥有一個“boolean 關閉 = false”?
第3章
3.1.5的例子看不怎麽懂......
第4章
不理解“Java支持中文類名、方法名、屬性名,並且不會因為亂碼問題導致運行期鏈接失敗。這是Java內核支持UTF-8這一特性決定的。”
第5章
所有的類都有自己的子類嗎?
第6章
不理解接口和abstract類的具體區別。
第7章
異常類不理解。
第八章往後我基本一臉蒙逼了......後面的邊學邊問吧,我感覺這學期Java的學習會讓我收獲不少。
四、關於Java學習
計算機語言的學習我覺得是代碼堆出來的。語言的學習離不開環境,而對於計算機語言,代碼就是環境。想要提高程序設計能力和培養計算思維,軟磨硬泡地訓練是必不可少的。“做中學”要求我們有靈活的思維,擺脫“舒適區”,進入“學習區”。
學習基礎和C語言基礎調查