typedef unsigned short num_range1;
typedef unsigned short num_range2;
typedef unsigned short error_num;
#define TRUE 1
#define FALSE 0
#define nil 0
typedef struct node *stu_p;
struct node {
num_range1 number;
char name[11];
char sex;
struct date birthdate;
num_range2 experience;
num_range2 force;
num_range2 smartness;
struct node *front;
struct node *next;
} ;
FILE *db_file; //text文件类型出错
struct node *head,
*current,
*last;
int count,
tmp;
char *command_line;//user command
/*字段缓冲变量*/
num_range1 number_c;
char name_c[11];
num_range2 experience_c;
char sex_c;
num_range2 force_c;
num_range2 smartness_c;
struct date birthdate_c;
/*过程和函数*/
student_database(); //是主函数
//布尔类型翻译出错
////////////////////////////////////
int check_number();
int check_sex();
int check_birthdate();
int check_experience();
int check_force();
int check_smartness();
///////////////////////////////////
error_num check_record();
int condition_select();
void output_title();
void output_it();
void modify_it();
void swap_it();
void delete_it();
void add_record();
void insert_it();
void save_record();
void close_database();
void output_record();
void del_record();
void find_record();
void sort_record();
void modify_record();
void read_record();
void input_record();
void insert_record();
void command_select();
void optimize();
int check_number (num_range1 check_object)
{
int function;
if ((check_object >= 1) && (check_object <= 1000))
function = TRUE;
else
function = FALSE;
return(function);
}
int check_sex (char check_object)
{
int function;
if (check_object=='m'||check_object=='M'||check_object=='f'||check_object=='M')
function = TRUE;
else
function = FALSE;
return(function);
}
int check_birthdate (struct date check_object)
{
int function;
if ((check_object.da_year >= 1000) && (check_object.da_year <= 3000))
if (check_object.da_mon==1||check_object.da_mon==3||
check_object.da_mon==5||check_object.da_mon==7||check_object.da_mon==8||
check_object.da_mon==10||check_object.da_mon==12)
if (check_object.da_day<=31&&check_object.da_day>=1)
function = TRUE;
else
function = FALSE;
else if (check_object.da_mon==4||check_object.da_mon==6||
check_object.da_mon==9||check_object.da_mon==11)
if (check_object.da_day<=30&&check_object.da_day>=1)
function = TRUE;
else
function = FALSE;
else if (check_object.da_mon == 2)
if ((check_object.da_year % 4 == 0) &&
(check_object.da_year % 100 != 0) ||
(check_object.da_year % 400 == 0))
if (check_object.da_day<=29&&check_object.da_day>=1)
function = TRUE;
else
function = FALSE;
else if (check_object.da_day<=28&&check_object.da_day>=1)
function = TRUE;
else
function = FALSE;
else
function = FALSE;
else
function = FALSE;
return(function);
}
int check_experience (num_range2 check_object)
{
int function;
if (check_object<=100&&check_object>=0)
function = TRUE;
else
function = FALSE;
return(function);
}
int check_force (num_range2 check_object)
{
int function;
if (check_object<=100&&check_object>=0)
function = TRUE;
else
function = FALSE;
return(function);
}
int check_smartness (num_range2 check_object)
{
int function;
if (check_object<=100&&check_object>=0)
function = TRUE;
else
function = FALSE;
return(function);
}
error_num check_record (num_range1 *number_c,char *sex_c,struct date *birthdate_c,
num_range2 *experience_c,num_range2 *force_c,num_range2 *smartness_c)
{
int err_p;
error_num function;
err_p = FALSE; /*CHECK NUMBER*/
if ((err_p == FALSE))
if (check_number(*number_c))
err_p = FALSE;
else {
err_p = TRUE;
function = 1;
} /*CHECK SEX*/
if ((err_p == FALSE))
if (check_sex(*sex_c))
err_p = FALSE;
else {
err_p = TRUE;
function = 2;
} /*CHECK BIRTHDATE_C*/
if ((err_p == FALSE))
if (check_birthdate(*birthdate_c))
err_p = FALSE;
else {
err_p = TRUE;
function = 3;
} /*CHECK experience*/
if ((err_p == FALSE))
if (check_experience(*experience_c))
err_p = FALSE;
else {
err_p = TRUE;
function = 4;
} /*CHECK force*/
if ((err_p == FALSE))
if (check_force(*force_c))
err_p = FALSE;
else {
err_p = TRUE;
function = 5;
} /*CHECK smartness*/
if ((err_p == FALSE))
if (check_smartness(*smartness_c))
err_p = FALSE;
else {
err_p = TRUE;
function = 6;
} /*RETURN ERR_NUMBER*/
if (err_p == FALSE)
function = 0;
return(function);
}
int condition_select (char *condition_message)
{
int condition_code;
int function;
printf("\n");
printf("%s\n",condition_message);
printf(" 1 record 2 No 3 name 4 sex\n");
printf(" 5 birthday 6 experience 7 force 8 smartness\n");
printf("\n");
printf("choise:(1~8)");
scanf("%d",&condition_code);
function = condition_code;
return(function);
}
void output_title(void)
{
printf("\n");
printf(" record no name sex birthday experience force smartness\n");
}
void output_it (struct node *c,int n)
{
printf("%7d",n); /*数据输出*/
printf("%7d",c->number);
printf("%10s",c->name);
printf("%6c",c->sex);
printf("%6d
/%2d/%2d",c->birthdate.da_year,c->birthdate.da_mon,
c->birthdate.da_day);
printf("%10d",c->experience);
printf("%10d",c->force);
printf("%10d",c->smartness);
printf("\n");
}
void modify_it (struct node *c,struct node *l,int n)
{
printf("modify %d input -1 ,still\n",n);
printf("record %d\n",n);
printf("No:");
scanf("%d",&number_c);
printf("name:");
gets(name_c);
gets(name_c);
printf("sex(M,F):");
scanf("%c",&sex_c);
printf("birthda_day(1978 16 1):");
scanf("%d %d %d",&birthdate_c.da_year,&birthdate_c.da_day,&birthdate_c.da_mon);
printf("experience:");
scanf("%d",&experience_c);
printf("force:");
scanf("%d",&force_c);
printf("smartness:");
scanf("%d",&smartness_c);
printf("\n");
if (number_c != - 1)
if (check_number(number_c))
c->number = number_c;
else
printf("out record\n");
if (strcmp(name_c,"-1") != 0)
strcpy (c->name,name_c);
if (sex_c != '-')
if (check_sex(sex_c))
c->sex = sex_c;
else
printf("sex error\n");
if ((birthdate_c.da_year != - 1) && (birthdate_c.da_mon != - 1) &&
(birthdate_c.da_day != - 1))
if (check_birthdate(birthdate_c))
c->birthdate = birthdate_c;
else
printf("birthday error\n");
if (experience_c != - 1)
if (check_experience(experience_c))
c->experience = experience_c;
else
printf("experience error\n");
if (force_c != - 1)
if (check_force(force_c))
c->force = force_c;
else
printf("force error\n");
if (smartness_c != - 1)
if (check_smartness(smartness_c))
c->smartness = smartness_c;
else
printf("smartness error\n");
}
void swap_it (struct node **current,struct node **last,struct node **c_bak,struct node **l_bak)
{
/*用于排序*/
struct node *tmp_c,
*tmp_l;
/*使C_BAK总是指向链表尾部*/
if (((*current)->front->front == nil) && (*last == nil)) {
/*STATUS=4*/
/*ONLY TWO*/ *current = (*current)->front;
head = *c_bak;
(*current)->front = head;
(*c_bak)->next = *current;
(*current)->next = nil;
*last = nil;
*c_bak = *current;
*l_bak = nil;
} /*LAST ONE*/
else if (((*current)->front->front != nil) && (*last == nil)) {
*current = (*current)->front;
(*current)->front->next = *c_bak;
(*c_bak)->front = (*current)->front;
(*c_bak)->next = *current;
(*current)->front = *c_bak;
(*current)->next = nil;
*last = (*current)->next;
*c_bak = *current;
*l_bak = *last;
} /*SECOND ONE*/
else if (((*current)->front->front == nil) && (*last != nil)) {
head = *current;
*current = (*current)->front;
head->next->front = *current;
(*current)->next = head->next;
head->front = nil;
head->next = *current;
(*current)->front = head;
*last = (*current)->next;
} /*MEDIUM*/
else {
tmp_c = *current;
*current = (*current)->front;
(*current)->front->next = tmp_c;
tmp_c->next->front = *current;
tmp_c->front = (*current)->front;
(*current)->next = tmp_c->next;
tmp_c->next = *current;
(*current)->front = tmp_c;
}
}
void delete_it (struct node **current,struct node **last)
{
/*可以自动后移指针*/
struct node *tmp;
if ((*current == head) && (*last == nil)) { /*statue = 4*/
/*ONLY ONE*/
free(*current);
head = nil;
*current = nil;
*last = nil;
count = 0;
} /*LAST ONE*/
else if ((*current != head) && (*last == nil)) {
*current = (*current)->front;
free(*current);
(*current)->next = *last;
count = count - 1;
} /*FIRST ONE*/
else if ((*current == head) && (*last != nil)) {
head = *last;
free(*current);
*current = head;
(*current)->front = nil;
*last = (*current)->next;
count = count - 1;
}
else {
(*current)->front->next = (*current)->next;
(*current)->next->front = (*current)->front;
tmp = *current;
*current = *last;
*last = (*current)->next;
free(tmp);
tmp = nil;
count = count - 1;
} /*IF*/
}
/*PROCEDURE*/
void add_record (void)
{
struct node *tmp;
if (head == nil) {
tmp = (stu_p) malloc (sizeof(struct node));
head = tmp;
head->next = nil;
current = head;
current->front = nil;
last = current->next;
}
else {
tmp = (stu_p) malloc (sizeof(struct node));
tmp->next = nil;
current->next = tmp;
tmp->front = current;
current = tmp;
last = current->next;
} /*数据赋值*/
current->number = number_c;
strcpy (current->name,name_c);
current->sex = sex_c;
current->birthdate = birthdate_c;
current->experience = experience_c;
current->force = force_c;
current->smartness = smartness_c;
count = count + 1;
}
void insert_it (struct node **c,int n,int *p)
{
struct node *insert;
error_num err;
*p = 0;
printf("record %d\n",n);
printf("No:");
scanf("%d",&number_c);
printf("name:");
gets(name_c);
gets(name_c);
printf("sex(M,F):");
scanf("%c",&sex_c);
printf("birthda_day(1978 16 1):");
scanf("%d %d %d",&birthdate_c.da_year,&birthdate_c.da_day,&birthdate_c.da_mon);
printf("experience:");
scanf("%d",&experience_c);
printf("force:");
scanf("%d",&force_c);
printf("smartness:");
scanf("%d",&smartness_c);
printf("\n");
err = check_record(&number_c,&sex_c,&birthdate_c,&experience_c,
&force_c,&smartness_c);
switch (err) {
case 0:
add_record();
n = n + 1;
*p=1;
break;
case 1:
printf("no wrong:1-1000\n");
printf("try again\n");
break;
case 2:
printf("sex wrong:M male F female\n");
printf("try again\n");
break;
case 3:
printf("birthday wrong:1978 1 16\n");
printf("try again\n");
break;
case 4:
printf("experience wrong:0-100\n");
printf("try again\n");
break;
case 5:
printf("force wrong:0-100\n");
printf("try again\n");
bre
ak;
case 6:
printf("smartness wrong:0-100\n");
printf("try again\n");
break;
}
if (*p == 1) { /*NO DATA*/
if (*c == nil) {
add_record();
} /*FIRST ONE*/
else if (*c == head) {
insert = (stu_p) malloc (sizeof(struct node));
insert->front = nil;
insert->next = nil;
head->front = insert;
insert->next = head;
head = insert;
insert->number = number_c;
strcpy (insert->name,name_c);
insert->sex = sex_c;
insert->birthdate = birthdate_c;
insert->experience = experience_c;
insert->force = force_c;
insert->smartness = smartness_c;
count = count + 1;
}
else {
insert = (stu_p) malloc (sizeof(struct node));
insert->front = nil;
insert->next = nil;
(*c)->front->next = insert;
insert->front = (*c)->front;
(*c)->front = insert;
insert->next = *c;
insert->number = number_c;
strcpy (insert->name,name_c);
insert->sex = sex_c;
insert->birthdate = birthdate_c;
insert->experience = experience_c;
insert->force = force_c;
insert->smartness = smartness_c;
count = count + 1;
}
}
}
void save_record (void)
{
int n;
char path[81];
struct node *c,
*l;
if (head == nil)
printf("no record\n");
else {
n = 0; /*文件初始化*/
printf("\n");
printf("write file name ps:pb.TXT:\n");
gets(path);
db_file=fopen(path,"wt"); /*指针初始化*/
c = head;
l = head->next;
fprintf(db_file,"%d\n",count); /*写入最大记录数*/
while (c != nil) { /*数据输出*/
fprintf(db_file,"%d",c->number);
fprintf(db_file,"%10s",c->name);
fprintf(db_file,"%2lc",c->sex);
fprintf(db_file,"%5d%3d%3d",c->birthdate.da_year,
c->birthdate.da_day,c->birthdate.da_mon);
fprintf(db_file,"%4d",c->experience);
fprintf(db_file,"%4d",c->force);
fprintf(db_file,"%4d",c->smartness);
fprintf(db_file,"\n");
n = n + 1;
c = l;
l = c->next;
}
fclose(db_file); /*保护代码*/
if (n != count)
printf("sum of record wrong\n");
printf("have been saved\n");
}
}
void close_database (int n)
{
/*N为内部使用,信息显示开关*/
struct node *c,
*l;
int i;
char pan;
if (head != nil) {
c = head;
l = c->next;
pan = ' ';
if (n == 1) {
printf("\n");
printf("save database?(Y/N)\n");
scanf("%c",&pan);
if (pan == 'Y')
save_record();
printf("\n");
}
for (i = 1; i <= count; i++)
delete_it(&c,&l);
head = nil;
current = nil;
last = nil;
count = 0;
if (n == 1)
printf("database close\n");
}
}
void output_record (void)
{
int n,
i;
struct node *c,
*l;
if (head == nil)
printf("no record\n");
else {
n = 1; /*指针初始化*/
c = head;
l = head->next;
output_title();
for (i = 1; i <= count; i++) {
output_it(c,n);
n = n + 1;
c = l;
l = c->next;
}
}
}
void del_record(void)
{
int condition_code;
int i,
deleted_num;
/* long_c,long_d : (* UNDEFINED TYPE: longint *);
Error 4: type expected: ; */
/* UNDEFINED TYPE: longint */
int long_c,long_d;
int del_num;
num_range1 del_number;
char del_name[11];
char del_sex;
struct date del_birthdate;
num_range2 del_experience;
num_range2 del_force;
num_range2 del_smartness;
struct node *c_bak,
*l_bak;
condition_code = condition_select("del condition:"); /*PROTECT*/
c_bak = current;
l_bak = last;
switch (condition_code) {
case 1:
printf("\n");
printf("record:");
scanf("%d",&del_num);
if ((del_num >= 1) && (del_num <= count)) {
if (head != nil) {
current = nil;
last = nil; /*FIND NODE*/
for (i = 1; i <= del_num; i++) {
if (i == 1) {
current = head;
last = current->next;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
delete_it(¤t,&last);
printf(" record %d delete\n",del_num);
}
else
printf("no record like u need\n");
}
else
printf("out record\n");
break; /*1*/
case 2:
printf("\n");
printf("no:");
scanf("%d",&del_number);
if ((del_number >= 1) && (del_number <= 1000)) {
if (head != nil) {
current = head;
last = current->next;
deleted_num = 0;
for (i = 1; i <= count; i++) {
if (current->number == del_number) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("no record like u need\n");
}
else
printf("out record\n");
break; /*2*/
case 3:
printf("\n");
printf("name:");
gets(del_name);
if (head != nil) {
current = head;
last = current->next;
deleted_num = 0;
for (i = 1; i <= count; i++) {
if (strcmp(current->name,del_name) == 0) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("out record\n");
break;
case 4:
printf("\n");
printf("sex:");
scanf("%c",&del_sex);
if (head != nil) {
current = head;
last = current->next;
deleted_num = 0;
for (i = 1; i <= count; i++) {
if ((current->sex == del_sex)) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("out record\n");
break;
case 5:
printf("\n");
printf("birthday:");
scanf("%d%d%d",&del_birthdate.da_year,&del_birthdate.da_mon,
&del_birthdate.da_day);
if (head != nil) {
current = head;
last = current->next;
de
leted_num = 0;
long_d = del_birthdate.da_year;
long_d = long_d * 100;
long_d = long_d + del_birthdate.da_mon;
long_d = long_d * 100;
long_d = long_d + del_birthdate.da_day;
for (i = 1; i <= count; i++) {
long_c = current->birthdate.da_year;
long_c = long_c * 100;
long_c = long_c + current->birthdate.da_mon;
long_c = long_c * 100;
long_c = long_c + current->birthdate.da_day;
if ((long_c == long_d)) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
}
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("out record\n");
break;
case 6:
printf("\n");
printf("experience:");
scanf("%d",&del_experience);
if (head != nil) {
current = head;
last = current->next;
deleted_num = 0;
for (i = 1; i <= count; i++) {
if ((current->experience == del_experience)) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("out record\n");
break;
case 7:
printf("\n");
printf("force:");
scanf("%d",&del_force);
if (head != nil) {
current = head;
last = current->next;
deleted_num = 0;
for (i = 1; i <= count; i++) {
if ((current->force == del_force)) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("out record\n");
break;
case 8:
printf("\n");
printf("smartness:");
scanf("%d",&del_smartness);
if (head != nil) {
current = head;
last = current->next;
deleted_num = 0;
for (i = 1; i <= count; i++) {
if ((current->smartness == del_smartness)) {
delete_it(¤t,&last);
deleted_num = deleted_num + 1;
}
else {
current = last;
last = current->next;
} /*IF*/
} /*FOR*/
if (deleted_num != 0)
printf(" record %d delete\n",deleted_num);
else
printf("no record like u need\n");
}
else
printf("out record\n");
break;
default:
printf("delete error\n");
break;
} /*CASE*/
if (last != nil) {
current = c_bak;
last = l_bak;
}
}
void find_record (void)
{
int condition_code;
int i,
found_num;
/* long_c,long_f : (* UNDEFINED TYPE: longint *);
Error 4: type expected: ; */
/* UNDEFINED TYPE: longint */
int long_c,long_f;
struct node *c,
*l;
int find_num;
num_range1 find_number;
char find_name[11];
char find_sex;
struct date find_birthdate;
num_range2 find_experience;
num_range2 find_force;
num_range2 find_smartness;
condition_code = condition_select("find condition:");
switch (condition_code) {
case 1:
printf("\n");
printf("record:");
scanf("%d",&find_num);
if ((find_num >= 1) && (find_num <= count)) {
if (head != nil) {
c = nil;
l = nil;
found_num = 1; /*FIND NODE*/
for (i = 1; i <= find_num; i++) {
if (i == 1) {
c = head;
l = c->next;
}
else {
c = l;
l = c->next;
} /*IF*/
} /*FOR*/
output_title();
output_it(c,find_num);
printf("find %d\n",found_num);
}
else
printf("no record\n");
}
else
printf("out record\n");
break;
case 2:
printf("\n");
printf("no:");
scanf("%d",&find_number);
if (head != nil) {
c = head;
l = c->next;
found_num = 0;
output_title();
for (i = 1; i <= count; i++) {
if (c->number == find_number) {
output_it(c,i);
found_num = found_num + 1;
c = l;
c = c->next;
}
else {
c = l;
l = c->next;
} /*IF*/
} /*FOR*/
if (found_num != 0)
printf("find %d\n",found_num);
else
printf("no record\n");
}
else
printf("out record\n");
break;
case 3:
printf("\n");
printf("name:");
gets(find_name);
if (head != nil) {
c = head;
l = c->next;
found_num = 0;
output_title();
for (i = 1; i <= count; i++) {
if (strcmp(c->name,find_name) == 0) {
output_it(c,i);
found_num = found_num + 1;
c = l;
c = c->next;
}
else {
c = l;
l = c->next;
} /*IF*/
} /*FOR*/
if (found_num != 0)
printf("find %d\n",found_num);
else
printf("no record\n");
}
else
printf("out record\n");
break;
case 4:
printf("\n");
printf("sex:");
scanf("%c",&find_sex);
if (head != nil) {
c = head;
l = c->next;
found_num = 0;
output_title();
for (i = 1; i <= count; i++) {
if (c->sex == find_sex) {
output_it(c,i);
found_num = found_num + 1;
c = l;
c = c->next;
}
else {
c = l;
l = c->next;
} /*IF*/
} /*FOR*/
if (found_num != 0)
printf("find %d\n",found_num);
else
printf("no record\n");
}
else
printf("out record\n");
break;
case 5:
printf("\n");
printf("birthday:");
scanf("%d%d%d",&find_birthdate.da_year,&find_birthdate.da_mon,
&find_birthdate.da_day);
if (head != nil) {
c = head;
l = c->next;
found_num = 0;
output_title();
long_f = find_birthdate.da_year;
long_f = long_f * 100;
long_f = long_f + find_birthdate.da_mon;
long_f = long_f * 100;
long_f = long_f + find_birthdate.da_day;
for (i = 1; i <= count; i++) {
long_c = c->birthdate.da_year;
long_c = long_c * 100;
long_c = long_c + c->birthdate.da_mon;
long_c = long_c * 100;
long_c = long_c + c->birthdate.da_day;
if (long_c == long_f) {
output_it(c,i);
found_num = found_num + 1;
c = l;
c = c->next;
}
else {
c = l;
l = c->next;
}
} /*FOR*/
if (found_num != 0)
printf("find %d\n",found_num);
else
printf
("no record\n");
}
else
printf("out record\n");
break;
case 6:
printf("\n");
printf("experience:");
scanf("%d",&find_experience);
if (head != nil) {
c = head;
l = c->next;
found_num = 0;
output_title();
for (i = 1; i <= count; i++) {
if (c->experience == find_experience) {
output_it(c,i);
found_num = found_num + 1;
c = l;
l = c->next;
}
else {
c = l;
l = c->next;
} /*IF*/
} /*FOR*/
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |