C#编程学习(01):北斗时转日历时的小程序

简介: C#编程学习(01):北斗时转日历时的小程序

需求说明:给定nav格式的北斗时文件从中提取出北斗周和周内秒信息,将该信息转化为日历时


软件界面:


2018112122390753.jpg


设计流程:


1. 变量定义:


批量处理: 打开,btn_openFile; 转换, btn_timeTrans


单一转换:北斗周对应文本框,txb_bdsWeek;周内秒对应的文本框:txb_weekInnerSec;转换结果对应的文本框,txb_resault;转换按钮:btn_singleTrans;清空按钮,btn_clear


2. 界面设计


将对话框的最大化按钮设为False的两种方式:


1)在 InitializeComponent()函数中手写代码:this.MaximizeBox = false;


2)在属性MaximizeBox设为false


将对话框设置为大小不可调整:属性FormBorderStyle设为FixedDialog


3. 代码实现


3.1 批量处理-->打开按钮

private void btn_openFile_Click(object sender, EventArgs e)
        {
            //弹出文件对话框
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.ShowDialog();
            txtPath = ofd.FileName;
            if (txtPath.Split('.')[1] != "nav")
            {
                MessageBox.Show("打开文件应为nav格式文件,请重新选择打开", "错误提示");
            }
        }

3.2 批量处理-->转换

 private void btn_timeTrans_Click(object sender, EventArgs e)
        {
            if (txtPath == null)
            {
                MessageBox.Show("请点击 打开 按钮,选择要转换的文件", "错误提示");
                return;
            }
            string outputFilePath = txtPath.Split('.')[0] + ".bds";
            System.IO.StreamWriter file = new System.IO.StreamWriter(outputFilePath, false);
            file.Write("北斗周 周内秒 年 月 日 时 分 秒\r\n");
            //打开文件开始转换
            System.IO.StreamReader inputFile = System.IO.File.OpenText(txtPath); 
            string nextLine; 
            while ((nextLine = inputFile.ReadLine()) != null) 
            {
                string[] substrtmp = nextLine.Split(';');
                string[] substrs = substrtmp[1].Split(',');
                //得到北斗周和周内秒
                int bdsWeek = int.Parse(substrs[0]);
                double weekInnerSec = double.Parse(substrs[1]);
                CalendarTime ct = gps2CalendarTime(bdsWeek, weekInnerSec);
                file.Write("{0:D} {1:N} {2:D} {3:D} {4:D} {5:D} {6:D} {7:N}\r\n", 
                    bdsWeek, weekInnerSec, ct.year, ct.month, ct.day, ct.hour, ct.minus, ct.second);
            } 
            //关闭文件
            file.Close();
            //释放对象
            inputFile.Dispose();
            file.Dispose();
            MessageBox.Show("输出路径为:" + outputFilePath, "转换成功");
        }

3.3 北斗时到日历时转换函数

private CalendarTime gps2CalendarTime(int weekno, double gpstow)
        {
            CalendarTime ct = new CalendarTime();
            int[] dinmth={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
            double isecs = gpstow;
            double fsec = gpstow - isecs;
            int dayofw = (int)(isecs / 86400);
            isecs = isecs - 86400 * dayofw;
            int h = (int)(isecs / 3600);
            isecs = isecs - 3600 * h;
            int m = (int)(isecs / 60);             
            double s = isecs - 60 * m + fsec;
            //输出时分秒
            ct.hour = h;
            ct.minus = m;
            ct.second = s;
            int ttlday = dayofw + 7 * weekno;
            ttlday -= 360;
            int yr = 1981;
            while(ttlday > 366)
            {
                ttlday = ttlday - 365;
                if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0)
                {
                    ttlday -= 1;
                }
                yr++;
            }
            if (ttlday == 366)
            {
                if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0)
                {
                    ct.year = yr;
                    dayofw = 366;
                }
                else
                {
                    ct.year = yr + 1;
                    dayofw = 1;
                }
            }
            if (ttlday < 366)
            {
                ct.year = yr;
                dayofw = ttlday;
            }
            int mon = 0;
            foreach (int i in dinmth)
            {
                mon += 1;
                if (ttlday <= i && ttlday > 0)
                {
                    ct.day = ttlday;
                    ct.month = mon;
                    ttlday = 0;
                }
                else if (mon == 2)
                {
                    if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0)
                    {
                        if (ttlday > 29)
                        {
                            ttlday -= 29;
                        }
                        else
                        {
                            ct.day = 29;
                            ct.month = 2;
                            ttlday = 0;
                        }
                    }
                    else
                    {
                        ttlday -= 28;
                    }
                }
                else
                {
                    ttlday -= dinmth[mon];
                }
                if (ttlday == 0) break;
            }
            return ct;
        }

3.4 单一处理-->转换

private void btn_ouputFile_Click(object sender, EventArgs e)
        {
            int bdsWeek = int.Parse(txb_bdsWeek.Text);
            double weekInnerSec = double.Parse(txb_weekInnerSec.Text);
            CalendarTime ct = gps2CalendarTime(bdsWeek, weekInnerSec);
            txb_resault.Text = string.Format("{0:D} {1:D} {2:D} {3:D} {4:D} {5:N}", ct.year, ct.month, ct.day, ct.hour, ct.minus, ct.second);
        }

3.5 单一处理-->清除

private void btn_clear_Click(object sender, EventArgs e)
        {
            txb_weekInnerSec.Text = null;
            txb_resault.Text = null;
            txb_bdsWeek.Text = null;
        }

4 抛砖引玉

对行数较多的大文件报如下错,还请高手指点

2018112122560236.png


相关文章
|
2月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
142 19
|
3月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
469 0
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
233 3
|
12月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
451 0
|
8月前
|
小程序 Java 关系型数据库
weixin030英语学习交流平台小程序+ssm(文档+源码)_kaic
本文介绍了英语学习交流平台小程序的开发全过程,包括系统分析、设计与实现。该小程序基于Java的SSM框架进行后端管理开发,使用MySQL作为数据库,并借助微信开发者工具确保系统稳定性。小程序设有管理员和用户两个角色,功能涵盖个人中心、每日打卡、学习计划、论坛交流等,具有操作简单、界面清晰、功能齐全的特点。通过技术可行性、经济可行性和操作可行性分析,证明了系统的实用性和高效性,为英语学习者提供了一个便捷的交流平台。
|
11月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
746 12
|
12月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
459 4
|
小程序 IDE 开发工具
Python编程--个人信息修改小程序
Python编程--个人信息修改小程序
129 2
|
人工智能 小程序 API
文字转语音神器+Python编程搞定语音报时小程序
文字转语音神器+Python编程搞定语音报时小程序
207 2
|
人工智能 小程序 API
ChatTTS+Python编程搞定语音报时小程序
ChatTTS+Python编程搞定语音报时小程序
229 1