http://xianghai.zjblog.com/index.shtml
 
 
 时 间 记 忆 
<<  < 2017 - >  >>
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

 
 专 题 分 类 
 最 新 评 论 
 最 新 日 志 
 最 新 留 言 


 
 
 
      c语言(学生管理系统)

>>2017-9-3 22:08:00
 

#i nclude<stdio.h>
#i nclude<stdlib.h>
#i nclude<string.h>
#define NAME_LEN 25



struct stu
{
    int number;
    char name[NAME_LEN+1];
    char sex[5];
    char dept[20];
    int age;
    struct stu *next;
    
};


struct stu *find_students1(int number,struct stu *first);
struct stu *find_students2(struct stu *first);
struct stu *insert(struct stu *first);//1
struct stu * search(struct stu *first);//2
void print(struct stu *first);//3
int search_girl(struct stu *first);//4
void search_first_name(struct stu *first);//5
int search_16_year(struct stu *first);//6
struct stu * search_max_boy(struct stu *first);//7
struct stu *  fix(struct stu *first);//8
void delete_students(struct stu *first,struct stu *p);//9
void save(char *name, struct stu *first,FILE *fp);//10
struct stu * readout(char *name,stu *first,FILE *fp);
int read_line(char str[],int n);
void quit(stu *first,char *name,FILE *fp);
void print_single(struct stu *p);
int search_boy(struct stu *first);
int * age_statistics(struct stu *first);
struct stu **boy_girl(struct stu *first);

int main()
{
    FILE *fp;
    
    struct stu *first=NULL;
    struct stu *p2,*p7,*p9;
    int *p11;
    int n;
    
    
    char filename[100];
    int type;
start: for(;;)
       {
           printf("输入 1 读入文件\n输入 2 创建新文件\n");
           scanf("%d",&type);
           if(type==1||type==2)
           {
               break;
           }
           else
           {
               printf("输入错误,请重新输入");
           }
       }
       if(type == 1)
       {
           for(;;)
           {
               printf("输入要读取的文件地址\n");
               fflush(stdin);
               gets(filename);
               if((fp = fopen(filename,"rb+"))==NULL)
               {
                   printf("无法打开文件\n");
                   goto start;
                   
               }
               else
               {
                   first = readout(filename,first,fp);
                   break;
                   
               }
           }
       }
       
       if(type == 2)
       {
           for(;;)
           {
               printf("输入要创建的文件地址\n");
               fflush(stdin);
               gets(filename);
               if((fp = fopen(filename, "w")) == NULL)
               {
                   printf("无法创建文件");
                   goto start;
                   
               }
               else
               {
                   struct stu *news;
                   news=(struct stu*)malloc(sizeof(struct stu));
                   news->number=805;
                   strcpy(news->name,"刘德华");
                   strcpy(news->sex,"男");
                   strcpy(news->dept,"null");
                   news->age=52;
                   news->next=NULL;
                   first=news;
                   
                   news=(struct stu*)malloc(sizeof(struct stu));
                   news->number=804;
                   strcpy(news->name,"金秀贤");
                   strcpy(news->sex,"女");
                   strcpy(news->dept,"MA");
                   news->age=24;
                   news->next=first;
                   first = news;
                   
                   news=(struct stu*)malloc(sizeof(struct stu));
                   news->number=803;
                   strcpy(news->name,"那英");
                   strcpy(news->sex,"女");
                   strcpy(news->dept,"CS");
                   news->age=41;
                   news->next=first;
                   first=news;
                   
                   news=(struct stu*)malloc(sizeof(struct stu));
                   news->number=802;
                   strcpy(news->name,"李敏槁");
                   strcpy(news->sex,"男");
                   strcpy(news->dept,"MA");
                   news->age=25;
                   news->next=first;
                   first=news;
                   
                   news=(struct stu*)malloc(sizeof(struct stu));
                   news->number=801;
                   strcpy(news->name,"金贤重");
                   strcpy(news->sex,"男");
                   strcpy(news->dept,"CS");
                   news->age=23;
                   news->next=first;
                   first=news;
                   
                   
                   break;
                   
                   
                   
               }
           }
       }
       
       
       
       
       int code;
       for(;;)
       {
           printf("1.增加学生名单\t         2.搜索学生名单\n"
               "3.打印学生信息表\t 4.查询男女学生人数\n"
               "5.同姓人数\t         6.年龄小于16岁的学生\n"
               "7.查询年龄最大的男生\t 8.修改学生信息\n"
               "9.删除学生\t\t 0.退出程序\n10.保存\t\t\t11.各年龄统计\n"
               "12.和最大女生年龄相同的男生\n");
           
           scanf("%d",&code);
           switch(code)
           {
           case 0:
               quit(first,filename,fp);
               return 0;
               break;
           case 1:
               first=insert(first);
               break;
           case 2:
               
               p2 = search(first);
               if(p2 == NULL)
               {
                   printf("查无该生\n");
               }
               else
               {
                   print_single(p2);
               }
               break;
           case 3:
               print(first);
               break;
           case 4:
               printf("%d个女生\n",search_girl(first));
               printf("%d个男生\n",search_boy(first));
               break;
           case 5:
               search_first_name(first);
               break;
           case 6:
               n = search_16_year(first);
               printf("有%d个小于16岁的学生\n");
               break;
           case 7:
               p7=search_max_boy(first);
               if(p7==NULL)
               {
                   printf("没有男生");
               }
               else
               {
                  printf("找到该男生\n");
                  print_single(p7);
               }
               break;
           case 8:
               first = fix(first);
               break;
           case 9:
               int item;
               for(;;)
               {
                   printf("输入 1 按学号查询\n输入 2 按姓名查询");
                   scanf("%d",&item);
                   if(item == 1 || item == 2)
                   {
                       break;
                   }
                   else
                   {
                       printf("输入错误,请重新输入\n");
                   }
               }
               if(item == 1)
               {
                   int number;
                   printf("请输入学生的学号:");
                   scanf("%d",&number);
                   p9 = find_students1(number,first);

               }

               if(item == 2)
               {
                   printf("请输入学生的姓名:");
                   p9 = find_students2(first);
               }

               if(p9 == NULL)
               {
                   printf("查无该生\n");
               }
               else
               {
                  delete_students(first,p9);
               }
               break;
           case 10:
               save(filename,first,fp);
               break;
           case 11:
               int i;
               p11 = age_statistics(first);
               for( i=0; i<120; i++)
               {
                   if(*p11 == 0)
                   {
                       p11++;
                   }
                   else
                   {
                       printf("%d岁:%d个人\n",i, *p11);
                       p11++;
                   }
               }
               break;
           case 12:
               struct stu **p12;
               p12 = boy_girl(first);
               if((*p12) == NULL)
               {
                   printf("未找到\n");
               }
               while(*p12 != NULL)
               {
                   printf("学号:%d\t姓名:%s\n",(*p12)->number,(*p12)->name);
                   p12 = p12++;
               }
               break;

           default:
               printf("输入错误,请重新输入\n");
           }
           printf("\n");
       }
       
       return 0;
}


/*********
*find_students2*
**********/



struct stu *find_students2(struct stu *first)
{
    struct stu *p;
    char search_name[NAME_LEN+1];
    read_line(search_name,NAME_LEN);
    for(p=first;p!=NULL&&strcmp(p->name,search_name)!=0;p=p->next)
        ;
    if(p!=NULL&&strcmp(p->name,search_name)==0)
    {
        return p;
    }
    return NULL;
}


/*********
*find_students1*
**********/
struct stu *find_students1(int number,struct stu *first)
{
    struct stu *p;
    for(p=first;p!=NULL&&p->number!=number;p=p->next)
        ;
    if(p!=NULL&&p->number==number)
    {
        return p;
    }
    return NULL;
}



/*********
* insert *
**********/

struct stu *insert(struct stu *first)
{
    struct stu *cur,*prev,*new_node;
    new_node=(struct stu *)malloc(sizeof(struct stu));
    printf("请输入学生的学号:");
    scanf("%d",&new_node->number);
    
    for(prev=NULL,cur=first;
    cur!=NULL&&new_node->number>cur->number;prev=cur,cur=cur->next)
        ;
    
