1. 程式人生 > 實用技巧 >幾種常用排序演算法的複雜度

幾種常用排序演算法的複雜度

一、題目要求

1.複習c檔案處理內容

2.編寫myod.c 用myod XXX實現Linux下od -tx -tc XXX的功能

3.main與其他分開,製作靜態庫和動態庫

4.編寫makefile

5.提交測試程式碼和執行結果截圖, 提交除錯過程截圖,要全屏,包含自己的學號資訊

二、實驗準備

(一)複習C語言

1)檔案是作業系統管理資料的基本單位,一般是指儲存在外部儲存介質上的有名字的一系列相關資料的有序集合。它是程式對資料進行讀寫操作的基本物件。

2)根據檔案中資料的組織形式的不同,可以把檔案分為:文字檔案和二進位制檔案。

  • 文字檔案:把要儲存的資料當成一系列字元組成,把每個字元的 ASCII 碼值存入檔案中。每個 ASCII 碼值佔一個位元組,每個位元組表示一個字元。故文字檔案也稱作字元檔案或 ASCII 檔案,是字元序列檔案。
  • 二進位制檔案:把資料對應的二進位制形式儲存到檔案中,是位元組序列檔案。

3)檔案訪問:

1.開啟函式fopen:

FILE * fopen(char *filename, char *mode);

函式引數:

  • filename:檔名,包括路徑,如果不顯式含有路徑,則表示當前路徑。
  • mode:檔案開啟模式,指出對該檔案可進行的操作。常見的開啟模式如 “r” 表示只讀,“w” 表示只寫,“rw” 表示讀寫,“a” 表示追加寫入。

2.關閉函式fclose:

int fclose(FILE *fp);

函式引數:

  • fp:已開啟的檔案指標。
  • 返回值:正常關閉,返回否則返回 EOF(-1)。

3.字元輸入函式fgetc:

int fgetc (FILE *fp);

函式功能:從檔案指標 fp 所指向的檔案中輸入一個字元。輸入成功,返回該字元;已讀取到檔案末尾,或遇到其他錯誤,即輸入失敗,則返回文字檔案結束標誌 EOF(EOF 在 stdio.h 中已定義,一般為 -1)。

4.字元輸出函式fputc:

int fputc (int c, FILE *fp);

函式功能:向 fp 指標所指向的檔案中輸出字元 c,輸出成功,返回該字元;輸出失敗,則返回 EOF(-1)。

5.字串輸入函式fgets:

char * fgets (char *s, int size, FILE * fp);

引數 fp:可以指向磁碟檔案或標準輸入裝置 stdin。

返回值:讀取成功,返回緩衝區地址 s;讀取失敗,返回 NULL。

函式功能:從 fp 所指向的檔案內,讀取若干字元(一行字串),並在其後自動新增字串結束標誌 '\0' 後,存入 s 所指的緩衝記憶體空間中(s 可為字元陣列名),直到遇到回車換行符或已讀取 size-1 個字元或已讀到檔案結尾為止。該函式讀取的字串最大長度為 size-1。

(二)學習Linux下的od命令

Linux od命令用於輸出檔案內容。

od指令會讀取所給予的檔案的內容,並將其內容以八進位制字碼呈現出來。

命令格式:

od [<選項><引數>] [<檔名>]

命令選項:

-t<TYPE>:指定輸出格式,格式包括a、c、d、f、o、u和x,各含義如下:

  • a:具名字元;
  • c:ASCII字元或者反斜槓;
  • d[SIZE]:十進位制,正負數都包含,SIZE位元組組成一個十進位制整數;
  • f[SIZE]:浮點,SIZE位元組組成一個浮點數;
  • o[SIZE]:八進位制,SIZE位元組組成一個八進位制數;
  • u[SIZE]:無符號十進位制,只包含正數,SIZE位元組組成一個無符號十進位制整數;
  • x[SIZE]:十六進位制,SIZE位元組為單位以十六進位制輸出,即輸出時一列包含SIZE位元組。在預設條件下,以四個位元組為一組輸出

三、實驗步驟與結果

(一)編寫myod.c 用myod XXX實現Linux下od -tx -tc XXX的功能

1.編寫函式:

head.h

#ifndef _HEAD_20181234_H_
#define _HEAD_20181234_H_
void hex(char *n);
void ascii(char *n);
#endif

ascii.c--輸出ASCII碼

#include "head20181234.h"
#include <stdio.h>
void ascii(char *n)
{
      FILE *fp;
      char ch;
	  fp=fopen(n,"r");
	  ch=fgetc(fp);
      printf("ascii:\n");

  while(ch!=EOF)
  {
     if(ch=='\n')
    	printf("\n");
     else
    	printf("%4d",ch);
    	ch=fgetc(fp);
  }
  fclose(fp);

}

hex.c--輸出16進位制

#include "head20181234.h"
#include <stdio.h>
void hex(char *n)
{
  FILE *fp;
  char ch;
  printf("Hexadecimal numbers:\n");
  fp=fopen(n,"r");
  ch=fgetc(fp);
  while(ch!=EOF)
  {
    if(ch=='\n')
    printf("\n");
    else
    printf("%4x",ch);
    ch=fgetc(fp);
   }
   fclose(fp);
}

myod.c

#include "head20181234.h"
#include <stdio.h>
void main()
{ 
  char n[50];
  printf("input the txtname:");
  scanf("%s",n);
  ascii(n);
  printf("\n");
  hex(n);
}

2.新建一個txt檔案20181234.txt

20181234 zhuyuexin

3.編譯並執行

4.od-tx-tc

5.結果:通過對比ascii表進行驗證,結果正確

(二)靜態庫

(三)動態庫

遇到的問題:在生成共享庫要呼叫進行編譯時,報錯,無法開啟共享檔案,即找不到動態庫檔案libmyod.so。

解決辦法將檔案libmyod.so複製到目錄/usr/lib中即可解決。

sudo cp libmyod.so /usr/lib

查詢資料後也可用此方法解決:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
gcc -shared -fpic -o libmyod.so hex.c ascii.c
gcc myod.c libmyod.so 

(四)makefile

testmyod:ascii.o hex.o myod.o
	gcc ascii.o hex.o myod.o -o testmyod
ascii.o:ascii.c head20181234.h
	gcc -c ascii.c -o ascii.o
hex.o:hex.c head20181234.h
	gcc -c hex.c -o hex.o
myod.o:myod.c head20181234.h 
	gcc -c myod.c -o myod.o

四、實驗總結

這次實驗不僅用到了新學的知識,還用到了之前學習過的舊知識,這個時候基礎不好的弊端就暴露了出來。為了能順利的完成實驗,我花費了大量的時間去複習C語言檔案的處理,但依然掌握額不是很好,仍需努力。在之後的學習中,我要抓緊時間複習曾經遺漏,遺忘的知識,同時認真學習新的知識,真正學懂知識。無論困難是什麼,總有辦法解決!