久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)

 昵稱(chēng)3863387 2010-10-11
二,、   課程設(shè)計(jì)內(nèi)容
設(shè)計(jì)一個(gè)程序,該程序具有下面功能:
(1)能夠選擇合適的排序算法,,如插入排序,、歸并排序或快速排序,依據(jù)該算法對(duì)某一數(shù)組進(jìn)行排序,,計(jì)算完成該操作所需時(shí)間,。
(2)Huffman編碼和解碼。
程序界面如下:
1,、主界面
------------------------------------------------------------------------
1.排序
2.Huffman編碼和解碼
3.退出
請(qǐng)選擇操作類(lèi)型(1—3):
------------------------------------------------------------------------
2,、排序界面
------------------------------------------------------------------------
1.插入排序
2.歸并排序
3.快速排序
4.返回
5.退出
請(qǐng)選擇操作類(lèi)型(1—5):
------------------------------------------------------------------------
是否打印排序前數(shù)組(Y/N):
是否打印排序后結(jié)果(Y/N):
排序所花時(shí)間:(按任意鍵返回)
3、編碼解碼界面
請(qǐng)輸入字符串:
編碼結(jié)果為:
解碼結(jié)果為:(按任意鍵返回)
三,、   課程設(shè)計(jì)要求
1,、課程設(shè)計(jì)的程序必須用C/C++語(yǔ)言完成。
2,、關(guān)鍵算法必須畫(huà)出流程圖,。
3、要求寫(xiě)出軟件分析和設(shè)計(jì),。分析部分包括功能需求和界面需求,;設(shè)計(jì)部分包括算法的詳細(xì)設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)(包括內(nèi)存數(shù)據(jù)結(jié)構(gòu)和文件結(jié)構(gòu))。
 
四,、    需求分析和模塊設(shè)計(jì)
1,、需求分析
   程序要完成兩大功能:一為內(nèi)排序,二為Huffman編碼與解碼,。而其中的排序又由三種方法實(shí)現(xiàn),,一是插入排序;二是歸并排序,;三是快速排序,。
2、模塊分解
   把程序分成六大模塊,,分別是主界面,,排序界面,插入排序,,歸并排序,,快速排序,Huffman編碼與解碼,。
3,、詳細(xì)設(shè)計(jì)
注:這部分對(duì)每個(gè)函數(shù)的功能進(jìn)行定義,方式如下:
函數(shù)名稱(chēng):menu( )  編號(hào):001
函數(shù)功能:實(shí)現(xiàn)主界面
輸入?yún)?shù):無(wú)
輸出參數(shù):無(wú)
返回值:無(wú)
數(shù)據(jù)流程圖
-------------------------------------------------------------------------------------------------------
函數(shù)名稱(chēng):sort( )  編號(hào):002
函數(shù)功能:實(shí)現(xiàn)排序面
輸入?yún)?shù):無(wú)
輸出參數(shù):無(wú)
返回值:無(wú)
數(shù)據(jù)流程圖
-------------------------------------------------------------------------------------------------------
函數(shù)名稱(chēng):inssort( )  編號(hào):003   
函數(shù)功能:實(shí)現(xiàn)插入排序
輸入?yún)?shù):要排序數(shù)組地址,數(shù)組長(zhǎng)度
輸出參數(shù):無(wú)
返回值:無(wú)
數(shù)據(jù)流程圖
 
-------------------------------------------------------------------------------------------------------
 
函數(shù)名稱(chēng):msort( )  編號(hào):004    
函數(shù)功能:實(shí)現(xiàn)歸并排序
輸入?yún)?shù):要排序數(shù)組地址,,臨時(shí)數(shù)組地址,,數(shù)組最左邊位置,數(shù)組最右邊位置,,
輸出參數(shù):無(wú)
返回值:無(wú)
數(shù)據(jù)流程圖
 -------------------------------------------------------------------------------------------------------
函數(shù)名稱(chēng):quicksort( )  編號(hào):005      
函數(shù)功能:實(shí)現(xiàn)快速排序
輸入?yún)?shù):要排序數(shù)組地址,,數(shù)組最左邊位置,數(shù)組最右邊位置,,
輸出參數(shù):無(wú)
返回值:無(wú)
 
函數(shù)名稱(chēng):huff( )  編號(hào):006
函數(shù)功能:實(shí)現(xiàn)Huffman編碼與解碼
輸入?yún)?shù):建樹(shù)的字符個(gè)數(shù),,字符和它的權(quán)值
輸出參數(shù):無(wú)
返回值:無(wú)
4、數(shù)據(jù)結(jié)構(gòu)
  插入排序:L
   i=1   2   3  4   5   6   7