    if(cur!=NULL&&cur->number==new_node->number)
    {
        printf("该学生编号已存在\n");
        free(new_node);
        return first;
    }
    int sex;
    printf("请输入学生姓名:");
    read_line(new_node->name,NAME_LEN);
    printf("请输入学生性别(1为男,2为女)");
    do
    {
        scanf("%d",&sex);
        if(sex!=1&&sex!=2)
        {
            printf("输入错误,请重新输入");
        }
    }
    while(sex!=1&&sex!=2);
    if(sex==1)
    {
        strcpy(new_node->sex,"男");
    }
    if(sex==2)
    {
        strcpy(new_node->sex,"女");
    }
    
    printf("输入学生系别:");
    scanf(" %s",new_node->dept);
    
    printf("输入学生年龄:");
    scanf("%d",&new_node->age);
    
    new_node->next=cur;
    
    if(prev==NULL)
    {
        first=new_node;
    }
    else
    {
        prev->next=new_node;
    }
    return first;
}


/*********
* search  *
**********/

struct stu * search(struct stu *first)
{
    struct stu *p;
    int measure,number;
    printf("输入1进行学号搜索(推荐)\n输入2进行姓名搜索\n");
    do
    {
        scanf("%d",&measure);
        if(measure!=1&&measure!=2)
        {
            printf("输入错误,请重新输入");
        }
    }
    while(measure!=1&&measure!=2);
    
    if(measure==1)
    {
        printf("输入搜索学生的学号:");
        scanf("%d",&number);
        p=find_students1(number,first);
        return p;
        
    }
    
    if(measure==2)
    {
        printf("输入搜索学生的姓名");
        p=find_students2(first);
        return p;
        
    }
    
}


/*********
* print *
**********/
void print(struct stu *first)
{
    struct stu *p;
    printf("学号\t姓名\t性别\t系别\t年龄\n");
    
    
    for(p=first;p!=NULL;p=p->next)
    {
        printf("%d\t%s\t%s\t%s\t%d\n",p->number,p->name,p->sex,p->dept,p->age);
    }
    
    
}



/*********
* search_girl *
**********/

int search_girl(struct stu *first)
{
    struct stu *p;
    int n=0;
    for(p=first;p!=NULL;p=p->next)
    {
        if(strcmp(p->sex,"女")==0)
        {
            n++;
        }
    }
    return n;
}


/*********
* search_16_year*
**********/

int search_16_year(struct stu *first)
{
    struct stu *p;
    int n=0;
    for(p=first;p!=NULL;p=p->next)
    {
        if(p->age<16)
        {
            n++;
        }
    }
    return n;
    
}

/*********
* search_max_boy*
**********/

struct stu * search_max_boy(struct stu *first)
{
    struct stu *p;
    int max=0;
    for(p=first;p!=NULL;p=p->next)
    {
        if(strcmp(p->sex,"男")==0&&max<p->age)
        {
            max=p->age;
        }
    }
    if(max==0)
    {
        return NULL;
    }
    else
    {   
        for(p=first;p->age!=max;p=p->next);
        return p;
    }
    
    
}


/*********
* delete_students*
**********/

void delete_students(struct stu *first,struct stu *p)
{
    if(p->next != NULL)
    {
        struct stu *next_node;
        next_node = p->next;
        *p = *(p->next);
        free(next_node);

    }
    else
    {
        struct stu *prev;
        for(prev = first;prev->next != p;prev = prev->next);
        prev->next = NULL;
        free(p);

    }



}

/*********
*search_first_name*
**********/

void search_first_name(struct stu *first)
{
    char fn[5];
    struct stu *p;
    int n=0;
    printf("输入查找的姓氏:");
    read_line(fn,5);
    for(p=first;p!=NULL;p=p->next)
    {
        if(p->name[0]==fn[0]&&p->name[1]==fn[1])
        {
            n++;
        }
    }
    
    printf("共%d个相同性别的人\n\n",n);
    for(p=first;p!=NULL;p=p->next)
    {
        if(p->name[0]==fn[0]&&p->name[1]==fn[1])
        {
            print_single(p);
        }
    }
    
}



/*********
*   fix   *
**********/

