# 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;
}
}
}
c语言课程设计1
最新推荐文章于 2022-06-09 01:04:27 发布