42 20 17 13 13 13 13 13
20 42 20 17 17 14 14 14
17 17 42 20 20 17 17 15
13 13 13 42 28 20 20 17
28 28 28 28 42 28 23 20
14 14 14 14 14 42 28 23
23 23 23 23 23 23 42 28
15 15 15 15 15 15 15 42
 
   快速排序:
72 6 57 88 60 42 83 73 48 85
            Pivot=60
 
48 6 57 42 60 88 83 73 72 85
Pivot=6              Pivot=73
 
6 42 57 48   72 73 85 88 83
Pivot=57             Pivot=88
 
42 48    57   85 83 88
Pivot=42              Pivot=85
 
42 48   83 85
 
6 42 48 57 60 72 73 83 85 88
        最終排好序的數(shù)組
 
   歸并排序:
    36 20 17 13 28 14 23 15
20 36 13 17 14 28 15 23
13 17 20 36 14 15 23 28
13 14 15 17 20 23 28 36
五,、    計(jì)中碰到的問(wèn)題及解決方法
程序的要求是要進(jìn)行一個(gè)操作后要返回原界面或主界面,,我用的是switch的結(jié)構(gòu),和老師給的有所不同,,所以在處理這個(gè)問(wèn)題時(shí)出了一點(diǎn)問(wèn)題,,但后來(lái)一想,也很簡(jiǎn)單,,再調(diào)用一次原來(lái)的界面函數(shù)不就行了嗎,?
 
六、   收獲和體會(huì)
           通過(guò)這次課程實(shí)踐,,我加深了對(duì)數(shù)據(jù)結(jié)構(gòu)這門(mén)課程的理解,,更好的掌握了各種排序方法和Huffman編碼與解碼!更鞏固了自己的C和C++的知識(shí),。
 
七,、   程序清單
主界面:
DS,cpp
 
#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
void sort();//聲明要調(diào)用的函數(shù)
void huff();
void menu()
{
       int num;
       cout <<endl;
       cout <<setw(40) <<"主界面: " <<endl;
       cout <<setw(45) <<"1.排序              " <<endl;
       cout <<setw(45) <<"2.Huffman編碼與解碼 " <<endl;
       cout <<setw(45) <<"3.退出              " <<endl;
       cout <<setw(45) <<"請(qǐng)選擇操作類(lèi)型(1-3):"; cin >>num;cout <<endl;
      
       switch(num)// 通過(guò)swich語(yǔ)句進(jìn)行選擇
       {
       case 1: sort();break;
    case 2: huff();break;
    case 3: break;
    default: cout <<"error";
       }
}
void main()
{
       menu();
}
 
排序界面:
Sort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
void inssort();/ //首先要聲明各個(gè)要調(diào)用的函數(shù)/
void menu();
void msort();
void qsort();
void sort() / 類(lèi)似于主界面,也通過(guò)switch語(yǔ)句進(jìn)行選擇/
{
       int num1;
       cout <<endl;
       cout <<setw(40) <<"排序界面:           " <<endl;
       cout <<setw(45) <<"1.插入排序          " <<endl;
       cout <<setw(45) <<"2.歸并排序          " <<endl;
       cout <<setw(45) <<"3.快速排序          " <<endl;
       cout <<setw(45) <<"4.返回              " <<endl;
       cout <<setw(45) <<"5.退出              " <<endl;
       cout <<setw(45) <<"請(qǐng)選擇操作類(lèi)型(1-5):";cin >>num1;cout <<endl;
       switch(num1)
       {
       case 1: inssort();break;
    case 2: msort();break;
    case 3: qsort();break;
       case 4: menu();break;
       case 5: break;
    default: cout <<"error";
       }
 
}
 
插入排序:
Inssort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
int time1=0;
int comp(int a,int b);//比較
void swap(int a[],int x,int y); //交換
void sort();//排序界面
void inssort1(int A[],int n)//進(jìn)行插入排序
{
       for(int i=0;i<n;i++)
              for(int j=i;(j>0)&&(comp(A[j],A[j-1]));j--)
                     swap(A,j,j-1);
}
int comp(int a,int b)
{
       int result;
    if(a>b)
              result=1;
       else
              result=0;
       return result;
       time1++;
}
void swap(int a[],int x,int y)
{
       int temp;
       temp=a[x];
       a[x]=a[y];
       a[y]=temp;
       time1++;
}
void inssort()
{
       int n;
       int A[80],B[80];
    cout <<"請(qǐng)輸入你要輸入的元素個(gè)數(shù):" <<endl;
       cin >>n;
       cout <<"請(qǐng)輸入要排序的元素:" <<endl;
       for(int i=0;i<n;i++)
       {
              cin >>A[i];
       }
       for(int j=0;j<n;j++)
       {
              B[j]=A[j];
       }
       cout <<"進(jìn)行排序后的結(jié)果:" <<endl;
       inssort1(A,n);//進(jìn)行插入排序
       for(int k=0;k<n;k++)
       {
              cout <<A[k] <<" ";
       }
       cout <<endl;
       cout <<"時(shí)間復(fù)雜度為: ";
       cout <<time1 <<endl;
       char answer;
       cout <<"是否要打印排序前的數(shù)組?(y/n)" <<endl;
       cin >>answer;
       if(answer=='y')
       {
              for(int ii=0;ii<n;ii++)
                     cout <<B[ii] <<" ";
       }
       cout <<endl;
       getchar();
       sort();
}
 
