轉眼間,大半個學期過去了,c語言的學習也過了一段時間。有時候,由于興趣,自己在課堂上亂劃,一道小程序便出來了,但是,要是不幸運的話,邏輯有毛病,抑或是語句出現問題,在電腦面前一坐便是幾個小時了!
隨著時間的流逝,我對C語言的理解和感悟也積攢了不少!
首先是數組的學習,給我帶來了不少煩惱。但是說起數組來,它貫穿于我們整個c語言之中,我們經常要用它來存儲數據。編寫圖形要用它來儲存坐標數據,編寫音樂要用它來儲存音符樂譜,即使學生的成績也要用到它來儲存……但是,如果我們在利用它的時候,不好好注意,將被弄得眼花繚亂!我們在利用它來處理數據的時候,涉及到的排序,找最大,最小值這些問題。特別是排序,方法挺多,但如果不把握住幾種常用的方法,使用數組就變得非常不便。常用的方法中,有冒泡排序,選擇排序,希爾排序,快速排序等方法:選擇法排序,與冒泡法排序都是利用for循環語句,前者是先尋找出最大最小值的下標,然后再交換,后者則是利用相鄰間元素的比較大小,不符合要求順序的就交換,這樣一級一級地向上交換,把最大的或者最小的放到最上面去;對于后兩種辦法排序,都利用到循環次數不確定的while和do-while語句,前者還利用到for語句,希爾排序利用一一對應比較的辦法,后者利用數組中其它元素與中間數進行比較大小,然后實行交換。
這是冒泡法的程序:
#include<stdio.h>
void sort(int array[],int size)
{
int i,j,temp;
/*下面是利用相鄰的比較,把大的數放到上面;*/
for(i=0;i<size-1;i++)
for(j=i+1;j<size;j++)
if(array[i]>array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
void main()
{
int i;
int a[10]={1,33,78,34,787,213,132,35,32,21};
sort(a,10);
for(i=0;i<10;i++)
printf("%6d",a[i]);
}
這是選擇法的程序:
#include<stdio.h>
void sort(int array[],int size)
{
int i,j,k,temp;
for(i=0;i<size-1;i++)
{
k=i;
/*把最小的那一個數找出來,并且用a[k]記下來,然后與a[i]交換;*/
for(j=i+1;j<size;j++)
if(array[k]>array[j])
k=j;
temp=array[k];
array[k]=array[i];
array[i]=temp;
}
}
void main()
{
int a[]={12,43,54,23,32,65,87,2,34,54};
int i;
sort(a,10);
for(i=0;i<10;i++)
printf("%d\t",a[i]);
}
這是一個快速排序的程序:
#include<stdio.h>
void quick_sort(int array[],int first,int last)//first,last分別為數組下標的范圍;
{
int temp,low,high,list_separator;
low=first;
high=last;
/*下面是比較數組中的大小,把數組中的數與中間數比較,大的放在后半部分,比中間數小的放在前半部分,*/
list_separator=array[(first+last)/2];//中間數;
do{
while(array[low]<list_separator)//中間數與前半部分比較;
low++;
while(array[high]>list_separator)// 中間數與后半部分比較;
high--;
if(low<=high)//前半部分與后半部分交換;
{
temp=array[low];
array[low++]=array[high];
array[high--]=temp;
}
}while(low<=high);
if(first<high)
quick_sort(array,first,high);//利用遞歸的辦法,實行循環;
if(low<last)
quick_sort(array,low,last);//利用遞歸的辦法,實行循環;
}
void main()
{
int a[9]={12,23,34,65,93,32,21,9,8};
quick_sort(a,0,8);
for(int i=0;i<9;i++)
printf("%d\t",a[i]);
printf("\n");
}
這是一個希爾排序的程序:
#include<stdio.h>
void shell_sort(int array[],int size)
{
int temp,gap,i,flag;
gap=size/2;
do{
do{
flag=0;/*利用標記,使前半部分與后半部分的數都對應比較過,前半部分大于后半部分的交換,直到都比較過,并且前半部分的數小于與前部分一一對應的后部分的數時,退出while循環*/
for(i=0;i<size-gap;i++)
if(array[i]>array[i+gap])
{
temp=array[i];
array[i]=array[i+gap];
array[i+gap]=temp;
flag=1;
}
}while(flag);
}while(gap=gap/2);
}
void main()
{
int array[]={1,2,32,43,64,7654,321,42,23,97,56,32,78,45,32},i;
shell_sort(array,15);
for(i=0;i<15;i++)
printf("%10d",array[i]);
}
對于后面兩個程序與前面用for語句排序來比較,while與do-while語句運行起來比較快,并且沒有for語句那樣的毛病,運行量大的時候可能會出錯。比如說,從1循環到10000那么大的時候,冒泡法與選擇法就有可能會出錯了,希爾排序只減少了一部分的運行量,但并不是很完善,快速排序法完全脫離for語句的使用,對于運行量大的循環是沒有問題的了,但只能夠用來排序,不能夠找出最值,若要找最值來的話,只好選擇選擇法。
其次,我們在學習數組的時候,還要考慮數組的輸出和輸入,但這都與循環語句for打交道,通常情況下,是幾維數組就用幾個for循環語句。但我們在不確定數組的范圍是多少時,我們可以先用宏定義來定義數組的范圍,然后再由用戶確定。但一定要先定義才能使用,因為c語言中,大部分的變量,都遵守著先定義后使用的原則(對于語句則是先聲明后使用)。數組在存儲字符串的時候,又涉及到專門的語句使用,如gets(),puts()輸入輸出語句,還有賦值時,就不能用等號賦值了,而用到strcpy()語句等等(將來在c++中或許可以考慮使用運算符重載)??傊?,數組的使用,可以與指針的結合(但指針并不是萬能的,有利也有弊,用得不好,有可能導致系統癱瘓),那樣運用起來會更加簡便,特別是在字符串那一部分,需要用到二維數祖時,利用指針可以先取下字符串的首地址,然后就可以訪問整個字符串了,這樣可以解決函數返回值一個值的問題。
另外,如果我們有興趣的話,可以接觸一些圖形的編輯。但圖形編輯是離不開我們所學的基本內容。不過在學之前,我們得先做點準備。c語言圖形編輯程序是在dos的環境之下運行的,但一般未經設置的編輯器是不能調用graphics.h的頭文件的,我們可以按照以下途徑設置:打開編輯器(c語言編輯不能用vc來編輯圖形),選擇途徑:options\\Linker\\Libraries……然后在Graphics library上打上“x”即可!這是TC的一種設置辦法,但對于其他的編輯器也是差不多的。在開始編輯圖形時,要進行圖形的初始化,也要對他進行一些設置,比如說,我們在D盤的根目錄下裝了一個TC,那么我們在初始化時設置為:initgraph(&gdriver,&gmode,”d:\\tc\\bgi”);這樣就可以利用圖形編輯了。有一個經驗就是在編輯圖形的時候,我們會經常用到一個輸入函數getch(),頭文件是conio.h,它是一個非緩沖式字符輸入的操作,不顯示輸入的內容。在c語言的編輯中,它提供了很多的圖形編輯工具,都在頭文件graphics.h里面,如果要編輯的話都可以找出來查看學習。
最后,我覺得在編譯的時候,很重要的一個查看函數頭文件的幫助方法,就是Ctrl+F1,使我們在忘記的時候,及時查看。方法雖然簡單,但很實用!