主题:  作业题~~求帮忙 学C的和想挑战难度地进来

秋冰梦

职务:普通成员
等级:6
金币:5.0
发贴:4325
注册:2002/5/16 22:14:21
#12004/5/31 11:13:05
C语言编写一个小型的学生成绩管理系统,具体要求如下:
从键盘输入学生的信息(学号,姓名,性别,年龄,班级,数学成绩,语文成绩,外语成绩,总分,平均分),根据成绩判断学生的等级,并输出班级里成绩最高和最低的学生的学号,姓名和成绩,这两个功能必须通过函数来是实现。

1. 能够从用户获得下面的学生信息:
a) 学生学号 班级
b) 学生姓名 性别 年龄
c) 学生课程(3门以上)
d) 学生成绩

2. 根据成绩进行如下等级判断。(用函数实现)
--如果成绩高于或等于85分,则该同学的等级为优秀
--如果成绩高于或等于60分但低于80分,则该同学的等级为通过
--如果成绩低于60分,则该同学的等级为不通过

3. 输出包含如下信息的成绩单:
a) 按学生学号升序(平均分,总分,名次)
b) 按总分升序(平均分,总分,名次)
c) 返回主菜单


4) 找出全班成绩总分最高和最低的学生。(用函数实现)

5) 输出全班成绩最高和最低的学生的学号,姓名和成绩

最后要求该系统具有可编辑性


生是色狼,死是色鬼。

老刀把子

职务:普通成员
等级:1
金币:0.0
发贴:207
注册:2004/5/12 15:01:20
#22004/5/31 11:31:31
300元



大当家

职务:普通成员
等级:3
金币:1.0
发贴:767
注册:2001/12/8 20:02:19
#32004/5/31 12:24:34
上期偶们的C程序设计大作业题目~

难道现在的老师都喜欢出这个程序?

编辑历史:[此帖最近一次被 扬扬 编辑过(编辑时间:2004-05-31 12:30:20)]


秋冰梦

职务:普通成员
等级:6
金币:5.0
发贴:4325
注册:2002/5/16 22:14:21
#42004/5/31 13:44:33
反正我是不会了
谁会帮我一下

我这有一个差不多的
会的帮我改下





# include "stdio.h"
# include "stdlib.h"
# include "string.h"
# include "conio.h"

# define LEN sizeof(STR) /* 一个学生信息所占用的内存单元 */
# define MAX 5 /* 4门必修课的成绩 */

typedef struct student
{
int n; /* 存放学生个数 */
char num[20]; /* 学号 */
char name[20]; /* 姓名 */
char sex[10]; /* 性别 */
int age; /* 年龄 */
char classes[20]; /* 班级 */
float score[MAX]; /* 成绩 */
struct student *next; /* 结点中的指针域 */
} STR;

/* 以下是函数说明部分 */
/**********************/

STR *creat(); /* 新建立一个学生档案数据库,返回头指针 */
STR *creat_continue(STR *); /* 继续输入学生信息 */
STR *load(); /* 装入已有的文件 */
void score(STR *); /* 输入学生成绩的函数 */
void choice(STR *); /* 进入相关选择菜单 */
void print_all(STR *); /* 输出所有学生的信息 */
void print_node(STR *); /* 输出查到的结果 */
void edit(STR *); /* 进入编辑模式 */

void find_choice(STR *); /* 进入查找模式的入口 */
void revision_choice(STR *); /* 进入修改模式的入口 */
void insert_choice(STR *); /* 进入插入模式的入口 */
void delete_choice(STR *); /* 进入删除模式的入口 */
void reorder_choice(STR *); /* 进入排序模式的入口 */
void save_choice(STR *); /* 询问是否保存 */

void save(STR *); /* 保存数据 */
void save_1(STR *, char *); /* 命名保存 */
void save_2(STR *, char *); /* 覆盖保存 */

