diff --git a/SIMager.h b/SIMager.h new file mode 100644 index 0000000..96e2284 --- /dev/null +++ b/SIMager.h @@ -0,0 +1,65 @@ +// +// SIMager.h +// SIManager +// +// Created by Eric on 15-8-16. +// Copyright (c) 2015年 Eric. All rights reserved. +// + +#ifndef SIManager_SIMager_h +#define SIManager_SIMager_h + +#include +#include +#include +#include +#include + +#define MAX_NUM 64 +#define PASSED_MAX 12 +#define WEIGHT_LENGTH_SQUARE 50 +#define HEIGHT_LENGTH_SQUARE 4 +#define MENU_NUM 4 +#define MENU_WEIGHT 3 +#define MENU_COMTEST 3 +#define MENU_1 "1.Add Students Information" +#define MENU_2 "2.Search Students Information" +#define MENU_3 "3.Delete Students Information" +#define MENU_4 "4.Change Password" + +//SYSTEM DIFFERENT (WINNDOWS: Clear = Cls) +#define CLEAR system("clear"); + +struct _students{ + char name[12]; + char class[6]; + char year[6]; + char number[28]; +}; +struct student{ + struct _students stu_info; + struct student *next; + struct student *front; +} students; + +typedef struct student stuc; + +void start_printf (int menu_number, char *MENU[]); +int add_info (int const max_count); + +int search_info_menu(void); +stuc *search_info_read(void); +stuc *search_info_name(stuc *head); +stuc *search_info_class(stuc *head); +stuc *search_info_year(stuc *head); +stuc *search_info_number(stuc *head); +int delete_info_printf(stuc *head, stuc *r_head); +int search_info_printf(stuc *head); + +int delete_data_menu (void); +void passwd_set (void); +void passwd_pass (void); +void menu_main (void); +char choice (char *string); + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..8b58c2d --- /dev/null +++ b/main.c @@ -0,0 +1,848 @@ +// +// main.c +// SIManager +// +// Created by Eric on 15-7-6. +// Copyright (c) 2015年 Eric. All rights reserved. +// + +#include "SIMager.h" + +int main(int argc, const char * argv[]) { + CLEAR passwd_pass(); + + return 0; +} + +//PAINT MENU +void start_printf (int menu_number, char *MENU[]){ + + for (int i = 0; i < WEIGHT_LENGTH_SQUARE; i++) printf("■"); + printf("\n"); + for (int i = 0; i < menu_number; i++ ){ + printf("■"); + for (int j = 0; j 0){ + count = 0; + printf("Input the password (Chance : %d) : ",c_count); + char temp = '0'; + while ((count < PASSED_MAX)&& (temp != '\n')){ + passwd [count] = getchar(); + temp = passwd [count]; + count++; + } + passwd[--count] = '\0'; + int pass = 0; + char r_passwd[12]; + FILE *fp = fopen("passwd.db", "r"); + fscanf(fp,"%s",r_passwd); + fclose(fp); + if (strcmp(passwd,r_passwd) == 0) pass =1; + if (pass == 1){ + CLEAR menu_main(); + break; + } + else { + printf("Wrong,try again!\n"); + c_count--; + } + } +} + +//ADD STUDENTS INFO +int add_info (int const max_count){ + int *count = (int*) malloc(sizeof(int)); + int w_ifnot = 0; + stuc *head = NULL; + *count = 1; + stuc *stu = NULL, *stu_last = NULL; + struct _students *stu_s; + while((*count) <= max_count){ + w_ifnot = 0; + for (int i = 0; i < 20-(*count % 10); i++ ) printf("■"); + printf("[ %d ] of [ %d ]",*count,max_count); + for (int i = 0; i < 20-(*count % 10); i++ ) printf("■"); + printf("\n"); + char u_name[12],u_class[6],u_year[6],u_number[28] = ""; + printf("NAME: "); + scanf("%s",u_name); + printf("CLASS: "); + scanf("%s",u_class); + printf("YEAR: "); + scanf("%s",u_year); + int int_uname = (int)u_name[0], int2_uname = (int)u_name[1]; + char u1_name[4] = {'0','0','0','\0'}, u2_name[4] = {'0','0','0','\0'}; + char c_rand[4]={'0','0','0','\0'}; + for (int i = 2; i >= 0;i--){ + u1_name[i] = (int_uname%10)+48; + int_uname/=10; + } + for (int i = 2; i >= 0;i--){ + u2_name[i] = (int2_uname%10)+48; + int2_uname/=10; + } + + srand((unsigned int)time(0)); + int int_rand = (rand()%1000); + for (int i = 2; i >= 0;i--){ + c_rand[i] = (int_rand%10)+48; + int_rand/=10; + } + strcat(u_number, u_year); + strcat(u_number, u_class); + strcat(u_number, u1_name); + strcat(u_number, u2_name); + strcat(u_number, c_rand); + + printf("NUMBER: %s\n",u_number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE+2; i++ ) printf("■"); + printf("\n"); + printf("YES?(y or n): "); + char yon = 'y'; + getchar(); + scanf("%c",&yon); + switch (yon) { + case 'y': + w_ifnot = 1; + break; + case '\n': + w_ifnot = 1; + break; + default: + w_ifnot = 0; + break; + } + if (w_ifnot == 1){ + stu = (stuc*) malloc(sizeof(stuc)); + stu_s = &stu->stu_info; + strcpy(stu_s->name,u_name); + strcpy(stu_s->class,u_class); + strcpy(stu_s->year,u_year); + strcpy(stu_s->number,u_number); + (*count)++; + } + if ((head == NULL) && (w_ifnot == 1)){ + head = stu; + stu_last = head; + } + else if ((head != NULL) && (w_ifnot == 1)){ + stu_last->next = stu; + stu_last = stu; + if(*count == max_count) stu->next = NULL; + } + CLEAR } + + stu = head; + FILE *fp; + fp = fopen("stuinfo.db", "a+"); + if (fp == NULL) { + printf("ERROR IN OPEN FILE!"); + return -1; + } + for (int i = 0; i < max_count; i++){ + stu_s = &stu->stu_info; + fprintf(fp, "%s\n",stu_s->name); + fprintf(fp, "%s\n",stu_s->class); + fprintf(fp, "%s\n",stu_s->year); + fprintf(fp, "%s\n",stu_s->number); + stu = stu->next; + } + + + fclose(fp); + free(count); + //内存泄漏问题(); + + // + count = NULL; + printf("Done,any key to continue...\n"); + getchar();getchar(); + + return 0; + + } + +//MENU OF SEARCH +int search_info_menu(){ + + char *SEARCH_MENU[5] = { + " SEARCH", + "1.NAME", + "2.CLASS", + "3.YEAR", + "4.NUMBER", + }; + start_printf(5, SEARCH_MENU); + int ifnot = 1; + stuc *head, *s_head; + while (ifnot){ + char choices = choice("Choose the number (q to quit): "); + switch(choices){ + case '1': + head = search_info_read(); + s_head = search_info_name(head); + search_info_printf(s_head); + ifnot = 0; + break; + case '2': + head = search_info_read(); + s_head = search_info_class(head); + search_info_printf(s_head); + ifnot = 0; + break; + case '3': + head = search_info_read(); + s_head = search_info_year(head); + search_info_printf(s_head); + ifnot = 0; + break; + case '4': + head = search_info_read(); + s_head = search_info_number(head); + search_info_printf(s_head); + ifnot = 0; + break; + case 'q': + ifnot = 0; + break; + default: + printf("Wrong,please try again!\n"); + break; + } + + } + return 0; +} + +//READ FILE TO MAKE TABLE +stuc *search_info_read(){ + FILE *fp = fopen("stuinfo.db", "r"); + if (fp == NULL){ + printf("ERROR IN OPEN FILE!"); + return NULL; + } + stuc *stu = NULL, *head = NULL, *stu_last = NULL; + struct _students *stu_s = NULL; + stu = (stuc*) malloc(sizeof(stuc)); + stu_s = &stu->stu_info; + while (fscanf(fp,"%s",stu_s->name) != EOF){ + fscanf(fp, "%s",stu_s->class); + fscanf(fp, "%s",stu_s->year); + fscanf(fp, "%s",stu_s->number); + if (head == NULL){ + head = stu; + stu_last = head; + stu->front = NULL; + } + else { + stu_last->next = stu; + stu->front = stu_last; + stu_last = stu; + } + stu = (stuc*) malloc(sizeof(stuc)); + stu_s = &stu->stu_info; + } + stu->next = NULL; + fclose(fp); + return head; +} + +//SERACH INFO FROM CLASS +stuc *search_info_class(stuc *head){ + printf("CLASS: "); + char s_class[6]= {'\0','\0','\0','\0','\0','\0'}; + scanf("%s",s_class); + CLEAR stuc *p_head = head, *s_head = NULL,*s_stu = NULL, *s_stu_last = NULL; + struct _students *p_head_s = &p_head->stu_info; + struct _students *s_head_s = NULL; + p_head_s = &p_head->stu_info; + int ifnot = 0; + while (p_head != NULL){ + if (strcmp(p_head_s->class, s_class) == 0){ + ifnot = 1; + s_stu = (stuc*) malloc(sizeof(stuc)); + s_head_s = &s_stu->stu_info; + strcpy(s_head_s->name,p_head_s->name); + strcpy(s_head_s->class,p_head_s->class); + strcpy(s_head_s->year,p_head_s->year); + strcpy(s_head_s->number,p_head_s->number); + if(s_head == NULL){ + s_head = s_stu; + s_stu_last = s_head; + s_head->front = NULL; + } + else { + s_stu_last->next = s_stu; + s_stu->front = s_stu_last; + s_stu_last = s_stu; + } + } + p_head = p_head->next; + p_head_s = &p_head->stu_info; + } + if (ifnot){ + s_stu->next = NULL; + } + else{ + return NULL; + } + return s_head; +} + +//SERACH INFO FROM NAME +stuc *search_info_name(stuc *head){ + printf("NAME: "); + char s_name[12]; + scanf("%s",s_name); + CLEAR stuc *p_head = head, *s_head = NULL,*s_stu = NULL, *s_stu_last = NULL; + struct _students *p_head_s = &p_head->stu_info; + struct _students *s_head_s = NULL; + p_head_s = &p_head->stu_info; + int ifnot = 0; + while (p_head != NULL){ + if (strcmp(p_head_s->name, s_name) == 0){ + ifnot = 1; + s_stu = (stuc*) malloc(sizeof(stuc)); + s_head_s = &s_stu->stu_info; + strcpy(s_head_s->name,p_head_s->name); + strcpy(s_head_s->class,p_head_s->class); + strcpy(s_head_s->year,p_head_s->year); + strcpy(s_head_s->number,p_head_s->number); + if(s_head == NULL){ + s_head = s_stu; + s_stu_last = s_head; + s_head->front = NULL; + } + else { + s_stu_last->next = s_stu; + s_stu->front = s_stu_last; + s_stu_last = s_stu; + } + } + p_head = p_head->next; + p_head_s = &p_head->stu_info; + } + if (ifnot){ + s_stu->next = NULL; + } + else{ + return NULL; + } + + return s_head; +} + + +//SERACH INFO FROM YEAR +stuc *search_info_year(stuc *head){ + + printf("YEAR: "); + char s_year[12]; + scanf("%s",s_year); + CLEAR stuc *p_head = head, *s_head = NULL,*s_stu = NULL, *s_stu_last = NULL; + struct _students *p_head_s = &p_head->stu_info; + struct _students *s_head_s = NULL; + p_head_s = &p_head->stu_info; + int ifnot = 0; + while (p_head != NULL){ + if (strcmp(p_head_s->year, s_year) == 0){ + ifnot = 1; + s_stu = (stuc*) malloc(sizeof(stuc)); + s_head_s = &s_stu->stu_info; + strcpy(s_head_s->name,p_head_s->name); + strcpy(s_head_s->class,p_head_s->class); + strcpy(s_head_s->year,p_head_s->year); + strcpy(s_head_s->number,p_head_s->number); + if(s_head == NULL){ + s_head = s_stu; + s_stu_last = s_head; + s_head->front = NULL; + } + else { + s_stu_last->next = s_stu; + s_stu->front = s_stu_last; + s_stu_last = s_stu; + } + } + p_head = p_head->next; + p_head_s = &p_head->stu_info; + } + if (ifnot){ + s_stu->next = NULL; + } + else{ + return NULL; + } + CLEAR return s_head; +} + +//SERACH INFO FROM NUMBER +stuc *search_info_number(stuc *head){ + + printf("NUMBER: "); + char s_number[28]; + scanf("%s",s_number); + CLEAR stuc *p_head = head, *s_head = NULL,*s_stu = NULL, *s_stu_last = NULL; + struct _students *p_head_s = &p_head->stu_info; + struct _students *s_head_s = NULL; + p_head_s = &p_head->stu_info; + int ifnot = 0; + while (p_head != NULL){ + if (strcmp(p_head_s->number, s_number) == 0){ + ifnot = 1; + s_stu = (stuc*) malloc(sizeof(stuc)); + s_head_s = &s_stu->stu_info; + strcpy(s_head_s->name,p_head_s->name); + strcpy(s_head_s->class,p_head_s->class); + strcpy(s_head_s->year,p_head_s->year); + strcpy(s_head_s->number,p_head_s->number); + if(s_head == NULL){ + s_head = s_stu; + s_stu_last = s_head; + s_head->front = NULL; + } + else { + s_stu_last->next = s_stu; + s_stu->front = s_stu_last; + s_stu_last = s_stu; + } + } + p_head = p_head->next; + p_head_s = &p_head->stu_info; + } + if (ifnot){ + s_stu->next = NULL; + } + else{ + return NULL; + } + CLEAR return s_head; +} + + +//PRINTF THE RESULT OF THE SEARCH +int search_info_printf(stuc *head){ + stuc *p_head = head; + int count = 0; + if(head == NULL){ + char *PRINTF_MENU[5] = { + " Not Found", + }; + start_printf(1, PRINTF_MENU); + printf("Done!(Any key to continue...)"); + getchar();getchar(); + CLEAR return 0; + }; + struct _students *p_head_s = &p_head->stu_info; + int ifnot = 1; + char input = 'e'; + while (ifnot){ + if ((input == 'w') && (p_head != NULL)){ + CLEAR if (p_head->next != NULL){ + count++; + p_head = p_head->next; + p_head_s = &p_head->stu_info; + } + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("[ %d ]", count); + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("\n"); + printf("NAME: %s\n",p_head_s->name); + printf("CLASS: %s\n",p_head_s->class); + printf("YEAR: %s\n",p_head_s->year); + printf("NUMBER: %s\n",p_head_s->number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE-7; i++ ) printf("■"); + printf("\n"); + } + else if ((input == 's') && (p_head != NULL)){ + CLEAR if (p_head->front != NULL){ + p_head = p_head->front; + p_head_s = &p_head->stu_info; + count--; + } + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("[ %d ]", count); + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("\n"); + printf("NAME: %s\n",p_head_s->name); + printf("CLASS: %s\n",p_head_s->class); + printf("YEAR: %s\n",p_head_s->year); + printf("NUMBER: %s\n",p_head_s->number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE-7; i++ ) printf("■"); + printf("\n"); + } + else if ((input == 'e') && (p_head != NULL)){ + count++; + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("[ %d ]", count); + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("\n"); + printf("NAME: %s\n",p_head_s->name); + printf("CLASS: %s\n",p_head_s->class); + printf("YEAR: %s\n",p_head_s->year); + printf("NUMBER: %s\n",p_head_s->number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE-7; i++ ) printf("■"); + printf("\n"); + } + else{ + + } + + if ((p_head->front == NULL) && (input != 'q')){ + printf("■:This is the first element in the list.\n"); + } + + if ((p_head->next == NULL) && (input != 'q')){ + printf("■:This is the last element of the list.\n"); + } + + getchar(); + printf("INPUT: w:Page down s:Page up q:Quit\n"); + printf("INPUT: "); + input = getchar(); + + if (input == 'q'){ + ifnot = 0; + } + } + + printf("Done,any key to continue...\n"); + getchar();getchar(); + return 0; +} + +void passwd_set (void){ + CLEAR printf("Please enter the administrator password: "); + char o_passwd[12]; + scanf("%s",o_passwd); + FILE *fp = fopen("passwd.db","r"); + char r_passwd[12]; + fscanf(fp,"%s",r_passwd); + fclose(fp); + if(strcmp(o_passwd, r_passwd) == 0 ){ + int ifnot = 1; + while (ifnot) { + printf("Input the new password: "); + char n_passwd[12]; + scanf("%s",n_passwd); + printf("Input the new password again: "); + char n2_passwd[12]; + scanf("%s",n2_passwd); + if(strcmp(n2_passwd, n_passwd) == 0){ + fp = fopen("passwd.db", "w"); + fprintf(fp,"%s",n_passwd); + fclose(fp); + ifnot = 0; + printf("Done,any key to continue..."); + getchar();getchar(); + CLEAR } + else{ + printf("Not the same!(Any key to continue...)"); + getchar();getchar(); + CLEAR } + + } + } + else{ + printf("Wrong!(Any key to continue...)"); + getchar();getchar(); + CLEAR } + +} + + +int delete_data_menu (void){ + CLEAR char *DELETE_MENU[5]={ + " Delete From", + "1.Name", + "2.Class", + "3.Year", + "4.Number" + }; + + start_printf(5, DELETE_MENU); + int ifnot = 1; + stuc *head, *s_head; + while (ifnot){ + char choices = choice("Choose the number (q to quit): "); + switch(choices){ + case '1': + head = search_info_read(); + s_head = search_info_name(head); + delete_info_printf(s_head, head); + ifnot = 0; + break; + case '2': + head = search_info_read(); + s_head = search_info_class(head); + delete_info_printf(s_head, head); + ifnot = 0; + break; + case '3': + head = search_info_read(); + s_head = search_info_year(head); + delete_info_printf(s_head, head); + ifnot = 0; + break; + case '4': + head = search_info_read(); + s_head = search_info_number(head); + delete_info_printf(s_head, head); + ifnot = 0; + break; + case 'q': + ifnot = 0; + break; + default: + printf("Wrong,please try again!\n"); + break; + } + } + return 0; +} + +//PRINTF THE RESULT OF THE SEARCH +int delete_info_printf(stuc *head, stuc *r_head){ + if(head == NULL){ + char *PRINTF_MENU[5] = { + " Not Found", + }; + start_printf(1, PRINTF_MENU); + printf("Done!(Any key to continue...)"); + getchar();getchar(); + CLEAR return 0; + } + stuc *p_head = head; + int count = 1; + struct _students *p_head_s = &p_head->stu_info; + int ifnot = 1; + char input = 'e'; + while (ifnot){ + int e_ifnot = 0; + if ((input == 'w') && (p_head != NULL)){ + CLEAR if (p_head->next != NULL){ + count++; + p_head = p_head->next; + p_head_s = &p_head->stu_info; + } + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("[ %d ]", count); + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("\n"); + printf("NAME: %s\n",p_head_s->name); + printf("CLASS: %s\n",p_head_s->class); + printf("YEAR: %s\n",p_head_s->year); + printf("NUMBER: %s\n",p_head_s->number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE-7; i++ ) printf("■"); + printf("\n"); + } + else if ((input == 's') && (p_head != NULL)){ + CLEAR if (p_head->front != NULL){ + p_head = p_head->front; + p_head_s = &p_head->stu_info; + count--; + } + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("[ %d ]", count); + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("\n"); + printf("NAME: %s\n",p_head_s->name); + printf("CLASS: %s\n",p_head_s->class); + printf("YEAR: %s\n",p_head_s->year); + printf("NUMBER: %s\n",p_head_s->number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE-7; i++ ) printf("■"); + printf("\n"); + } + else if ((input == 'e') && (p_head != NULL)){ + p_head_s = &p_head->stu_info; + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("[ %d ]", count); + for (int i = 0; i < 20-(count % 10); i++ ) printf("■"); + printf("\n"); + printf("NAME: %s\n",p_head_s->name); + printf("CLASS: %s\n",p_head_s->class); + printf("YEAR: %s\n",p_head_s->year); + printf("NUMBER: %s\n",p_head_s->number); + for (int i = 0; i < WEIGHT_LENGTH_SQUARE-7; i++ ) printf("■"); + printf("\n"); + } + else if (input == 'd'){ + stuc *p_front, *p_next, *pr_head = r_head; + struct _students *r_head_s; + while(pr_head != NULL){ + r_head_s = &pr_head->stu_info; + if (strcmp(r_head_s->number, p_head_s->number) == 0) { + p_front = pr_head->front; + p_next = pr_head->next; + if (p_front != NULL){ + p_front->next = p_next; + } + if (p_next != NULL){ + p_next->front = p_front; + } + if (p_front == NULL){ + pr_head = p_next; + r_head = pr_head; + } + pr_head = NULL; + } + else{ + pr_head = pr_head->next; + } + } + if (p_head != NULL){ + p_front = p_head -> front; + p_next = p_head -> next; + if (p_front != NULL){ + p_front->next = p_next; + } + if (p_next != NULL){ + p_next->front = p_front; + } + if (p_next == NULL){ + p_head = p_front; + count--; + } + else if(p_front == NULL){ + p_head = p_next; + count++; + } + else if((p_front == NULL) && (p_next == NULL)){ + p_head = NULL; + } + else{ + p_head = p_head -> next; + } + e_ifnot = 1; + } + } + else{ + + } + + if ((e_ifnot == 0) && (p_head != NULL)) { + if ((p_head->front == NULL) && (input != 'q')){ + printf("■:This is the first element in the list.\n"); + } + if ((p_head->next == NULL) && (input != 'q')){ + printf("■:This is the last element of the list.\n"); + } + getchar(); + printf("INPUT: w:Page down s:Page up d:delete q:Quit\n"); + printf("INPUT: "); + input = getchar(); + } + if ((e_ifnot == 1) && (p_head != NULL)){ + input = 'e'; + CLEAR } + + if (input == 'q' ){ + ifnot = 0; + } + + if(p_head == NULL){ + char *PRINTF_MENU[5] = { + " Not Found", + }; + start_printf(1, PRINTF_MENU); + break; + } + } + FILE *fp = fopen("stuinfo.db", "w"); + if (fp == NULL) { + printf("ERROR IN OPEN FILE!"); + return -1; + } + stuc *prf_head = r_head; + struct _students *rf_head_s; + while (prf_head != NULL){ + rf_head_s = &prf_head->stu_info; + fprintf(fp, "%s\n", rf_head_s->name); + fprintf(fp, "%s\n", rf_head_s->class); + fprintf(fp, "%s\n", rf_head_s->year); + fprintf(fp, "%s\n", rf_head_s->number); + prf_head = prf_head->next; + } + + printf("Done,any key to continue...\n"); + fclose(fp); + getchar();getchar(); + return 0; +} +//End of program