C语言实训总结在初学C语言的一个学期后,我们进行了C语言实训阶段 , 尝试自己编写一个比较复杂的程序系统 。在为期两周的时间中,我们同组的同学共同的感受是:C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的 。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序 。在这里,我作为其中的参与者,自然感触良多 。
刚开始接触到C的时候,我已经学过一些有关VB的内容,这个在算法和思维上稍微有点帮助 。回想本学期的学习,首先,最基本的,是C的数据格式 , 让我们知道整数,浮点数以及字符常量在C中的运用 。然后,在学会了数据转化,以及熟练的可以对各种数据处理之后,我开始进行有关数据结构,像数组 , 结构体等的学习,因为有的东西从现有的知识来看都是非常简单的,还没有联系到指针等等一些复杂的概念 。可是,仅仅学会这些是远远不够的 , C语言中,还有很多更加经典、重要、实用的知识 。
说说函数 。虽说很多程序语言都有函数这一内容,但我觉得C语言的函数是最有魅力的了 。学习函数的方法是比较简单的,只有两个字“牢记”,即:牢记函数的功能 , 牢记函数的用途以及如何输入输出 。函数从本质上讲是一段通用程序,用它可以帮助我们节约很多编程的时间,学习C语言的“高人”都说,一个聪明的编程者在编写程序前往往总是先找自己所编写的程序中有多少是可以用函数来代替的 。比如,大家可以作一个比较字符串的实验,用C语言中的strcmp()函数只要一句话,而自己编写的话,30句都很难实现,可想而知函数的实用和快捷 。在我们C语言实训的代码中,函数更是得到了充分的应用,可以说,实训题目的复杂代码,就是用无数个函数的调用和嵌套积累出来的 。
要注意的是 , 有的同学刚刚开始的时候,都是被一些大的程序激励的,所以当开始的时候看到繁琐的数据转化和简单的算法,都觉得很无聊,都想自己做几个自己满意的程序来看看,虽然这种想法很好,但是,我们说 , 没有基础,纯粹是搬照一些现成设计方法 , 是不足取的 。要知道,程序设计讲究的是个人的思维的,假如刚开始就被一些现成的思想束缚?。?以后就会觉得很无趣 。
我们知道,指针其实是C语言的灵魂,许多的数据结构在我们学到这里之前都可以说是精通了 。所以我们的任务就是,让数据结构在指针中运行 。当然,刚刚开始接触到这些新的东西,是一件非常痛苦的事情,所以我们一定要用非常形象的思维去看待指针,不能太固化 。所以,新的东西,比如结构体在指针中的表现方法,数组及多维数组在结构体中的运用,都一点一点的加了进来 , 同时丰满了我们对原来C的数据机构,数据表示的理解 。当我们完成了这三步的学习,我们已经可以自豪的说,我们的基础都扎实了,可以进一步的学习有关算法,设计概念等等深层次的东西了 。
但是,指针,结构体,这些太抽象的东西,在学习C语言的时候我们就有点“似懂非懂”,可是在眼下的C语言实训中,像这么重要的C语言知识,一定要达到能熟练掌握,实际运用的程度 。在实训的大程序中 , 结构体在指针中的表现方法 , 数组及在结构体中的运用等具体的技术环节,都得到了体现,不会指针,我们的工作是没法展开的 。所以 , 在实训期间,大家在巩固基本知识的基础上,逐块攻克实训课题,克服了困难 , 自信心得到了提高 。
最后 , 谈谈我们组的程序软件 。商店商品管理系统,是一个比较利于应用,解决实际问题,方便实际管理的程序 。设计代码比较复杂,结构比较严谨 。在程序编写的1周左右的时间里,组员们遇到了上述的困难,包括程序设计构思,甚至是指针等某些知识点的欠缺,导致的工作中出现的困难 。但是,当大家一起团结协作,解决了这些困难之后,发现自己也可以编写复杂的、应用性的程序了,更发现自己对C语言这门学科的兴趣也提高了 。
当然,我们编写的商店商品管理系统,还存在很多疏漏和不合理之处 。比如,程序复杂冗长 , 如果时间充裕,我们将在不改变程序运行结果的基础上 , 简化程序,使每一句更加精辟,总体上更加简化 。另外,在程序的外观上,我们由于时间问题,没有做更多的修饰 , 运行起来显得比较死板、枯燥乏味 。如果增添一些色彩和其他效果,我们的程序也许会更加完美 。
以上就是我的C语言实训个人总结
c语言综合实验报告 帮我弄一个姓名***
**学 院 ** 专业052 班
2007年11月24日
实验内容实验五指导老师陈老师
一、实验内容及要求c语言实验四函数与程序:
编译运行习题5-3,观察x、y变量的值 。
实现客户机类(类名为CLIENT),其中包含的成员有c语言实验四函数与程序:字符型静态数据成员ServerName,用来保存服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;静态函数ChangeServerName(),用来改变服务器名称 。在头文件client.h中声明这个类 , 在文件client.cpp中实现,在文件test.cpp中测试这个类 , 观察相应的成员变量取值的变化情况 。二、实验目的:
1、复习类的声明和使用、掌握对象的声明和使用;
2、学习构造函数和析构函数的使用,观察构造函数和析构函数的执行过程 。
三、程序:
//client.h
class Client
{
public:
Client();
~Client();
static ChangeServerName(char *);//改变服务器名称
char * GetServerName();//返回服务器名称
int GetClientNum ();//返回客户机数量
protected:
static char ServerName[20];//服务器名称
static int ClientNum;//存放服务器数量
};
/////////////////////////////////////////////////////
//client.cpp
# include iostream
# include cstring
# include "client.h"
using namespace std;
static char *ServerName = "";
int Client::ClientNum = 0;
Client::Client()
{ClientNum;}
Client::~Client(){}
void Client::ChangeServerName(char * names)//改变服务器名称
{strcpy(ServerName,names);}
char * GetServerName()//返回服务器名称
{return ServerName;}
int GetClientNum ()//返回服务器数量
{return ClientNum;}
////////////////////////////////////////////////////////
//test.cpp
# include iostream
# include "client.cpp"
using namespace std;
void main()//用于测试的主函数
{
Client threeclient[3];
char namestr[20];//临时存放服务器名称
cout"定义了3个客户"endl;
cout"请输入新服务器名称:"endl;
cin namestr;
CC.ChangeServerName(namestr);
cout"服务器的名称是"Client::GetServerName()endl;
cout"客户数量为"CC.GetClientNum ();
}
思考题:
(1)C语言有五种基本数据类型:字符、整型、单精度实型、双精度实型和空类型 。结构体可以定义自己所需特殊类型.其c语言实验四函数与程序他类型是已经定义好,不可修改的,而结构体是根据自己的需要定义的特殊的类型.
(3)采用了循环,复合语句.
c语言程序设计第一章 程序设计的基本概念
第一节 C语言的发展历史与特点
第二节 程序与程序设计
第三节 算法与算法的描述
第四节 C语言的上机操作
思考题与习题
第二章 C语言程序设计基础
第一节 C语言的程序结构
第二节 数据类型
第三节 运算符与表达式
思考题与习题
第三章 C程序控制结构
第一节 C程序的三种基本控制结构
第二节 顺序结构
第三节 选择结构
第四节 循环结构
思考题与习题
第四章 数组
第一节 数组与数组元素的概念
第二节 一维数组
第三节 二维数组及多维数组
第四节 字符串与字符数组
思考题与习题
第五章 指针
第一节 指针与指针变量的概念
第二节 指针变量的定义和引用
第三节 指针变量与数组
思考题与习题
第六章 函数
第一节 函数的定义
第二节 函数的嵌套调用
第三节 数组作为函数参数
第四节 指针与函数
第五节 变量的使用范围与存储类别
第六节 不同文件中的函数使用
思考题与习题
第七章 编译预处理
第一节 宏定义
第二节 文件包含
第三节 条件编译
思考题与题
第八章 结构体与共用体
第一节 结构体基础
第二节 结构体数组
第三节 结构体指针
第四节 链表
第五节 位段
第六节 共用体
第七节 枚举类型与自定义类型
思考题与习题
第九章 文件
第一节 文件概述
第二节 文件的打开与关闭
第三节 文件的读/写
第四节 文件的定位
思考题与习题
第十章 程序设计方法
第一节 程序设计的基本概念
第二节 结构化程序设计方法
第三节 程序效率
第四节 程序设计风格
思考题与习题
附录
附录A C语言实验
附录B 标准ABSII码表
附录C C语言中的关键字
附录D 运算符的优先级与结合性
求这几个C语言程序(函数)又是课堂作业c语言实验四函数与程序,做c语言实验四函数与程序了n遍,练练手把
1.判断素数
#includestdio.h
int is_prime(int num)
{
int i=0;
for(;inum/2;i)
{
if(num%i==0)
{
break;
}
}
if(i=num/2)
{
return -1;//不是素数返回-1
}
else
{
return 0;//如果是素数返回0
}
}
int main(void)
{
printf("请输入一个正整数c语言实验四函数与程序:");
int x;
scanf("%d",x);
if(x=0)
{
printf("输入的不是正整数");
}
else
{
if(is_prime(x)==-1)
printf("输入的是素数");
if(is_prime(x)==0)
printf("输入的不是素数");
}
}
2.scopy函数
#includestdio.h
void myscopy(char *des, const char* src)
{
while(*src!='\0')
{
*des=*src;
}
}
int main(void)
{
char a[20]="hello";
char b[20]="myworld";//注意这个地方数组的长度要适当大,要不然可能出现越界!
printf("拷贝之前,a是%s,b是%s",a,b);
myscopy(a,b);
printf("拷贝之后 , a是%s,b是%s"a,b);
return 0;
}
3.矩阵相加
int **res addmatrix(int a[][],int b[][])
{
int sum[5][5];
int i=0;
int j=0;
for(;i5;i)
{
for(;j5;j)
{
sum[i][j]=a[i][j] b[i][j];
}
}
return sum;
}
int main(void)
{
int a[5][5]={},b[5][5]={};//初始化可以随意,注意列数要求就行了
int i=0;
int j=0;
int mysum[5][5]=addmatrix(a,b);
for(;i5;i) //输出
{
for(;j5;j)
{
printf("- ",mysum[i][j]);
}
printf("\n");
}
}
4.递归求斐波那契数列
#includestdio.h
static buf[100];//这个主要是用来存数列的中间结果的 , 为了提高递归算法的效率,否则会运行得很慢
int Febanaci(int num)
{
if(num=1||num=2)
{
return num;
}
else
{
buf[num-1]=Febanaci(num-1);
buf[num-2]=Febanaci(num-2);
buf[num]=buf[num-1] buf[num-2];
return buf[num];
}
}
int main(void)
{
int i=1;
int count=0;
for(;i21;i)
{
printf("] ",Febanaci(i));
count;
if(count==3)
{
count=0;
printf("\n");
}
}
return 0;
}
5.统计字符数
void cnt(const char *src)
{
int num;
int alpha;
int space;
int others;
while(*src!="\0")
{
if(isdigit(*src))
{
num;
}
else if(isalpha(*src))
{
alpha;
}
else if(*src="http://img.readke.com/240722/1H43I312-0.jpg")
{
space;
}
else
{
others;
}
src;
}
printf("该字符串中数字有%d个,字母有%d个,空格有%d个 , 其c语言实验四函数与程序他字符有%d个",num,alpha,space,others);
}
int main(void)
{
printf("请输入要统计的字符串c语言实验四函数与程序:");
char mystr[100];//注意输入的时候不要越界;
gets(mystr);
cnt(mystr);
}
c语言中编写程序 , 输入2个数,定义四个函数,分别实现加减乘除四则运算 , 要使用函数 。计算除法时要判断1、打开python语言中的命令窗口,定义函数com_result,传入三个参数x、y和func 。
2、定义一个变量result,然后调用第一步中的函数,使用lambda表达式 。
3、使用同样的方法,调用函数com_result,这次lambda表达式使用减号 。
4、再次调用函数,lambda表达式使用乘号,连接两个操作数 。
5、如果要计算两个数的除法,可以使用lambda表达式,中间使用除号 。
6、最后使用求模运算,然后调用函数计算模运算,并打印对应的值 。
c语言实验报告心得c语言实验心得:
1、只有频繁用到或对运算速度要求很高的变量才放到data区内,如for循环中的计数值 。
2、其他不频繁调用到和对运算速度要求不高的变量都放到xdata区 。
3、常量放到code区,如字库、修正系数 。
4、逻辑标志变量可以定义到bdata中 。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量 。这样可以大大降低内存占用空间 。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中 。
5、data区内最好放局部变量 。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖) , 可以提高内存利用率 。当然静态局部变量除外,其内存使用方式与全局变量相同;
6、确保程序中没有未调用的函数 。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数 。函数里用的局部变量的空间是不释放 , 也就是同全局变量一样处理 。这一点Keil做得很愚蠢,但也没办法 。
7、如果想节省data空间就必须用large模式 。
将未定义内存位置的变量全放到xdata区 。当然最好对所有变量都要指定内存类型 。
8、使用指针时 , 要指定指针指向的内存类型 。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节 。如指针p是指向data区,则应定义为:char data *p; 。还可指定指针本身的存放内存类型 , 如:char data * xdata p; 。其含义是指针p指向data区变量,而其本身存放在xdata区 。
以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机 , 因为手头资料不多,找到一些C51的程序,发现里面有这些关键字 , 不甚明了,没办法只好找了下,发现如下描述:
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述) 。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果 。
在51系列中data,idata,xdata,pdata的区别
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小 。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同 , 只是因为访问的方式不同 。idata是用类似C中的指针方式访问的 。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间 , 用DPTR访问 。
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写 。这个比较特殊,而且C51好象有对此BUG,建议少用 。但也有他的优点,具体用法属于中级问题,这里不提 。
三、有关单片机ALE引脚的问题
"单片机不访问外部锁存器时ALE端有正脉冲信号输出,此频率约为时钟振荡频率的1/6.每当访问
外部数据存储器是,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲."这句话是不是有毛
病.我觉得按这种说法,应该丢失3个ALE脉冲才对,我一直想不通是怎么回事,希望大虾们帮帮我.
小弟感激涕零.
答:
其他所有指令每6个机器周期发出一个ALE , 而MOVX指令占用12个机器周期只发出一个ALE
四、如何将一个INT型数据转换成2个CHAR型数据?
经keil优化后,char1=int1/256,char2=int1%6或char1=int18,char2=int10x00ff效率是一样的 。
五、在KEIL C51上仿真完了,怎样生成HEX文件去烧写??
右键点项目中Target 1,选第二个,在OUTPUT中选中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一个新的数据类型,但实际上这个新的数据类型是已经存在的,只不过是定义了
一个新的名字.
#define只是一个标号的定义.
你举的例子两者没有区别,但是#define还可以这样用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,这些情况下是不能用typedef定义的
七、请问如何设定KELC51的仿真工作频(时钟)
用右键点击左边的的target 1,然后在xtal一栏输入
八、不同模块怎样共享sbit变量 , extern不行?
把SBIT定义单独放到一个.H中,每个模块都包含这个.h文件
九、C51中对于Px.x的访问必须自己定义吗?
是的 。
如sbit P17 = 0x97;即可定义对P1.7的访问
十、SWITCH( )语句中表达式不可以是位变量对吗?
可以用位变量:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case '0':{printf("0\n");break;}
case '1':{printf("1\n");break;}
default:break;
}
}
bit 变量只有两种状态,if 语句足够啦,!!!
十一、const常数声明占不占内存???
const 只是用来定义“常量”,所占用空间与你的定义有关,如:
const code cstStr[] = {"abc"};
占用代码空间;而如:
const char data cstStr[] = {"abc"};
当然占用内存空间 。
另外,#define 之定义似乎不占用空间 。
十二、philips的单片机P89C51RD 的扩展RAM在C51中如何使用?
试一试将auxr.1清0,然后在c语言中直接声明xdata类型的变量
十三、BUG of Keil C51
程序中用如下语句:
const unsigned char strArr[] = {"数学"};
结果发现strArr[] 内容为 {0xCA,0xD1,0xA7} , 真奇怪!
凡是有0xfd,则会通通不见了 , 所以只能手工输入内码了,例如 uchar strArr[]=
{0xCA,0xfd,0xd1,0xa7}(用Ultraedit会很方便) 。
十四、Keil C51中如何实现代码优化?
菜单Project下Option for target "Simulator"的C51.
看到Code optimization了吗?
十五、请教c的!和 ~ 符号有甚区别??
!是逻辑取反,~是按位取反 。
十六、c51编程,读端口,还要不要先输出1?
我怎么看到有的要,有的不要,请高手给讲讲,到底咋回事?谢了
要输出1的,除非你能保证之前已经是1,而中间没有输出过其他值 。
十七、当定时器1(T1)用于产生波特率时,P3^5还是否可以用作正常的I/O口呢?
p3.5完全可以当普通的io使用
十八、C51中 INT 转换为 2个CHAR?
各位高手:
C51中 INT 转换为 CHAR 如何转换诸如:
X = LOW(Z);
Y = HIGH(Z);
答:
x=(char)z;
y=(char)(z8);
十九、如果我想使2EH的第7位置1的话 , 用位操作可以吗?
现在对位操作指令我一些不太明白请各位多多指教:
如 SETB 07H 表示的是20H.7置1,对吗?(我在一本书上是这么看到的)
那么如果我想使2EH的第7位置1的话,象我举的这个例子怎么表示呢?谢谢!
SETB 77H
setb (2eh-20h)*8 7
20h-2fh每字节有8个可位操作(00h-7fh),其它RAM不可位直接操作
二十、char *addr=0xc000 和char xdata *addr=0xc000有何区别?
char *addr=0xc000;
char xdata *addr=0xc000;
除了在内存中占用的字节不同外,还有别的区别吗?
char *addr=0xc000; 是通用定义,指针变量 addr 可指向任何内存空间的值;
char xdata *addr=0xc000; 指定该指针变量只能指向 xdata 中的值;
后一种定义中该指针变量(addr)将少占用一个存储字节 。
uchar xdata *addr=0xc000;指针指向外ram;
如果:data uchar xdata *addr=0xc000;指针指向外ram但指针本身存在于内ram(data)
中
以此类推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;
data uchar idata *addr=0xa0;.........
二十一、while(p1_0)的执行时间?
假设,P1_0为单片机P1口的第一脚,请问,
while(P1_0)
{
P1_0=0;
}
while(!P1_0)
{
P1_0=1;
}
以上代码,在KEIL C中,需要多长时间,执行完 。能具体说明while(P1_0)的执行时间吗?
仿真运行看看就知道了,
我仿真了试了一下,约14个周期
二十二、怎样编写C51的watchdog程序?
各位大虾,我用KEIL C51 编写了一个带外部开门狗的程序,可程序无法运行起来 , 经过查
找,发现程序在经过C51编译后,在MAIN()函数的前部增加了一端初始化程序,等到进入
主程序设置开门狗时 , 开门狗已经时间到,将我的程序复位了 , 请问我怎样才能修改这一端
初始花程序,使他一运行,就设置开门狗?
可以在startup.a51中加入看门狗刷新指令,当然用汇编,然后重新编译startup.a51
,将他和你的程序连接即可 。新的startup.a51会自动代替系统默认的启动模块 。
二十三、keil C51 怎样把修改的startup.a51 加到工程文件中
直接加入即可
注意不要改动?STACK,?C_START,?C_STARTUP等符号 。startup.a51直接加入项目,不用修改也可 。可在内面自己修改汇编的一些限制或堆栈指针 。
二十四、关于波特率的设置
我在设定串口波特率时发现一个问题:在晶体震荡器为11.0592MHz时 , 若设9600BPS的话,
TH1=0XFD,TL1=0XFD , 而要设19200BPS的话,TH1、TL1有否变化 , 如果没变,为什么?
如果变了,又为什么?(因为我看书上俩个是一样的),希望大家点拨 。
答:
当电源控制寄存器(PCON)第BIT7(SMOD)为1时波特率加倍 。
TH1和TL1的值不变.
二十五、如何在C中声明保留这部分RAM区不被C使用?
我不知道在C源程序中怎么控制这个,但在汇编程序中加入下面一段就行:
DSEG AT 20H
AA: DS 10
这样C51就不会占用20H--29H了
或者在c51里这样定义:
uchar data asm_buff[10] _at_ 0x20;
二十六、问浮点运算问题
我在用C51时发现它对传递浮点参数的个数有限制,请问:
1)参数是以全局变量的形式传递的,请问以全局变量的形式传递的参数也有限制吗?
2)这种传递浮点参数的限制有多少呢?
3)float*float的结果是float类型还是double类型?能否直接赋值给float类型的变量?
答:
由于KEIL C51的参数传递是通过R0-R7来传递的 , 所以会有限制 。
不过KEIL提供了一个编译参数,可以支持更多参数的传递 。具体
的内容见KEIL的PDF文档 。
我建议你把多个要传递的参数定义到指针或结构体中去,传递参
数通过指针或结构进行 , 这样好一些 。
第3个问题回答是YES,你自己试试不就知道了 。
二十七、如何在某一个地址定义ram
用_at_ 命令,这样可以定位灵活一点的地址
uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM
将dis_buff[16]定位在0x6020开始的16个字节
二十八、keil c中 , 用什么函数可以得到奇偶校验位?
例如32位数据,将四个字节相互异或后检查P即可 , 若耽心P被改变,可用内嵌汇编 。
#include
unsigned char parity(unsigned char x){
x^=x;
if(P)return(1);
else return(0);
}
unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}
【c语言实验四函数与程序 c语言实验八函数】关于c语言实验四函数与程序和c语言实验八函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- Java简单购书系统代码,javaweb编写简易购书系统
- 什么叫五菱房车视频,五菱房车使用感受
- 视频号能暂时直播多久,视频号直播可以暂停吗
- php表单数据库数目 php中表单的使用
- 肌腱断裂用什么拍摄技术,肌腱断裂要做什么检查
- 微信发视频号怎么又要实名认证,微信视频号为什么要实名认证
- 百度网盘vb.net 百度网盘下载慢怎么解决
- nova3e什么时候用鸿蒙,华为nova3e是什么时候出来的
- 黑暗系冒险解谜游戏中文网,黑暗系冒险解谜游戏中文网站