void revision(STR *); /* 修改查到的学生信息 */
void insert(STR *, STR *); /* 在查到的结点前插入一个新结点 */
void delete(STR *, STR *); /* 删除查到的结点 */
void reorder_score(STR *, int); /* 该函数是按某一成绩进行排序的 */
void reorder_num(STR *); /* 该函数是按学号进行排序的 */
STR *find_line(STR *); /* 找序号查找学生信息 */
STR *find_number(STR *); /* 按学号查找 */
STR *find_name(STR *); /* 按姓名查找 */

/* 主函数部分 */
/**************/

main()
{
STR *head; /* 定义头结点 */
char flag; /* 选择菜单的标记 */

do
{
clrscr(); /* 清屏 */
printf("Press \"1\" . . . creat file\n"); /* 选择1,则新建立文件 */
printf("Press \"2\" . . . load file\n"); /* 选择2,则装入已有的文件 */
printf("Press the others . . . return to \"DOS\" mode\n"); /* 其它任意键则退出程序 */
printf("\n");

printf("Please choice:"); /* 提示选择菜单 */
flag = getch(); /* 选择菜单 */

switch(flag)
{
case '1': head = creat(); /* 调用函数新建文件 */
printf("\n");
choice(head); /* 进入相关选择菜单 */
printf("\n");
break;

case '2': head = load(); /* 装入已有的文件 */
printf("\n");
choice(head); /* 进入相关选择菜单 */
printf("\n");
break;
default: printf("\n");
exit(1); /* 输入其它任意字符则退出到DOS模式下 */
}
} while (1);
}

/* 新建立一个学生档案数据库,返回头指针 */
/****************************************/

STR *creat()
{
STR *head; /* 表头结点 */
STR *p; /* 前一个结点 */
STR *q; /* 后一个结点 */
char temp[20]; /* 存放学生信息的临时数组 */

head = (STR *)malloc(LEN); /* 让头结点指向一片存储单元 */
head->n = 0; /* 头结点中成员n存放学生个数,初值为0 */
p = head; /* 尾指针为初值 */
clrscr(); /* 清屏 */
printf("This is a \"creat\" mode . . .");
getch();

printf("\nPress \"ENTER\" to number, you will finish input!\n\n"); /* 提示,如果键入回车,则结束输入 */

printf("Number:");
gets(temp); /* 输入学号 */

while (temp[0] != '\0')
{
q = (STR *)malloc(LEN); /* 开辟新的结点 */
head->n = head->n + 1; /* 表长加1 */
strcpy(q->num, temp); /* 学号 */
printf("Name:"); /* 姓名 */
gets(q->name);
printf("Sex:"); /* 性别 */
gets(q->sex);
printf("Age:"); /* 年龄 */
gets(temp);
q->age = atoi(temp);
printf("Class:"); /* 班级 */
gets(q->classes);
score(q); /* 调用函数输入成绩 */
p->next = q; /* 连接 */
p = q; /* 转移指向当前结点 */
p->next = NULL;
print_all(head); /* 输出当前已经输入的学生信息 */
printf("Press any key to continue . . .");
getch();
printf("\n");
printf("Number:");
gets(temp); /* 输入学号 */

}
p->next = NULL; /* 置尾结点标志 */
return head; /* 返回头结点 */
}


/* 输入学生成绩的函数 */
/**********************/

void score(STR *q)
{
char temp[5]; /* 存放成绩的临时数组 */
int j;
float sum=0; /* 存放总分的变量 */

for (j = 1; j<=MAX; j++)
{
switch(j)
{
case 1: printf("Windows XP:");
gets(temp);
if (temp[0] == '\0')
{
q->score[j-1] = -1;
}
else
{
q->score[j-1] = atof(temp);
sum += atof(temp);
} break;

case 2: printf("Word 2002:");
gets(temp);
if (temp[0] == '\0')
{
q->score[j-1] = -1; /* 如果某项没有考试,则成绩暂为-1 */
}
else
{
q->score[j-1] = atof(temp);
sum += atof(temp);
} break;

case 3: printf("Excel 2002:");
gets(temp);
if (temp[0] == '\0')
{
q->score[j-1] = -1; /* 如果某项没有考试,则成绩暂为-1 */
}
else
{
q->score[j-1] = atof(temp);
sum += atof(temp);
} break;

case 4: printf("IE:");
gets(temp);
if (temp[0] == '\0')
{
q->score[j-1] = -1; /* 如果某项没有考试,则成绩暂为-1 */
}
else
{
q->score[j-1] = atof(temp);
sum += atof(temp);
} break;
case MAX: q->score[j-1] = sum;
}
}
}


