C#探索之路(10):实现一个简单应用的功能——志愿填报
文章目录
- C#探索之路(10):实现一个简单应用的功能——志愿填报
- 1、前景:
- 2、需求分析
- 3、功能实现
- 3.1、界面交互-输入
- 3.2、界面交互-输出
- 3、代码示例:
- 4、效果图:
- 5、总结
1、前景:
前段时间,妹妹高考结束了,高考分数出来后,我妹妹亲自来问我志愿填报的事情,我父母也希望我来帮她出出注意,想到了现在的志愿填报和我们当时的志愿填报不一样了,我也是绞尽了脑汁,我实在是低估了现在志愿填报的复杂性。
首先需要提及的有这么几个要素,院校、专业志愿组、对应专业组、最高分、最低分、投档线
让我觉得最为困惑的是各个学校招录的专业、人数,让我对这个环节产生了极大的困惑。我查了整整一个小时,实在是觉得这种重复性的工作是在太多了。
然后想到了,作为一个IT专业的人,我觉得最不怕的就是这些重复性的工作了,正好感觉自己很少把C#编程这个能力应用到生活中去,我觉得这是一个机会,所以我打算尝试做一个自动根据分数推荐志愿院校的这么个一个功能。
2、需求分析
①可输入自己的分数、排名、选科
②可以收录对应院校的相关信息数据
③需要有一个期望值/概率来计算其中的录取概率
④根据第三点要求可以输出对应的推荐院校,对对应的院校来进行排名。
由于时间紧迫的关系,我只根据自己的需求录入了一些投档线比较接近的学校(大概92所意向志愿专业),因为录入信息的流程是一个比较漫长和繁琐的一个过程:
数据含义:学校,投档线,志愿组,志愿编号,最高分,最低分,平均分,最高排名,最低排名
3、功能实现
3.1、界面交互-输入
3.2、界面交互-输出
其实功能很简单,一个输入自己的相关信息,
另一个就是输出推荐院校的相关信息
3、代码示例:
一个简单的数据结构:
using System.Collections.Generic;
namespace Script
{
// 定义学校的数据结构
public struct SchoolInfo
{
public string Name;
public string Describe;
public VolunteerGroup VolunteerGroups;
}
public class VolunteerGroup
{
public int FilingScore; //投档线
public int ProNumOne; //专业编号1
public int ProNumTwo; //专业编号2
public int HighestScore; //最高分
public int LowestScore; //最低分
public int AvgScore; //平均分
public int HighestTag;//最高排名
public int LowestTag;//最低排名
public int Probability; //概率
}
public class MyScore
{
public int TotalScoce;
public int RankingNum;
public int AndScoreRankingNum;
}
}
筛选条件:自己制定,如果是要做一个非常严谨的条件筛选,一定要有足够多的数据分析。
我仅仅就自己大概制定了一个简单的筛选规则:这个规则不够严谨,抛砖引玉,只要你想要做一个足够好的,那一定可以做的更好
private void Start()
{
//初始化自己数据
MyScore Info = new MyScore();
Info.TotalScoce = XXX;
Info.RankingNum = XXXXX;
Info.AndScoreRankingNum = XXXXX;
//初始化学校数据
List<SchoolInfo> schools = InitializeSchoolData();
//过滤后得到符合条件的学校
var filterSchools = FilterSchools(schools, Info);
var sortEnumerable = filterSchools.OrderBy(x => x.VolunteerGroups.LowestTag)
.ThenBy(x => x.VolunteerGroups.FilingScore);
// .ThenBy(x => x.VolunteerGroups.LowestScore).ThenBy(x => x.VolunteerGroups.AvgScore) as List<SchoolInfo>;
//输出所有符合信息的数据
string filePath = "Assets/Resources/SchoolInfoList.txt";
List<SchoolInfo> sortList = new List<SchoolInfo>();
foreach (var schoolInfo in sortEnumerable)
{
sortList.Add(schoolInfo);
}
var data = sortList;
SaveSchoolInfoList(sortList, filePath);
}
public static List<SchoolInfo> ReadSchoolInfoFromFile(string filePath)
{
string[] lines = File.ReadAllLines(filePath);
// SchoolInfo[] schoolInfos = new SchoolInfo[lines.Length];
List<SchoolInfo> schoolInfoList = new List<SchoolInfo>();
for (int i = 0; i < lines.Length; i++)
{
SchoolInfo schoolInfoItem = new SchoolInfo();
VolunteerGroup volunteerGroups = new VolunteerGroup();
string[] data = lines[i].Split(',');
// schoolInfos[i].Name = data[0];
schoolInfoItem.Name = data[0];
volunteerGroups.FilingScore = int.Parse(data[1]);
volunteerGroups.ProNumOne = int.Parse(data[2]);
volunteerGroups.ProNumTwo = int.Parse(data[3]);
volunteerGroups.HighestScore = int.Parse(data[4]);
volunteerGroups.LowestScore = int.Parse(data[5]);
volunteerGroups.AvgScore = int.Parse(data[6]);
volunteerGroups.HighestTag = int.Parse(data[7]);
volunteerGroups.LowestTag = int.Parse(data[8]);
// schoolInfos[i].VolunteerGroups = volunteerGroups;
schoolInfoItem.VolunteerGroups = volunteerGroups;
schoolInfoList.Add(schoolInfoItem);
}
// return schoolInfos;
return schoolInfoList;
}
// 初始化学校数据
private List<SchoolInfo> InitializeSchoolData()
{
var filePath = "Assets/Resources/schoolInfo.txt"; // 替换为你的文件路径
var schoolInfos = ReadSchoolInfoFromFile(filePath);
return schoolInfos;
}
// 筛选符合条件的学校
private List<SchoolInfo> FilterSchools(List<SchoolInfo> schools, MyScore myScore)
{
// List<SchoolInfo> schools = InitializeSchoolData();
List<SchoolInfo> filteredSchools = new List<SchoolInfo>();
foreach (SchoolInfo school in schools)
{
SchoolInfo filteredSchool = new SchoolInfo();
filteredSchool.Name = school.Name;
filteredSchool.VolunteerGroups = new VolunteerGroup();
if (筛选条件1)
{
filteredSchool.Describe = "符合冲刺条件";
filteredSchool.VolunteerGroups.Probability =
(int) ((int) Mathf.Abs(school.VolunteerGroups.FilingScore - myScore.TotalScoce) /
(float) 20.0f * 100);
filteredSchool.VolunteerGroups = school.VolunteerGroups;
filteredSchools.Add(filteredSchool);
}
else if (筛选条件2)
{
filteredSchool.Describe = "符合稳妥条件";
filteredSchool.VolunteerGroups.Probability =
(int) ((myScore.TotalScoce / (float)school.VolunteerGroups.HighestScore) * 100);
filteredSchool.VolunteerGroups = school.VolunteerGroups;
filteredSchool.VolunteerGroups = school.VolunteerGroups;
filteredSchools.Add(filteredSchool);
}
else if (筛选条件3)
{
filteredSchool.Describe = "符合保底条件";
filteredSchool.VolunteerGroups.Probability = 90;
filteredSchool.VolunteerGroups = school.VolunteerGroups;
filteredSchools.Add(filteredSchool);
}
// 如果符合条件的志愿组数量大于0,则将学校加入到筛选结果中
if (filteredSchools.Count > 0)
{
Debug.Log("找到了符合条件的学校");
}
}
return filteredSchools;
}
// 以文件的形式输出
public void SaveSchoolInfoList(List<SchoolInfo> schoolInfoList, string filePath)
{
StringBuilder stringBuilder = new StringBuilder();
// 拼接每个SchoolInfo对象的字段,使用逗号分隔
foreach (SchoolInfo schoolInfo in schoolInfoList)
{
stringBuilder.Append(schoolInfo.Name).Append(",");
stringBuilder.Append(schoolInfo.Describe).Append(",");
stringBuilder.Append(schoolInfo.VolunteerGroups.FilingScore).Append(",");
stringBuilder.Append("第").Append(schoolInfo.VolunteerGroups.ProNumOne).Append("组").Append(",");
stringBuilder.Append("编号【").Append(schoolInfo.VolunteerGroups.ProNumTwo).Append("】").Append(",");
stringBuilder.Append("最高分:").Append(schoolInfo.VolunteerGroups.HighestScore).Append(",");
stringBuilder.Append("最低分:").Append(schoolInfo.VolunteerGroups.LowestScore).Append(",");
stringBuilder.Append("平均分:").Append(schoolInfo.VolunteerGroups.AvgScore).Append(",");
stringBuilder.Append("最高排名:").Append(schoolInfo.VolunteerGroups.HighestTag).Append(",");
stringBuilder.Append("最低排名:").Append(schoolInfo.VolunteerGroups.LowestTag).Append(",");
stringBuilder.Append("概率:").Append(schoolInfo.VolunteerGroups.Probability).Append("\n");
}
// 将拼接好的内容保存到txt文件
File.WriteAllText(filePath, stringBuilder.ToString());
}
4、效果图:
5、总结
说明:
虽然提及到的概念其实很浅显易懂,期望,权重,
这是我一个短期内去实现的一个简要的功能Demo,hhh 大家可以发现一个很明显的bug-》概率怎么可能都为0.
由于我的筛选条件比较简单,而且逻辑上其实是有问题的。我之所以会把这个内容展示出来主要的原因,是因为这是一个功能的实现外壳。
旨在的目的是梳理写一个功能的逻辑:
要确定的几个大步骤:
1、数据准备以及数据读取
2、筛选条件
3、输出形式
这三个步骤是最基础且最主要的。至于实现细节不过是在外壳里面去完善实现细节。比如说界面、功能、数据结构、
我们也可以发现这上面充满了if else 那我们是不是可以尝试去别的方式去过滤、去排序
总结:
1、市面上的各大志愿填报App(还要充会员)其实逻辑并不复杂
2、市面上的app的普遍优势在于拥有更多的数据分析,处于大大数据的时代,其实我们会发现数据才是最重要的。
3、功能上逻辑其实并不复杂,不过关于app的sdk相关流程而言整个开发流程才会显得比较复杂。
4、(狗头)那我们是不是可以尝试的有机会做一款自己的app。哈哈开个玩笑,有机会的话说不定真的有可能
算是一个比较简单的案例实现Demo用到生活当中去吧,学习的过程中可以尝试多做一些这种类似的练习。
总而言之,代码优化永无止尽哈哈哈…总有更好的方式…
公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!
作者:ProMer_Wang
链接:https://blog.csdn.net/qq_43801020/article/details/131714461