C语言第二次课

来源:互联网 发布:好用保湿的乳液 知乎 编辑:程序博客网 时间:2024/06/05 11:08
/*
*学生信息管理程序,
*管理学生的个人信息及各科成绩;
*/
#include <stdio.h>  
#include <conio.h>  
#include <string.h>  
#include <stdlib.h>  
    
  
typedef struct Node Node;  
  
//定义成绩信息节点
//分别为语文、数学、英语和总成绩;


struct Score  
{  
    int chinese,math,english,sum;  
};  
 
//定义学生信息节点
//分别为姓名、班级、学号、成绩和指向下一个节点的指针
//定义了4个全局变量,头节点,和临时节点变量;


struct Node  
{  
    char name[20],classs[20],number[20];  
    struct Score score;  
    struct Node* next;  
}*head,*u,*p,*q;  
  
  //定义多个学生的学生个数及各科平均成绩优秀率及格率;
int n,C,M,E,Cj,Cy,Mj,My,Ej,Ey;  
char num[20];  
  
//进入菜单函数
void Welcome()  
{  
    printf("\t\t      # # # # # # # # # # # # # # # # #\n");  
    printf("\t\t      #   欢迎您使用学生成绩管理系统 #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         1.读取文件           #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         2.保存文件           #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         3.添加学生成绩       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         4.修改学生成绩       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         5.删除学生成绩       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         6.查询个人成绩       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         7.查询本班成绩       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         8.查询全校成绩       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      #         9.退出管理系统       #\n");  
    printf("\t\t      #                              #\n");  
    printf("\t\t      # # # # # # # # # # # # # # # # #\n\n");  
    printf("\t\t       请输入指令:(1-9) ");  
}  
//构造节点函数
Node* new_node(Node* uu)  
{  
    uu = (Node*)malloc(sizeof(Node));  
    uu->next = NULL;  
    return uu;  
}  
//添加学生信息
void Add()  
{  
//新建一个节点;
    u = new_node(u);  
    printf("\n请输入您要加入的学生的信息:\n");  
    printf("\n姓名: ");  
    scanf("%s",u->name);  
    printf("\n班级: ");  
    scanf("%s",u->classs);  
    printf("\n学号: ");  
    scanf("%s",u->number);  
    printf("\n语文、数学、英语成绩: ");  
    scanf("%d%d%d",&u->score.chinese,&u->score.math,&u->score.english);  
//计算总成绩;
    u->score.sum = u->score.chinese + u->score.math + u->score.english;  
//采用头插法将新节点的尾指针指向第二个节点(掰开)
    u->next = head->next;  
//将新节点放在头节点后面;
    head->next = u;  
    printf("\n--->添加成功!\n");  
}  
//根据学号修改信息
//和查找函数一样,依次从第二个节点开始遍历,如果找到这更新
void Mod()  
{  
    n = 0;  
    printf("\n请输入您要修改的学号: ");  
    scanf("%s",num);  
    for(u = head; u != NULL;u = u->next)  
    {  
        if(strcmp(u->number,num) == 0)  
        {  
            n = 1;  
            printf("\n请输入新的语文、数学、英语成绩: ");  
            scanf("%d%d%d",&u->score.chinese,&u->score.math,&u->score.english);  
            u->score.sum = u->score.chinese + u->score.math + u->score.english;  
            printf("\n--->修改成功!\n");  
            break;  
        }  
    }  
    if(!n)  
        printf("\n--->没有这个学生的信息!\n");  
}  
//根据学号删除学生信息,
//从头节点开始遍历,如果找到这删除此节点;
void Del()  
{  
    n = 0;  
    printf("\n请输入您要删除的学生的学号: ");  
    scanf("%s",num);  
    for(u = head; u != NULL;u = u->next)  
    {  
        if(strcmp(u->number,num) == 0)  
        {  
            n = 1;  
            p->next = u->next;  
            free(u);  
            printf("\n--->删除成功!\n");  
            break;  
        }  
        p = u;  
    }  
    if(!n)  
        printf("\n--->没有这个学生的信息!\n");  
}  
void Sort()  
{  
    int i,j;  
//记录学生总数;
    n = 0;  
    for(u = head->next; u != NULL;u = u->next)  
        n++;  
//采用冒泡法对各个节点按班级升序和总成绩降序排列
    for(i=1;i<=n;i++)  
    {  
        u = head;  
        for(j=0;j<n-i;j++)  
        {  
            p = u->next;  
            q = p->next;  
            if(strcmp(p->classs,q->classs) > 0 || strcmp(p->classs,q->classs) == 0 && p->score.sum < q->score.sum)  
            {  
                u->next = q;  
                p->next = q->next;  
                q->next = p;  
            }  
            u = u->next;  
        }  
    }  
}  
//按学号查找某一学生成绩;
void Que_One()  
{  
//标志变量,记录是否查找成功;
    n = 0;  
    printf("\n请输入您要查询的学生的学号: ");  
    scanf("%s",num);  
//从第二个节点开始遍历,直到最后一个节点为止;
    for(u = head->next; u != NULL;u = u->next)  
    {  
//如果当前节点学号与要查找学号一致这输出此学生信息;
        if(strcmp(u->number,num) == 0)  
        {  
            n = 1;  
            printf("\n");  
            puts("班级       姓名          语文  数学  英语 总成绩");  
            printf("%-11s%-15s",u->classs,u->name);  
            printf("%-6d%-6d%-6d%-6d\n",u->score.chinese,u->score.math,u->score.english,u->score.sum);  
            break;  
        }  
    }  
    if(!n)  
        printf("\n--->没有这个学生的信息!\n");  
}  
void Analyze_Sco(Node *uu)  
{  
//对查找到的节点进行求各科平均成绩
//求优秀率及格率;
    C += uu->score.chinese;  
    M += uu->score.math;  
    E += uu->score.english;  
    if(uu->score.chinese >= 60)  
        Cj++;  
    if(uu->score.chinese >= 90)  
        Cy++;  
    if(uu->score.math >= 60)  
        Mj++;  
    if(uu->score.math >= 90)  
        My++;  
    if(uu->score.english >= 60)  
        Ej++;  
    if(uu->score.english >= 90)  
        Ey++;  
}  
//打印各科平均成绩及格率优秀率