/* 完成新建后进入相关选择菜单 */
/******************************/
void choice(STR *head)
{
char flag;

do
{
clrscr();
printf("This is a \"choice\" mode . . .");
getch();
printf("\n\n");
printf("Press \"1\" . . . output all the student . . .\n");
printf("Press \"2\" . . . enter the \"edit\" mode . . .\n");
printf("Press \"3\" . . . creat continue . . .\n");
printf("Press the others . . . quit and ask save . . .\n");
flag = getch();
switch(flag)
{
case '1': print_all(head);
printf("\n");
break;
case '2': edit(head);
printf("\n");
break;
case '3': head = creat_continue(head);
printf("\n");
break;
default: save_choice(head); /* 询问是否保存 */
printf("\n");
}
if (flag != '1' && flag != '2' && flag != '3')
{
return;
}
} while (1);
}

/* 输出所有学生的信息 */
/**********************/

void print_all(STR *head)
{
STR *h;
STR *p;
int i = 1; /* 编号列表 */
int j; /* 输出成绩时的循环控制变量 */

p = head;
clrscr();

printf(" number name sex age classes WinXP Word Excel IE sum\n\n"); /* 输出列表信息 */

while (p->next != NULL)
{
p = p->next;
printf("%-3d", i++); /* 以下是格式输出 */
printf("%-12s", p->num);
printf("%-8s", p->name);
printf("%-5s", p->sex);
printf("%-5d", p->age);
printf("%-10s", p->classes);

for (j=0; j<MAX; j++)
{
if (p->score[j] == -1) /* 如果在输入时,成绩为-1(即没有考试),则输出相应的空格来控制 */
{
printf("%-6c", ' ');
}
else
{
printf("%-6.0f", p->score[j]); /* 否则输出成绩 */
}
}

printf("\n");

if ((i-1)%20 == 0) /* 功能是每输出20个学生数据就暂停,按任意键继续输出 */
{
printf("Press any key to continue. . .\n");
getch();
}
}

printf("SUM = %d\n", head->n);
getch();
printf("\n");

return;
}


/* 该函数是进入编辑模式的入口 */
/******************************/

void edit(STR *head)
{
char c;
do
{
clrscr(); /* 首先清屏 */
printf("This is a \"edit\" mode . . ."); /* 提示信息 */
getch(); /* 按任意键继续 */
printf("\n\n");

printf("Press \"1\" . . . Find the data!\n");
printf("Press \"2\" . . . Revision the data!\n");
printf("Press \"3\" . . . Insert the data!\n");
printf("Press \"4\" . . . Delete the data!\n");
printf("Press \"5\" . . . Reorder the data!\n");
printf("Press the others . . . Return to the \"choice\" mode!\n");
printf("\nPlease choice:");

c = getch();
switch(c)
{
case '1': find_choice(head);
break;
case '2': revision_choice(head);
break;
case '3': insert_choice(head);
break;
case '4': delete_choice(head);
break;
case '5': reorder_choice(head);
break;
default: return;
}
} while (1);
}


/* 该函数是进入查找模式的入口*/
/*****************************/

void find_choice(STR *head)
{
char c;
STR *p_line; /* 指向返回的单个结点 */


do
{
clrscr(); /* 首先清屏 */
printf("This is a \"find\" mode . . ."); /* 提示信息 */
getch();
printf("\n\n");

printf("Press \"1\" . . . Find from line!\n");
printf("Press \"2\" . . . Find from number!\n");
printf("Press \"3\" . . . Find from name!\n");
printf("Press the others . . . return to the \"edit\" mode!\n");
printf("\nPlease choice:");
c = getch();
printf("\n");
switch(c)
{
case '1': p_line = find_line(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
}
break;
case '2': p_line = find_number(head); /* 按学号查找 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
}
break;
case '3': p_line = find_name(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出学生的信息 */
}
break;
default: return;
}
} while (1);
}


