2016-02-27 52 views
0

我無法解釋這個練習的邏輯...如何比較和寄存器,它被複制

的練習要求我在一個結構 註冊5「品牌」陣列值和輸出必須展示如何每個品牌重複多次,如果它已經註冊不止一次。

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

#define C 5 

typedef struct  
{ 
    int id; 
    char brands[30]; 
} Something; 


Something a[C]; 
int main() 
{ 
    int i=0, j=0; 

    //input 
    for(i=0;i<C;i++) 
    { 
     a[i].id = i; 

     printf("BRAND: "); 
     fflush(stdin); 
     gets(a[i].brands); 
    } 

    for(i=0;i<C;i++) 
    { 
     for(j=0;j<C;j++) 
     { 
      if (strcmp(a[i].brands, a[j].brands)==0) 
       // 
     } 
    } 
    return 0; 
} 

品牌輸入值不是恆定的,它可以是任何東西。

所以我想通過搜索來看看,比較是否有相同的品牌和增加每個櫃檯。 (此計數器是我卡住了,因爲我不知道有多少不同的品牌會在註冊表中)...

例如1
輸入

Ford 
Ferrari 
Ford 
Nissan 
Nissan 

輸出應該是這樣的:

Ford 2x 
Ferrari 1x 
Nissan 2x 


例如2
輸入

Ford 
Ford 
Ford 
Ford 
Nissan 

輸出:

Ford 4x 
Nissan 1x 
+0

請更具體一些。你不明白什麼?它有助於建議你在你的結構中放置一個計數器嗎?然後對於每個輸入,搜索'Something'列表。如果輸入已經存在,則增加計數器。否則,爲該輸入填充一個新的結構(其計數設置爲1)。 – kaylum

+0

在C中搜索Set和Bag之間的區別使用Bag,應該很容易輸出引用的數量,並用較少的內存管理多個註冊。 – Myst

+0

「品牌輸入不是恆定的」。你是什​​麼意思「不恆定」?你的意思是*輸入數*不是常數?如果是這樣,那麼有兩種一般方法:1.使用動態內存分配。 2.使用靜態MAX值分配數據結構內存。顯然,前者總體上好得多。 – kaylum

回答

1

有很多方法可以實現你想要什麼。以下是一些有望幫助您達成解決方案的指針。

第一步是在你的結構中包含一個計數器。

typedef struct  
{ 
    int id; 
    char brands[30]; 
    unsigned int count; 
} Something; 

初始化所有count字段爲0。brands場只包含一個有效的字符串,如果count大於0。由於a是一個全局變量,所有的字段將自動初始化爲0,因此不存在需要額外的代碼。

然後每次讀取輸入時,代碼都會從頭開始搜索a。搜索邏輯將是

for each 'a' entry 
    if (count field > 0) 
     if (brand field is same as input) 
      // Found a match 
      increment count field 
      break out of loop 
     // else will check next entry by continuing the loop 
    else 
     // Reached end of valid entries. Hence no match. 
     Create a new entry. Copy input into the brand field. 
     Set count field to 1. 
     break out of loop 

我故意顯示的僞代碼離開C代碼作爲一個練習。但基本上這個想法是(如我之前的評論所述)在讀取每個輸入之後搜索現有的有效條目(不需要兩個獨立的數組)。