struct stu * fix(struct stu *first)
{
    int number,item;
    struct stu *p;
    printf("请输入想修改的学生的学号");
    scanf("%d",&number);
    p=find_students1(number,first);
    if(p==NULL)
    {
        printf("无该学生信息\n");
    }
    else
    {
        print_single(p);
        for(;;)
        {
            
            printf("请输入想修改项的序号(输入0退出修改):");
            scanf("%d",&item);
            if(item==0)
            {
                break;
            }
            switch(item)
            {
            case 1:
                struct stu *prev,*cur,*prev2,*cur2;
                for(prev=NULL,cur=first;
                cur!=p;prev=cur,cur=cur->next)/*找到该学生和之前的学生*/
                    ;
                int new_number;
                printf("输入修改后的学号:");
                scanf("%d",&new_number);/*存储新学号*/
                for(prev2=NULL,cur2=first;
                cur2!=NULL&&new_number>cur2->number;prev2=cur2,cur2=cur2->next)/*找到新学号应在链表中的位置*/
                    ;
                if(cur2!=NULL&&new_number==cur2->number)/*判断学号是否存在*/
                {
                    printf("该学号以存在\n");
                }
                else if(prev==NULL&&new_number>p->next->number)/*学生在首结点,且新学号大于后一学生*/
                {
                    first=p->next;
                    
                    if(cur2==NULL)/*该学生序号最大*/
                    {
                        prev2->next=p;
                        p->next=NULL;
                        p->number=new_number;
                    }
                    else
                    {
                        prev2->next=p;
                        p->next=cur2;
                        p->number=new_number;
                    }
                }
                else if(prev==NULL&&new_number<p->next->number)/*学生在首结点,且新学号小于后一学生*/
                {
                    p->number=new_number;
                }
                
                else if(cur->next==NULL&&prev->number>new_number)/*学生在末结点,且新学号小于前一学生*/
                {
                    if(prev2==NULL)
                    {
                        prev->next=NULL;
                        p->next=cur2;
                        first=p;
                        p->number=new_number;
                    }
                    else
                    {
                        prev->next=NULL;
                        prev2->next=p;
                        p->next=cur2;
                        p->number=new_number;
                    }
                }
                else if(cur->next==NULL&&prev->number<new_number)/*学生在末结点,且新学号大于前一学生*/
                {
                    p->number=new_number;
                }/*学生在末结点,且新学号小于前一学生*/
                else if(cur->next!=NULL&&prev!=NULL&&(prev->number>new_number||cur->next->number<new_number))
                {
                    prev->next=cur->next;
                    if(cur2==NULL)/*该学生序号最大*/
                    {
                        prev2->next=p;
                        p->next=NULL;
                        p->number=new_number;
                    }
                    if(prev2==NULL)
                    {
                        p->next=cur2;
                        first=p;
                        p->number=new_number;
                    }
                    else
                    {
                        prev2->next=p;
                        p->next=cur2;
                        p->number=new_number;
                    }
                    
                    
                    
                }
                else if(cur->next!=NULL&&prev!=NULL&&prev->number>new_number&&cur->next->number<new_number)
                {
                    p->number=new_number;
                }
                
                break;
                
                
                
                case 2:
                    printf("输入修改后的姓名:");
                    read_line(p->name,NAME_LEN);
                    print_single(p);
                    break;
                case 3:
                    int sex;
                    printf("输入性别:(1为男性 2为女性)");
                    do
                    {
                        scanf("%d",&sex);
                        if(sex!=1&&sex!=2)
                        {
                            printf("输入错误请重新输入");
                        }
                    }
                    while(sex!=1&&sex!=2);
                    
                    if(sex==1)
                    {
                        strcpy(p->sex,"男");
                    }
                    if(sex==2)
                    {
                        strcpy(p->sex,"女");
                    }
                    print_single(p);
                    break;
                case 4:
                    printf("请输入修改后系别:");
                    read_line(p->dept,20);
                    print_single(p);
                    break;
                case 5:
                    printf("请输入修改后的年龄:");
                    scanf("%d",&p->age);
                    print_single(p);
                    break;
                default :
                    printf("输入错误,请重新输入");
                    
                    
                    
            }
            
            
        }
        
    }
    return first;
    
    
}


/***********
**** save***
************/
void save(char *name, struct stu *first,FILE *fp)
{
    struct stu *p;
    p=first;
    if((fp = fopen( name, "wb"))==NULL)
    {
        printf("error\n");
        exit(0);
    }
    for(;p!=NULL;p=p->next)
    {
        if(fwrite(p, sizeof(struct stu), 1, fp) != 1)
        {
            printf("error");
        }
    }
    printf("保存成功\n");
}


/***********
**** readout***
************/


