日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#进阶(一)——TXT文件处理:以导线网近似平差为例

發(fā)布時間:2023/12/18 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#进阶(一)——TXT文件处理:以导线网近似平差为例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

引用及預(yù)處理方法的設(shè)計

引用

讀取方法

相關(guān)類及方法的設(shè)計

窗體類后續(xù)方法的設(shè)計及調(diào)用

完整的窗體類設(shè)計


首先展示一下此程序可讀取的.txt文件的正確格式

6,3,2 A,3143.237,5260.334 B,4609.361,5025.696 C,4157.197,8853.254 D,3822.911,9795.726 A B,L,0 P1,L,44.0545 P1,S,2185.070 B P1,L,0 A,L,93.1043 P1 A,L,0 B,L,42.4327 B,S,1522.853 P2,L,244.3218 P2,S,1500.017 P2 P1,L,0 C,L,201.5734 C,S,1009.021 C P2,L,0 D,L,168.0145

引用及預(yù)處理方法的設(shè)計

引用

讀取.txt后綴文件,需要作引用,需要引用的內(nèi)容如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;

注意,這是程序能正常運行的完整引用,并不只是處理.txt文件所需的引用。

讀取方法

接下來就是讀取,這里在對應(yīng)的窗體類中設(shè)計一個void函數(shù)來進(jìn)行讀取:

/// <summary> /// 讀取文件 /// </summary> /// <returns></returns> private void ReadDoc() {observedDatas = new List<ObservedData>();OpenFileDialog open = new OpenFileDialog();if (open.ShowDialog() != DialogResult.OK){return;}StreamReader reader = new StreamReader(open.FileName);//讀取已知數(shù)據(jù)string[] s = reader.ReadLine().Split(',');knownData = new KnownData(Convert.ToDouble(s[0]), Convert.ToDouble(s[1]), Convert.ToDouble(s[2]));while (true){s = reader.ReadLine().Split(',');if (s.Length != 3) break;knownData.pointDatas.Add(new PointData(s[0], Convert.ToDouble(s[1]), Convert.ToDouble(s[2])));}while (!reader.EndOfStream){ObservedData observedData = new ObservedData(s[0]);while (!reader.EndOfStream){s = reader.ReadLine().Split(',');if (s.Length != 3) break;observedData.originalDatas.Add(new OriginalData(s[0], s[1], Convert.ToDouble(s[2])));}observedDatas.Add(observedData);}DataTable table = new DataTable(); }

相關(guān)類及方法的設(shè)計