/* 按序号查找学生的信息 */
/************************/

STR *find_line(STR *head)
{
STR *p;
char c;
int j;
int i;


p = head; /* 工作指针指向头结点 */
j = 0; /* 初值为0,表明当前处于未查找状态 */
printf("Please input the line:");
scanf("%d%c", &i, &c);

while ((p->next != NULL) && (j < i))
{
p = p->next;
j++;
}
if (j==i && j!=0)
{
return p; /* 找到则返回结点指针 */
}
else
{
printf("Can not find!\n");
getch();
return NULL;
}
}


/* 按学号查找学生的信息 */
/************************/

STR *find_number(STR *head)
{
char temp[20]; /* 定义存放学号的临时数组 */
STR *p;

p = head;
printf("Please input the number:");
gets(temp); /* 输入目标学号 */

while (p->next != NULL)
{
p = p->next;
if (strcmp(p->num,temp)==0)
{
break;
}
}
if (strcmp(p->num, temp)==0) /* 比较字符串的大小 */
{
return p;
}
else
{
printf("Can not find!\n");
getch();
return NULL;
}
}


/* 该函数是按姓名来查找学生的信息 */
/**********************************/

STR *find_name(STR *head)
{
char temp[20]; /* 定义存放学号的临时数组 */
STR *p;

p = head;
printf("Please input the name:");
gets(temp); /* 输入目标学号 */

while (p->next != NULL)
{
p = p->next;
if (strcmp(p->name,temp)==0)
{
break;
}
}
if (strcmp(p->name, temp)==0) /* 比较字符串的大小 */
{
return p;
}
else
{
printf("Can not find!\n");
getch();
return NULL;
}
}


/* 输出查到的学生信息 */
/**********************/

void print_node(STR *p_line)
{
int j;
int i=1;
printf(" number name sex age classes WinXP Word Excel IE sum\n\n"); /* 输出列表信息 */

printf("%-3d", i++); /* 以下是格式输出 */
printf("%-12s", p_line->num);
printf("%-8s", p_line->name);
printf("%-5s", p_line->sex);
printf("%-5d", p_line->age);
printf("%-10s", p_line->classes);

for (j=0; j<MAX; j++)
{
if (p_line->score[j] == -1) /* 如果在输入时,成绩为-1(即没有考试),则输出空格来控制 */
{
printf("%-6c", ' ');
}
else
{
printf("%-6.0f", p_line->score[j]); /* 否则输出成绩 */
}
}

printf("\n\nPress any key to continue . . .");
getch();
printf("\n");
return;
}


/* 该函数是进入修改模式的入口*/
/*****************************/

void revision_choice(STR *head)
{
char c;
STR *p_line; /* 指向返回的单个结点 */

do
{
clrscr(); /* 首先清屏 */
printf("This is a \"revision\" mode . . ."); /* 提示信息 */
getch();
printf("\n\n");

printf("Press \"1\" . . . revision from line!\n");
printf("Press \"2\" . . . revision from number!\n");
printf("Press \"3\" . . . revision from name!\n");
printf("Press the others . . . return to the \"edit\" mode!\n");
printf("\nPlease choice:");
c = getch();
printf("\n");
switch(c)
{
case '1': p_line = find_line(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
revision(p_line); /* 修改查到的学生信息 */
print_node(p_line); /* 输出修改后的学生信息 */
}
break;
case '2': p_line = find_number(head); /* 按学号查找 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
revision(p_line); /* 修改查到的学生信息 */
print_node(p_line);
}
break;
case '3': p_line = find_name(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出学生的信息 */
revision(p_line);
print_node(p_line);
}
break;
default: return;
}
} while (1);
}


/* 该函数是用来修改查到的学生的信息 */
/************************************/

