2012-03-23 75 views
2

該程序應該採用一個文件,比如data.dat,填充一個最多320個字的列表,所有字母都小於或等於29個字符( 30與空字符)並將每個單詞添加到全局數組。然後我想按照字母順序排序該列表。我在自己的文件中的以下功能這樣做sort.cC - 冒泡排序字符串數組,然後應用於unsigned int數組

#include "set.h" 
#include "sortAndSearch.h" 
#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 

void bubbleSort(char A[][30], int num) { 
int i, j; 
char temp[30]; 

for(i = 0; i < num; i++) 
    for(j = 0; j < num-1; j++) 
     if(strcmp(A[i], A[i+1]) > 0){ 
      //swap the two array elements 
      strcpy(temp, A[j]); 
      strcpy(A[j], A[j+1]); 
      strcpy(A[j+1], temp); 
     } 
} 

我需要一組無符號整數

unsigned int Set[10]; 

充當名稱數組的索引。因此,每個無符號整數有32位,並且有10個無符號整型,總共320位,每位將引用一個字。我不確定如何處理這部分。

最終目標是創建函數來操作集合。我覺得我可以自己攻擊,如果我可以得到排序和索引,因爲我已經做了類似的事情,但沒有使用字符數組。定義函數的頭文件set.h要使用的內容如下

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

// defining new type(s) 
typedef unsigned int Set[10]; 

// declaring global variable(s) 
extern char names[320][30]; 

extern void setUnion(Set set1, Set set2, Set result); 
extern void setIntersection(Set set1, Set set2, Set result); 
extern void clearSet(Set set); 
extern void add2Set(Set set, int value); 
extern void deleteFromSet(Set set, int value); 
extern int isMember(Set set, int element); 
extern void printSet(Set); 
extern int nameIsMember(Set set, char *); 
extern void addName2Set(Set set, char *); 
extern void deleteNameFromSet(Set set, char *); 

而這裏是頭文件sortAndSearch.h

void bubbleSort(char A[][30], int num); 

int binarySearch(char A[][30], char *, int, int); 
+0

你能總結一下您需要什麼? – 2012-03-23 20:17:30

+0

第一件事,幫助弄清楚爲什麼冒泡排序排序未啓用,然後從首次獲得的話mes [320] [30]到無符號int Set [10] – manalishi 2012-03-23 20:22:21

+0

好吧,我創建了外循環,現在函數可以很好地排序。現在最重要的問題是創建索引。 – manalishi 2012-03-23 20:37:20

回答

4

你的氣泡排序實際上不是氣泡排序。它只在數組上進行一次傳遞。您需要重複傳遞數組,直到您傳遞不會導致交換爲止。那時你知道你的數組是有序的。

我的首選氣泡排序實現有一個外部的do循環。內循環與您目前的一樣。當最新的內部循環執行失敗以交換任何項目時,外部循環終止。

當然,我建議從長遠來看使用更好的排序算法,但這可能是一項家庭作業。

+0

是的,它的任務。所有的細節都來自頭文件中的prof。我一直在閱讀那種冒泡排序是蹩腳的,但那是我們被告知要使用的。 – manalishi 2012-03-23 20:24:56

+0

這是一個很好的教學工具。正如你發現的那樣,這並不是完全微不足道的。 – 2012-03-23 20:25:47

+0

人們喜歡氣泡排序實現?大聲笑...對不起! – Kaz 2012-03-23 23:21:50

1

的冒泡不正確實現的內容。應該有一個內部循環和一個外部循環。

我對320位集合的用途還不清楚:它不能用於排序,或者除了每一位以外的任何其他信息都表示數組的某些屬性是真實的,比如它是否存在,或者包含動詞或其他內容。

+0

你是對的,這是相當混亂。我已經能夠得到的最好的解釋是320位集是作爲一個索引,所以我可以實現其他功能,如設置聯合,設置交集,清除集合,添加設置等。 – manalishi 2012-03-23 20:28:06

2

問題是這一部分:

for(i = 0; i < num-1; i++) 
     if(strcmp(A[i], A[i+1]) > 0){ 
      //swap the two array elements 
      strcpy(temp, A[i]); 
      strcpy(A[i], A[i+1]); 
      strcpy(A[i+1], temp); 
     } 

有應該是對冒泡排序兩個循環! ;-) 查看here以整數爲例。

+0

謝謝。所以我需要一個外部的for循環來循環任何數量等於?這是有道理的,我會嘗試。 – manalishi 2012-03-23 20:25:49

0

總結一下名稱的排序與設置操作無關是否公平?

只要名稱不更改,設置的操作將工作?

操作您列出分爲如下幾類:

直組操作,這不要緊,他們是什麼樣的一組。他們在一整套連續運轉:

extern void setUnion(Set set1, Set set2, Set result); 
extern void setIntersection(Set set1, Set set2, Set result); 
extern void clearSet(Set set); 

你可以解決這些而不用擔心一組可能意味着,但youu將需要一些值,我有能夠編碼,也可以使用它們。

集組件操作,這些操作在集中的單個位,並再次不太在乎什麼比特表示:

extern void add2Set(Set set, int value); 
extern void deleteFromSet(Set set, int value); 
extern int isMember(Set set, int element); 

這是一個良好的開端。

這些操作的名稱和設置之間進行映射,從而需要更多的東西的工作:

extern int nameIsMember(Set set, char *); 
extern void addName2Set(Set set, char *); 
extern void deleteNameFromSet(Set set, char *); 

我不知道什麼extern void printSet(Set);手段,它打印的是該組中的名字呢?

好了,一套是

unsigned int s[10]; 

測試了一下,我們需要一個int值轉換爲int的指數,和int中位。最簡單的方法是數組索引=(值/ 32),位偏移量是(數值%32)。編譯器應該做得很好,因此不用擔心效率問題。

要獲得在個位值:(S [(值/ 32)] &(1 < <(值%32))

那麼你瞭解bit operators

~ not 
& and 
| or 
^ xor 
<< left shift 
>> right shift 

他們的操作,你將使用在集設置,清除和更改位。

+0

謝謝!是的,名稱的排序與設置的操作無關。首先,我需要讀取集合中所有可能的元素,並將這些char字符串放在一個最多有320個位置的數組中。然後我按升序對數組進行排序。然後我需要能夠找到與int X關聯的char字符串,通過訪問索引X處的數組元素來完成。要從字符串到索引,您必須實現遞歸二進制搜索函數,該函數應該返回存儲字符串的索引或 - 1因爲根本不存在。 – manalishi 2012-03-24 01:11:04

+0

@manalishi - 聽起來很連貫。我很可能會寫一個簡單的程序來測試基本的add2Set/deleteFromSet/isMember。如果這些集合是幾個字,那麼靜態地將它們初始化int int [3] = {0x00000001,0x00000002,0x00000004};然後對它進行一些簡單的操作。 – gbulmer 2012-03-24 01:22:45

+0

好的,謝謝你的輸入,我會做一些這樣的測試。 – manalishi 2012-03-24 01:55:24