哪种类型的功能更适合

Which type of function fits more

说,我需要从 classOneclassTwoclassThree 中排序一些分数。每个 class 都有自己的文件,名称如前所述。我需要将它们打印在屏幕上,如下所示:

Class One:
John 23
Timmy 34
Drake 35

Class Two:
Tina 25
Bob 31

Class Three:
Anthony 18
Rose 20

在文件本身中,每个数据的格式都是 name#score,因此我使用 fscanf 正确读取它们并将它们打印为 name score

现在,进入排序部分。我提出两种方法:

  1. 在 1 个函数中分别对每个文件进行排序
  2. 按各自的功能对每个文件进行排序

根据 Robert C. Martin 在他的书 Clean Code 中所说,关于函数的主要规则之一是它们应该只做一件事。这意味着二号显然是站着的,但是,我认为它是湿的,一号可以用更干燥的方法做同样的事情。

下面是一些代码片段。

1 号:

void sortFile(){
    FILE *classScore;
    for (int i = 0; i < 3; i++){
        char name [50][20]; //assuming there are 50 students
        int score [50];
        if (i == 0){
            classScore = fopen ("score1.txt", "r");
        }
        else if (i == 1){
            classScore = fopen ("score2.txt", "r");
        }
        else if (i == 2){
            classScore = fopen ("score3.txt", "r");
        }
        //stores file content into array
        fclose (classScore);
        //sort mechanism (bubble sort)
        //print sorted array content
    }
}

2号:

void sortClassOne(){
    FILE *classScore;
    char name [50][20]; //assuming there are 50 students
    int score [50];
    classScore = fopen ("score1.txt", "r");
    //stores file content into array
    fclose (classScore);
    //sort mechanism (bubble sort)
    //print sorted array content
    }

void sortClassTwo(){
    FILE *classScore;
    char name [50][20]; //assuming there are 50 students
    int score [50];
    classScore = fopen ("score2.txt", "r");
    //stores file content into array
    fclose (classScore);
    //sort mechanism (bubble sort)
    //print sorted array content
    }

void sortClassThree(){
    FILE *classScore;
    char name [50][20]; //assuming there are 50 students
    int score [50];
    classScore = fopen ("score3.txt", "r");
    //stores file content into array
    fclose (classScore);
    //sort mechanism (bubble sort)
    //print sorted array content
    }

有了这个,两种方法之间哪种适合(至少在我的情况下)?我知道我不是在做一个非常大的项目或什么的,但我想让自己习惯于进一步编写代码的良好习惯。

谢谢! ;)

就我自己而言,我个人更喜欢第一个选项,就像您提到的“DRYer”一样。但是我会对代码进行一些细微的修改。 首先,我会添加一个 numOfClass 参数来动态确定是否有多少 类。其次,假设所有文件都具有相同格式的名称 scoreX.txt,我会为文件名创建一个字符串,我不需要 if else 块。

void sortFile(int numOfClass){
    FILE *classScore;
    for (int i = 0; i < numOfClass; i++){
        char name [50][20]; //assuming there are 50 students
        int score [50];
        string className = "score" + (i + 1) + ".txt";
        classScore = fopen(className, "r");
        //stores file content into array
        fclose (classScore);
        //sort mechanism (bubble sort)
        //print sorted array content
    }
}

在这里发布我的工作代码!我采纳了评论中的一些建议。

void readFile(FILE *fileOpenedToRead){
char buffer[20];
int temp;
j = 0;
while (fscanf (fileOpenedToRead, "%[^#]#%d\n", buffer, &temp) != EOF){
    strcpy (namePlayer[j], buffer);
    score[j] = temp;
    j++;
}
fclose (fileOpenedToRead);}

void sortFile(){
int store;
char storage[20];
for (int i = 0; i < j; i++){
    for (int k = 0; k < j - i - 1; k++){
        if (score[k] > score[k+1]){
            store = score[k]; //swap score
            score[k] = score[k+1];
            score[k+1] = store;
            strcpy (storage, namePlayer[k]); //swap name
            strcpy (namePlayer[k], namePlayer[k+1]);
            strcpy (namePlayer[k+1], storage);
        }
    }
}}

void displayFile(){
for (int i = 0; i < j; i++){
    printf ("| %d", i+1);
    if (i < 9) printf ("   ");
    else printf ("   ");
    printf ("| %s", namePlayer[i]);
    for (int k = 0; k < 51 - strlen(namePlayer[i]); k++) printf (" ");
    printf ("|    %d |\n", score[i]);
}}