c语言课程设计1

# include<stdio.h>
# include<math.h>
# include<time.h>
# include<malloc.h>
# include<string.h>

typedef struct _node
{
    char name[40];//姓名
    char no[18];//身份证号
    int xb;//性别:女性为0,男性为1
    struct _node *next;
}node;
//=====================函数声明===========================
void PutBlack();
void PutWhite();
void Paint(int Arr[]);

node *Create(int n);//创建链表
void TraverList(node *Head);//遍历链表
void Insert(node **Head,char name[]);//在某考生之前插入新节点
void Delete(node **Head, char name[]);//删除某考生
//=======================================================

int main()
{
    //=======================定义变量======================
    int iSelect;
    //===========================1========================

    int n_1;//正多边形的边数
    double iSide_1 = 1;
    double PI_1;
    int i_1;//for循环里面的
    int iCountTotal_1=0;
    int iCount_1=0;
    double x_1, y_1;
    int iWhile_2=0;//while里循环次数

    //===========================2========================
    int Arr_2[] = { 0, 0, 0,-1,1, 1, 1 };
    //0表示白子,1表示黑子,-1表示空格
    int iCount_2=0;//步数
    int i_2;
    int temp_2[7] = {1,1,1,-1,0,0,0};
    int *p_2 = Arr_2;
    int flag_2 = 0;

    //==========================3==========================
    int n_3;
    node *head;
    char _name_3[40];




    printf("欢迎来到第15组,考试报名管理\n");
    printf("1:求π的近似值\n");
    printf("2:黑白子交换\n");
    printf("3:开始报名管理\n");
    printf("请输入对应的数字选择要进行的项目:");

    scanf("%d", &iSelect);
    switch (iSelect)
    {
        //==========================1==============================
    case 1:
        printf("假设圆半径为1\n");
        printf("\n这是用”正多边形逼近”方法实现的\n");
        printf("正6边形,π=3\n");
        for (i_1 = 0, n_1 = 12; i_1 < 20; i_1++, n_1 *= 2)
        {
            iSide_1 = (double)sqrt(2 - sqrt(4 - iSide_1*iSide_1));
            PI_1 = (double)n_1*iSide_1 / 2;
            printf("正%d边形,边长=%.15f\tπ=%.15f\n", n_1, iSide_1, PI_1);
        }

        printf("\n这是用随机数法实现的\n");
        srand(time(0));
        for (i_1 = 0; i_1 < 100000; i_1++)
        {
            iCountTotal_1++;
            x_1 = rand() % 10 / 1.0;
            y_1 = rand() % 10 / 1.0;
            if ((x_1*x_1 + y_1*y_1) <= 100)
                iCount_1++;
        }
        printf("PI=%.15f\n", (double)iCount_1 / (double)iCountTotal_1 * 4.0);

        break;



        //==========================2==============================
    case 2:
        /*
        用 system() 调用 color命令可以改变颜色 如system(“color 12”),后面打出来的就是蓝底绿字

        COLOR [attr]

        attr        指定控制台输出的颜色属性

        颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
        前景。每个数字可以为以下任何值之一:

        0 = 黑色       8 = 灰色
        1 = 蓝色       9 = 淡蓝色
        2 = 绿色       A = 淡绿色
        3 = 浅绿色     B = 淡浅绿色
        4 = 红色       C = 淡红色
        5 = 紫色       D = 淡紫色
        6 = 黄色       E = 淡黄色
        7 = 白色       F = 亮白色

        如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
        的颜色。这个值来自当前控制台窗口、/T 命令行开关或
        DefaultColor 注册表值。

        如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
        会将 ERRORLEVEL 设置为 1。

        例如: "COLOR fc" 在亮白色上产生亮红色
        */
        system("COLOR 70");
        printf("有三个白子和三个黑子如下图布置(.表示空格):\n");

        Paint(Arr_2);
        printf("游戏目的是用最少的步数将上图中白字和黑子的位置进行交换:\n");
        Paint(temp_2);
        printf("游戏的规则是:\n1);一次只能移动一个棋子;\n2)棋子可以向空格中移动,也可以跳过");
        printf("一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子。\n");
        printf("以下是移动过程\n\n");

        while ((Arr_2[0] + Arr_2[1] + Arr_2[2]) != 3 || Arr_2[3] != -1 || (Arr_2[4] + Arr_2[5] + Arr_2[6]) != 0)
            //判断游戏是否结束
        {
            flag_2 = 0;//每次进入循环后flag_2设为0


            //1)黑子向左跳过白子落入空格
            //空格 白 黑
            //这时不用考虑棋子阻塞现象
            for (i_2 = 0; !flag_2&&i_2 < 5; i_2++)//如果移动了棋子,这里肯定不执行,直接跳到while判断
            if (p_2[i_2] == -1 && p_2[i_2 + 1] == 0 && p_2[i_2 + 2] == 1 && i_2 <= 4)
            {
                Arr_2[i_2] = 1;
                Arr_2[i_2 + 2] = -1;
                iCount_2++;
                printf("%d:\t", iCount_2);
                Paint(Arr_2);
                printf("\n");
                flag_2 = 1;//移动了棋子
            }


            //2)白子向右跳过黑子落入空格
            //白 黑 空格
            //这时不用考虑棋子阻塞现象
            for (i_2 = 0;!flag_2&&i_2 < 5; i_2++)
            if (Arr_2[i_2] == 0 && Arr_2[i_2 + 1] == 1 && Arr_2[i_2 + 2] == -1 && i_2 <= 4)
            {
                Arr_2[i_2] = -1;
                Arr_2[i_2 + 2] = 0;
                iCount_2++;
                printf("%d:\t", iCount_2);
                Paint(Arr_2);
                printf("\n");
                flag_2 = 1;
            }




            //3)黑子向左移动一格落入空格(但不应该产生棋子阻塞现象)
            //空格 黑
            //如果是白 空 黑 白就不能移动中间的(亦即黑)
            //这时i_2是空的下标,i_2=0或5时肯定不会阻塞
            for (i_2 = 0; !flag_2&&i_2 < 7; i_2++)//对每一个棋子做判断
            if (Arr_2[i_2] == -1 && Arr_2[i_2 + 1] == 1 && (i_2 == 0 || i_2 == 5 || !(Arr_2[i_2 - 1] == 0 && Arr_2[i_2 + 2] == 0)))
            {
                Arr_2[i_2 ] = 1; Arr_2[i_2 +1] = -1;
                iCount_2++;
                printf("%d:\t", iCount_2);
                Paint(Arr_2);
                printf("\n");
                flag_2 = 1;
            }


                //4)白子向右移动一格落入空格(但不应该产生棋子阻塞现象)
                //白 空格
                //如果是黑 白 空 黑就不能移动中间的(亦即白)
                //这时i_2是白下标,i_2=0或5时肯定不会阻塞
                for (i_2 = 0; !flag_2&&i_2 < 7; i_2++)
                if (Arr_2[i_2] == 0 && Arr_2[i_2 + 1] == -1 && (i_2 == 0 || i_2 == 5 || !(Arr_2[i_2 - 1] == 1 && Arr_2[i_2 + 2] == 1)))
                {
                    Arr_2[i_2 ] = -1; Arr_2[i_2+1] = 0;
                    iCount_2++;
                    printf("%d:\t", iCount_2);
                    Paint(Arr_2);
                    printf("\n");
                    flag_2 = 1;

                }


        }
        printf("游戏结束,共用了%d步\n", iCount_2);
        break;



        //==========================3==============================
    case 3:

        printf("欢迎来到考试报名管理系统!\n");
        printf("请输入要统计的考生的个数n:");
        scanf("%d", &n_3);
        printf("现在,请依次输入一下信息:\n");
        printf("姓名\t身份证号\t\t\t性别(1代表男,0代表女)\n");

        //创建链表
        head = Create(n_3);

        //插入节点
        printf("接下来要在某考生节点前插入一个新的考生节点,请输入该考生的名字\n");
        scanf("%s", _name_3);
        Insert(&head, _name_3);
        printf("插入节点后:\n\n");
        TraverList(head);

        //删除节点
        printf("现在,要删除一个考生节点,请输入该考生姓名:\n");
        scanf("%s", &_name_3);
        Delete(&head, _name_3);
        printf("删除该考生后:\n\n");
        TraverList(head);

        break;

    }

    system("pause");
    return 0;
}