void revision(STR *p_line)
{
char c;
char temp[20]; /* 临时数组 */
printf("Do you want to revision the data really . . .(Y/N)");
c = getch();
printf("\n");

if (c=='y' || c=='Y')
{
printf("Number:");
gets(temp); /* 修改学号 */
if (temp[0] != '\0')
{
strcpy(p_line->num, temp);
}
printf("Name:");
gets(temp); /* 修改姓名 */
if (temp[0] != '\0')
{
strcpy(p_line->name, temp);
}
printf("Sex:");
gets(temp); /* 修改性别 */
if (temp[0] != '\0')
{
strcpy(p_line->sex, temp);
}
printf("Age:");
gets(temp); /* 修改年龄 */
if (temp[0] != '\0')
{
p_line->age = atoi(temp);
}
printf("Class:");
gets(temp); /* 修改班级 */
if (temp[0] != '\0')
{
strcpy(p_line->classes, temp);
}
printf("Windows XP:");
gets(temp); /* 修改成绩 */
if (temp[0] != '\0')
{
if (p_line->score[0] != -1) /* 这里要注意原有成绩可能暂时记为-1的情况,实际它代表没有输入成绩 */
{
p_line->score[MAX-1] = p_line->score[MAX-1] - p_line->score[0]; /* 减去原有成绩 */
}
p_line->score[0] = atof(temp);
p_line->score[MAX-1] = p_line->score[MAX-1] + atof(temp); /* 加上修改后的新成绩 */
}
printf("Word 2002:");
gets(temp); /* 修改成绩 */
if (temp[0] != '\0')
{
if (p_line->score[1] != -1) /* 这里要注意原有成绩可能暂时记为-1的情况,实际它代表没有输入成绩 */
{
p_line->score[MAX-1] = p_line->score[MAX-1] - p_line->score[1]; /* 减去原有成绩 */
}
p_line->score[1] = atof(temp);
p_line->score[MAX-1] = p_line->score[MAX-1] + atof(temp); /* 加上修改后的新成绩 */
}
printf("Excel 2002:");
gets(temp); /* 修改成绩 */
if (temp[0] != '\0')
{
if (p_line->score[2] != -1) /* 这里要注意原有成绩可能暂时记为-1的情况,实际它代表没有输入成绩 */
{
p_line->score[MAX-1] = p_line->score[MAX-1] - p_line->score[2]; /* 减去原有成绩 */
}
p_line->score[2] = atof(temp);
p_line->score[MAX-1] = p_line->score[MAX-1] + atof(temp); /* 加上修改后的新成绩 */
}
printf("IE:");
gets(temp); /* 修改成绩 */
if (temp[0] != '\0')
{
if (p_line->score[3] != -1) /* 这里要注意原有成绩可能暂时记为-1的情况,实际它代表没有输入成绩 */
{
p_line->score[MAX-1] = p_line->score[MAX-1] - p_line->score[3]; /* 减去原有成绩 */
}
p_line->score[3] = atof(temp);
p_line->score[MAX-1] = p_line->score[MAX-1] + atof(temp); /* 加上修改后的新成绩 */
}
}
printf("\n\n");
return;
}


/* 该函数是进入插入模式的入口 */
/******************************/

void insert_choice(STR *head)
{
char c;
STR *p_line; /* 指向返回的单个结点 */


do
{
clrscr(); /* 首先清屏 */
printf("This is a \"insert\" mode . . ."); /* 提示信息 */
getch();
printf("\n\n");

printf("Press \"1\" . . . Insert from line!\n");
printf("Press \"2\" . . . Insert from number!\n");
printf("Press \"3\" . . . Insert from name!\n");
printf("Press the others . . . return to the \"edit\" mode!\n");
printf("\nPlease choice:");
c = getch();
printf("\n");
switch(c)
{
case '1': p_line = find_line(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
insert(head, p_line); /* 调用函数,在该结点前插入新的数据 */
print_all(head); /* 显示所有学生信息 */
}
break;
case '2': p_line = find_number(head); /* 按学号查找 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
insert(head, p_line); /* 调用函数,在该结点前插入新的数据 */
print_all(head); /* 显示所有学生信息 */
}
break;
case '3': p_line = find_name(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出学生的信息 */
insert(head, p_line); /* 调用函数,在该结点前插入新的数据 */
print_all(head); /* 显示所有学生信息 */
}
break;
default: return;
}
} while (1);
}


