计科二班 安为 150809113 作业

任务一.打飞机游戏的代码


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define N 35
void print(int [][N]);//输出函数
void movebul(int [][N]);//子弹移动函数
void movepla(int [][N]);//敌机移动函数
void setting(void);//设置函数
void menu(void);//菜单函数
int scr[22][N]={0},pl=9,width=24,speed=3,density=30,score=0,death=0;//全局变量:界面、我机初始位、界面宽度、敌机速度、敌机密度、得分、死亡
main(void)
{
menu();
int i=0,j=0;
scr[21][pl]=1;
scr[0][5]=3;
while(1){if(kbhit())switch(getch())//控制左右移动和进入菜单
{case 'a':case 'A':if(pl>0)scr[21][pl]=0,scr[21][--pl]=1;break;
case 'd':case 'D':if(pl<width-2)scr[21][pl]=0,scr[21][++pl]=1;
break;
case 'w':case 'W':scr[20][pl]=2;break;case 27 :setting();
break;
}
if(++j%density==0)//控制生产敌机的速度
{j=0;srand(time(NULL));
scr[0][rand()%width]=3;
}
if(++i%speed==0)//控制敌机移动速度,相对于子弹移动速度
movepla(scr);
movebul(scr);
print(scr);
if(i==30000)i=0;//以免i 越界
}
}
void print(int a[][N]){system("cls");
int i,j;
for(i=0;i<22;i++){a[i][width-1]=4;
for(j=0;j<width;j++){if(a[i][j]==0)printf(" ");
if(a[i][j]==1)printf("\5");//输出我机的符号
if(a[i][j]==2)printf(".");//子弹
if(a[i][j]==3)printf("\3"); //输出敌机符号
if(a[i][j]==4)printf("|");
if(i==0&&j==width-1)printf("得分:%d",score);//右上角显示得分
if(i==1&&j==width-1)printf("死亡:%d",death);
if(i==2&&j==width-1)printf("设置:Esc");
if(i==3&&j==width-1)printf("Copyright:王攀");
}
printf("\n");
}
}
void movebul(int a[][N]){int i,j;
for(i=0;i<22;i++)
for(j=0;j<width;j++)
{
if(i==0&&a[i][j]==2)a[i][j]=0;if(a[i][j]==2)
{
if(a[i-1][j]==3)score+=10,printf("\7");
a[i][j]=0,a[i-1][j]=2;
}
}
}
void movepla(int a[][N])
{
int i,j;
for(i=21;i>=0;i--)//从最后一行往上是为了避免把敌机直接冲出数组。
for(j=0;j<width;j++)
{
if(i==21&&a[i][j]==3)a[i][j]=0;//底行赋值0 以免越界。
if(a[i][j]==3)a[i][j]=0,a[i+1][j]=3;
}
if(a[20][pl]==3&&a[21][pl]==1)death++;
}
void setting(void)
{
int sw=0,i,j;
system("cls");
do{sw=0;printf("\n 游戏界面的大小:1.大2.小>> ");
switch(getche())
{
case '1':width=34;break;
case '2':width=24;break;
default:printf("\n 错误,请重新选择...\n");
sw=1;
}
}
while(sw);
do
{
sw=0;
printf("\n 请选择敌机密度:1.大2.中3.小>> ");
switch(getche())
{
case '0':density=10;
break;
case '1':density=20;
break;case '2':density=30;
break;case '3':density=40;break;
default:printf("\n 错误,请重新选择...\n");
sw=1;
}
}
while(sw);
do
{
sw=0;
printf("\n 敌机的飞行速度:1.快2.中3.慢>> ");
switch(getche())
{
case '1':speed=2;
break;
case '2':speed=3;
break;
case '3':speed=4;
break;
default:printf("\n 错误,请重新选择...\n");
sw=1;
}
}
while(sw);
for(i=0;i<22;i++)
for(j=0;j<45;j++)
scr[i][j]=0;
scr[21][pl=9]=1;
printf("\n 按任意键保存...");
getch();
}
void menu(void)
{
printf("说明:按A D 控制我机左右飞行,W 发射子弹\n 设置:请按Esc\n 开始游戏:任意键\n                               by yan_xu");
if(getch()==27)setting();
}





任务二.学生管理系统代码


/*
*学生信息管理程序,
*管理学生的个人信息及各科成绩;
*/
#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;  
}





任务三.指针和链表的感想


    首先,我是一个大一计算机系的学生,说实话,对计算机这门学科不是很感兴趣,原因就在于我的计算机超级差,甚至可以说是一窍不通,我对计算机这个领域一直没有一个透彻的理解,所以上课也没怎么好好听讲,但是又要面临着其中考试、期末考试,所以每次考试之前都是临时抱舍友的佛脚。

别人高考选专业都是擅长哪门,对哪门感兴趣,就选哪个,以后未来也好发展,但是我跟他们截然不同,我选这个专业有两个原因:一个原因是计算机领域在未来的前景很好,另一个原因是因为我最不擅长计算机这个领域,所以大学要学习这方面的知识,学习自己最不会的知识。

但是,当我入了这个专业之后发现所哟的同学专业知识都比我强,老是上课讲的知识也不是哦我所想的那样,不讲基础,直接对计算机深入了解,这让我很伤脑筋,所以我就开始了狠补。

    行了,对这个专业的感想就到这里,话不多说,说说对链表和指针的理解以及感想吧。

    看完这篇关于指针和链表的文章后,首先几个概念要清楚

    指针:指针无处不在,打开电脑,显示屏上的指针就是它了,用鼠标操作,你鼠标动一下,指针就跟着动一下,指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。实际上指针就是对内存地址的一系列操作。指针其实非常重要,它使编程变得更加效率、精简代码,节约内存,等等好处。根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其它情况用到*表示指针的取值。&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。

数组:数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。数组变量是常量,即使指针变量指向同样的地址或者一个不同的数组,也不能把指针赋值给数组变量。也不可以将一个数组变量赋值给另一个数组。然而,可以把一个数组变量赋值给指针,这一点似乎让人感到费解。把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。

    单向列表:链表由一系列不必在内存中相连的结构组成。每一个结构均含有表元素和指向包含该元素后继元的结构指针。我们称之为next指针。最后一个单元的next指针指向NULL;该值由C定义并且不能与其它指针混淆。ANSI C规定NULL为零。

 

    下面有个非常简单易懂的图示

    如图所示,这个表含有五个结构,恰好在内存中分配给它们的位置分别是1000,800,712,992和692。第一个结构的指针含有值800,它提供了第二个结构所在的位置。其余每个结构也都有一个指针用于类似的目的。


    动态内存分配这个是连接指针和链表的关键

 

    要实现根据程序的需要动态分配存储空间,就必须用到以下两个个函数 :

    1、malloc函数

    malloc函数的原型为:
    void *malloc (unsigned int size)
    其作用是在内存的动态存储区中分配一个长度为size的连续空间。

    2、free函数

    其函数原型是:
    void free(void *p)
    作用是释放指针p所指向的内存区。

 

 

下面是一个运用指针的完整程序实例

