fopen(\
FILE *fp;fp=fopen(\
将fopen函数的返回值赋给指针变量fp。 常用下面方法打开一个文件: if((fp=fopen(\{
printf(\exit(0); }
3) fclose函数(文件的关闭)
关闭 fclose(文件指针);当顺利关闭文件,则返回0值,否则返回EOF(-1). 4) fprintf函数与fscanf函数
fprintf函数、fscanf函数与printf函数、scanf函数相仿都是格式化读写函数。只有一点不同:fprintf和fscanf函数的读写对象不是终端而是磁盘文件。它们的一般调用方式为:
fprintf(文件指针,格式化字符串,输出列表); fscanf(文件指针,格式化字符串,输入列表); 例如:
fprintf(fp,”%d,%6.2f”,I,t);
它的作用是将变量i与t的值按%d与%6.2f的格式输出到fp指向的文件上。 用fprintf函数和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要讲二进制形式转换成字符,花费时间较多。因此,在内存与磁盘频繁交换数据的情况下,最好不要使用fprintf和fscanf函数。 5) fread与fwrite函数
ANSI C标准提出设置两个函数(fread与fwrite),用来读写一个数据块,它们的一般调用形式为
fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 其中:
buffer:是一个指针。对于fread来说,它是读入数据的存放地址。对fwrite来说,是要输出的数据的地址。
Size:要读写的字节数。
Count:要进行读写多少个size字节的数据项。 fp:文件型指针。
如果fread与fwrite调用成功,则函数返回值为count的值,即输入输出数据项的完整个数。
常用fread与fwrite函数进行文件的读写操作 例:
11. 冒泡排序与折半排序
1) 冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序算法的运作如下:(从后往前)
a) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
b) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在
这一点,最后的元素应该会是最大的数。
c) 针对所有的元素重复以上的步骤,除了最后一个。
d) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需
要比较。
实例:
#include
#defineSIZE8
Void Bubble_Sort(int a[],int n);
Void Bubble_Sort(int a[],int n) //n为数组a的元素个数 {
int i,j,temp; for(j=0;j if(a[i]>a[i+1])//数组元素大小按升序排列 { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } } int main() { int i_Num[SIZE]={95,45,15,78,84,51,24,12}; int i; Bubble_Sort(i_Num,SIZE); for(i=0;i printf(\ } printf(\} 2) 折半排序 折半排序实质上是不断地对有序数据集进行对半分割,并且获取每个分区的中间元素,用中间元素与待排序元素进行比较,最终确定数据集顺序。 折半排序算法思想:折半排序的重点是查找待排序元素A[i]在有序数据集中的位置。在处理A[i]时,A[0]……A[i-1]已经按关键码值排好序。所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较;否则只能插入A[i-1/2]到A[i-1]之间,故可以在A[i-1/2+1]到A[i-1]之间继续使用折半比较。如此重复,直到最后能够确定插入的位置为止。 算法的基本过程: a) 计算 0 ~ i-1 的中间点,用 i 索引处的元素与中间值进行比较,如果 i 索引处的元素大,说明要插入的这个元素应该在中间值和刚加入i索引之间,反之,就是在刚开始的位置 到中间值的位置,这样很简单的完成了折半; b) 在相应的半个范围里面找插入的位置时,不断的用(1)步骤缩小范围, 不停的折半,范围依次缩小为 1/2 1/4 1/8 .......快速的确定出第 i 个元素要插在什么地方; c) 确定位置之后,将整个序列后移,并将元素插入到相应位置; d) 对形成的新的有序序列再次进行插入,重复步骤a),b),c),直到所有 数据完成排序。 数组实例: void BisSort(int p_Num[],int i_Len) { int i_Left,i_Right,i_Middle; int i_Loop,i_Subloop; int i_Buffer;//临时变量 if (p_Num[0]>p_Num[1]) { } for (i_Loop=2;i_Loop i_Left=0; i_Right=i_Loop-1; i_Buffer=p_Num[i_Loop]; if (i_Buffer<=p_Num[0]||i_Buffer>=p_Num[i_Right]) { } else { } p_Num[i_Middle]=i_Buffer; p_Num[i_Subloop]=p_Num[i_Subloop-1]; while(i_Left<=i_Right) { } i_Middle=(i_Left+i_Right)/2;//折半中数 if(i_Buffer>=p_Num[i_Middle]) else i_Right=i_Middle-1; //确定要插入的位置 i_Left=i_Middle+1; if (i_Buffer<=p_Num[0]) i_Middle=0; else i_Buffer=p_Num[0]; p_Num[0]=p_Num[1]; p_Num[1]=i_Buffer; i_Middle=i_Right+1; for (i_Subloop=i_Loop;i_Subloop>i_Middle;i_Subloop--)//生成新的有序数组 } } 链表实例: struct _Road* RoadOrder(struct _Road *pst_Road ) { struct _Road *pst_Road_Head; pst_Road_Head=pst_Road; struct _Road *p_Low,*p_Hight,*p_Mid,*p_Current; p_Low=pst_Road; p_Hight=pst_Road->pst_Next; int i_Low,i_Hight,i_Mid;//中数 int i_Len=RoadListLength(pst_Road); if (pst_Road_Head->i_GeoLength>p_Hight->i_GeoLength) { } for (int i=3;i<=i_Len;i++) { p_Low=p_Mid=p_Hight=pst_Road_Head; i_Low=1,i_Hight=i-1; for(int j=1;j p_Current=p_Hight->pst_Next; //如果小于头指针数据 if (p_Current->i_GeoLength<=p_Low->i_GeoLength) { } else if (p_Current->i_GeoLength while(i_Low<=i_Hight) { i_Mid=(i_Low+i_Hight)/2; for(int j=i_Low;j p_Mid=p_Mid->pst_Next; p_Hight->pst_Next=p_Current->pst_Next; p_Current->pst_Next=pst_Road_Head; pst_Road_Head=p_Current; p_Hight=p_Hight->pst_Next; pst_Road_Head->pst_Next=p_Hight->pst_Next; p_Hight->pst_Next=pst_Road_Head; pst_Road_Head=p_Hight;