void Print_Sco()  
{  
    printf("语文平均成绩: %-6.2f, 及格率: %%%-6.2f , 优秀率: %%%-6.2f.\n\n",(float)C/n,(float)100*Cj/n,(float)100*Cy/n);  
    printf("数学平均成绩: %-6.2f, 及格率: %%%-6.2f , 优秀率: %%%-6.2f.\n\n",(float)M/n,(float)100*Mj/n,(float)100*My/n);  
    printf("英语平均成绩: %-6.2f, 及格率: %%%-6.2f , 优秀率: %%%-6.2f.\n\n",(float)E/n,(float)100*Ej/n,(float)100*Ey/n);  
}  
//查找某一班级所以学生的信息;
void Que_Cla()  
{  
//对链表节点排序;
    Sort();  
    n = C = M = E = Cj = Cy = Mj = My = Ej = Ey = 0;  
    printf("\n请输入您要查询的班级: ");  
    scanf("%s",num);  
    printf("\n");  
    for(u = head->next; u != NULL;u = u->next)  
    {  
//不是该班的学生则跳过;
        if(strcmp(u->classs,num))  
            continue;  
//如果是第一个学生则打印头信息
        if(!n)  
            puts("学号       姓名          语文  数学  英语 总成绩");  
        n++;  
        printf("%-11s%-15s",u->number,u->name);  
        printf("%-6d%-6d%-6d%-d\n",u->score.chinese,u->score.math,u->score.english,u->score.sum);  
        Analyze_Sco(u);  
    }  
    if(!n)  
    {  
        printf("没有这个班级的学生信息!\n");  
        return ;  
    }  
//打印该班级学生的各个成绩的特征值;
    printf("\n该班共有学生 %d 人.\n\n",n);  
    Print_Sco();  
  
}  
//打印全校所以学生的信息
//具体情况同打印班级学生信息;
void Que_All()  
{  
    Sort();  
    n = C = M = E = Cj = Cy = Mj = My = Ej = Ey = 0;  
    printf("\n");  
    if(head->next == NULL)  
    {  
        printf("--->没有学生信息!\n");  
        return ;  
    }  
    puts("班级        学号        姓名          语文  数学  英语 总成绩");  
    for(u = head->next; u != NULL;u = u->next)  
    {  
        n++;  
        printf("%-12s%-12s%-15s",u->classs,u->number,u->name);  
        printf("%-6d%-6d%-6d%-d\n",u->score.chinese,u->score.math,u->score.english,u->score.sum);  
        Analyze_Sco(u);  
    }  
    printf("\n全校共有学生 %d 人.\n\n",n);  
    Print_Sco();  
}  
//保存文件;
void Save()  
{  
    char c;  
    printf("\n确认保存?(Y/N): ");  
    scanf("%*c%c",&c);  
    if(c == 'N')  
        return ;  
    FILE *fp;  
    if((fp=fopen("C:\\data.txt","w"))==NULL)  
    {  
        printf("\n--->无法打开文件\n");  
        return ;  
    }  
//写入数据表头信息;
    fputs("班级       学号       姓名          语文  数学  英语 总成绩",fp);  
    if(head->next != NULL)  
        fputs("\n",fp);  
//从头节点开始依次写入文件;
    for(u = head->next; u != NULL;u = u->next)  
    {  
        fprintf(fp,"%-11s%-11s%-15s",u->classs,u->number,u->name);  
        fprintf(fp,"%-6d%-6d%-6d%-d",u->score.chinese,u->score.math,u->score.english,u->score.sum);  
        if(u->next != NULL)  
            fprintf(fp,"\n");  
    }  
    fclose(fp);  
    printf("\n--->成绩成功存入C:\\\\data.txt中\n");  
}  
//读取文件;
void Open()  
{  
    printf("\n请把数据放到目录C:\\\\data.txt中,按任意键确认.\n");  
    getch();  
    FILE *fp; 
//从c盘根目录下读取文件;
    if((fp=fopen("C:\\data.txt","r"))==NULL)  
    {  
        printf("\n--->没有找到文件!\n");  
        return ;  
    }  
    char tmp[100];  
//读取65个菜单头字符存入tem字符数组中;
    fgets(tmp,66,fp);  


//读到文件结尾处跳出循环;
    while(!feof(fp))  
    {  
        u = new_node(u);  
        fscanf(fp,"%s%s%s",u->classs,u->number,u->name);  
        fscanf(fp,"%d%d%d%d",&u->score.chinese,&u->score.math,&u->score.english,&u->score.sum);
//头插法建立链表;
        u->next = head->next;  
        head->next = u;  
    }  
    printf("\n--->成绩读入成功!\n");  
    fclose(fp);  
}  
//退出程序
void Exi()  
{  
    char c;  
    printf("\n确定退出?(Y/N): ");  
    scanf("%*c%c",&c);  
    if(c == 'N')  
        return ;  
//打印结束语;
    system("cls");  
    printf("\n\n");  
    printf("\t\t\t     %c %c %c %c %c %c %c %c %c\n",4,4,4,4,4,4,4,4,4);  
    printf("\t\t\t     %c 谢谢使用 %c\n",4,4);  
    printf("\t\t\t     %c %c %c %c %c %c %c %c %c\n",4,4,4,4,4,4,4,4,4);  
    printf("\t\t\t                          Thank you!\n\n\n");  
    exit(0);  
}  
int main()  
{  
//存储指令的变量
    int orz;  
//设置系统文本颜色
    system("color 0B");  
//新建一个学生信息头节点;
    head = new_node(head);  
    while(1)  
    {  
//显示菜单、
        Welcome();  
//接收用户命令、
        scanf("%d",&orz);  
//调用系统函数清屏;
        system("cls");  
        switch(orz)  
        {  
//根据指令进入相应菜单选项
            case 1:Open();break;  
            case 2:Save();break;  
            case 3:Add();break;  
            case 4:Mod();break;  
            case 5:Del();break;  
            case 6:Que_One();break;  
            case 7:Que_Cla();break;  
            case 8:Que_All();break;  
            case 9:Exi();break;  
            default :printf("\n--->无效的指令!\n");  
        }  
        printf("\n"); 
//执行系统函数
        system("pause");  
        system("cls");  
    }  
    return 0;  

}


- - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - -- - - - - ---  ----  ----  ----     -----    -------

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
  /*结构体类型*/
typedef struct  
{   int num;/*图书编号*/
    char name[20];/*书名*/
char sex[5];/*图书类型*/
int age;/*价格*/
char studentclass[20];/*图书分组*/
int score;/*数量*/
}STUDENTS;


int read_file(STUDENTS stu[])
{ FILE *fp;
    int i=0;
if((fp=fopen("stu.txt","rt"))==NULL)
{printf("\n\n*****库存文件不存在!请创");
return 0;
}
while(feof(fp)!=1)
    {
fread(&stu[i],sizeof(STUDENTS),1,fp);
if(stu[i].num==0)
break;
else
i++;
}
fclose(fp);
return i;
}
void save_file(STUDENTS stu[],int sum)
{FILE*fp;
 int i;
 if((fp=fopen("stu.txt","wb"))==NULL)
 {printf("写文件错误!\n");
  return;
 }
   for(i=0;i<sum;i++)
  if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1)
  printf("写文件错误!\n");
  fclose(fp);
}




/*创建图书信息*/
int input(STUDENTS stu[])
{  int i,x;
   for(i=0;i<1000;i++)
   {
    system("cls");  
    printf("\n\n                 录入图书信息  (最多%d个)\n",MAX);
    printf("               ----------------------------\n");
   
        printf("\n                     第%d个学生",k+1);
   printf("\n 请输入图书的编号:");
        scanf("%d",&stu[k].num);
        printf("\n 请输入图书的名字:");
        scanf("%s",stu[k].name); 
  printf("\n 请输入图书的类型:");
        scanf("%s",stu[k].sex);
        printf("\n 请输入图书的价格:");   
        scanf("%d",&stu[k].age);  
        printf("\n 请输入图书的分组:");
        scanf("%s",stu[k].studentclass);        
        printf("\n 请输入图书的数量:");
        scanf("%d",&stu[k++].score);
        printf("\n 请按1键返回菜单或按0键继续创建");
scanf("%d",&x);
if(x)
 break;
   }
      
       return k;
}