[csharp]  view plain  copy
  1. /* 
  2. *学生信息管理程序, 
  3. *管理学生的个人信息及各科成绩; 
  4. */  
  5. #include <stdio.h>    
  6. #include <conio.h>    
  7. #include <string.h>    
  8. #include <stdlib.h>    
  9.       
  10.     
  11. typedef struct Node Node;    
  12.     
  13. //定义成绩信息节点  
  14. //分别为语文、数学、英语和总成绩;  
  15.   
  16. struct Score    
  17. {    
  18.     int chinese,math,english,sum;    
  19. };    
  20.    
  21. //定义学生信息节点  
  22. //分别为姓名、班级、学号、成绩和指向下一个节点的指针  
  23. //定义了4个全局变量,头节点,和临时节点变量;  
  24.   
  25. struct Node    
  26. {    
  27.     char name[20],classs[20],number[20];    
  28.     struct Score score;    
  29.     struct Node* next;    
  30. }*head,*u,*p,*q;    
  31.     
  32.   //定义多个学生的学生个数及各科平均成绩优秀率及格率;  
  33. int n,C,M,E,Cj,Cy,Mj,My,Ej,Ey;    
  34. char num[20];    
  35.     
  36. //进入菜单函数  
  37. void Welcome()    
  38. {    
  39.     printf("\t\t      # # # # # # # # # # # # # # # # #\n");    
  40.     printf("\t\t      #   欢迎您使用学生成绩管理系统 #\n");    
  41.     printf("\t\t      #                              #\n");    
  42.     printf("\t\t      #         1.读取文件           #\n");    
  43.     printf("\t\t      #                              #\n");    
  44.     printf("\t\t      #         2.保存文件           #\n");    
  45.     printf("\t\t      #                              #\n");    
  46.     printf("\t\t      #         3.添加学生成绩       #\n");    
  47.     printf("\t\t      #                              #\n");    
  48.     printf("\t\t      #         4.修改学生成绩       #\n");    
  49.     printf("\t\t      #                              #\n");    
  50.     printf("\t\t      #         5.删除学生成绩       #\n");    
  51.     printf("\t\t      #                              #\n");    
  52.     printf("\t\t      #         6.查询个人成绩       #\n");    
  53.     printf("\t\t      #                              #\n");    
  54.     printf("\t\t      #         7.查询本班成绩       #\n");    
  55.     printf("\t\t      #                              #\n");    
  56.     printf("\t\t      #         8.查询全校成绩       #\n");    
  57.     printf("\t\t      #                              #\n");    
  58.     printf("\t\t      #         9.退出管理系统       #\n");    
  59.     printf("\t\t      #                              #\n");    
  60.     printf("\t\t      # # # # # # # # # # # # # # # # #\n\n");    
  61.     printf("\t\t       请输入指令:(1-9) ");    
  62. }    
  63. //构造节点函数  
  64. Node* new_node(Node* uu)    
  65. {    
  66.     uu = (Node*)malloc(sizeof(Node));    
  67.     uu->next = NULL;    
  68.     return uu;    
  69. }    
  70. //添加学生信息  
  71. void Add()    
  72. {    
  73. //新建一个节点;  
  74.     u = new_node(u);    
  75.     printf("\n请输入您要加入的学生的信息:\n");    
  76.     printf("\n姓名: ");    
  77.     scanf("%s",u->name);    
  78.     printf("\n班级: ");    
  79.     scanf("%s",u->classs);    
  80.     printf("\n学号: ");    
  81.     scanf("%s",u->number);    
  82.     printf("\n语文、数学、英语成绩: ");    
  83.     scanf("%d%d%d",&u->score.chinese,&u->score.math,&u->score.english);    
  84. //计算总成绩;  
  85.     u->score.sum = u->score.chinese + u->score.math + u->score.english;    
  86. //采用头插法将新节点的尾指针指向第二个节点(掰开)  
  87.     u->next = head->next;    
  88. //将新节点放在头节点后面;  
  89.     head->next = u;    
  90.     printf("\n--->添加成功!\n");    
  91. }    
  92. //根据学号修改信息  
  93. //和查找函数一样,依次从第二个节点开始遍历,如果找到这更新  
  94. void Mod()    
  95. {    
  96.     n = 0;    
  97.     printf("\n请输入您要修改的学号: ");    
  98.     scanf("%s",num);    
  99.     for(u = head; u != NULL;u = u->next)    
  100.     {    
  101.         if(strcmp(u->number,num) == 0)    
  102.         {    
  103.             n = 1;    
  104.             printf("\n请输入新的语文、数学、英语成绩: ");    
  105.             scanf("%d%d%d",&u->score.chinese,&u->score.math,&u->score.english);    
  106.             u->score.sum = u->score.chinese + u->score.math + u->score.english;    
  107.             printf("\n--->修改成功!\n");    
  108.             break;    
  109.         }    
  110.     }    
  111.     if(!n)    
  112.         printf("\n--->没有这个学生的信息!\n");    
  113. }    
  114. //根据学号删除学生信息,  
  115. //从头节点开始遍历,如果找到这删除此节点;  
  116. void Del()    
  117. {    
  118.     n = 0;    
  119.     printf("\n请输入您要删除的学生的学号: ");    
  120.     scanf("%s",num);    
  121.     for(u = head; u != NULL;u = u->next)    
  122.     {    
  123.         if(strcmp(u->number,num) == 0)    
  124.         {    
  125.             n = 1;    
  126.             p->next = u->next;    
  127.             free(u);    
  128.             printf("\n--->删除成功!\n");    
  129.             break;    
  130.         }    
  131.         p = u;    
  132.     }    
  133.     if(!n)    
  134.         printf("\n--->没有这个学生的信息!\n");    
  135. }    
  136. void Sort()    
  137. {    
  138.     int i,j;    
  139. //记录学生总数;  
  140.     n = 0;    
  141.     for(u = head->next; u != NULL;u = u->next)    
  142.         n++;    
  143. //采用冒泡法对各个节点按班级升序和总成绩降序排列  
  144.     for(i=1;i<=n;i++)    
  145.     {    
  146.         u = head;    
  147.         for(j=0;j<n-i;j++)    
  148.         {    
  149.             p = u->next;    
  150.             q = p->next;    
  151.             if(strcmp(p->classs,q->classs) > 0 || strcmp(p->classs,q->classs) == 0 && p->score.sum < q->score.sum)    
  152.             {    
  153.                 u->next = q;    
  154.                 p->next = q->next;    
  155.                 q->next = p;    
  156.             }    
  157.             u = u->next;    
  158.         }    
  159.     }    
  160. }    
  161. //按学号查找某一学生成绩;  
  162. void Que_One()    
  163. {    
  164. //标志变量,记录是否查找成功;  
  165.     n = 0;    
  166.     printf("\n请输入您要查询的学生的学号: ");    
  167.     scanf("%s",num);    
  168. //从第二个节点开始遍历,直到最后一个节点为止;  
  169.     for(u = head->next; u != NULL;u = u->next)    
  170.     {    
  171. //如果当前节点学号与要查找学号一致这输出此学生信息;  
  172.         if(strcmp(u->number,num) == 0)    
  173.         {    
  174.             n = 1;    
  175.             printf("\n");    
  176.             puts("班级       姓名          语文  数学  英语 总成绩");    
  177.             printf("%-11s%-15s",u->classs,u->name);    
  178.             printf("%-6d%-6d%-6d%-6d\n",u->score.chinese,u->score.math,u->score.english,u->score.sum);    
  179.             break;    
  180.         }    
  181.     }    
  182.     if(!n)    
  183.         printf("\n--->没有这个学生的信息!\n");    
  184. }    
  185. void Analyze_Sco(Node *uu)    
  186. {    
  187. //对查找到的节点进行求各科平均成绩  
  188. //求优秀率及格率;  
  189.     C += uu->score.chinese;    
  190.     M += uu->score.math;    
  191.     E += uu->score.english;    
  192.     if(uu->score.chinese >= 60)    
  193.         Cj++;    
  194.     if(uu->score.chinese >= 90)    
  195.         Cy++;    
  196.     if(uu->score.math >= 60)    
  197.         Mj++;    
  198.     if(uu->score.math >= 90)    
  199.         My++;    
  200.     if(uu->score.english >= 60)    
  201.         Ej++;    
  202.     if(uu->score.english >= 90)    
  203.         Ey++;    
  204. }    
  205. //打印各科平均成绩及格率优秀率  
  206.   
  207.   
  208. void Print_Sco()    
  209. {    
  210.     printf("语文平均成绩: %-6.2f, 及格率: %%%-6.2f , 优秀率: %%%-6.2f.\n\n",(float)C/n,(float)100*Cj/n,(float)100*Cy/n);    
  211.     printf("数学平均成绩: %-6.2f, 及格率: %%%-6.2f , 优秀率: %%%-6.2f.\n\n",(float)M/n,(float)100*Mj/n,(float)100*My/n);    
  212.     printf("英语平均成绩: %-6.2f, 及格率: %%%-6.2f , 优秀率: %%%-6.2f.\n\n",(float)E/n,(float)100*Ej/n,(float)100*Ey/n);    
  213. }    
  214. //查找某一班级所以学生的信息;  
  215. void Que_Cla()    
  216. {    
  217. //对链表节点排序;  
  218.     Sort();    
  219.     n = C = M = E = Cj = Cy = Mj = My = Ej = Ey = 0;    
  220.     printf("\n请输入您要查询的班级: ");    
  221.     scanf("%s",num);    
  222.     printf("\n");    
  223.     for(u = head->next; u != NULL;u = u->next)    
  224.     {    
  225. //不是该班的学生则跳过;  
  226.         if(strcmp(u->classs,num))    
  227.             continue;    
  228. //如果是第一个学生则打印头信息  
  229.         if(!n)    
  230.             puts("学号       姓名          语文  数学  英语 总成绩");    
  231.         n++;    
  232.         printf("%-11s%-15s",u->number,u->name);    
  233.         printf("%-6d%-6d%-6d%-d\n",u->score.chinese,u->score.math,u->score.english,u->score.sum);    
  234.         Analyze_Sco(u);    
  235.     }    
  236.     if(!n)    
  237.     {    
  238.         printf("没有这个班级的学生信息!\n");    
  239.         return ;    
  240.     }    
  241. //打印该班级学生的各个成绩的特征值;  
  242.     printf("\n该班共有学生 %d 人.\n\n",n);    
  243.     Print_Sco();    
  244.     
  245. }    
  246. //打印全校所以学生的信息  
  247. //具体情况同打印班级学生信息;  
  248. void Que_All()    
  249. {    
  250.     Sort();    
  251.     n = C = M = E = Cj = Cy = Mj = My = Ej = Ey = 0;    
  252.     printf("\n");    
  253.     if(head->next == NULL)    
  254.     {    
  255.         printf("--->没有学生信息!\n");    
  256.         return ;    
  257.     }    
  258.     puts("班级        学号        姓名          语文  数学  英语 总成绩");    
  259.     for(u = head->next; u != NULL;u = u->next)    
  260.     {    
  261.         n++;    
  262.         printf("%-12s%-12s%-15s",u->classs,u->number,u->name);    
  263.         printf("%-6d%-6d%-6d%-d\n",u->score.chinese,u->score.math,u->score.english,u->score.sum);    
  264.         Analyze_Sco(u);    
  265.     }    
  266.     printf("\n全校共有学生 %d 人.\n\n",n);    
  267.     Print_Sco();    
  268. }    
  269. //保存文件;  
  270. void Save()    
  271. {    
  272.     char c;    
  273.     printf("\n确认保存?(Y/N): ");    
  274.     scanf("%*c%c",&c);    
  275.     if(c == 'N')    
  276.         return ;    
  277.     FILE *fp;    
  278.     if((fp=fopen("D:\\data.txt","w"))==NULL)    
  279.     {    
  280.         printf("\n--->无法打开文件\n");    
  281.         return ;    
  282.     }    
  283. //写入数据表头信息;  
  284.     fputs("班级       学号       姓名          语文  数学  英语 总成绩",fp);    
  285.     if(head->next != NULL)    
  286.         fputs("\n",fp);    
  287. //从头节点开始依次写入文件;  
  288.     for(u = head->next; u != NULL;u = u->next)    
  289.     {    
  290.         fprintf(fp,"%-11s%-11s%-15s",u->classs,u->number,u->name);    
  291.         fprintf(fp,"%-6d%-6d%-6d%-d",u->score.chinese,u->score.math,u->score.english,u->score.sum);    
  292.         if(u->next != NULL)    
  293.             fprintf(fp,"\n");    
  294.     }    
  295.     fclose(fp);    
  296.     printf("\n--->成绩成功存入D:\\\\data.txt中\n");    
  297. }    
  298. //读取文件;  
  299. void Open()    
  300. {    
  301.     printf("\n请把数据放到目录D:\\\\data.txt中,按任意键确认.\n");    
  302.     getch();    
  303.     FILE *fp;   
  304. //从c盘根目录下读取文件;  
  305.     if((fp=fopen("D:\\data.txt","r"))==NULL)    
  306.     {    
  307.         printf("\n--->没有找到文件!\n");    
  308.         return ;    
  309.     }    
  310.     char tmp[100];    
  311. //读取65个菜单头字符存入tem字符数组中;  
  312.     fgets(tmp,66,fp);    
  313.   
  314. //读到文件结尾处跳出循环;  
  315.     while(!feof(fp))    
  316.     {    
  317.         u = new_node(u);    
  318.         fscanf(fp,"%s%s%s",u->classs,u->number,u->name);    
  319.         fscanf(fp,"%d%d%d%d",&u->score.chinese,&u->score.math,&u->score.english,&u->score.sum);  
  320. //头插法建立链表;  
  321.         u->next = head->next;    
  322.         head->next = u;    
  323.     }    
  324.     printf("\n--->成绩读入成功!\n");    
  325.     fclose(fp);    
  326. }    
  327. //退出程序  
  328. void Exi()    
  329. {    
  330.     char c;    
  331.     printf("\n确定退出?(Y/N): ");    
  332.     scanf("%*c%c",&c);    
  333.     if(c == 'N')    
  334.         return ;    
  335. //打印结束语;  
  336.     system("cls");    
  337.     printf("\n\n");    
  338.     printf("\t\t\t     %c %c %c %c %c %c %c %c %c\n",4,4,4,4,4,4,4,4,4);    
  339.     printf("\t\t\t     %c 谢谢使用 %c\n",4,4);    
  340.     printf("\t\t\t     %c %c %c %c %c %c %c %c %c\n",4,4,4,4,4,4,4,4,4);    
  341.     printf("\t\t\t                          Thank you!\n\n\n");    
  342.     exit(0);    
  343. }    
  344. int main()    
  345. {    
  346. //存储指令的变量  
  347.     int orz;    
  348. //设置系统文本颜色  
  349.     system("color 0F");    
  350. //新建一个学生信息头节点;  
  351.     head = new_node(head);    
  352.     while(1)    
  353.     {    
  354. //显示菜单、  
  355.         Welcome();    
  356. //接收用户命令、  
  357.         scanf("%d",&orz);    
  358. //调用系统函数清屏;  
  359.         system("cls");    
  360.         switch(orz)    
  361.         {    
  362. //根据指令进入相应菜单选项  
  363.             case 1:Open();break;    
  364.             case 2:Save();break;    
  365.             case 3:Add();break;    
  366.             case 4:Mod();break;    
  367.             case 5:Del();break;    
  368.             case 6:Que_One();break;    
  369.             case 7:Que_Cla();break;    
  370.             case 8:Que_All();break;    
  371.             case 9:Exi();break;    
  372.             default :printf("\n--->无效的指令!\n");    
  373.         }    
  374.         printf("\n");   
  375. //执行系统函数  
  376.         system("pause");    
  377.         system("cls");    
  378.     }    
  379.     return 0;    
  380. }  

谢谢观看!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值