哪种类型的功能更适合
Which type of function fits more
说,我需要从 classOne
、classTwo
和 classThree
中排序一些分数。每个 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 个函数中分别对每个文件进行排序
- 按各自的功能对每个文件进行排序
根据 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]);
}}
说,我需要从 classOne
、classTwo
和 classThree
中排序一些分数。每个 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 个函数中分别对每个文件进行排序
- 按各自的功能对每个文件进行排序
根据 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]);
}}