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


相关文章
|
20天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
30 3
|
10天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
1月前
|
小程序 IDE 开发工具
Python编程--个人信息修改小程序
Python编程--个人信息修改小程序
|
2月前
|
人工智能 小程序 API
文字转语音神器+Python编程搞定语音报时小程序
文字转语音神器+Python编程搞定语音报时小程序
|
2月前
|
人工智能 小程序 API
ChatTTS+Python编程搞定语音报时小程序
ChatTTS+Python编程搞定语音报时小程序
|
2月前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
2月前
|
小程序 JavaScript
微信小程序学习之数据绑定,事件绑定,事件传参与数据同步的学习记录
本文介绍了微信小程序中的数据绑定、事件绑定、事件传参与数据同步的基本概念和使用方法,包括如何在data对象中定义数据、使用mustache语法在wxml中渲染数据、绑定和处理事件、事件对象属性、事件传参以及实现输入框与data数据的同步。
微信小程序学习之数据绑定,事件绑定,事件传参与数据同步的学习记录
|
1月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
114 0
|
2月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
44 2
下一篇
无影云桌面