用C而不是C ++进行游戏。需要在保存,替换和排序txt文件中的分数方面的帮助

问题描述 投票:1回答:1

我正在尝试用C语言编写函数!不是C ++。我不知道该如何去做,所以这只是我想做的事情的概述。此功能的目的是将前10个高分保存到txt文件中。它需要在获奖者的名字旁边有获奖者的名字和获胜数量。每次回合结束时,获胜者都会将其姓名以及获胜的总次数打印在文件中。如果回头客获胜,他们的名字应该只出现一次。下面是一个示例,显示txt文件在显示时的外观,以及我想在代码方面尝试的内容。

EX。

1乔102仁83鲍勃74迦勒65长矛56西奥本37月桂树28杰克29加百利110蒂米1

Outline of function

c string sorting file-io
1个回答
0
投票

您需要一个数据结构来表示每个条目。我想到的最简单的东西是这样的

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
© www.soinside.com 2019 - 2024. All rights reserved.