/* 该函数是在查到的结点前插入新的结点 */
/**************************************/

void insert(STR *head, STR *p_line)
{
STR *p; /* 可移动的指针 */
STR *q; /* 指向新结点的指针 */
char temp[20]; /* 定义临时数组 */
p = head; /* 起始值指向头结点 */

while (p->next != p_line)
{
p = p->next;
}
printf("\n");

printf("Number:");
gets(temp); /* 输入学号 */

if (temp[0] != '\0')
{
q = (STR *)malloc(LEN); /* 开辟新的结点 */
head->n = head->n + 1; /* 表长加1 */
strcpy(q->num, temp); /* 学号 */
printf("Name:"); /* 姓名 */
gets(q->name);
printf("Sex:"); /* 性别 */
gets(q->sex);
printf("Age:"); /* 年龄 */
gets(temp);
q->age = atoi(temp);
printf("Class:"); /* 班级 */
gets(q->classes);
score(q); /* 调用函数输入成绩 */
p->next = q; /* 连接 */
q->next = p_line; /* 连接 */
}

printf("\n");
return;
}


/* 该函数是在原有的基础上继续输入信息 */
/**************************************/

STR *creat_continue(STR *head)
{
STR *p; /* 前一个结点 */
STR *q; /* 后一个结点 */
char temp[20]; /* 存放学生信息的临时数组 */
p = head; /* 尾指针为初值 */
while (p->next != NULL)
{
p = p->next;
}
clrscr(); /* 清屏 */

printf("\nPress \"ENTER\" to number, you will finish input!\n\n"); /* 提示,如果键入回车,则结束输入 */

printf("Number:");
gets(temp); /* 输入学号 */

while (temp[0] != '\0')
{
q = (STR *)malloc(LEN); /* 开辟新的结点 */
head->n = head->n + 1; /* 表长加1 */
strcpy(q->num, temp); /* 学号 */
printf("Name:"); /* 姓名 */
gets(q->name);
printf("Sex:"); /* 性别 */
gets(q->sex);
printf("Age:"); /* 年龄 */
gets(temp);
q->age = atoi(temp);
printf("Class:"); /* 班级 */
gets(q->classes);
score(q); /* 调用函数输入成绩 */
p->next = q; /* 连接 */
p = q; /* 转移指向当前结点 */
p->next = NULL;
print_all(head); /* 输出当前已经输入的学生信息 */
printf("Press any key to continue . . .");
getch();
printf("\n");
printf("Number:");
gets(temp); /* 输入学号 */

}
p->next = NULL; /* 置尾结点标志 */
return head; /* 返回头结点 */
}


/* 该函数是进入删除模式的入口 */
/******************************/

void delete_choice(STR *head)
{
char c;
STR *p_line; /* 指向返回的单个结点 */

do
{
clrscr(); /* 首先清屏 */
printf("This is a \"delete\" mode . . ."); /* 提示信息 */
getch();
printf("\n\n");

printf("Press \"1\" . . . delete from line!\n");
printf("Press \"2\" . . . delete from number!\n");
printf("Press \"3\" . . . delete from name!\n");
printf("Press the others . . . return to the \"edit\" mode!\n");
printf("\nPlease choice:");
c = getch();
printf("\n");
switch(c)
{
case '1': p_line = find_line(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
delete(head, p_line); /* 删除查到的学生信息 */
print_all(head); /* 输出修改后的学生信息 */
}
break;
case '2': p_line = find_number(head); /* 按学号查找 */
if (p_line != NULL)
{
print_node(p_line); /* 输出该学生的信息 */
delete(head, p_line); /* 删除查到的学生信息 */
print_all(head);
}
break;
case '3': p_line = find_name(head); /* 返回查到的结点或空 */
if (p_line != NULL)
{
print_node(p_line); /* 输出学生的信息 */
delete(head, p_line); /* 删除查到的学生信息 */
print_all(head);
}
break;
default: return;
}
} while (1);
}


