You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
5.7 KiB

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"Array.h"
void print_blanks(int n)
{
for(int i = 0; i < n; i ++)
putchar(' ');
}
int make_sure(){
char s[200];
scanf("%s", s);
return strcmp(s, "yes") == 0;
}
struct StuInfo
{
int id;
char *clas;
char *name;
double ma,
ph,
eg,
sum;
};
struct Array info;
#define psf PAT(struct StuInfo, p)
void Info_release_(void *p){
free(((struct StuInfo*)p)->clas);
free(((struct StuInfo*)p)->name);
}
void Info_add(int id,const char *const clas, const char *const name, double ma, double ph, double eg){
struct StuInfo stu = {id, NULL, NULL, ma, ph, eg, ma+ph+eg};
stu.clas = malloc_s_strcpy(clas);
stu.name = malloc_s_strcpy(name);
Array_insert(&info, &stu, info.size);
}
void Info_Add()
{
printf("Info Adding Guide:\nPlease type in Student's \n[id, class, name, math score, physics score, english score] in orders\n");
char tmp[200];
struct StuInfo stu;
do{
printf("Id:");scanf("%d", &stu.id);
printf("Class:");scanf("%s", tmp);
stu.clas = malloc_s_strcpy(tmp);
printf("Name:");scanf("%s", tmp);
stu.name = malloc_s_strcpy(tmp);
printf("Math Score:");scanf("%lf", &stu.ma);
printf("Physics Score:");scanf("%lf", &stu.ph);
printf("English Score:");scanf("%lf", &stu.eg);
stu.sum += stu.ma + stu.ph + stu.eg;
Array_insert(&info, &stu, info.size);
printf("Continue to Add?[yes/no]\n");
}while(make_sure());
printf("Info Adding Done.\n");
}
void info_format_print(struct Array_ *p){
printf("%d %s %s %2.1lf %2.1lf %2.1lf %2.1lf\n",psf->id,psf->clas,psf->name,psf->ma,psf->ph,psf->eg,psf->sum);
}
void Info_Remove()
{
printf("Remove Guide:\nType in [id] of the students you want to remove\n");
int num, ord = 0, stk[200], tp = 0;
scanf("%d", &num);
Range(info){
ord++;
if(psf->id == num)
stk[tp ++] = ord;
}
if(tp){
printf("Found:%d\n", tp);
Range(info){
ord++;
if(psf->id == num)
info_format_print(p);
}
if(tp != 1)
scanf("%d", &num);
else num = 1;
if(num > 0 && num < tp){
printf("Make Sure To Remove?[yes/no]");
if(make_sure()){
Array_deletepos(&info, stk[num-1]);
printf("Remove Done\n");
}else printf("Canceling the option\n");
}else printf("illegal input of the Index\n");
}else printf("Student [id:%d] Not Found\n", num);
}
void Info_Show()
{
printf("Here lists all infomation stored in the system:\n");
Range(info)
info_format_print(p);
printf("[End]\n");
}
void Info_Quiry()
{
printf("Qury Guide:\nType in [id] of the students you are looking for\n");
int num, ord = 0, stk[200], tp = 0;
scanf("%d", &num);
Range(info){
ord++;
if(psf->id == num)
stk[tp ++] = ord;
}
if(tp){
printf("Found:%d\n", tp);
Range(info){
ord++;
if(psf->id == num)
info_format_print(p);
}
}else printf("Student [id:%d] Not Found\n", num);
}
int Info_sortById_a(void *a, void *b){
return ((struct StuInfo*)a)->id - ((struct StuInfo*)b)->id;
}
int Info_sortByClass_a(void *a, void *b){
return strcmp(((struct StuInfo*)a)->clas, ((struct StuInfo*)b)->clas);
}
int Info_sortByName_a(void *a, void *b){
return strcmp(((struct StuInfo*)a)->name, ((struct StuInfo*)b)->name);
}
int Info_sortBySumScore_a(void *a, void *b){
return ((struct StuInfo*)a)->sum - ((struct StuInfo*)b)->sum;
}
void Info_SortByKeys()
{
int keys, order = 0;
printf("Sort Guide:\nType in Keys:\n");
printf("1.id\n2.class\n3.name\n4.total score\n");
scanf("%d", &keys);
printf("Choose the sort order:\n1.ascend\n2.descend\n");
scanf("%d", &order);
int (*func)(void *, void *);
switch(keys){
case 1:func = Info_sortById_a;break;
case 2:func = Info_sortByClass_a;break;
case 3:func = Info_sortByName_a;break;
case 4:func = Info_sortBySumScore_a;break;
default:
printf("Illegal Input\n");
return;
}
Array_sort(&info, func, order >= 2);
printf("Sort Finished\n");
Info_Show();
}
struct Opt{
char *opt;
void (*func)();
};
struct Array Cmds;
void Opts_Append(const char *const opt, void (*func)()){
struct Opt optt = {NULL, func};
optt.opt = malloc_s_strcpy(opt);
Array_insert(&Cmds, &optt, Cmds.size);
}
void Opts_release_(void *p){
free(((struct Opt *)p)->opt);
}
int Opts_Select(){
int i=0;
Range(Cmds)
printf("%d.%s\n", ++i, PAT(struct Opt, p)->opt);
printf("%d.Quit\n", ++i);
int selectNum = 0;
scanf("%d", &selectNum);
if(selectNum > i || selectNum < 1){
printf("Error Input:%d\n", selectNum);
return 1;
}else if(selectNum == i){
printf("Quit From System...\n");
return 0;
}else PAT(struct Opt, Array(&Cmds, selectNum-1))->func();
return 1;
}
int main(){
ArrayList_Init();
DECLARE_ARRAY(struct StuInfo, Info_release_)
DECLARE_ARRAY(struct Opt, Opts_release_)
ARRAY_BIND(info, struct StuInfo);
ARRAY_BIND(Cmds, struct Opt);
Opts_Append("Quiry", Info_Quiry);
Opts_Append("Add", Info_Add);
Opts_Append("Remove", Info_Remove);
Opts_Append("Show", Info_Show);
Opts_Append("SortByKeys", Info_SortByKeys);
Info_add(1, "CLASS_TEST_1", "TEST_2", 100, 100, 100);
Info_add(2, "CLASS_TEST_2", "TEST_4", 20, 0, 60);
Info_add(3, "CLASS_TEST_3", "TEST_1", 5, 53, 100);
while(Opts_Select());
ArrayList_Rel();
printf("Done\n");
}