//=========================函数定义===================================
void PutBlack()
{
    printf("●");
}

void PutWhite()
{
    printf("○");
}

//画图形
void Paint(int Arr[])
{

    for (int i = 0; i < 7; i++)
    {
        switch (Arr[i])
        {
        case 1:
            PutBlack();
            break;
        case 0:
            PutWhite();
            break;
        case -1:
            printf(".");
            break;
        }
        printf("\t");
    }
    printf("\b\n");
}


node *Create(int n)//创建链表
{
    node *p1, *p2,*Head;
    char _name[40], _no[18];
    int i;
    p1 = (node *)malloc(sizeof(node));

    scanf("%s%s%d", _name, _no, &p1->xb);
    strcpy(p1->name, _name);
    strcpy(p1->no, _no);
    p1->next = NULL;
    Head = p1;
    p2 = p1;

    for (i = 1; i < n; i++)
    {
        p2 = p1;
        p1 = (node *)malloc(sizeof(node));
        scanf("%s%s%d", _name, _no, &p1->xb);
        strcpy(p1->name, _name);
        strcpy(p1->no, _no);
        p1->next = NULL;

        p2->next = p1;
        p2 = p1;

    }
    return Head;
}

void TraverList(node *Head)//遍历链表
{
    node *p = Head;
    for (; p != NULL; p = p->next)
    {

        printf("%s\t%s\t\t\t", p->name, p->no);
        if (p->xb == 1)
            printf("%s\n", "男");
        else printf("%s\n", "女");
    }
}
void Insert(node **Head, char name[])//在某考生之前插入新节点
{
    node *p = *Head;
    node *p1;
    char _name[40];
    char _no[18];

    node *newNode = (node *)malloc(sizeof(node));

    printf("请输入要插入的节点的信息:\n");
    scanf("%s%s%d", _name, _no, &newNode->xb);
    strcpy(newNode->name, _name);
    strcpy(newNode->no, _no);
    newNode->next = NULL;

    if (strcmp((*Head)->name, name) == 0)
    {
        newNode->next = *Head;
        *Head = newNode;
        return;
    }

    for (; p->next != NULL;p=p->next)
    {
        if (strcmp(p->next->name, name) == 0)
        {
            p1 = p->next;
            p->next = newNode; 
            newNode->next = p1;
            return;
        }
    }

}
void Delete(node **Head, char name[])//删除某考生
{
    node *p = *Head;
    node *p1;
    if (strcmp((*Head)->name, name) == 0)
    {
        (*Head) = (*Head)->next;
        free(p);
        p = NULL;
        return;
    }
    for (; p->next != NULL; p = p->next)
    {
        if (strcmp(p->next->name, name) == 0)
        {
            p1 = p->next;
            p->next = p1->next;
            free(p1);
            p1 = NULL;
            return;
        }
    }
}

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值