這個方法中,有自主設(shè)計的類,KnowData類、ObservedData類。此外還有需要在近似平差中使用的PointData類,其設(shè)計及內(nèi)置方法如下所示:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 水平網(wǎng)平差程序 {/// <summary>/// 已知數(shù)據(jù)/// </summary>class KnownData{public double directionError, sideError, ratioError;public List<PointData> pointDatas;public KnownData(double directionError, double sideError, double ratioError){this.directionError = directionError;this.sideError = sideError;this.ratioError = ratioError;this.pointDatas = new List<PointData>();}}/// <summary>/// 已知點數(shù)據(jù)/// </summary>class PointData{public string id;public double x, y;public PointData(string id, double x, double y){this.id = id;this.x = x;this.y = y;}}/// <summary>/// 觀測數(shù)據(jù)/// </summary>class ObservedData{public string testSiteNum;public List<OriginalData> originalDatas;public ObservedData(string testSiteNum){this.testSiteNum = testSiteNum;this.originalDatas = new List<OriginalData>();}}/// <summary>/// 照準(zhǔn)點數(shù)據(jù)/// </summary>class OriginalData{public string id;public string type;public double value;public OriginalData(string id, string type, double value){this.id = id;this.type = type;this.value = value;}} }

之后設(shè)計角度等的簡單計算:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 水平網(wǎng)平差程序 {/// <summary>/// 基本運算/// 包括:角度弧度互化、坐標(biāo)方位角計算/// </summary>class BasicCal{/// <summary>/// 角度轉(zhuǎn)弧度/// 適用于格式為dd.mmss/// </summary>/// <param name="dms"></param>/// <returns></returns>public static double Dms2rad(double dms){double d = Math.Floor(dms);double m = Math.Floor((dms - d) * 100.0);double s = (dms - d - m / 100.0) * 10000.0;return (d + m / 60.0 + s / 3600.0) * Math.PI / 180.0;}/// <summary>/// 弧度轉(zhuǎn)角度/// </summary>/// <param name="rad"></param>/// <returns></returns>public static double Rad2dms(double rad){double temp = rad * 180 / Math.PI;double d = Math.Floor(temp);double m = Math.Floor((temp - d) * 60);double s = Math.Floor((temp - d - m / 60.0) * 3600);return d + m / 100.0 + s / 10000.0;}/// <summary>/// 求坐標(biāo)方位角/// </summary>/// <param name="xA"></param>/// <param name="yA"></param>/// <param name="xB"></param>/// <param name="yB"></param>/// <returns></returns>public static double CoordinateAzimuth(double xA, double yA, double xB, double yB){if (yB - yA < 0){return Math.Atan2(yB - yA, xB - xA) + 2.0 * Math.PI;}if (xB - xA == 0 && yB - yA >= 0){return Math.PI / 2.0;}if (xB - xA == 0 && yB - yA < 0){return Math.PI * 3.0 / 2.0;}return Math.Atan2(yB - yA, xB - xA);}} }

最后是近似平差類及方法:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 水平網(wǎng)平差程序 {/// <summary>/// 導(dǎo)線網(wǎng)近似坐標(biāo)計算/// </summary>class ApproximateCoordinate{public List<PointData> points;public ApproximateCoordinate(KnownData knownData, List<ObservedData> observedDatas){this.points = new List<PointData>();foreach (ObservedData observedData in observedDatas){//從已知數(shù)據(jù)中尋找相應(yīng)點號坐標(biāo)PointData pA = knownData.pointDatas.Find(item => item.id == observedData.testSiteNum);if (pA == null){//若已知數(shù)據(jù)不存在相應(yīng)點號,則到已算近似坐標(biāo)中尋找pA = points.Find(item => item.id == observedData.testSiteNum);if (pA == null){//若已知數(shù)據(jù)和已算近視坐標(biāo)均找不到則數(shù)據(jù)有誤MessageBox.Show("數(shù)據(jù)有誤");return;}}//同理查找第一個照準(zhǔn)點PointData pB = knownData.pointDatas.Find(item => item.id == observedData.originalDatas[0].id);//points.Add(pB);if (pB == null){pB = points.Find(item => item.id == observedData.originalDatas[0].id);if (pB == null){MessageBox.Show("數(shù)據(jù)有誤");return;}}//計算AB的坐標(biāo)方位角double alphaAB = BasicCal.CoordinateAzimuth(pA.x, pA.y, pB.x, pB.y) - observedData.originalDatas[0].value;//循環(huán)計算該組數(shù)據(jù)的其他照準(zhǔn)點近似坐標(biāo)for (int i = 1; i < observedData.originalDatas.Count; i++){//若為已知數(shù)據(jù)直接加入PointData tempP = knownData.pointDatas.Find(item => item.id == observedData.originalDatas[i].id);if (tempP != null){//points.Add(tempP);continue;}//只要角度觀測值if (knownData.pointDatas.Exists(item => item.id == observedData.originalDatas[i].id) || observedData.originalDatas[i].type == "S" || points.Exists(item => item.id == observedData.originalDatas[i].id)){continue;}//計算近似點坐標(biāo)double xA = pA.x;double yA = pA.y;double sAP = observedData.originalDatas.Find(item => item.id == observedData.originalDatas[i].id && item.type == "S").value;double AlphaAP = alphaAB + BasicCal.Dms2rad(observedData.originalDatas[i].value);double cosAlphaAP = Math.Cos(AlphaAP);double sinAlphaAP = Math.Sin(AlphaAP);points.Add(new PointData(observedData.originalDatas[i].id, xA + sAP * cosAlphaAP, yA + sAP * sinAlphaAP));}}}} }

窗體類后續(xù)方法的設(shè)計及調(diào)用

這里采取Datagridview控件儲存及處理數(shù)據(jù)

設(shè)計兩個Name屬性分別為 已知點 和 觀測值 的Datagirdview在窗體內(nèi),不做其他設(shè)計,之后在窗體中設(shè)計ShowTable方法,用于將數(shù)據(jù)讀入控件:

private void ShowTable() {//已知數(shù)據(jù)顯示DataTable table1 = new DataTable();table1.Columns.Add("已知點點號");table1.Columns.Add("X坐標(biāo)");table1.Columns.Add("Y坐標(biāo)");foreach (PointData p in knownData.pointDatas){DataRow row = table1.NewRow();row["已知點點號"] = p.id;row["X坐標(biāo)"] = p.x;row["Y坐標(biāo)"] = p.y;table1.Rows.Add(row);}已知點.DataSource = table1;//觀測數(shù)據(jù)顯示DataTable table2 = new DataTable();table2.Columns.Add("觀測點點號");table2.Columns.Add("照準(zhǔn)點點號");table2.Columns.Add("觀測值類型");table2.Columns.Add("觀測值");foreach (ObservedData observedData in observedDatas){foreach (OriginalData P in observedData.originalDatas){DataRow row = table2.NewRow();row["觀測點點號"] = observedData.testSiteNum;row["照準(zhǔn)點點號"] = P.id;row["觀測值類型"] = P.type;row["觀測值"] = P.value;table2.Rows.Add(row);}}已知點.DataSource = table1;觀測值.DataSource = table2; }

在點擊 打開 按鈕時調(diào)用:

private void 打開_Click(object sender, EventArgs e) {try{ReadDoc();ShowTable();}catch{MessageBox.Show("文件格式不符");} }

之后是在單擊某個控件時進(jìn)行計算,這里使用Name為 計算 的 按鈕 控件:

private void 計算_Click(object sender, EventArgs e) {try{approximateCoordinate = new ApproximateCoordinate(knownData, observedDatas);ShowText();}catch{MessageBox.Show("計算錯誤");} }

接下來,是將計算結(jié)果寫入某控件,這里采取的是 Name 屬性為 報告 的 richtextbox:

private void ShowText() {報告.Text += " 近似坐標(biāo)值:\n";報告.Text += string.Format("{0,14}", "點名") + string.Format("{0,14}", "X坐標(biāo)") + string.Format("{0,14}", "Y坐標(biāo)") + "\n";foreach (PointData pointData in knownData.pointDatas){報告.Text += string.Format("{0,16}", pointData.id) + string.Format("{0,16}", pointData.x) + string.Format("{0,16}", pointData.y) + "\n";}foreach (PointData pointData in approximateCoordinate.points){報告.Text += string.Format("{0,16}", pointData.id) + string.Format("{0,16}", pointData.x.ToString("0.000")) + string.Format("{0,16}", pointData.y.ToString("0.000")) + "\n";} }

最后則是將結(jié)果寫入.txt文件,同樣在單擊按鈕時進(jìn)行:

private void 保存_Click(object sender, EventArgs e) {SaveFileDialog save = new SaveFileDialog();save.Filter = "(文本文件)|.txt";if (save.ShowDialog() == DialogResult.OK){StreamWriter sw = new StreamWriter(save.FileName);sw.Write(報告.Text);sw.Close();} }

完整的窗體類設(shè)計

完整的窗體類設(shè)計如下所示:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 水平網(wǎng)平差程序 {public partial class 導(dǎo)線網(wǎng)近似平差 : Form{public 導(dǎo)線網(wǎng)近似平差(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;}KnownData knownData;List<ObservedData> observedDatas;ApproximateCoordinate approximateCoordinate;IndirectAdjustment indirectAdjustment;private void 打開_Click(object sender, EventArgs e){try{ReadDoc();ShowTable();}catch{MessageBox.Show("文件格式不符");}}private void 計算_Click(object sender, EventArgs e){try{approximateCoordinate = new ApproximateCoordinate(knownData, observedDatas);ShowText();展示框.SelectedTab = 報告頁;}catch{MessageBox.Show("計算錯誤");}}private void 保存_Click(object sender, EventArgs e){SaveFileDialog save = new SaveFileDialog();save.Filter = "(文本文件)|.txt";if (save.ShowDialog() == DialogResult.OK){StreamWriter sw = new StreamWriter(save.FileName);sw.Write(報告.Text);sw.Close();}}/// <summary>/// 讀取文件/// </summary>/// <returns></returns>private void ReadDoc(){observedDatas = new List<ObservedData>();OpenFileDialog open = new OpenFileDialog();if (open.ShowDialog() != DialogResult.OK){return;}StreamReader reader = new StreamReader(open.FileName);//讀取已知數(shù)據(jù)string[] s = reader.ReadLine().Split(',');knownData = new KnownData(Convert.ToDouble(s[0]), Convert.ToDouble(s[1]), Convert.ToDouble(s[2]));while (true){s = reader.ReadLine().Split(',');if (s.Length != 3) break;knownData.pointDatas.Add(new PointData(s[0], Convert.ToDouble(s[1]), Convert.ToDouble(s[2])));}while (!reader.EndOfStream){ObservedData observedData = new ObservedData(s[0]);while (!reader.EndOfStream){s = reader.ReadLine().Split(',');if (s.Length != 3) break;observedData.originalDatas.Add(new OriginalData(s[0], s[1], Convert.ToDouble(s[2])));}observedDatas.Add(observedData);}DataTable table = new DataTable();}private void ShowTable(){//已知數(shù)據(jù)顯示DataTable table1 = new DataTable();table1.Columns.Add("已知點點號");table1.Columns.Add("X坐標(biāo)");table1.Columns.Add("Y坐標(biāo)");foreach (PointData p in knownData.pointDatas){DataRow row = table1.NewRow();row["已知點點號"] = p.id;row["X坐標(biāo)"] = p.x;row["Y坐標(biāo)"] = p.y;table1.Rows.Add(row);}已知點.DataSource = table1;//觀測數(shù)據(jù)顯示DataTable table2 = new DataTable();table2.Columns.Add("觀測點點號");table2.Columns.Add("照準(zhǔn)點點號");table2.Columns.Add("觀測值類型");table2.Columns.Add("觀測值");foreach (ObservedData observedData in observedDatas){foreach (OriginalData P in observedData.originalDatas){DataRow row = table2.NewRow();row["觀測點點號"] = observedData.testSiteNum;row["照準(zhǔn)點點號"] = P.id;row["觀測值類型"] = P.type;row["觀測值"] = P.value;table2.Rows.Add(row);}}已知點.DataSource = table1;觀測值.DataSource = table2;}private void ShowText(){報告.Text += " 近似坐標(biāo)值:\n";報告.Text += string.Format("{0,14}", "點名") + string.Format("{0,14}", "X坐標(biāo)") + string.Format("{0,14}", "Y坐標(biāo)") + "\n";foreach (PointData pointData in knownData.pointDatas){報告.Text += string.Format("{0,16}", pointData.id) + string.Format("{0,16}", pointData.x) + string.Format("{0,16}", pointData.y) + "\n";}foreach (PointData pointData in approximateCoordinate.points){報告.Text += string.Format("{0,16}", pointData.id) + string.Format("{0,16}", pointData.x.ToString("0.000")) + string.Format("{0,16}", pointData.y.ToString("0.000")) + "\n";}}} }

總結(jié)

以上是生活随笔為你收集整理的C#进阶(一)——TXT文件处理:以导线网近似平差为例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。