/* 该函数是用来删除查到的学生 */
/******************************/

void delete(STR *head, STR *p_line)
{
STR *p;
char c;
p = head;

while (p->next != p_line)
{
p = p->next;
}
printf("\n");

printf("Do you want to delete the data really . . .(Y/N)");
c = getch();
if (c=='y' || c=='Y')
{
p->next = p_line->next; /* 与待删除结点继开连接 */
head->n = head->n-1; /* 结点数自减一 */
free(p_line); /* 释放该结点 */
}
printf("\n");
return;
}


/* 该函数是按某一成绩进入排序的*/
/*******************************/

void reorder_choice(STR *head)
{
char c;

do
{
clrscr(); /* 首先清屏 */
printf("This is a \"reorder\" mode . . ."); /* 提示信息 */
getch();
printf("\n\n");

printf("Press \"1\" . . . reorder from windowsXP!\n");
printf("Press \"2\" . . . reorder from word2002!\n");
printf("Press \"3\" . . . reorder from excer2002!\n");
printf("Press \"4\" . . . reorder from ie!\n");
printf("Press \"5\" . . . reorder from sum!\n");
printf("Press \"6\" . . . reorder from number!\n");
printf("Press the others . . . return to the \"edit\" mode!\n");
printf("\nPlease choice:");
c = getch();
printf("\n");
switch(c)
{
case '1': reorder_score(head, c-48); /* 根据windowsXP排序 */
print_all(head); /* 输出排序后的结果 */
break;
case '2': reorder_score(head, c-48); /* 根据word2002排序 */
print_all(head); /* 输出排序后的结果 */
break;
case '3': reorder_score(head, c-48); /* 根据excel2002排序 */
print_all(head); /* 输出排序后的结果 */
break;
case '4': reorder_score(head, c-48); /* 根据ie排序 */
print_all(head); /* 输出排序后的结果 */
break;
case '5': reorder_score(head, c-48); /* 根据总分排序 */
print_all(head);
break;
case '6': reorder_num(head); /* 根据学号排序 */
print_all(head);
break;
default: return;
}
} while (1);
}


/* 该函数是用来按某一成绩进行排序的 */
/************************************/

void reorder_score(STR *head, int n)
{
int i;
int j;
STR *h;
STR *p;
STR *q;


printf("Reorder . . . big---->small . . .");
getch();

for (i=1; i<=head->n-1; i++)
{
h = head;
p = h->next; /* 前一个结点 */
q = p->next; /* 后一个结点 */
for (j=1; j<=head->n-i; j++)
{
if (p->score[n-1]<q->score[n-1]) /* 前一个结点和后一个结点相比较 */
{
p->next = q->next;
q->next = p;
h->next = q;
h = q;
q = p->next;
}
else
{
h = p;
p = q;
q = q->next;
}
}

}

return;

}


/* 该函数是根据学号对学生进行升序排序的 */
/****************************************/

void reorder_num(STR *head)
{
int i;
int j;
STR *h;
STR *p;
STR *q;


printf("Reorder . . . small---->big . . .");
getch();

for (i=1; i<=head->n-1; i++)
{
h = head;
p = h->next; /* 前一个结点 */
q = p->next; /* 后一个结点 */
for (j=1; j<=head->n-i; j++)
{
if (strcmp(p->num, q->num) > 0) /* 前一个结点和后一个结点相比较 */
{
p->next = q->next;
q->next = p;
h->next = q;
h = q;
q = p->next;
}
else
{
h = p;
p = q;
q = q->next;
}
}

}

return;

}

/* 该函数是进入保存模式的入口 */
/******************************/

void save_choice(STR *head)
{
char c;
clrscr();

printf("Do you want to save the data . . . (Y/N)");
c = getch();
printf("\n");

if (c == 'y' || c == 'Y')
{
save(head);
}
printf("\n");
return;
}


/* 该函数是用来保存学生信息的 */
/******************************/

