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.

164 lines
4.0 KiB

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Student
{
char id[20];
char clas[20];
char name[20];
double score1;
double score2;
double score3;
double score;
struct Student* prev;
struct Student* next;
}student;//
student* head, * tail;
int tot;
void ins(student *t)
{
t->prev = tail->prev;
tail->prev->next = t;
tail->prev = t;
t->prev = tail;
tot++;
}
void del(student* u)
{
student* v = u->next;
u->next = v->next;
v->next->prev = u;
if (v == tail) tail = u;
free(v);
tot--;
}
void input()
{
student *t;
t = (struct Student*)malloc(sizeof(struct Student));
printf("Id "); scanf("%s", t->id);
printf("class "); scanf("%s", t->clas);
printf("name "); scanf("%s", t->name);
printf("score1 "); scanf("%lf", &t->score1);
printf("score2 "); scanf("%lf", &t->score2);
printf("score3 "); scanf("%lf", &t->score3);
t->score = t->score1 + t->score2 + t->score3;
ins(t);
}
void output()
{
for (student* u = head; u->next != NULL; u = u->next) {
student* v = u->next;
printf("%s,%s,%s,%.1lf,%.1lf,%.1lf,%.1lf\n", v->id, v->clas, v->name,
v->score1, v->score2, v->score3, v->score);
}
}
void deletl()
{
char s[10];
scanf("%s", s);
student* u;
for (u = head; u->next != NULL;) {
student* v = u->next;
if (strcmp(s, v->id) == 0 || strcmp(s, v->name) == 0) del(u);
else u = u->next;
}
output();
}
void select()
{
char s[10];
scanf("%s", s);
student* u;
int flag = 0;
for ( u = head; u->next != NULL; u = u->next) {
student* v = u->next;
if (strcmp(s, v->clas) == 0 || strcmp(s, v->id) == 0)
{
printf("%s,%s,%s,%.1lf,%.1lf,%.1lf,%.1lf\n", v->id, v->clas, v->name,
v->score1, v->score2, v->score3, v->score);
flag++;
}
}
if (flag == 0)
printf("there is no eligible student\n");
}
void sort(student* st, student* ed)
{
student t;
for (student* i = st; i != ed; i++)
for (student* j = ed - 1; j != i; j--) {
int x = strcmp(j->clas, (j - 1)->clas);
if (x < 0 || x == 0 && j->score >(j - 1)->score) {
t = *j;
*j = *(j - 1);
*(j - 1) = t;
}
}
}
void order()
{
student* students = (student*)malloc(sizeof(student) * tot);
int n = 0;
while (head->next != NULL) {
students[n++] = *(head->next);
del(head);
}
sort(students, students + n);
for (int i = 0; i < n; i++)
ins((students+i));
free(students);
output();
}
int main()
{
tail = head = (student*)malloc(sizeof(student));
head->next = NULL;
head->prev = NULL;
tail->next = NULL;
tail->prev = head;
tot = 0;
while (1) {
printf("1.input\n"
"2.delete\n"
"3.select\n"
"4.order\n"
"5.output\n"
"6.quit\n"
"please input your option\n");
char op[10];
while (1) {
scanf("%s", op);
if (strlen(op) == 1 && op[0] >= '1' && op[0] <= '6') break;
printf("Wrong input\n");
}
if (op[0] == '6') break;
while (1) {
if (op[0] == '1') input();
else if (op[0] == '2') deletl();
else if (op[0] == '3') select();
else if (op[0] == '4') order();
else if(op[0]=='5') output();
if (op[0] == '4' || op[0] == '5')
break;
printf("continue?\n");
char buf[10];
while (1) {
scanf("%s", buf);
if (strcmp(buf, "yes") == 0 || strcmp(buf, "no") == 0) break;
printf("Wrong input\n");
}
if (strcmp(buf, "no") == 0) break;
}
}
return 0;
}