C#程序设计》开发总结
2015-07-06 22:41
260 查看
C#程序设计》开发总结-201211671312-林少鑫
开发总结要求链接:http://user.qzone.qq.com/303727350/blog/1434679744
猜猜看最终结果链接:http://blog.csdn.net/u011524722/article/details/46496501
源代码下载链接:http://yun.baidu.com/share/link?shareid=3959927691&uk=1577712945
开发、运行环境为:windows8.1,zend studio10.6.2,apache2.4.9,php5.5.12,mysql5.6.17。
建议在环境下运行,数据库帐号密码在中查找修改。
开发过程介绍:
大约开发时间为5小时,大部分时间用在了解决乱码问题上,试了很多方式都没有成功,最终通过
$file=mb_convert_encoding ($file,'UTF-8','GBK');
一句解决;
另外大部分时间则用在解决mysql语句的错误和对数组出错时的处理上。
开发时的学习收获:
通过把所有方法重构、整合在<func.php>内,并作适当的注释,做到页面和逻辑分离,使用起来方便很多,看着也很舒服。
开发后的感受与体会:
遇到的第一个问题依旧是编码问题,通过
$file=mb_convert_encoding ($file,'UTF-8','GBK');这一句解决,感觉每次进行有关文件操作的时候都会遇到这样的问题,应该找个时间整合一下,方便自己,也可以给别人帮助。
第二个问题是mysql语句的错误,花了很多时间才改正完成,感觉是熟练度仍然不够,才会低效率。
第三个问题是数组,对于php的数组用的不少,但是经常会遇到问题,花费大量时间处理。
第四个考虑的问题是session,大量将session作为全局变量不知道合不合适,感觉是自己没把整个结构设计好,因此才会需要大量的session作辅助。
第五个考虑的问题是,这个程序完全没有面向对象,自己的感觉就是一步一步写,函数的调用按照先后顺序进行,接触编程三年多,投入的时间精力太少,感觉还是在用很低级的方式编程。
核心代码或全部代码的解读:
核心算法很简单,如下:总人数N,ran1=ran(1—N),ran2=ran(1—N),比较ran1和ran2正确率,选择正确率低者为相片来源;随机一个名字ran3=ran(1—N/2),随机又一个名字ran4=ran(N/2+1—N),两名字均不与ran1相同即可,这样就有三个名字可选择。通过计算,在正常情况下,正确率从高到低排列者出现率为:1/N*N、3/N*N、5/N*N……(2*N-3)/N*N、(2*N-1)/N*N。
以上算法满足以下四原则:
原则1:认识概率 高的学生,在猜猜看游戏中出现的频率相对低一些。
原则2:认识概率 低的学生,在猜猜看游戏中出现的频率相对高一些。
原则3:认识概率 100%的学生,也有出现的可能性。
原则4:认识概率 0%的学生,也不必每次都出现。
//获取文件列表
function getFile($dir) {
$fileArray[]=NULL;
if (false != ($handle = opendir ( $dir ))) {
$i=0;
while ( false !== ($file = readdir ( $handle )) ) {
//去掉"“.”、“..”以及带“.xxx”后缀的文件
if ($file != "." && $file != ".."&&strpos($file,".")) {
$file=mb_convert_encoding ($file,'UTF-8','GBK'); //极其重要的一句话,编码问题
$fileArray[$i]=$dir.$file;
if($i==200){
break;
}
$i++;
}
}
//关闭句柄
closedir ( $handle );
}
return $fileArray;
}这一段是实现获取文件名的方法,可以说是最基础也是最难的,因为乱码问题,经过多次尝试,最终通过添加这一句之后才成功。
初始化数据表数据,需要验证口令,口令由32位MD5加密,很大程度上防止了数据被除管理员以外的人清除的可能性,保障数据安全;同时管理员完全可以根据需要选择清楚所有数据,重新读取文件夹内文件名并写入数据库。
//主方法
function main(){
$ran=choose();
$result=get("student", "*",$ran);
while(($row = mysql_fetch_array($result))!=false){
$arr['name1']=$row['name'];
$arr['imgPath']=$row['imgPath'];
}
$_SESSION['name']=$arr['name1'];
$arr['name2']=getName1($ran);
$arr['name3']=getName2($ran);
$arr2[]=ranName($arr);
$_SESSION['isset']=1;
return $arr2;
}该方法作为主页面传递用户操作数据之后的主要方法,通过上述核心算法随机选择数据库内已有的一名学生,并写入session;同时调用getName1()和getName2()随机获取另外两名学生的姓名;通过ranName()将三个名字的顺序打乱,写入数组$arr2,最后将数组返回。
//挑选一名学生
function choose(){
$n=getN();
$ran1=rand(1, $n);
$ran2=rand(1, $n);
$result1=get("student", "*",$ran1);
while(($row1 = mysql_fetch_array($result1))!=false){
$result2=get("student", "*",$ran2);
while(($row2 = mysql_fetch_array($result2))!=false){
if($row1['count']!=0&&$row2['count']!=0){
$rate1=$row1['correct']/$row1['count'];
$rate2=$row2['correct']/$row2['count'];
if($rate1>$rate2){
$ran1=$ran2;
}
}
else if($row1['count']!=0){
$ran1=$ran2;
}
}
}
return $ran1;
}
该方法通过上述核心算法随机选择一名学生,获得该名学生的所有信息,写入数组,并返回该该数组。
//获取一个学生名字
function getName1($ran0){
$name=null;
$n=getN();
$ran=rand(1, $n*0.5);
if ($ran==$ran0)
$ran--;
$result=get("student", "*",$ran);
while(($row = mysql_fetch_array($result))!=false){
$name=$row['name'];
}
return $name;
}
//获取又一个学生名字
function getName2($ran0){
$name=null;
$n=getN();
$ran=rand($n*0.5+1, $n);
if ($ran==$ran0)
$ran--;
$result=get("student", "*",$ran);
while(($row = mysql_fetch_array($result))!=false){
$name=$row['name'];
}
return $name;
}随机选取另外两名学生的姓名,并返回给调用这两个方法的主方法。
//打乱三个学生名字顺序
function ranName($arr){
$i=rand(1, 3);
if ($i==1){
$temp=$arr['name1'];
$arr['name1']=$arr['name2'];
$arr['name2']=$temp;
}
else if ($i==2){
$temp=$arr['name1'];
$arr['name1']=$arr['name3'];
$arr['name3']=$temp;
}
return $arr;
}
将以上三名学生的姓名顺序打乱,并返回调用这个方法的主方法。
function get($table,$name,$value){
$result = mysql_query("select {$name} from {$table} where id=($value)");
return $result;
}
function change($name){
$sql="update student set count=count+1,{$name}={$name}+1 where name='{$_SESSION['name']}'"; //注意空格问题
mysql_query($sql);
}
对数据库的查找和修改,比较麻烦的是在语句当中使用变量,经常会出现意外。
开发总结要求链接:http://user.qzone.qq.com/303727350/blog/1434679744
猜猜看最终结果链接:http://blog.csdn.net/u011524722/article/details/46496501
源代码下载链接:http://yun.baidu.com/share/link?shareid=3959927691&uk=1577712945
开发、运行环境为:windows8.1,zend studio10.6.2,apache2.4.9,php5.5.12,mysql5.6.17。
建议在环境下运行,数据库帐号密码在中查找修改。
开发过程介绍:
大约开发时间为5小时,大部分时间用在了解决乱码问题上,试了很多方式都没有成功,最终通过
$file=mb_convert_encoding ($file,'UTF-8','GBK');
一句解决;
另外大部分时间则用在解决mysql语句的错误和对数组出错时的处理上。
开发时的学习收获:
通过把所有方法重构、整合在<func.php>内,并作适当的注释,做到页面和逻辑分离,使用起来方便很多,看着也很舒服。
开发后的感受与体会:
遇到的第一个问题依旧是编码问题,通过
$file=mb_convert_encoding ($file,'UTF-8','GBK');这一句解决,感觉每次进行有关文件操作的时候都会遇到这样的问题,应该找个时间整合一下,方便自己,也可以给别人帮助。
第二个问题是mysql语句的错误,花了很多时间才改正完成,感觉是熟练度仍然不够,才会低效率。
第三个问题是数组,对于php的数组用的不少,但是经常会遇到问题,花费大量时间处理。
第四个考虑的问题是session,大量将session作为全局变量不知道合不合适,感觉是自己没把整个结构设计好,因此才会需要大量的session作辅助。
第五个考虑的问题是,这个程序完全没有面向对象,自己的感觉就是一步一步写,函数的调用按照先后顺序进行,接触编程三年多,投入的时间精力太少,感觉还是在用很低级的方式编程。
核心代码或全部代码的解读:
核心算法很简单,如下:总人数N,ran1=ran(1—N),ran2=ran(1—N),比较ran1和ran2正确率,选择正确率低者为相片来源;随机一个名字ran3=ran(1—N/2),随机又一个名字ran4=ran(N/2+1—N),两名字均不与ran1相同即可,这样就有三个名字可选择。通过计算,在正常情况下,正确率从高到低排列者出现率为:1/N*N、3/N*N、5/N*N……(2*N-3)/N*N、(2*N-1)/N*N。
以上算法满足以下四原则:
原则1:认识概率 高的学生,在猜猜看游戏中出现的频率相对低一些。
原则2:认识概率 低的学生,在猜猜看游戏中出现的频率相对高一些。
原则3:认识概率 100%的学生,也有出现的可能性。
原则4:认识概率 0%的学生,也不必每次都出现。
//获取文件列表
function getFile($dir) {
$fileArray[]=NULL;
if (false != ($handle = opendir ( $dir ))) {
$i=0;
while ( false !== ($file = readdir ( $handle )) ) {
//去掉"“.”、“..”以及带“.xxx”后缀的文件
if ($file != "." && $file != ".."&&strpos($file,".")) {
$file=mb_convert_encoding ($file,'UTF-8','GBK'); //极其重要的一句话,编码问题
$fileArray[$i]=$dir.$file;
if($i==200){
break;
}
$i++;
}
}
//关闭句柄
closedir ( $handle );
}
return $fileArray;
}这一段是实现获取文件名的方法,可以说是最基础也是最难的,因为乱码问题,经过多次尝试,最终通过添加这一句之后才成功。
//初始化数据 function createSql($pwd){ if (md5($pwd)=="cdf4f90b8adcb0e1dc28652c83dd1e14"){ clearDate(); $dir="./photos/"; $array=getFile($dir); $mes=0; foreach ($array as $imgPath){ $str=str_replace($dir, "", $imgPath); $arr['name']=str_replace(".jpg","",substr($str,12)); $arr['name']=str_replace(".JPG","",$arr['name']); $arr['number']=substr($str,0,12); $arr['class']="1".substr($str,2,2).substr($str,9,1); $arr['imgPath']=$imgPath; $arr['count']="0"; $arr['wrong']="0"; $arr['correct']="0"; $mes=createDate($arr); } if($mes==1)alertMes("数据初始化失败", ""); else alertMes("数据初始化成功", ""); } else alertMes("口令有误", ""); } function clearDate(){ mysql_query("truncate student"); } function createDate($array){ $keys=join(",",array_keys($array)); @$vals=isset($vals)?$vals:"'".join("','",array_values($array))."'"; $sql="insert into student($keys)values({$vals})"; if (mysql_query($sql))$is=1; else $is=0; if($is==0)return 1; }
初始化数据表数据,需要验证口令,口令由32位MD5加密,很大程度上防止了数据被除管理员以外的人清除的可能性,保障数据安全;同时管理员完全可以根据需要选择清楚所有数据,重新读取文件夹内文件名并写入数据库。
//主方法
function main(){
$ran=choose();
$result=get("student", "*",$ran);
while(($row = mysql_fetch_array($result))!=false){
$arr['name1']=$row['name'];
$arr['imgPath']=$row['imgPath'];
}
$_SESSION['name']=$arr['name1'];
$arr['name2']=getName1($ran);
$arr['name3']=getName2($ran);
$arr2[]=ranName($arr);
$_SESSION['isset']=1;
return $arr2;
}该方法作为主页面传递用户操作数据之后的主要方法,通过上述核心算法随机选择数据库内已有的一名学生,并写入session;同时调用getName1()和getName2()随机获取另外两名学生的姓名;通过ranName()将三个名字的顺序打乱,写入数组$arr2,最后将数组返回。
//挑选一名学生
function choose(){
$n=getN();
$ran1=rand(1, $n);
$ran2=rand(1, $n);
$result1=get("student", "*",$ran1);
while(($row1 = mysql_fetch_array($result1))!=false){
$result2=get("student", "*",$ran2);
while(($row2 = mysql_fetch_array($result2))!=false){
if($row1['count']!=0&&$row2['count']!=0){
$rate1=$row1['correct']/$row1['count'];
$rate2=$row2['correct']/$row2['count'];
if($rate1>$rate2){
$ran1=$ran2;
}
}
else if($row1['count']!=0){
$ran1=$ran2;
}
}
}
return $ran1;
}
该方法通过上述核心算法随机选择一名学生,获得该名学生的所有信息,写入数组,并返回该该数组。
//获取一个学生名字
function getName1($ran0){
$name=null;
$n=getN();
$ran=rand(1, $n*0.5);
if ($ran==$ran0)
$ran--;
$result=get("student", "*",$ran);
while(($row = mysql_fetch_array($result))!=false){
$name=$row['name'];
}
return $name;
}
//获取又一个学生名字
function getName2($ran0){
$name=null;
$n=getN();
$ran=rand($n*0.5+1, $n);
if ($ran==$ran0)
$ran--;
$result=get("student", "*",$ran);
while(($row = mysql_fetch_array($result))!=false){
$name=$row['name'];
}
return $name;
}随机选取另外两名学生的姓名,并返回给调用这两个方法的主方法。
//打乱三个学生名字顺序
function ranName($arr){
$i=rand(1, 3);
if ($i==1){
$temp=$arr['name1'];
$arr['name1']=$arr['name2'];
$arr['name2']=$temp;
}
else if ($i==2){
$temp=$arr['name1'];
$arr['name1']=$arr['name3'];
$arr['name3']=$temp;
}
return $arr;
}
将以上三名学生的姓名顺序打乱,并返回调用这个方法的主方法。
function get($table,$name,$value){
$result = mysql_query("select {$name} from {$table} where id=($value)");
return $result;
}
function change($name){
$sql="update student set count=count+1,{$name}={$name}+1 where name='{$_SESSION['name']}'"; //注意空格问题
mysql_query($sql);
}
对数据库的查找和修改,比较麻烦的是在语句当中使用变量,经常会出现意外。
相关文章推荐
- C#数据公共操作函数
- C# Kinect 2.0 SDK 学习笔记(1)——彩色影像数据流
- ZeroMQ_官方文档C#示例
- C#课程考核——猜猜看.
- [工具-006] C#如何模拟发包登录
- 学习笔记--委托,Lambda表达式和事件(1)
- C#第六次作业 猜猜看游戏
- C# WinForm开发系列 - ADO.NET
- C#高级编程三十七天----结构比较
- 【c#第7次作业】学习体会
- .NET C# 创建WebService服务简单的例子
- C#基础总结
- C#接口实例详解
- C#高级编程三十六天----元组
- C#学习笔记(五):泛型
- 多目标进化问题,根据PCI进行小区的聚类,Kmeans算法的改进:二次聚类
- C# WebProxy POST 或者 GET
- C#基础学习第二天(.net菜鸟的成长之路-零基础到精通)
- C#高级编程三十五天----foreach和yield
- C# 重命名文件 (正宗的方法)