任务描述:
写⼀个命令⾏交互式C语⾔程序。该程序需要实现下述菜单功能: 1. 数据存储。
你需要将⼀系列的学⽣期末考试信息进⾏存储(学⽣⼈数不会超过100)。每个学⽣的信息包括:姓名
(由 first name 和last name 两部分组成,例如Xiaoer He,first_name = “Xiaoer” last_name = “He”)
;学号(12 位数字组成,开头4位为2021 、2020 、2019); C语⾔成绩(⼀个⼤于等于零的整数);
重修信息(学号 2021………为否,其余为是); GPA等级(A+, A, B+, B, C+, C, D, F );班级排名(成绩相同需并列)。 其中,姓名,学号,成绩为输入数据,其余数据需要你计算。
同时,你需要添加⼀些维护数据库的功能
Add(name, id, score): 新增⼀个学⽣的信息;
Adds(n, name[], id[], score[]): 批量新增n个学⽣的信息;
Delete(id): 根据学号删除某个学⽣的信息;
Search(id) :根据学号查找某个学⽣的信息。
2. 数据处理。
Sort_by_id(): ⽣成根据学号顺序排列学⽣信息的表格
Sort_by_score(): ⽣成根据分数由⾼到低顺序排列学⽣信息的表格
Max():返回最⾼分学⽣信息
Min(): 返回最低分学⽣信息
Ave(): 返回所有学⽣期末成绩平均分
prime(id): 返回某个学⽣的成绩是否为素数
coprime(id, id) :返回某两个学⽣的成绩是否互质/互素
#define _CRT_SECURE_NO_WARNINGS 1
#define MAX 100
#define MAX_NAME 50
#define MAX_NUM 50
#include<stdio.h>
#include<string.h>
enum Option
{
EXIT,//0
ADD,//1
ADDS,//2
DEL,//3
SEARCH,//4
SORTID,//5
SORTSORCE,//6
BEST,//7
WORST,//8
PRIME,//9
COPRIME,//10
MODIFY,//11
AVE,//12
SHOW,//13
};
struct PeoInfo
{
char name[MAX_NAME];
int grade;
char num[MAX_NUM];
char GPA[50];
char rebuild[20];
int rinking;
};
//表格类型
struct Form
{
struct PeoInfo data[MAX];//存放一个信息
int size;//记录当前已经有的元素个数
};
//声明函数
//初始化表格函数
void InitForm(struct Form* ps);
//排名函数
void Rinking(struct Form* ps);
//增加一个信息到表格
void AddForm(struct Form* ps);
// 增加多个信息到表格
void AddsForm(struct Form* ps);
//打印表格中的信息
void ShowForm(const struct Form* ps);
//删除指定的学生成绩
void DelForm(struct Form* ps);
//查找指定人的信息
void SearchForm(const struct Form* ps);
//修改指定学生信息
void ModifyForm(struct Form* ps);
//按成绩排序内容
void SortscoreForm(struct Form* ps);
//按学号排序内容
void SortidForm(struct Form* ps);
//返回最高分同学信息
void BestForm(struct Form* ps);
//返回最低分同学信息
void WorstForm(struct Form* ps);
//返回所有同学的平均成绩
void AveForm(struct Form* ps);
//判断指定同学的成绩是否为素数
void PrimeForm(struct Form* ps);
// 判断指定俩位同学的成绩是否互素
void CoprimeForm(struct Form* ps);
void menu()
{
printf("Okay, data upload finished. What do you what to do next? You can enter a number to tell me.\n");
printf("1.添加一位同学信息\n");
printf("2.添加多位同学信息\n");
printf("3.删除一位同学信息\n");
printf("4.查找同学信息\n");
printf("5.按学号排序内容\n");
printf("6.按成绩排序内容\n");
printf("7.最高分\n");
printf("8.最低分\n");
printf("9.判断指定同学的成绩是否为素数\n");
printf("10.判断指定俩位同学的成绩是否互素\n");
printf("11.修改同学信息\n");
printf("12.平均数\n");
printf("13.打印表格\n");
printf("0.退出\n");
}
int main()
{
printf("Hello, pls input a series of student information!\n");
int input = 0;
//创建通讯录
struct Form form;//form就是表格,里面包含:MAX个元素和size
//初始化通讯录
InitForm(&form);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddForm(&form);
Rinking(&form);
break;
case ADDS:
AddsForm(&form);
Rinking(&form);
break;
case DEL:
DelForm(&form);
Rinking(&form);
break;
case SEARCH:
SearchForm(&form);
break;
case SORTSORCE:
SortscoreForm(&form);
break;
case SORTID:
SortidForm(&form);
break;
case BEST:
BestForm(&form);
break;
case WORST:
WorstForm(&form);
break;
case AVE:
AveForm(&form);
break;
case PRIME:
PrimeForm(&form);
break;
case COPRIME:
CoprimeForm(&form);
break;
case MODIFY:
ModifyForm(&form);
Rinking(&form);
break;
case SHOW:
ShowForm(&form);
break;
case EXIT:
printf("退出查询\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
//辅助函数
static int FindByName(const struct Form* ps, char name[MAX_NAME])
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (0 == strcmp(ps->data[i].name, name))
{
return i;
}
}
return -1;//找不到的情况
}
//取较小值
int MIN(int x, int y)
{
if (x > y)
{
return y;
}
else
{
return x;
}
}
void InitForm(struct Form* ps)
{
memset(ps->data, 0, sizeof(ps->data));
ps->size = 0;//设置表格最初只有0个元素
}
void Rinking(struct Form* ps)
{
int arr[200]={0};
int i = 0;
for ( i = 0; i<=ps->size; i++)
{
arr[i] = ps->data[i].grade;
}
for (int j = 0; j <i; j++)
{
for (int k = 0; k + 1 < i; k++)
{
if (arr[k]< arr[k+1])
{
int tmp;
tmp = arr[k];
arr[k] = arr[k + 1];
arr[k + 1] = tmp;
}
}
}
for (int j = 0; j < i; j++)
{
for (int k = 0; k <= i; k++)
{
if (ps->data[j].grade == arr[k])
{
ps->data[j].rinking = k+1;
break;
}
}
}
}
void AddForm(struct Form* ps)
{
if (ps->size == MAX)
{
printf("表格已满,无法增加\n");
}
else
{
printf("请输入名字:>");
scanf("%*[\n]%[^\n]", ps->data[ps->size].name);
printf("请输入成绩:>");
scanf("%d", &(ps->data[ps->size].grade));
printf("请输入学号:>");
scanf("%s", ps->data[ps->size].num);
if (ps->data[ps->size].grade >= 93)
{
//ps->data[ps->size].GPA[0] = "A+";
strcpy(ps->data[ps->size].GPA, "A+");
}
else if (ps->data[ps->size].grade < 93 && ps->data[ps->size].grade >= 85)
{
//ps->data[ps->size].GPA[0] = "A";
strcpy(ps->data[ps->size].GPA, "A");
}
else if (ps->data[ps->size].grade < 85 && ps->data[ps->size].grade >= 80)
{
//ps->data[ps->size].GPA[0] = "B+";
strcpy(ps->data[ps->size].GPA, "B+");
}
else if (ps->data[ps->size].grade < 80 && ps->data[ps->size].grade >= 75)
{
//ps->data[ps->size].GPA[0] = "B";
strcpy(ps->data[ps->size].GPA, "B");
}
else if (ps->data[ps->size].grade < 75 && ps->data[ps->size].grade >= 70)
{
//ps->data[ps->size].GPA[0] = "B";
strcpy(ps->data[ps->size].GPA, "C+");
}
else if (ps->data[ps->size].grade < 70 && ps->data[ps->size].grade >= 65)
{
//ps->data[ps->size].GPA[0] = "C";
strcpy(ps->data[ps->size].GPA, "C");
}
else if (ps->data[ps->size].grade < 65 && ps->data[ps->size].grade >= 60)
{
//ps->data[ps->size].GPA[0] = "C";
strcpy(ps->data[ps->size].GPA, "D");
}
else if (ps->data[ps->size].grade < 60)
{
//ps->data[ps->size].GPA[0] = "D";
strcpy(ps->data[ps->size].GPA, "F");
}
if (ps->data[ps->size].num[0] == '2' && ps->data[ps->size].num[1] == '0' && ps->data[ps->size].num[2] == '2' && ps->data[ps->size].num[3] == '1')
{
//ps->data[ps->size].rebuild[0] = "NO";
strcpy(ps->data[ps->size].rebuild, "NO");
}
else
{
//ps->data[ps->size].rebuild[0] = "YES";
strcpy(ps->data[ps->size].rebuild, "YES");
}
ps->size++;
printf("添加成功\n");
}
}
void AddsForm(struct Form* ps)
{
int n;
printf("请输入要存储的学生信息个数:>");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
if (ps->size == MAX)
{
printf("表格已满,无法增加\n");
}
else
{
printf("请输入第%d个同学的信息", i+1);
printf("请输入名字:>");
scanf("%*[\n]%[^\n]", ps->data[ps->size].name);
printf("请输入成绩:>");
scanf("%d", &(ps->data[ps->size].grade));
printf("请输入学号:>");
scanf("%s", ps->data[ps->size].num);
if (ps->data[ps->size].grade >= 93)
{
//ps->data[ps->size].GPA[0] = "A+";
strcpy(ps->data[ps->size].GPA, "A+");
}
else if (ps->data[ps->size].grade < 93 && ps->data[ps->size].grade >= 85)
{
//ps->data[ps->size].GPA[0] = "A";
strcpy(ps->data[ps->size].GPA, "A");
}
else if (ps->data[ps->size].grade < 85 && ps->data[ps->size].grade >= 80)
{
//ps->data[ps->size].GPA[0] = "B+";
strcpy(ps->data[ps->size].GPA, "B+");
}
else if (ps->data[ps->size].grade < 80 && ps->data[ps->size].grade >= 75)
{
//ps->data[ps->size].GPA[0] = "B";
strcpy(ps->data[ps->size].GPA, "B");
}
else if (ps->data[ps->size].grade < 75 && ps->data[ps->size].grade >= 70)
{
//ps->data[ps->size].GPA[0] = "B";
strcpy(ps->data[ps->size].GPA, "C+");
}
else if (ps->data[ps->size].grade < 70 && ps->data[ps->size].grade >= 65)
{
//ps->data[ps->size].GPA[0] = "C";
strcpy(ps->data[ps->size].GPA, "C");
}
else if (ps->data[ps->size].grade < 65 && ps->data[ps->size].grade >= 60)
{
//ps->data[ps->size].GPA[0] = "C";
strcpy(ps->data[ps->size].GPA, "D");
}
else if (ps->data[ps->size].grade < 60)
{
//ps->data[ps->size].GPA[0] = "D";
strcpy(ps->data[ps->size].GPA, "F");
}
if (ps->data[ps->size].num[0] == '2' && ps->data[ps->size].num[1] == '0' && ps->data[ps->size].num[2] == '2' && ps->data[ps->size].num[3] == '1')
{
//ps->data[ps->size].rebuild[0] = "NO";
strcpy(ps->data[ps->size].rebuild, "NO");
}
else
{
//ps->data[ps->size].rebuild[0] = "YES";
strcpy(ps->data[ps->size].rebuild, "YES");
}
ps->size++;
}
}
printf("添加成功\n");
}
void ShowForm(const struct Form* ps)
{
if (ps->size == 0)
{
printf("表格为空\n");
}
else
{
int i = 0;
//标题
printf("%-20s\t%-3s\t%-20s\t%-15s\t%-15s\t%-5s\n", "名字", "成绩", "学号","重修信息","GPA","排名");
//数据
for (i = 0; i < ps->size; i++)
{
printf("%-20s\t%-3d\t%-20s\t%-15s\t%-15s\t%-5d\n",
ps->data[i].name,
ps->data[i].grade,
ps->data[i].num,
ps->data[i].rebuild,
ps->data[i].GPA,
ps->data[i].rinking);
}
}
}
void DelForm(struct Form* ps)
{
char name[MAX_NAME];
printf("请输入要删除人的名字:>");
scanf("%*[\n]%[^\n]", name);
//1.查找要删除的人在什么位置
//找到了返回名字所在元素的下标
//找不到返回-1
int pos = FindByName(ps, name);
//2.删除
if (pos == -1)
{
printf("要删除的人不存在\n");
}
else
{
//删除数据
int j = 0;
for (j = pos; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功\n");
}
}
void SearchForm(const struct Form* ps)
{
char num[MAX_NUM];
printf("请输入要查找的学号:>");
scanf("%s", num);
int pos = FindByName(ps, num);
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
printf("%-20s\t%-3s\t%-12s\n", "名字", "成绩", "学号");
printf("%-20s\t%-3d\t%-12s\n",
ps->data[pos].name,
ps->data[pos].grade,
ps->data[pos].num);
}
}
void ModifyForm(struct Form* ps)
{
char num[MAX_NUM];
printf("请输入要修改人的学号:>");
scanf("%s", num);
int pos = FindByName(ps, num);
if (pos == -1)
{
printf("要修改的人不存在\n");
}
else
{
printf("请输入名字:>");
scanf("%s", ps->data[pos].name);
printf("请输入成绩:>");
scanf("%d", &(ps->data[pos].grade));
printf("请输入学号:>");
scanf("%s", ps->data[pos].num);
printf("修改完成\n");
}
}
void SortscoreForm(struct Form* ps)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
for (int j = 0; j + 1 < ps->size; j++)
{
if (ps->data[j].grade < ps->data[j + 1].grade)
{
struct PeoInfo tmp;
tmp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
void SortidForm(struct Form* ps)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
for (int j = 0; j + 1 < ps->size; j++)
{
for (int k = 0; k < 12; k++)
{
if (ps->data[j].num[k] > ps->data[j + 1].num[k])
{
struct PeoInfo tmp;
tmp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = tmp;
break;
}
}
}
}
printf("排序成功\n");
}
void BestForm(struct Form* ps)
{
int max = 0;
for (int i = 0; i < ps->size; i++)
{
if (ps->data[i].grade > max)
{
max = ps->data[i].grade;
}
}
printf("%-20s\t%-3s\t%-20s\t%-15s\t%-15s\t%-5s\n", "名字", "成绩", "学号", "重修信息", "GPA", "排名");
for (int i = 0; i < ps->size; i++)
{
if (ps->data[i].grade == max)
{
printf("%-20s\t%-3d\t%-20s\t%-15s\t%-15s\t%-5d\n",
ps->data[i].name,
ps->data[i].grade,
ps->data[i].num,
ps->data[i].rebuild,
ps->data[i].GPA,
ps->data[i].rinking);
}
}
}
void WorstForm(struct Form* ps)
{
int min = 100;
for (int i = 0; i < ps->size; i++)
{
if (ps->data[i].grade < min)
{
min = ps->data[i].grade;
}
}
printf("%-20s\t%-3s\t%-5s\n", "名字", "成绩", "学号");
for (int i = 0; i < ps->size; i++)
{
if (ps->data[i].grade == min)
{
printf("%-20s\t%-3d\t%-12s\n",
ps->data[i].name,
ps->data[i].grade,
ps->data[i].num);
}
}
}
void PrimeForm(struct Form* ps)
{
char num[MAX_NUM];
printf("请输入要查找人的学号:>");
scanf("%s", num);
int pos = FindByName(ps, num);
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
int flag = 0;
for (int i = 2; i < ps->data[pos].grade; i++)
{
if (ps->data[pos].grade % i == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
{
printf("该同学的成绩不是素数\n");
}
else
{
printf("该同学的成绩是素数\n");
}
}
}
void CoprimeForm(struct Form* ps)
{
char num1[MAX_NUM];
char num2[MAX_NUM];
printf("请输入要查找的第一位同学的学号:>");
scanf("%s", num1);
int pos1 = FindByName(ps, num1);
printf("请输入要查找的另一位同学的学号:>");
scanf("%s", num2);
int pos2 = FindByName(ps, num2);
if (pos1 == -1)
{
printf("要查找的人不存在\n");
}
else if (pos2 == -1)
{
printf("要查找的人不存在\n");
}
else
{
int flag = 0;
for (int i = 2; i < MIN(ps->data[pos1].grade,ps->data[pos2].grade); i++)
{
if (ps->data[pos1].grade % i == 0&& ps->data[pos2].grade % i == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
{
printf("该俩位同学的成绩不互素\n");
}
else
{
printf("该俩位同学的成绩互素\\n");
}
}
}
void AveForm(struct Form* ps)
{
int sum = 0;
for (int i = 0; i < ps->size; i++)
{
sum += ps->data[i].grade;
}
printf("平均数为%d\n", sum / ps->size);
}