歸并排序:
Mergesort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
void inssort1(int A[],int n);
int time2=0;//時(shí)間復(fù)雜度
extern int time1;
void sort();
void mergesort(int A[],int temp[],int left,int right)
{     if((right-left)<=32)
       {
              inssort1(&A[left],right-left+1);//對(duì)于較小的數(shù)組,,調(diào)用內(nèi)排序
              return;
       }
       int i,j,k,mid=(left+right)/2;
       if(left==right) return;
       mergesort(A,temp,left,mid);
       mergesort(A,temp,mid+1,right);
       for(i=mid;i>=left;i--)
       {
              temp[i]=A[i];
              time2++;
       }
       for(j=1;j<right-mid;j++)
       {
              temp[right-j+1]=A[j+mid];
              time2++;
       }
       for(i=left,j=right,k=left;k<=right;k++)
       {
              if(temp[i]<=temp[j])
              {
                     A[k]=temp[i++];
                     time2++;
              }
              else
              {
                     A[k]=temp[j--];
                     time2++;
              }
       }
      
 
}
 
void msort()
{
       int n,left,right;
       int time;
       int A[80];
       int B[80];
       int temp[80];
    cout <<"請(qǐng)輸入元素個(gè)數(shù):" <<endl;
           cin >>n;
       left=0;
       right=n-1;
       cout <<"請(qǐng)輸入數(shù)組元素:" <<endl;
       for(int i=0;i<n;i++)
       {
              cin >>A[i];
       }
       for(int j=0;j<n;j++)
       {
              B[j]=A[j];
       }
       mergesort(A,temp,left,right);//進(jìn)行歸并排序
       cout <<"進(jìn)行排序后的結(jié)果:" <<endl;
       for(int k=0;k<n;k++)
       {
              cout <<A[k] <<" ";
       }
       cout <<endl;
       time=time1+time2;
       cout <<"時(shí)間復(fù)雜度為: ";
       cout <<time <<endl;
       char answer;
       cout <<"是否要打印排序前的數(shù)組?(y/n)" <<endl;
       cin >>answer;
       if(answer=='y')
       {
              for(int ii=0;ii<n;ii++)
                     cout <<B[ii] <<" ";
       }
       cout <<endl;
       getchar();
       sort();
}
 
快速排序:
Quicksort.cpp
 
#include "stdafx.h"
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
void sort();
int time3=0;
int pation(int A[],int x,int y);
void quicksort(int A[], int x, int y)
{
    if(x>=y) return;
    int q=pation(A, x, y);
    quicksort(A, x, q-1);
    quicksort(A, q+1, y);
}
 
int pation(int A[], int x, int y)
{
    int n=A[x], i=x+1, j=y, temp;
    while(1)
    {
        while(A[i]<n)
              {
                     ++i;
                     time3++;
              }
              while(A[j]>n)
              {
                     --j;
                     time3++;
              }
              if(i>=j) break;
        temp=A[i]; A[i]=A[j]; A[j]=temp;
              time3++;
    }
    A[x]=A[j];
    A[j]=n;
    return j;
}
 
void qsort( )
{
    int i, A[80],n,B[80];
       char answer;
       cout <<"請(qǐng)輸入元素個(gè)數(shù):";
       cin >>n;
       cout <<"請(qǐng)輸入要排序的元素:" <<endl;
    for(i=0; i<n; ++i)
        cin >>A[i];
       for(int j=0;j<n;j++)
              B[j]=A[j];
    quicksort(A, 0, n-1);
       cout <<"排序后的結(jié)果為:" <<endl;
    for(i=0; i<n; ++i)
        cout <<A[i] <<" ";
    cout <<endl;
    cout <<"時(shí)間復(fù)雜度為:" <<time3 <<endl;
       cout <<"是否打印排序前的數(shù)組?(y/n)";
       cin >>answer;
       if(answer=='y')
       {
              for(int k=0;k<n;k++)
              {
                     cout <<B[k] <<" ";
              }
       }
    cout <<endl;
       getchar();
       sort();
      
}
 