void save(STR *head)
{
STR *p;
FILE *fp;
char name[40]; /* 存放文件名的字符数组 */
p = head;
clrscr(); /* 清屏 */
printf("Please input [address] and file name:");
gets(name);
printf("\n");

if ((fp = fopen(name, "rb")) == NULL) /* 表示当前文件不存在 */
{
save_1(p, name); /* 第一种保存方式,命名保存 */
}
else
{
save_2(p, name); /* 覆盖保存 */
}
fclose(fp);
printf("\n");
return;
}


/* 命名保存方式 */
/****************/

void save_1(STR *head, char name[])
{
FILE *fp;
STR *p;
p = head;

if ((fp = fopen(name, "wb")) == NULL)
{
printf("Can not save . . .");
getch();
exit(1);
}
while (p->next != NULL)
{
p = p->next;
fwrite(p, LEN, 1, fp);
}
fclose(fp);
printf("\n");
return;
}


/* 覆盖保存方式 */
/****************/

void save_2(STR *head, char name[])
{
FILE *fp; /* 定义文件指针fp */
STR *p; /* 定义STR型工作指针 */
char c; /* 存放保存的选择字符 */
p = head;

printf("The same filename, cover? . . .(Y/N)"); /* 提问是否覆盖同名文件 */
c = getch(); /* 输入是保存或不保存信息 */

if (c == 'y' || c == 'Y') /* 确认覆盖保存 */
{
if ((fp = fopen(name, "wb")) == NULL)
{
printf("Error! can not save the file!\n");
exit(1);
}
while (p->next != NULL) /* 读入数据 */
{
p = p->next;
fwrite(p, LEN, 1, fp);
}
fclose(fp); /* 关闭文件 */
}
else
{
printf("The file was not saved!\n"); /* 确认没有保存 */
}

return; /* 返回到主调函数中 */
}


/* 装入已有的文件 */
/******************/

STR *load()
{
STR *head;
STR *p;
STR *q;
FILE *fp;
char name[40];
char c;

head = (STR *)malloc(LEN); /* 开辟头指针 */
head->n = 0;
p = head; /* 指向头指针 */

clrscr();
printf("This is a \"load\" mode. . .");
getch();
printf("\n");

printf("Please input the filename:");
gets(name);

if ((fp = fopen(name, "rb")) == NULL)
{
printf("Can not find the file!\n");
exit(1);
}
q = (STR *)malloc(LEN); /* 先开辟一个存储结点 */
fread(q, LEN, 1, fp); /* 将文件中的第一条信息读入结点中 */

while (!feof(fp)) /* 如果这时候是到达文件尾,说明上一步并没有读入信息 */
{
p->next = q; /* 如果不是文件尾,说明上一步读入了一个学生的信息,让头结点指向第一个结点 */
p = q; /* 工作指针移动到当前结点 */
head->n = head->n+1; /* 学生数自加一 */
q = (STR *)malloc(LEN); /* 再一次开辟存储结点 */
fread(q, LEN, 1, fp); /* 继续读入 */
}

p->next = NULL; /* 如果到达文件尾,则当前结点指向空 */
printf("\n");
fclose(fp); /* 关闭文件 */

print_all(head); /* 输出整个文件中的信息 */
return (head);
}



无敌自恋王子~

职务:普通成员
等级:3
金币:1.0
发贴:860
注册:2004/4/10 8:32:01
#52004/5/31 22:58:06
看完你这个~~~~~````会死人的~~~````



无敌小猪胖胖

职务:普通成员
等级:2
金币:0.0
发贴:234
注册:2004/8/29 18:21:27
#62004/5/31 23:06:54
虽然我是学这个的,看了还是很怕!!!!
真的会死人的!不骗你!!
快拿走!



海飞丝

职务:版主
等级:7
金币:8.6
发贴:5442
注册:2004/8/5 14:35:44
#72004/6/1 8:42:25
如果换成是过去,我一定会很有兴趣的来做,但现在太懒了




秀发去无踪,头屑更出众 —— 信赖海飞丝