2016-02-27 66 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代码作为一个练习。但基本上这个想法是(如我之前的评论所述)在读取每个输入之后搜索现有的有效条目(不需要两个独立的数组)。