Huffman編碼:
Huff.cpp
#include "stdafx.h"
#include <iostream.h>
#include "stdio.h"
#include "string.h"
#define MAX 99
char cha[MAX];
char hc[MAX-1][MAX];
int s1,s2; //設(shè)置全局變量,,以便在方法(函數(shù))select中返回兩個(gè)變量
void menu();
typedef struct //huffman樹(shù)存儲(chǔ)結(jié)構(gòu)
{
 unsigned int wei;
 int lch,rch,parent;
}hufftree;
 
 
void select(hufftree tree[],int k) //找尋parent為0,權(quán)最小的兩個(gè)節(jié)點(diǎn)
{
 int i;
 for (i=1;i<=k && tree[i].parent!=0 ;i++); s1=i;
 for (i=1;i<=k;i++)
    if (tree[i].parent==0 && tree[i].wei<tree[s1].wei) s1=i;
 for (i=1; i<=k ; i++)
    if (tree[i].parent==0 && i!=s1) break; s2=i;
 for (i=1;i<=k;i++)
    if ( tree[i].parent==0 && i!=s1 && tree[i].wei<tree[s2].wei) s2=i;
}
 
void huffman(hufftree tree[],int *w,int n) //生成huffman樹(shù)
{ int m,i;
   if (n<=1) return;
   m=2*n-1;
 for (i=1;i<=n;i++)
   {
        tree[i].wei=w[i];
        tree[i].parent=0;
      tree[i].lch=0;
        tree[i].rch=0;
 }
 for (i=n+1;i<=m;i++)
   {
        tree[i].wei=0;
        tree[i].parent=0;
      tree[i].lch=0;
        tree[i].rch=0;
 }
   for (i=n+1;i<=m;i++)
   {
          select(tree, i-1);
       tree[s1].parent=i;
       tree[s2].parent=i;
       tree[i].lch=s1;
       tree[i].rch=s2;    
       tree[i].wei=tree[s1]. wei+ tree[s2].wei;
      }
}
void huffmancode(hufftree tree[],char code[],int n)
{
 int start,c,i,f;
 code[n-1]='\0';
 cout <<"Huffman編碼:" <<endl;
 for(i=1;i<=n;i++)
 {
        start=n-1;
       for(c=i,f=tree[i].parent;f!=0;c=f,f=tree[f].parent)
       {  
               if(tree[f].lch==c)       
                      code[--start]='0';    
               else            
                      code[--start]='1';
        }
     strcpy(hc[i],&code[start]);
     cout <<cha[i] <<"-->" <<hc[i] <<endl;
 }
}
void tohuffmancode(int n)
{
   int i=0,j;
   char anychar[9999];
   cout <<"請(qǐng)輸入一段字符:" <<endl;
   cin >>anychar;
   cout <<"進(jìn)行Huffman編碼后的結(jié)果為:" <<endl;
   for (;anychar[i]!='\0';i++)
   {
      j=0;
      for(;anychar[i]!=cha[j]&&j<=n;)
               j++;
      if (j<=n)
               cout <<hc[j];
   }
   cout <<endl;
}
 
void decode(char ch[],hufftree tree[],int n)
{
 int i,j,m;
 char b;
 m=2*n-1;
 i=m;
 cout <<"請(qǐng)輸入你要解碼的編碼:" <<endl;
 cin >>b;
 cout <<"解碼結(jié)果為:" <<endl;
 while(b!='#')   //遇到回車(chē)時(shí),結(jié)束
 {
 
 if(b=='0')
        i=tree[i].lch;
 else
        i=tree[i].rch;
 if(tree[i].lch==0)
 {
        cout <<ch[i];
      j=i,i=m;
 }
 cin >>b;
 }
 if(tree[j].lch!=0)
    cout <<"發(fā)生錯(cuò)誤!!";
}
 
void huff()
{
 int i=0,n=0;
 int *w,wei[MAX];
 char code[MAX];
 hufftree tree[MAX];
 w=wei;
 cout <<"請(qǐng)輸入n(n為你要建樹(shù)的字符個(gè)數(shù)):" <<endl;
 cin >>n;
 cout <<"請(qǐng)輸入字符和它的權(quán)值(例如:a20):" <<endl;
 for(i=1;i<=n;i++)
 {
        cin >>cha[i] >>wei[i];
 }
 huffman(tree,w,n);   //生成huffman樹(shù)
 huffmancode(tree,code,n); //編碼A
 tohuffmancode(n);//編碼B
 decode(cha,tree,n); //譯碼
 cout <<"按任意鍵返回";
 getchar();
 menu();

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多