/*删除学生信息*/
void deletel(STUDENTS stu[])
  { system("cls"); 
   char Stuname2[20];
   int i,j;
   printf("请输入书名:");
   scanf("%s",Stuname2);
   printf("\n");
   for(i=0;i<k;i++)
   if(strcmp(stu[i].name,Stuname2)==0)   
     for(j=0;j<20;j++)
       stu[i].name[j]=stu[i+1].name[j];
   k--;

  
   printf("删除成功\n");
   printf("按任意键加回车返回主菜单!");
   scanf("%d",&i);
   getchar();
}


/*打印学生信息*/                                                                                                                                                                                                                                                        
void output(STUDENTS stu[])
{  system("cls");
   int i;
   for(i=0;i<k;i++)  
     printf("编号:%d,书名:%s,类型:%s,价格:%d,分组:%s,数量: %d\n",stu[i].num,stu[i].name,
 stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
   printf("按任意键加回车返回主菜单!");
   scanf("%d",&i);
   getchar();
}


/*查询学生信息*/
void inquire(STUDENTS stu[]) 
  { int i;
    int num;
    system("cls");
    printf("     \n\n请输入您要查找的图书的编号");
    scanf("%d",&num);
    for(i=0;i<k;i++)
      if(num==stu[i].num)
         printf("\n\n\n书名:%d,书名:%s,类型:%s,价格:%d,分组:%s,数量: %d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
    printf("按任意键加回车返回主菜单!");
scanf("%d",&i);
    getchar();
  }




/*修改学生信息*/
void change(STUDENTS stu[])
  {  int num,i,choice;
     system("cls"); 
printf("\n\n\n      请输入您要修改的图书的编号");
     scanf("%d",&num);
     for(i=0;i<k;i++)
     { if(num==stu[i].num)
         printf("\n编号:%d,书名:%s,类型:%s,价格:%d,分组:%s,数量: %d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);


     printf("\n\n\n     ********请输入您想要修改的数据********\n\n");
     printf("                1. 编号\n\n");
     printf("                2. 书名\n\n");
printf("                3. 类型\n\n");
     printf("                4. 价格\n\n");
     printf("                5. 分组\n\n");
     printf("                6. 数量\n\n");
     printf("                 请选择(1-6):");
 scanf("%d",&choice);
 switch(choice)
 {case 1:{
      printf("\n   请输入你改的新编号");
          scanf("%d",&stu[i].num); 
  break;
  }
  case 2:{
      printf("\n   请输入你改的新书名");
          scanf("%s",stu[i].name); 
  break;
 }
  case 3:{
      printf("\n   请输入你改的新类型");
          scanf("%s",stu[i].sex); 
  break;
 }
  case 4:{
      printf("\n   请输入你改的新价格");
          scanf("%d",&stu[i].age); 
  break;
 }
  case 5:{
      printf("\n   请输入你改的新分组");
          scanf("%s",stu[i].studentclass); 
  break;
 }
  case 6:{
      printf("\n   请输入你改的新数量");
          scanf("%d",&stu[i].score); 
  break;
 }
 }
 
  printf("编号:%d,书名:%s,类型:%s,价格:%d,分组:%s,价格: %d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
       printf("按任意键加回车返回主菜单!");
  scanf("%d",&i);
  break;
}
}




/*学生成绩信息排名*/
void sort(STUDENTS stu[])
  {  int i,j,n=1,x;
     system("cls"); 
     int t;
      for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(stu[i].score<stu[j].score)
{ t=stu[i].score;
 stu[i].score=stu[j].score;
 stu[j].score=t;
              t=stu[i].num;
 stu[i].num=stu[j].num;
 stu[j].num=t;


}
     for(i=0;i<k;i++)
printf("排名    编号    数量\n %d       %d       %d\n",n++,stu[i].num,stu[i].score);
     printf("按任意键加回车返回主菜单!");
scanf("%d",&x);
     getchar();
  }


void pagedis()
{
   printf(" \n\n\n                   **********************************\n");
   printf("                   *                                *\n");
   printf("                   *                                *\n");
   printf("                   *                                *\n");
   printf("                   *     欢迎进入图书信息管理系统   *\n");
   printf("                   *                                *\n");
   printf("                   *                                *\n");
   printf("                   *                                *\n");
   printf("                   **********************************\n");
   
}
void check()
{
   char userName[5];/*书名*/
   char userPWD[5];/*密码*/
   int i,sum;
   system("color 4E");
   for(i = 1; i < 4; i++)
   {
      /*用户名和密码均为a;*/
   printf("   用户名和密码均为a\n\n");
        printf("\n       请输入您的用户名:");
        gets(userName);
        
        printf("\n       请输入您的密码:");
        gets(userPWD);
        
        if ((strcmp(userName,"a")==0) && (strcmp(userPWD,"a")==0))/*验证用户名和密码*/
        {
            printf("用户名和密码正确,显示主菜单");
            return;
        }
        else
        {
            if (i < 3)
            {
                printf("用户名或密码错误,提示用户重新输入");
                printf("用户名或密码错误,请重新输入!");
            }
            else
            {
                printf("连续3次输错用户名或密码,退出系统。");
                printf("您已连续3次将用户名或密码输错,系统将退出!");
                exit(1); 
            }
        }
   }
}
void menu()
{
  STUDENTS stu[20];
  int choice,k,sum;
  sum=read_file(stu);
  if(sum==0)
   {  printf("首先录入基本库存信息!按回车后进入*****\n");
      getch();
 sum=input(stu);
   }
  
  do
  {  system("cls");  
     printf("\n\n\n               ********学生信息管理系统********\n\n");
     printf("                      1. 创建图书信息\n\n");
     printf("                      2. 打印图书信息\n\n");
printf("                      3. 查询图书信息\n\n");
     printf("                      4. 修改图书信息\n\n");
     printf("                      5. 删除图书信息\n\n");
     printf("                      6. 图书信息数量\n\n");
     printf("                      0. 退出系统\n\n");
     printf("                       请选择(0-6):");
     scanf("%d",&choice); 
    switch(choice)
    {
      case 1: k=input(stu); break;/*创建图书信息*/
      case 2: output( stu) ; break;/*打印图书信息*/
      case 3: inquire(stu); break;/*查询图书信息*/
      case 4: change(stu); break;/*修改图书信息*/
      case 5: deletel(stu); break;/*删除图书信息*/
      case 6: sort(stu); break;/*图书信息数量*/
      case 0: break;
    }
  }while(choice!=0);
  save_file(stu,sum);
}
int main()
{  
   
  
  int i,sum;
  pagedis();
  check();
  menu();   
  
}


对比更改出图书管理系统。分析得到:

数据结构

Struct student{

char name[10];//姓名

char num[10];//学号

char sex[10];//性别

int ying;//英语成绩

…//各类成绩

Int zong;//总成绩

….



我觉得很完美的是密码设置环节

      /*用户名和密码均为a;*/
   printf("   用户名和密码均为a\n\n");
        printf("\n       请输入您的用户名:");
        gets(userName);
        
        printf("\n       请输入您的密码:");
        gets(userPWD);
        
        if ((strcmp(userName,"a")==0) && (strcmp(userPWD,"a")==0))/*验证用户名和密码*/
        {
            printf("用户名和密码正确,显示主菜单");
            return;
        }
        else
        {
            if (i < 3)
            {
                printf("用户名或密码错误,提示用户重新输入");
                printf("用户名或密码错误,请重新输入!");
            }
            else
            {
                printf("连续3次输错用户名或密码,退出系统。");
                printf("您已连续3次将用户名或密码输错,系统将退出!");
                exit(1); 
            }
这个用个一个if语句限定了输入次数为三次,当然也可以自由设定,这样设计和很多大型网站填写密码的思路相似,非常严谨。


不管是学生管理系统还是图书系统就相当于把一些数据信息储存到一个个小盒子里,然后在把那些小盒子都放进一个大箱子里。

需要调用或者查看的时候更加方便快捷的找出来。

简单的说就是储存和调用。



0 0
原创粉丝点击