我正在尝试用C语言编写函数!不是C ++。我不知道该如何去做,所以这只是我想做的事情的概述。此功能的目的是将前10个高分保存到txt文件中。它需要在获奖者的名字旁边有获奖者的名字和获胜数量。每次回合结束时,获胜者都会将其姓名以及获胜的总次数打印在文件中。如果回头客获胜,他们的名字应该只出现一次。下面是一个示例,显示txt文件在显示时的外观,以及我想在代码方面尝试的内容。
EX。
1乔102仁83鲍勃74迦勒65长矛56西奥本37月桂树28杰克29加百利110蒂米1
您需要一个数据结构来表示每个条目。我想到的最简单的东西是这样的
struct record_entry{
char name[BUFLEN];
int score;
};
然后您需要另一个数据结构来存储这些entry_record
对象。理想情况下,可以使用name
字段作为键,例如C ++映射或Java HasMap(即哈希表)来存储所有条目。但是,这需要您实现自己的哈希表,如果您不想这样做,则可以使用C数组。
使用标准库的qsort
function对数组中的条目进行排序。 qsort
的简单compar
函数可以是
struct entry_record
然后,您需要一个函数来根据新条目更新数据结构(哈希表或数组)。您应该实现类似于int cmp_score(const void* e1, const void* e2){
int s1, s2;
s1 = ((struct record_entry*)e1)->score;
s2 = ((struct record_entry*)e2)->score;
if (s1 < s2)
return -1;
else if (s1 == s2)
return 0;
else
return 1;
}
或insert_or_assign()
method of std::map (C++17)的东西。以下是实现此目的的简单函数
insert_or_assign()
put()
method of Java's HashMap class返回新数组的大小;如果您作为参数传递的条目不在数组(即新记录)中,则为put()
,如果已存在,则为size_t update_records(struct record_entry **ep, size_t n, struct record_entry ne){
size_t i;
int exist=0;
size_t nsize = n;
struct record_entry *tmp = *ep;
/* check if the entry is already there */
for (i=0; i<nsize; i++){
if (strcmp(tmp[i].name, ne.name) == 0){
exist = 1;
break;
}
}
if (exist){
/* update the record */
tmp[i].score = ne.score;
} else {
/* add a new entry */
nsize++;
tmp = realloc(*ep, nsize * sizeof(struct record_entry));
strncpy(tmp[nsize-1].name, ne.name, BUFLEN);
tmp[nsize-1].score=ne.score;
}
/* sort the array */
qsort(tmp, nsize, sizeof(struct record_entry), cmp_score);
*ep = tmp;
return nsize;
}
。当然,在后一种情况下,它将更新现有记录。
下面的代码段与您要实现的功能类似,只需从文本文件中获取数据并在适当的地方添加错误处理即可。逻辑是一样的]
update_records
当我使用新条目运行此代码时
n+1
以及当我更新现有条目时
n