我的问题是,如果我将全局变量结构数组和整数值计数器从主函数传递给menu2函数,则该结构数组的内容需要修改,但没有任何改变。例如,当我在主函数中调用menu2函数并写入内容时,在调用menu2之后调用菜单1、3和4时没有任何反应。我已经尝试将菜单2上的所有“列表”更改为“列表”。您能帮我一次吗?
#include<stdio.h>
#include<string.h>
#define MAX_STUDENT 100
#define YEAR_STUDENT 7
#define MAX_NAMELEN 20
char convertScore(int score)
{
if (score > 89)
return 'A';
else if (score > 79)
return 'B';
else if (score > 69)
return 'C';
else if (score > 59)
return 'D';
else
return 'F';
}
typedef struct student {
char name[MAX_STUDENT+1];
int scoreSecurity;
char gradeSecurity;
int scoreAI;
char gradeAI;
int scoreAlgorithm;
char gradeAlgorithm;
int scoreDataStructure;
char gradeDataStructure;
int scoreOS;
char gradeOS;
int gradeF;
char year[YEAR_STUDENT];
}Student;
Student List[MAX_STUDENT];
int Counter = 0;
void menu1(Student* list, int cnt)
{
int i;
printf("Name\tAI\tSecurity\tDataStructure\tOS\tAlgorithm\tYear\n");
for (i = 0; i < cnt; i++) {
printf("%s\t%c\t%c\t%c\t%c\t%c\t%s\n", List[i].name, List[i].gradeAI,
List[i].gradeSecurity,List[i].gradeDataStructure, List[i].gradeOS, List[i].gradeAlgorithm,
List[i].year);
}
printf("\n");
}
void menu2(Student* list, int cnt)
{
char sn[21];
printf("Student name: ");
scanf("%s", sn);
strcpy(List[cnt].name, sn);
printf("Student score AI(0~100): ");
scanf("%d", &List[cnt].scoreAI);
List[cnt].gradeAI = convertScore(List[cnt].scoreAI);
printf("Student score Security(0~100): ");
scanf("%d", &List[cnt].scoreSecurity);
List[cnt].gradeSecurity = convertScore(List[cnt].scoreSecurity);
printf("Student score Datastructure(0~100): ");
scanf("%d", &List[cnt].scoreDataStructure);
List[cnt].gradeDataStructure = convertScore(List[cnt].scoreDataStructure);
printf("Student score OS(0~100): ");
scanf("%d", &List[cnt].scoreOS);
List[cnt].gradeOS = convertScore(List[cnt].scoreOS);
printf("Student score Algorithm(0~100): ");
scanf("%d", &List[cnt].scoreAlgorithm);
List[cnt].gradeAlgorithm = convertScore(List[cnt].scoreAlgorithm);
printf("Student year(Junior/Senior): ");
scanf("%s", &List[cnt].year);
printf("\n");
}
void menu3(Student* list, int cnt)
{
int junior=0, senior=0, i;
for (i = 0; i < cnt; i++) {
if (List[i].year == "Junior")
junior++;
else
senior++;
}
printf("Junior: %d\nSenior: %d\n", junior, senior);
}
void menu4(Student* list, int cnt)
{
int i;
int fail = 0;
int suck = 0;
int yeah = 0;
for (i = 0; i < cnt; i++) {
if (List[i].gradeAI == 'F')
fail++;
else if (List[i].gradeAlgorithm == 'F')
fail++;
else if (List[i].gradeDataStructure == 'F')
fail++;
else if (List[i].gradeOS == 'F')
fail++;
else if (List[i].gradeSecurity == 'F')
fail++;
if (fail > 2)
suck++;
else
yeah++;
fail = 0;
}
printf("Passed: %d\nFailed: %d\n", yeah, suck);
}
首先,在menu2
中,scanf("%s", &List[cnt].year);
应该为scanf("%s", List[cnt].year);
。其次,我认为您应该考虑Counter
的工作方式。例如,在您依次呼叫menu2
和menu1
之后,将无法打印任何内容。原因是在menu1
中,您无法进入for
循环执行任何操作。那时,您的Counter
为0,即cnt
中的menu1
为0。