哈夫曼编码(报告)
一、任務名稱: ?哈夫曼編譯碼
二、任務內容:
??????????????①編寫較美觀的圖形用戶界面;
???? ?????????②得到客戶端所發送的字符信息,并進行統計,每個字符 的頻度作為哈夫 ??????????????????
????????????????曼樹葉子結點的權值,并構建哈夫曼樹;
??????????????③進行哈夫曼樹的編碼和譯碼;
??????????????④自行選取5~7個二進制碼來進行壓縮;
??????????????⑤將壓縮好的字符發送到服務器端,并接受;
??????????????⑥解壓----譯碼-----編碼-----還原成原來的字符!
?
三、任務要求:
?????????????編寫一個用哈夫曼實現的編碼壓縮器,語言不限!
?????????????實現英文字符編譯碼的功能;
?????????????實現譯碼的壓縮解壓功能;
?????????????要有較美觀的圖形用戶界面;
?????????????從客戶端發送一段字符給服務器端,服務器端能成功的返回這段字符經過哈夫曼????
?????????????編譯碼之后的結果!
?
四、任務計劃:7-20 —— 7-22
??????????????????學會如何建立哈夫曼樹,了解并掌握哈夫曼編碼的編碼規則,在網上瀏覽
??????????????哈夫曼編碼的代碼實現方法,形成自己實現C語言編寫的基本方法和結構,練
??????????????習程序的實現過程,完成哈夫曼編碼;
??????????????7-23——7-25
??????????????????思考如何將哈夫曼編碼進行壓縮,測試,最后與之前代碼合并;
??????????????????解壓還原,通過控制哪些命令可以對應找到相應指令,簡單程序測試,與
??????????????原來代碼進行合并,完成壓縮解壓過程;
??????????????7-26——7-29
??????????????????看Windows網絡編程,大概了解網絡編程的基礎知識,重點掌握TCP/IP協
??????????????議,socket,大致了解網絡編程中的重要名詞與數據類型,熟悉數據傳輸的基
??????????????本過程,練習數據傳輸代碼的實現過程,思考其與哈夫曼編碼傳輸的聯系
??????????????7-30——8-01
??????????????????實現數據傳輸過程,與原來代碼相結合,重新整理程序;
??????????????8-02——8-05
??????????????????了解圖形界面的處理,自己練習,然后加到原來程序上;
???????????????????完成實驗報告;完成代碼注釋;
?
五、實現情況:
?????????????7月25日前,完成哈夫曼編碼的壓縮解壓處理;
?????????????7月31日前,完成從客戶端發送一段字符給服務器端,服務器端能成功的返回???????????????????
?????????????這段字符經過哈夫曼編譯碼之后的結果
六、任務總結:
?????????????因為這次任務要做的基本沒有接觸過,所以首先制定了一個簡單的計劃,在做哈
?????????夫曼編碼時開始只能處理英文字母,然后又需要譯碼,要體現相互對應關系,所以多
?????????次修改了結構體類型成員,因為沒有想到要標記,開始做的很麻煩,出錯也很多,然
??????????后從頭開始換了另一種思路重新編寫,在壓縮和解壓的過程中,除了標記編碼之外,
??????????又出現了另一個問題;
??????????就是編碼的長度,壓縮之后變成十進制,解壓過程還需要將十進制轉換為二進制,
??????????但有可能會出現相同的十進制,不同的編碼(比如:001,0001,01對應十進制均為1,
??????????轉化為編碼又要根據之前編碼的長度來確定,不然都會變成1,1,1,編碼就沒有意
??????????義了),在分離每一位編碼時,涉及char和int的轉換,出現了一點問題,導致滯
??????????留了多半天的時間來處理;
?
??????????????最后是服務器與客戶端的連接,我沒有太深入的理解,只是簡單了解了這個數 ??????
??????????據傳輸的過程,看過例子程序之后,在自己編寫時,沒有結構和整體思路,完全進 ??
??????????行不下去,最后放棄,重新開始仔細閱讀Windows網絡編程相關基礎知識,然后經
??????????過老師的講解,大體掌握了整個書寫結構然后分過程編寫的,先寫服務器,在寫客
??????????戶端,然后理解記憶每個應用函數的作用及執行過程,因為涉及內容比較少,
??????????沒有寫線程;最后圖形界面,我看了一些東西,但是現在只會用C語言寫,設計的
??????????代碼麻煩不宜讀,我暫時放棄,接下來會慢慢接觸,先從底部開始了解,接下來再
??????????添加此功能;
?
七、心得體會:
????????????在學習使用一些新東西的時候,要先掌握它的語法規則,再看物理結構,通過知
????????識長知識,通過代碼長知識,拓寬自己的知識面;然后在設計代碼的過程中要注意合
????????理性和容錯性;接觸比較難的東西要有耐心,一步一個腳印,腳踏實地的弄懂模糊的
????????地方,加強程序編寫能力,真正能將書中的內容化成自己的代碼來實現功能;
? 網絡編程現學現用,暫時只了解了皮毛
附件:代碼
//server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <conio.h>
#include <math.h>
?
#define PORT 8087
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 10000
#define MAX_SIZE 10000
#pragma comment(lib, "WS2_32")
?
#define MaxValue 10000 // 權值最大值
#define MaxBit 126 ????// 最大編碼位數
#define MaxN 126 ??????// 最大結點個數
#define FileName "D:\\哈夫曼編碼信息.txt"
?
int n;
/*====================================
=1.構造哈夫曼樹
=2.構造哈夫曼編碼 ?
=3.構造哈夫曼解碼
====================================*/
?
//哈夫曼樹的結點結構 定義
typedef struct
{
char wei;
int weight;//權值
int flag;//標記
int parent;// 雙親結點下一標
int leftChild;//左孩子下標
int rightChild;//右孩子下標
?} HaffNode;
?
?//哈夫曼編碼結構定義
typedef struct
{
char wei; ??????//字符
? char bit[MaxN]; //存放哈夫曼編碼的數組
? int start; ?????//編碼的起始下標
? int weight; ????//字符權值
?}Code;
typedef struct
{
char ch;
int ?weight;
}STR;
?
typedef struct
{
int n;
int wei;
}TRAN;
?
?
void HaffTree(STR str[],HaffNode haffTree[]);//構造哈夫曼樹
void HaffCode(HaffNode haffTree[],Code haffCode[],char huff[]);//哈夫曼編碼
void haffyima(HaffNode haffTree[],int n,Code haffCode[],int weight[],char ch[]);//哈夫曼譯碼
?
void file_build(char huffbm[10000]);//編碼存入文件
int file_read(STR str[]); ??????????//將文件中的編碼讀到結構體str中
?
int zip(char bianma[100][1000],Code haffCode[],TRAN trans[],char huff[],HaffNode haffTree[],char ch3[]);
int unzip(Code haffCode[],int num,TRAN trans[],char ch2[]);
?
?
SOCKET prepare(sockaddr_in server_addr,SOCKET m_Socket)//服務器準備
{
????server_addr.sin_family = AF_INET; // 聲明并初始化一個服務端(本地)的地址結構
????server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
????server_addr.sin_port = htons(PORT);
??
????WSADATA wsaData; ?// 初始化socket dll
????WORD socketVersion = MAKEWORD(2, 0);
????if(WSAStartup(socketVersion, &wsaData) != 0)
????{
????????printf("Init socket dll error!");
????????return 0;
????}
????// 創建socket
????m_Socket = socket(AF_INET, SOCK_STREAM, 0);
????if (SOCKET_ERROR == m_Socket)
????{
????????printf("Create Socket Error!");
????????return 0;
????}
????//綁定socket和服務端(本地)地址
????if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
????{
????????printf("Server Bind Failed: %d", WSAGetLastError());
????????return 0;
????}
????system("color 05");
????printf("Server Bind Succeed:::\n");
????system("color 04");
??
????//監聽
????if (SOCKET_ERROR == listen(m_Socket, 10))
????{
????????printf("Server Listen Failed: %d", WSAGetLastError());
????????return 0;
????}
printf("Server Listen Succeed:::\n");
????
????return m_Socket;
}
?
start_process(SOCKET m_New_Socket)//進程
{
????int i,j,num;
????char huffbm[10000];//cunfang bianma
????char bianma[100][1000];
????char ch2[10000],ch3[10000];
FILE *fp;
STR str[100];
TRAN trans[100];
HaffNode *myHaffTree;
Code ????*myHaffCode;
recv(m_New_Socket,huffbm,MAX_SIZE,0);
for(i=0;i<100;i++)
????trans[i].n=0;
loop:
????file_build(huffbm);//編碼輸入文件
printf("--->the next------Establish Huffman tree\n");
????getch();
????system("cls");
????system("color 0A");
if(file_read(str)==-1)
????{
????goto loop;
????} ???//文件中讀出編碼內容
myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*n-1));
myHaffCode=(Code *)malloc(sizeof(Code)*n);
????if(n>MaxN)
{
????printf("n越界!!!\n");
getch();
return 0;
}
printf("\n☆☆☆Process one: ??Establish Huffman tree·····\n");
HaffTree(str,myHaffTree);
printf("\n--->the next------struct Huffman coding\n");
????getch();
????
system("cls"); ??????
printf("\n☆☆☆Process two: ??struct Huffman coding ·····\n");
HaffCode(myHaffTree,myHaffCode,huffbm); //構造輸出哈夫曼編碼
printf("\n--->the next------Decoding compressed\n");
????getch();
system("cls");
system("color 5E"); ???
printf("\n☆☆☆Process three: ?Decoding compressed ·····\n");
num=zip(bianma,myHaffCode,trans,huffbm,myHaffTree,ch3);
printf("\n--->the next------Decoding decompression\n");
????getch();
i=0;
char clen;
clen=(char)num;
printf("→→→→→clen=%c\n",clen);
printf("→→→→→num=%d\n",num);
if(send(m_New_Socket,&clen,sizeof(char),0)<0)
{
printf("---------Send length failed!!!!!---------\n");
return 0;
}
for(i=0; i<num; i++)
{
if(send(m_New_Socket,&ch3[i],sizeof(char),0)<0)
{
printf("---------Send compressed data ?failed!!!!!---------\n");
return 0;
}
}
printf("-----Send compressed data ?successful!!!!!\n");
printf("☆☆☆Process four: ?Decoding decompression ····\n");
memset(ch2,0,10000);
unzip(myHaffCode,num,trans,ch2);
if(send(m_New_Socket,ch2,MAX_SIZE,0)<0)
{
????printf("-----Decoding decompression information failed!!!!\n");
????return 0;
}
printf("\n--->the next------start a new process\n");
????getch();
}
int main()
{
????sockaddr_in server_addr;
????sockaddr_in client_addr;
????int ????????client_addr_len;
????SOCKET ?????m_Socket;
????SOCKET ?????m_New_Socket;
??
????m_Socket=prepare(server_addr,m_Socket);
????printf("\n ???????????????????服務器開始運行 ?????????????????????\n");
????printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
????system("color 5E");
while(1)
????{
????????printf("\t\t-------Listening To Client...-----------\n\n");
????????client_addr_len = sizeof(client_addr);//得到地址長度
????????m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len);
????????if (SOCKET_ERROR == m_New_Socket) //創建新的套接字
????????{
????????????printf("---------Server Accept Failed: %d", WSAGetLastError());//???????????
????????????break;
????????} ?
start_process(m_New_Socket);//開始進程
????????closesocket(m_New_Socket); //釋放新的套接字
????????
????printf("\n---the next→\n");
????????getch();
????????system("cls");
????????system("cls");
printf(" ??????????start a new process\n");
????}
????closesocket(m_Socket);
????//釋放winsock庫
????WSACleanup();
????return 0;
}
?
?
void file_build(char huffbm[10000])//編碼存入文件
{
FILE *fp;
fp=fopen(FileName,"w");
if(fp==NULL)
{
printf("Cannot open file!!!\n");
getchar();
exit(1);
}
????????
fprintf(fp,"%s\n",huffbm);
fclose(fp);
printf("informatoin write in file······\n");
?}
?
int file_read(STR str[])//將文件中的編碼讀到結構體str中
{
int i,j,k;
FILE *fp;
STR huff[10000]; ?????????????????//存放剛剛被讀出未統計的編碼
fp=fopen(FileName,"r");
if(fp==NULL)
{
printf("Cannot open file!!!\n");
getchar();
return 0;
}
i=0;
while((huff[i].ch=fgetc(fp))!=EOF)//讀入文件
{
//printf("%c",huff[i].ch);
i++;
}
for(i=0;i<100;i++)
????str[i].weight=huff[i].weight=0;//初始化權值
????//str weight:字符頻率 ????str1 weight:是否被記錄
k=0;
for(i=0; huff[i].ch!='\0'; i++)
{
if(huff[i].ch>=32&&huff[i].ch<=126&&huff[i].weight==0)
{
????str[k].ch=huff[i].ch;
for(j=i; huff[j].ch!='\0'; j++)
{
if(str[k].ch==huff[j].ch)
{
str[k].weight++;
huff[j].weight=1;
}
}
k++;
}
?????}
?/*printf("output the weight of zifu\n");
?????for(i=0;i<k;i++)
?????????printf("str[%d].ch=%c ??str[%d].weight=%d\n",i,str[i].ch,i,str[i].weight);*/
?????n=k;
?????return 1;
}
?
??
// 建立葉節點個數為n,權值數組為weight的哈夫曼樹
void HaffTree(STR str[],HaffNode haffTree[])
{
?? int i,j,m1,m2,x1,x2;
??
?? //初始化哈夫曼樹,n個葉結點的二叉樹共有2n-1個結點
for(i=0; i<2*n-1; i++)
{
?? if(i<n)
{
??haffTree[i].wei=str[i].ch;
??haffTree[i].weight = str[i].weight;//葉節點
??}
?? else haffTree[i].weight = 0;//非葉結點
??
?? haffTree[i].parent ?????= -1;
?? haffTree[i].flag ???????= 0;//是否加入二叉樹
haffTree[i].leftChild ??= -1;
haffTree[i].rightChild ?= -1;
}
???
//構造哈夫曼樹haffTree的n-1個非葉結點
for(i=0; i<n-1; i++)
{
m1=m2=MaxValue;
x1=x2=0;
for(j=0; j<n+i; j++)
{
if(haffTree[j].weight<=m1 && haffTree[j].flag==0)
{
?? m2=m1;
?? x2=x1;
?? m1=haffTree[j].weight;
?? x1=j;
}
else if(haffTree[j].weight<=m2 && haffTree[j].flag==0)
{
m2=haffTree[i].weight;
x2=j;
}
????} ??
//將找出的兩棵權值最小的子樹合并為一棵子樹
haffTree[x1].parent=n+i;
haffTree[x2].parent=n+i;
haffTree[x1].flag=1;
haffTree[x2].flag=1;
haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight;
haffTree[n+i].leftChild=x1;
haffTree[n+i].rightChild=x2;
????}
????printf("---------huffTree build!!!\n");
} ?
//由n個結點的哈夫曼樹->構造哈夫曼編碼
void HaffCode(HaffNode haffTree[],Code haffCode[],char huff[])
{
Code *cd = (Code *)malloc(sizeof(Code));
int i,j,k,child,parent;
//求n個葉結點的哈夫曼編碼
for(i=0; i<n; i++)
{
????cd->start = n-1;//權值越小,編碼越長
cd->weight=haffTree[i].weight;
child=i;//從小到大依次編碼
parent=haffTree[child].parent;
//刨根問底->從葉結點沿路直到根結點
while(parent !=-1)//-1根結點
{
if(haffTree[parent].leftChild==child)
cd->bit[cd->start]=0+48;
else
cd->bit[cd->start]=1+48;
???
cd->start--;//從后往前依次填碼
child=parent;
parent=haffTree[child].parent;
}
//保存每個葉結點的信息
for(j=cd->start+1; j<n; j++)
haffCode[i].bit[j]=cd->bit[j];//編碼
haffCode[i].wei=haffTree[i].wei;//字符記錄
haffCode[i].start=cd->start+1;//編碼起始位
haffCode[i].weight=cd->weight;//權值
}
printf(" ?????output the coding of character ???\n");
for(i=0; i<n; i++)
{
printf("%c-->",haffCode[i].wei);
? for(j = haffCode[i].start; j<n; j++)
????printf("%c",haffCode[i].bit[j]);
? printf("\n");
}
printf(" ??????output the coding of string\n");
printf("════════════════════\n");
for(i=0; huff[i]!='\0'; i++)
for(j=0;j<n;j++)
if(haffCode[j].wei==huff[i])
{
????for(k = haffCode[j].start; k<n; k++)
????????printf("%c",haffCode[j].bit[k]);
????printf(" ");
????break;
}
printf("\n════════════════════\n");
printf("\n");
}
?
int zip(char bianma[100][1000],Code haffCode[],TRAN trans[],char huff[],HaffNode haffTree[],char ch3[])
{
int i,j,m,k,l;
int len;
char ch;
m=0;
for(i=0; huff[i]!='\0'; i++)
{
//得到字符編碼
for(j=0;j<n;j++)
if(haffCode[j].wei==huff[i])
{
????for(k = haffCode[j].start,l=0; k<n; k++,l++)
????bianma[i][l]=haffCode[j].bit[k];
????break;
}
//編碼轉換
k=0;
for(j=l-1; j>=0; j--)
{
????ch=bianma[i][j];
m=(int)ch-48;
trans[i].n+=m*pow(2,k);
k++;
????}
trans[i].wei=k;
}
//output
memset(ch3,0,10000);
printf("════════════════════\n");
for(i=0;i<strlen(huff);i++)
????{
???? ch3[i]=(char)trans[i].n;
???? printf("%c ",ch3[i]);
????//printf("%d ?",trans[i].n);
}
printf("\n════════════════════\n");
printf("\n");
????return strlen(huff);
?}
?
int unzip(Code haffCode[],int num,TRAN trans[],char ch2[])
{
int i,m,r,j,k;
char a[100][100]={0},ch[100][100]={0};
//ASCALL碼轉化成二進制
for(i=0; i<num; i++)
{
m=trans[i].n;
j=0;
if(m==0)//0000
????{
????for(k=0;k<trans[i].wei; k++)
????????????a[i][k]='0';
????????a[i][k]='\0';
????}
else if(m==1)//0001
???{
???????a[i][0]='1';
???????for(k=1;k<trans[i].wei;k++)
???????????a[i][k]='0';
????????a[i][k]='\0';
}
else
{
????while(m!=0)
????{
????????a[i][j]=m%2+48;
????m=m/2;
????j++;
????}
????if(trans[i].wei>=j)
?????for(k=j; k<trans[i].wei; k++)
?????????a[i][k]='0';
a[i][k]='\0';
????}
????
}
?
for(i=0; i<n; i++)
????for(j=haffCode[i].start,k=n-haffCode[i].start-1; j<n,k>=0; j++,k--)
????????ch[i][k]=haffCode[i].bit[j];//哈夫曼編碼存入字符數組
????????
//編碼對應字符
printf("════════════════════\n");
k=0;
for(i=0;i<num;i++)
????for(j=0; j<n; j++)
{
????if(strcmp(a[i],ch[j])==0)
????????{
????????????ch2[k++]=haffCode[j].wei;
printf("%c",haffCode[j].wei);
break;
}
}
printf("\n════════════════════\n");
printf("\n");
ch2[k]='\0';
??return 1;
}
?
?
?
/*====================================================
=Name: ????Client
=function: Send a bunch of strings
=Athor ??: Cassiel
====================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
??
#define PORT 8087 ????????????????????//The port number
#define SERVER_IP "127.0.0.1" ????????// Server ip address
?
#define BUFFER_SIZE 10000 ????????????//Buffer (array) maximum length
#define MAX_SIZE 10000 ???????????????//Maximum length of string
#pragma comment(lib, "WS2_32") ???????//Link Library--->API function
?
//Initialize the dynamic-link library
int initial_dll();
//Initialize
SOCKET initial_socket(SOCKET c_Socket);
int intial_sockaddress(SOCKET c_Socket,sockaddr_in server_addr);
int zip(char ch2[],SOCKET c_Socket);
int unzip(char ch2[],SOCKET c_Socket);
void menu();
?
int main()
{ ?
int ????????i=0,num;
????SOCKET ?????c_Socket;
char ???????len;
????sockaddr_in server_addr;
????char ???????huffbm[MAX_SIZE],ch2[MAX_SIZE];//原碼 解壓后的字符串
????
????initial_dll();
????c_Socket=initial_socket(c_Socket);
????intial_sockaddress(c_Socket,server_addr);//指定服務端的地址
menu();
????system("color 0A");
????loop:
????zip(ch2,c_Socket);
unzip(ch2,c_Socket);
closesocket(c_Socket);
????//釋放winsock庫
????WSACleanup();
????system("pause");
????return 0;
}
?
int initial_dll()
{
// 初始化socket dll
??WSADATA wsaData;
??WORD socketVersion = MAKEWORD(2, 0);
??if(WSAStartup(socketVersion, &wsaData) != 0)
??{
????printf("Init socket dll error!");
????return 0;
??}
??return 1;
}
SOCKET initial_socket(SOCKET c_Socket)
{
c_Socket = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKET_ERROR == c_Socket)
????{
??????printf("Create Socket Error!");
??????system("pause");
??????return 0;
????}
????return c_Socket;
}
int intial_sockaddress(SOCKET c_Socket,sockaddr_in server_addr)
{
?????
????server_addr.sin_family = AF_INET;
????server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
????server_addr.sin_port = htons(PORT);
?
printf("begin to connect with server......\n");
????if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))
????{
????????printf("ERROR:::Can Not Connect To Server IP!!!\n");
????????system("pause");
????????return 0;
????}
printf(" ????connected successfully!!!!!!!\n"); ??
}
int zip(char ch2[],SOCKET c_Socket)
{
char huffbm[MAX_SIZE];
char len;
int num;//原碼
printf("\tPlease Input the information you want to deal: \n");
????scanf("%s",huffbm);
?
????//向服務器發送信息
????if(send(c_Socket, huffbm, BUFFER_SIZE, 0) < 0)
????{
????????printf("-----------Send information Failed----------\n");
????????system("pause");
????????return 0;
????}
printf("----------Send information succeed----------\n");
system("cls");
????printf("\n--------------------▼after zip▼-----------\n");
????printf("---Server Processing\n");
int i=0;
if(recv(c_Socket, &len, sizeof(char),0)<0)
{
printf("----------Receive length failed!!!!---------\n");
return 0;
}
printf("→→→→len=%c\n",len);
num=(int)len;
printf("→→→→num=%d \n",num);
printf("\n\n");
printf(" ????????????????壓縮信息 ????????????????\n");
printf("════════════════════\n");
for(i=0; i<num; i++)
{
if(recv(c_Socket, &ch2[i],sizeof(char),0)<0)
{
printf("---------Receiving compressed data failed!!!!!!!-----\n");
return 0;
}
printf("%c ",ch2[i]);
}
printf("\n════════════════════\n");
printf("Receive information From Server Successful!\n");
printf("---the next-->\n");
????getchar(); ?
????return i;
}
int unzip(char ch2[],SOCKET c_Socket)
{
????//向服務器發送信息
????if(recv(c_Socket, ch2, MAX_SIZE,0) < 0)
????{
????????printf("---------Receive information Failed---------\n");
????????system("pause");
????????return 0;
????}
????printf("\tReceive information: %s From Server Successful!\n", "unzip");
????printf("--------------------▼after unzip▼----------------------:\n");
?
????printf("\n\n");
????printf(" ????????????????????解壓信息 ?????????????????????????????\n");
????printf("════════════════════\n");
printf("%s\n",ch2);
printf("\n════════════════════\n");
printf("\n---the next-->\n");
????getchar(); ??
}
void menu()
{
system("color 09");
printf("\n ???????????????????客戶端開始運行 ?????????????????????\n");
????printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
????printf("stating: you are needed to input some information ??????\n");
????printf(" ????????then the server will zip and unzip it ?????????\n\n");
????printf("---the next-->\n");
????getchar();
????system("cls");
????
????system("color 0A");
????printf("\t\tYou can deal your information!!\n\n");
????printf("\t\t============the menu===========\n");
????printf("\t\t=====↓ ????zip data============\n");
????printf("\t\t=====↓ ????unzip data==========\n");
????printf("\t\t=====↓ ????exit================\n");
????printf("\t\t================================\n");
}
總結
- 上一篇: 用PE系统中虚拟光驱进行MSDN XP系
- 下一篇: 盘古苹果iOS9.2-iOS9.3.3越