struct stu * readout(char *name,struct stu *first,FILE *fp)
{
/*FILE *fp;
if((fp = fopen(name, "r"))==NULL)
{
printf("error");
exit( 0 );
}*/
    
    struct stu *new_node;
    first = (struct stu *)malloc(sizeof(struct stu));
    fread(first, sizeof(struct stu), 1, fp);
    /*if(feof(fp))
    {
    first->next=NULL;
    return first;
    }
    else
    {*/
    first->next = (struct stu *)malloc(sizeof(struct stu));
    new_node = first->next;
    for(;;)
    {
        int ch;
        
        fread(new_node,sizeof(struct stu), 1, fp);
        //fseek(fp,2L,SEEK_CUR);
        if((ch=fgetc(fp))==EOF)
        {
            new_node->next=NULL;
            break;
        }
        else
        {   
            fseek(fp,-1L,SEEK_CUR);
            //fseek(fp,-2L,SEEK_CUR);
            new_node->next = (struct stu *) malloc(sizeof(struct stu));
            new_node = new_node->next;
        }
    }
    
    
                
    
    
    fclose(fp);
    return first;
}


/************
***read_line**
**************/

#i nclude<ctype.h>
#i nclude<stdio.h>


int read_line(char str[],int n)
{
    int ch,i=0;
    while(isspace(ch=getchar()))
        ;
    while(ch!='\n'&&ch!=EOF)
    {
        if(i<n)
        {
            str[i++]=ch;
            ch=getchar();
        }
    }
    str[i]='\0';
    return i;
    
}



/*************
***quit******
*************/

void quit(stu *first,char *name,FILE *fp)
{
    char c;
    for(;;)
    {
        printf("是否保存数据?\n");
        printf("保存请输入Y\t不保存请输入N\n");
        fflush(stdin);
        scanf("%c",&c);
        if(c=='Y'||c=='N'||c=='y'||c=='n')
        {
            break;
        }
        else
        {
            printf("输入错误,请重新输入");
        }
    }
    if(c=='y'||c=='Y')
    {
        save(name,first,fp);
        return ;
    }
    else
    {
        return ;
        
    }
    
}


/**************
***print_single**
****************/
void print_single(struct stu *p)
{
    printf("1.学号:%d\n",p->number);
    printf("2.姓名:%s\n",p->name);
    printf("3.性别:%s\n",p->sex);
    printf("4.系别:%s\n",p->dept);
    printf("5.年龄:%d\n\n",p->age);
};




/**************
*search_boy***
**************/
int search_boy (struct stu *first)
{
    struct stu *p;
    int n=0;
    for(p=first;p!=NULL;p=p->next)
    {
        if(strcmp(p->sex,"男")==0)
        {
            n++;
        }
    }
    return n;
}



/************************
*****age_statistics*******
**************************/


int * age_statistics(struct stu *first)
{
    int *age;
    age = (int *)malloc(sizeof(int)*120);
    for(int i=0; i<120; i++)
    {
        age[i] = 0;
    }
    struct stu *p;
    for(p = first; p!=NULL; p = p->next)
    {
        age[p->age]++;
    }
    return age;
}


/**********
**boy_girl**
************/
struct stu **boy_girl(struct stu *first)
{
    struct stu *p;
    struct stu **boy;
    struct stu *gilr;
    int max = 0 ;
    int i;
    boy = (struct stu **)malloc(sizeof(struct stu*)*120);
    for(i = 0; i<120; i++)
    {
        boy[i] = NULL ;
    }
    for(p = first; p != NULL; p = p->next)
    {
        if((strcmp(p->sex,"女") == 0)&&p->age > max)
        {
            max = p->age;
        }
    }
    if(max == 0)
    {
        return NULL;
    }
    
    else
    {
        for(p = first,i=0; p != NULL; p = p->next)
        {
            if((strcmp(p->sex,"男") == 0)&&p->age == max)
            {
                boy[i] = p;
                i++;

            }

        }
    }
    return boy;
}







   xianghai   
  • 标签:C语言 
  • 发表评论:
     
     我 的 相 册 

     
     友 情 连 接 
     用 户 登 录 
     我 的 好 友 
     我 的 圈 子 
     博 客 信 息 


     文 章 搜 索 

     
       


       
    浙江博客欢迎您!