前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇c語言編程范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。
摘要:現在單片機的程序設計,C51已經得到廣泛的推廣和應用,算是單片機的主流設計程序,甚至可以說作為單片機開發人員必須要掌握的一門語言了。本文簡要介紹了Franklin C51交叉編譯器的特點,較詳細地討論了C51語言程序設計的基本技巧及其與匯編語言程序的混合編程、中斷處理過程等實際問題。
關鍵詞:C51;C語言;編程
在研制單片機應用系統時,匯編語言是一種常用的軟件工具。它能直接操作硬件,指令的執行速度快。但其指令系統的固有格式受硬件結構的限制很大,且難于編寫與調試,可移植性也差。隨著單片機硬件性能的提高,其工作速度越來越快,因此在編寫單片機應用系統程序時,更著重于程序本身的編寫效率。而Franklin C51交叉編譯器是專為80C51系列單片機設計的一種高效的C語言編譯器,使用它可以縮短開發周期,降低開發成本,因此目前它已成為開發80C51系列單片機的流行工具。
一、C51的編程規范
(一)注釋
1.開始的注釋:
文件(模塊)注釋內容:
公司名稱、版權、作者名稱、修改時間、模塊功能、背景介紹等,復雜的算法需要加上流程說明;
函數開頭的注釋內容:
函數名稱、功能、說明 輸入、返回、函數描述、流程處理、全局變量、調用樣例等,復雜的函數需要加上變量用途說明 ;
2.程序中的注釋內容:
修改時間和作者、方便理解的注釋等。注釋內容應簡煉、清楚、明了,一目了然的語句不加注釋。
(二)命名:
命名必須具有一定的實際意義。
1.常量的命名:全部用大寫。
2.變量的命名:
3.結構體命名:
4.函數的命名:
函數名首字大寫,若包含有兩個單詞的每個單詞首字母大寫。
函數原型說明包括:引用外來函數及內部函數,外部引用必須在右側注明函數來源: 模塊名及文件名, 內部函數,只要注釋其定義文件名 ;
1.縮進:縮進以Tab為單位,一個Tab為四個空格大小。預處理語句、全局數據、函數原型、標題、附加說明、函數說明、標號等均頂格書寫。語句塊的“{”“}”配對對齊,并與其前一行對齊;
2.空格:數據和函數在其類型,修飾名稱之間適當空格并據情況對齊。關鍵字原則上空一格,如:
if ( ... ) 等,運算符的空格規定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正負號),“&”(取址或引用)、“*”(指使用指針時)等幾個運算符兩邊不空格(其中單目運算符系指與操作數相連的一邊),其它運算符(包括大多數二目運算符和三目運算符“?:”兩邊均空一格,“(”、“)”運算符在其內側空一格,在作函數定義時還可據情況多空或不空格來對齊,但在函數實現時可以不用。
3.空行:程序文件結構各部分之間空兩行,若不必要也可只空一行,各函數實現之間一般空兩行
4.修改:版本封存以后的修改一定要將老語句用/* */ 封閉,不能自行刪除或修改,并要在文件及函數的修改記錄中加以記錄。
二、C51語言程序設計的基本技巧
C語言是一種高級程序設計語言,它提供了十分完備的規范化流程控制結構。因此采用C51語言設計單片機應用系統程序時,首先要盡可能地采用結構化的程序設計方法,這樣可使整個應用系統程序結構清晰,易于調試和維護。對于不同的功能模塊,分別指定相應的入口參數和出口參數,而經常使用的一些程序最好編成函數,這樣既不會引起整個程序管理的混亂,還可增強可讀性,移植性也好。
在程序設計過程中,要充分利用C51語言的預處理命令。對于一些常用的常數,如TRUE,FALSE,PI以及各種特殊功能寄存器,或程序中一些重要的依據外界條件可變的常量,可采用宏定義"#define"或集中起來放在一個頭文件中進行定義,再采用文件包含命令"#include"將其加入到程序中去。這樣當需要修改某個參量時,只須修改相應的包含文件或宏定義,而不必對使用它們的每個程序文件都作修改,從而有利于文件的維護和更新。
三、C51語言與匯編語言程序的混合編程
C51編譯器能對C語言源程序進行高效率的編譯,生成高效簡潔的代碼,在絕大多數場合采用C語言編程即可完成預期的目的。但有時為了編程直觀或某些特殊地址的處理,還須采用一定的匯編語言編程。它們必須有完整的約定,否則數據的交換就可能出錯。下面就以力源公司的10位串行A/D轉換器TLC1549 為例說明C語言程序與匯編語言程序的調用。
四、C51中斷處理過程
C51編譯器支持在C源程序中直接開發中斷過程,因此減輕了使用匯編語言的繁瑣工作,提高了開發效率。中斷服務函數的完整語法如下:
void函數名(void)[模式]
[再入]interrupt n [using r]
其中n(0~31)代表中斷號。C51編譯器允許32個中斷,具體使用哪個中斷由80C51系列的芯片決定。r(0~3)代表第r組寄存器。在調用中斷函數時,要求中斷過程調用的函數所使用的寄存器組必須與其相同。"再入"用于說明中斷處理函數有無"再入"能力。C51編譯器及其對C語言的擴充允許編程者對中斷所有方面的控制和寄存器組的使用。這種支持能使編程者創建高效的中斷服務程序,用戶只須在C語言下關心中斷和必要的寄存器組切換操作。
四、結語
C51編譯器不但可以縮短單片機控制系統的開發周期,而且易于調試和維護。此外,C51語言還有許多強大的功能,如提供豐富的庫函數供用戶直接調用,完整的編譯控制指令為程序調試提供必要的符號信息等等。總之,C51語言是廣大單片機開發人員的強有力的工具。
參考文獻:
[1]周立功.單片機實驗與實踐教程(三)[M].北京:北京航天航空大學出版社.2006
[2]柴鈺.單片機原理及應用[M].北京:西安電子科技大學出版社.2009
關鍵詞:計算機C語言 計算機編程 實驗教學 改革措施 分析 探討
中圖分類號:TP312.1-4 文獻標識碼:A 文章編號:1007-9416(2012)11-0229-01
1、計算機C語言教學特點分析
計算機C語言是進行計算機程序編寫設計使用的一種計算機程序代碼語言,在進行計算機程序編寫設計應用中,C語言具有語言簡練、數據類型豐富以及邏輯性強、完全結構化的特征,在計算機程序編寫設計中應用十分廣泛和普遍。同時,計算機C語言是高等院校計算機專業的基礎學科中的一門基本語言,也是進行計算機數據結構以及數據庫部分知識內容教學的重要基礎教學部分,是進行計算機程序設計學習的入門學習課程。在進行計算機C語言教學過程中,由于C語言的基礎入門學科特點以及數據類型豐富、多樣特征,對于C語言教學的實踐性要求尤其高,對于計算機C語言課程知識的教學以及對于學生掌握情況的檢查,都需要通過學生上機的實際編程操作進行實現。因此,對于計算機C語言教學來講,在進行C語言理論性教學過程中,也應注意加強對于C語言實驗的教學開展,以培養學生C語言課程的相關能力和素質。
2、計算機C語言實驗教學中存在的問題
在進行計算機C語言實驗教學中,由于計算機C語言實驗教學內容比較難以理解和掌握,而對于C語言實驗教學的模式不當,導致初學者對于C語言實驗教學部分逐漸失去學習興趣,或者是學習興趣不大。比如,一些C語言初學者,在進行實驗教學內容部分的學習過程中,由于缺乏相應的對于C語言實驗教學內容學習的思維模式,導致在學習過程中無法進行C語言與實踐解決問題之間的轉換與描述,導致C語言編程設計任務無法完成,從而逐漸形成一定的學習問題與壓力,逐漸失去C語言實驗教學的學習興趣。其次,在進行C語言實驗教學開展過程中,由于進行C語言實驗教學的教學應用設備比較落后,導致實驗教學開展中,設備無法滿足一些實驗教學的需求,從而對于正常的計算機C語言實驗教學活動的開展造成不利影響,從而對于C語言實驗教學目標以及教學效果造成影響。再次,進行計算機C語言實驗教學開展過程中,由于進行C語言實驗教學的方式比較單一,也是目前計算機C語言實驗教學中存在一個重要問題,對于實驗教學的效果以及教學目標、任務等的實現,都有很大的不利影響和作用。最后,在進行計算機C語言實驗教學過程中,主要是為了通過上機的計算機編程設計實驗,鍛煉與培養學生的實踐動手能力與解決實際問題的能力,對于學生掌握知識情況進行檢測。但是,目前C語言的實驗教學中,存在著對于C語言教學上機實踐的考核措施與機制,這也對于老師進行實驗教學成果的檢驗以及學生對于實驗教學的真正掌握情況了解,有很大的不利影響,從而對于實驗教學計劃與教學開展設計、教學效果等都有很大的影響。
3、計算機C語言實驗教學改革的有效措施
針對上述計算機C語言教學過程中存在的問題,以及對于C語言實驗教學的影響作用,在進行計算機C語言實驗教學的開展過程中,應注意從以下幾個方面對于C語言實驗教學的方式以及內容進行改革推進,以提高C語言實驗教學的效果與水平。首先,在進行計算機C語言的實驗教學過程中,可以通過合適實驗教學方式,來提高學生對于C語言實驗教學的學習興趣。比如,通過錯誤案例的分析教學法,將學生編程設計中容易出現的錯誤問題,提前進行教學設計,并通過教學分析,在吸引學生興趣同時,加深學生對于知識內容的記憶、理解。其次,應注意結合現代多媒體信息技術,開展多媒體網絡的計算機C語言實驗教學,并且主要在實驗教學過程中改進教學方法,提高計算機C語言教學的效果,培養學生計算機C語言編程設計的相關實踐能力與水平,推進計算機C語言的教學發展。
如下,是使用計算機C語言進行循環冗余校驗碼的實驗教學應用過程。在進行這一部分的教學中,首先使用計算機C語言進行多項式除法的程序模擬設計,具體設計過程如下:
計算機程序的函數名稱:polydiv;
計算機程序函數原型位置:CRC.H;
所屬計算機數據庫:CRC.LIB
在使用C語言進行函數計算設計過程中,會產生一個余數,余數存放在remainder文件中。
其中,計算機C語言多項式除法模擬設計中,頭文件為siodef.h
USHORT polydiv?。║SHORT data,USHORT divisor,USHORT remainder)
{
static USHORT quotient,i;
for(i=8;i>0;I-)
return remainder
}
在進行上述應用計算機C語言進行多項式除法程序的模擬設計基礎上,在使用CRC函數進行CRC測試程序設計實現,就可以實現計算機C語言對于循環冗余校驗碼的設計實現,并在教學過程中通過學生的實驗操作,進行教學實現。
4、結語
總之,計算機C語言課程教學是一門實踐性比較強的教學課程,教學過程中尤其重視對于學生實踐動手以及實驗設計能力的培養鍛煉,因此,進行計算機C語言實驗教學改革的分析與探討,有利于對于當前實驗教學中存在的問題進行避免與控制,取得較好的C語言實驗教學效果。
參考文獻
[1]卜登立,彭嵩松,唐衛東,龍侃.“匯編語言程序設計”課程教學改革研究與探討.井岡山大學學報,2009(5).
[2]方艷紅,趙海龍.計算機高級語言程序設計類課程實踐教學改革研究.中國科技信息,2008(19).
[3]朱旻如,郭劍,朱立華.計算機語言課程中案例實驗教學法的實施探討.計算機教育,2008(18).
關鍵詞:c語言;計算機;軟件編程;技巧
中圖分類號:TP311
文獻標識碼:A
文章編號:1009-3044(2017)10-0071-01
1.C語言概述
c語言是經由B語言不斷完善、發展而來的。隨著現代信息技術的發展,原有的計算機語言系統逐漸無法滿足計算機編程的需求,因此,人們開始對原有的B語言進行不斷的豐富和完善,于1972年推出了C語言,自1978年以后,C語言逐漸被移植到計算機中,成為計算機編程系統語言,為計算機軟件編程提供了條件。
2.c語言環境下計算機軟件編程技巧
C語言具有模塊化的特點,在計算機軟件編程工作中,應當注重軟件編程的技巧性,充分發揮C語言的便捷性和靈活性特點,不斷優化軟件編程,提高軟件的質量和使用效率。
2.1計算機軟件編程函數運用技巧
在C語言計算機軟件編程中,還會涉及函數的運用。事實上,每個函數都有其相應的功能,函數的功能可暮數的名稱上進行判斷。在編程工作中,需要程序員定義函數參數值、返回值以及函數名稱,但事實上,C語言系統自帶函數數據庫,程序員只需要充分利用"#include指令和頭文件,即可調用數據庫中的函數,提高軟件編程效率。例如,在實際編程工作中,需要運用到sqrt函數,其調用函數的指令如下:#include"string.h"。
2.2變量存儲類型定義和設置技巧
變量存儲器的選取和操作,會對軟件編程代碼的執行效率產生一定影響。只有實現變量存儲器的合理定義,軟件的執行效率才能得以提高。程序在定義變量存儲器時,應當在充分考慮編程實際情況的前提下,采用內部直接尋址存儲器。另外,在c語言編程中,函數變量的正確傳遞也非常重要,子程序模塊和整個程序模塊在選擇變量時,有一定的區別。整個程序應當選取全局變量,而子程序則選取局部變量。
2.3設計合理的c語言和軟件編程的接口
C語言的執行速度快,還可實現對硬件的直接操作。在實際操作中,可將C語言運用到計算機軟件的編程操作中,實現對數據的采集、處理服務器中斷、實時控制等操作,實現數據傳遞和控制的自動化,進而提高控制任務的操作準確性,加速程序的實時響應。
3.C語言和匯編語言的結合
C語言雖然能夠產生快速又緊湊的目標代碼,但是若要產生高質量的目標代碼,仍需要借助匯編語言來實現。在某些方面,匯編語言比C語言更具優勢,但是對某些程序的編程又不得不使用C語言。因此,在計算機軟件編程中,兩種語言經常會混合使用。匯編語言和C語言的混合,通??刹捎靡韵聝煞N方法實現:第一,在C語言編程中嵌入匯編語言。第二,分別編輯c語言和匯編語言,再進行目標模塊的鏈接。
3.1在c語言中嵌入匯編語言
匯編語言的AMS指令在c語言中為合法指令,因此,在c語言中嵌入匯編語言主要利用這一指令進行操作。在C語言中嵌入匯編語言的格式如下:”ASMf“匯編語句”)”,即將匯編語句用雙引號和括號括起,并在括號前加上關鍵字ASM,需要強調的是,匯編指令與前一雙引號之間要預留空格。比如,在C語言中嵌入匯編語言INTM指令(中斷指令),其指令為"ASMf“INTM”)”。在C語言中嵌入匯編語言時,應當遵守以下原則:第一,被嵌人的匯編指令在結束時不需要輸入(;)。第二,ASM塊中的分號(;)是匯編代碼的注釋。第三,在ASN塊中返回指令為return。第四,在嵌入c語言時,應用匯編語言中所使用的C語言進行初始化處理,并明確匯編的類型。第五,匯編語言中如db等偽指令被禁止嵌入C語言中。事實上,在C語言中嵌入匯編語句的方式,雖然較為簡單便捷,但是在嵌入的過程中,有可能導致C語言本身的語言環境受到破壞,導致程序運行結果出錯。因此,不建議在C語言中嵌入大段功能完整的匯編語言。
關鍵詞 可視化編程環境;人機交換界面;詞法分析;語法糾正
中圖分類號:TP311 文獻標識碼:A 文章編號:1671-7597(2014)01-0042-01
計算機的普及過程中,為了讓計算機程序更好的服務于公眾,對于程序的語言的要求就尤為突出,合理有效的建立起良好的語言環境是研究者的任務,也是在本文中著重提出的議題。我們通過在使用C語言環境下的人機交換系統來實現計算機系統程序的可視化管理,在對程序設計的過重中將設計的方案確實的實現出來,有效的體現出程序化進程管理的優勢。
1 人機交換模式的意義
在系統的交流過程中,以往是采取人為發出指令,使用計算機的匯編語言和更為完善的C語言進行命令的編輯,改變了機器和人之間存在的間隙。這套人機交換模式最為主要的就是可視化技術,技術在現有的環境中實現了可視化的操作模式,對于人直接命令機器起到了關鍵的作用。人機交換模式在使用中的原理是:可視化系統在程序運行的過程中,將數據整理編程成結構化的模式,由抽象的數字概念轉換為具體形象的可視化模型結構?;讷@取計算機模型信息在使用中較為復雜,完全可以考慮使用二維圖像對于圖像可視化生產,這些都需要通過計算機對于數據進行采集,利用視覺信息定位處理的加工方法,對編程可視化進行完善,這就在很大程度上解決了在可視化圖像采集中出現程序混亂的現象。
在所提到的計算機編程可視化圖像采集裝置中最為主要的電腦原件就是高靈敏度的光學構件,它使用的是光學的耦合技術,在QQSDE模式下快速的采集圖片,形成的還原圖像與真實的圖像像素大致相同。再把光學原件收集的檢測信息發送到信號轉換裝置當中,利用信號發射的原理將圖像轉變成圖像信號。在計算機程序接收信號的同時,對于信號進行分析,把原有的加密進行破解,快速的從信號當中需找圖像信息,并將破解出的信息提取出來再次轉換成模型,對于目標表征較為明顯的圖片可以直接進行直接的編程處理。如果遇到較為輔復雜的表征形式,可以將數據的格式存儲記錄到數據庫中,與原有數據進行比對,得出最為相似的數據進行分析提取,并將最終得到的數據指令下達到每一個數據終端當中。
2 可視化編程環境設計的內容
直觀有效的可視化系統是在程序設計中提高效率的重要方式,對于計算機程序后期的檢測也起到了關鍵的作用,對于圖像的界面設置,在程序的整體結構中,減少了操作人員在交流中的成本,縮短了操作的時間,降低了操作的復雜性,同時C語言的介入可以使得程序中的語言內容更加的完善,改變了以往語言出現的細節上的錯誤,完全實現了設計的可視化模式。
C語言的在編程過程中,會在錯誤的狀態下有系統的提示,這就是可視化的作用,在語言的編輯程序中,將設置和編輯形成連接關系,最后在關系的確立后形成具體的操作過程。在實施的每個階段C語言的源代碼程序會發生一定的規律性轉變,在表示方式的不同中,會出現一定的語言語法錯誤和語言意思的不明確,對于在可視化編程的中的C語言環境可分為語言的分析判斷、代碼的轉換和命令的執行三個過程。對于語言的判斷中,設計者在非操作的狀態下,由計算機自身的識別方式上的工作狀態,對于編程環境中的語言出現的問題和錯誤及時的糾正,在發現系統無法解決的問題時,系統會發出對話框提示對于編程語言進行人工的處理。數據源中的信息在讀取過程中直接傳送到緩沖接收裝置中,這就進行第二相內容,就是代碼的轉換過程,原有的信號源會在轉換器中經過變換,生成新的數據形式,在正確的語法的指示下,系統記錄下代碼生成的具體標記。再結合原有的C語言的環境模式進行比對,對于無關的代碼進行刪除的預處理,剔除一些無關錯位的信息,并保留和存儲新生成的文字、標點和符號。最后一個階段就是根據新生成的編程代碼設計在計算機程序中實現操作指令的過程,完成整個可視化編程操作環境的使用。
3 可視化編程的實例介紹
在可視化編程的實現中,對于數據的分析是設計中的關鍵項目,對于語言的掃描器會根據C語言的具體規則(如關鍵字、運算符、數據類型和程序語句結構等)從詞法預處理器產生的原始Token中依次讀取原始Token信息進行分析,產生最終給語法分析器使用的記號流信息,并為每一個Token定義相應的類型信息。Token的數據結構設置如下根據系統設計的原理。根據原理的改變方式構建程序代碼的可視化可以實現計算機指令系統和運行機制研究的可視直觀性,為研究提高計算機的性能提供了一個可靠的虛擬平臺。通過數字模擬圖形的結構方式將程序虛擬運行的內部工作過程進行現實展示,可以大大提高C語言環境下對計算機系統內部結構優化的研究,對于語言環境中的技術和語法的檢驗在程序內部進行,可以有效的講計算機程序完善。并且考慮到關于可編程環境下的語義的詮釋,以及提供對系統的可擴展能力的研究,真正做到研究CPU程序中關于C語言技術的提高。
語法分析階段是整個編譯過程中繼詞法分析后的第二個階段,該過程是實現可視化的關鍵階段。它與編譯程序中的語法分析器略有不同,區別主要在算法和輸出結果上。編譯程序的語法分析是在詞法分析得出的單詞序列的基礎上得出相應的語法樹,進而為下階段的語義分析做準備,確保可編程環境下的語義完整。
在對于語法的判別和解釋的過程中,尤其是對于代碼和單詞符號的辨別,分析出已有的單詞的語境和構詞方式,將已有的單詞符號串聯起來。在通過規范中的分析方法形成分析樹,并通過語法分析器具體的表現出來,其具體的過程為:利用CParser相關聯的詞語對詞法分析產生的Token進行分析判斷(也即調用CScaner相關聯詞語),然后通過單詞的使用方式及相應規則建立語法樹。在語法分析中,根據傳入的Token值情況進行分析,調用相應的執行函數進行分析判斷,每個函數產生相應的語法樹,直到最后所有的Token處理完成以后,整個C語言程序產生一棵總體的語法樹。
4 結束語
在計算機的可視化環境中,實現人機的交流是提高計算機運行效率的關鍵手段,在提供這樣的交流平臺的過程中實現圖像的可視化,將虛擬狀態下的數據資源系統的轉變為可視化的具體操作過程,其中結合有C語言的環境設置,對于在程序編程過程中出現的錯誤和優化檢測中,了解和發現語言語義和語法的正確與否是實現結構自身優化的一種方式,在對于編程環境的不斷優化設計中,完善程序內部的環境狀態,在實現程序化設計的過程中更加的順利,借此來達到計算機程序智能化、方便操作的目的。
參考文獻
[1]蔡勇,劉學慧,吳恩華.基于圖像繪制的虛擬現實系統環境[J].軟件學報,2007,8(10):721-728.
關鍵詞:圓曲線;主點放樣;c#語言
中圖分類號:TP文獻標識碼:A文章編號:1672-3198(2008)08-0359-03
無論是采用傳統光學儀器放樣圓曲線主點,還是采用全站儀放樣圓曲線主點,圓曲線要素、圓曲線主點里程均是必須計算出來的,它們的數學模型分別為:
圓曲線要素切線長:T=Rtgα2
曲線長:L=π180•α•R
外矢距:E=R(secα2-1)
切曲差:q=2T-L
圓曲線主點里程計算:
ZY里程=JD里程-T
YZ里程=ZY里程+L
QZ里程=YZ里程-L2(假設JD里程已知)
JD里程=QZ里程+q2(檢核)
各點平面坐標的計算:x=Li-li36R2+li5120R4(QZ點:Li=L2;YZ點:Li=L)y=li22R-Li424R3+L6i720R5
假定我們在進行圓曲線放樣時,建立如下坐標系統(圖1)。
圖1
I――測站點
JD――交點
ZY――直線段公路與曲線段公路的轉折點
QZ――圓曲線中點
YZ――曲線段公路與直線段公路的轉折點
α――曲線轉角(實測或已知)
R――圓曲線設計半徑(已知)
下面是圓曲線主點放樣要素計算基于c#語言編程實現的主要源代碼,考慮到文章的篇幅,對于窗口通用的最大化、最小化、關閉的代碼就沒有再一一列出。
namespace 測量計算器 //程序命名空間
{
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgse)
{
//主要的計算過程就在這里了
//按照計算要求,輸入各已知量,已知量包括:
//轉向角,轉向方向,曲線半徑,曲線主點里程和測站點坐標。
//首先輸入主點里程
int DisMiles;
double DisMeters;
double Distance;
DisMiles = Convert.ToInt32(txtmiles.Text);
DisMeters = Convert.ToDouble(txtmeters.Text);
Distance = 1000 * DisMiles + DisMeters;//得到已知里程
//輸入角度,包括度、分、秒;
int drg = 0, mnt = 0, snd = 0;
drg = int.Parse(txtdeg.Text);
mnt = int.Parse(txtmin.Text);
snd = int.Parse(txtsec.Text);
double vbanjing = double.Parse(txtrd.Text); //輸入曲線半徑
//角度換成弧度:
double grdvalue = ((drg + mnt / 60.0 + snd / 3600.0) / 180.0) * Math.PI;
double valueIX, valueIY;//IY,IX分別是I點的坐標,這個坐標一般已經給出
double valueT,valueL,valueE,valueq; //表示各曲線要素
double valueZY,valueYZ,valueQZ,valueJD; //表示各主點里程
double valueXQZ, valueYQZ, valueXYZ, valueYYZ, valueXJD, valueYJD;//QZ,YZ,JD 3點的坐標
valueIX = Convert.ToDouble(txtx.Text);
valueIY = Convert.ToDouble(txty.Text);
valueT = vbanjing * Math.Tan(grdvalue/2);//算出T
txtT.Text = Math.Round(valueT,3).ToString();
valueL = grdvalue * vbanjing;//算出L;
txtL.Text =Math.Round( valueL,3).ToString();
valueE=vbanjing*((1/Math.Cos(grdvalue/2))-1);//算出E
txte.Text =Math.Round( valueE,3).ToString();
valueq = 2 * valueT - valueL;//算出q;
txtq.Text =Math.Round( valueq,3).ToString();
//接下來計算各主點里程里程
valueZY = Distance + valueL-valueL/2 + valueq/2-valueT;
valueYZ = valueZY + valueL;
valueQZ = valueYZ - valueL/2;
valueJD = valueQZ +valueq/2;
// 定義中間量方便計算轉換
int vzy, vyz, vqz, vjd;
vzy = (int)valueZY / 1000;
vyz = (int)valueYZ / 1000;
vqz = (int)valueQZ / 1000;
vjd = (int)valueJD / 1000;
txtzy1.Text = vzy.ToString();
txtzy2.Text = Convert.ToString(Math.Round((valueZY - 1000 * vzy),3));
txtyz1.Text = vyz.ToString();
txtyz2.Text = Convert.ToString(Math.Round((valueYZ - 1000 * vyz),3));
txtqz1.Text = vqz.ToString();
txtqz2.Text = Convert.ToString(Math.Round((valueQZ - 1000 * vqz),3));
txtjd1.Text = vjd.ToString();
txtjd2.Text = Convert.ToString(Math.Round((valueJD - 1000 * vjd),3));
//首先確定JD點的坐標
valueXJD = valueT;
valueYJD = 0;
//接下來計算4個坐標值:
//注意,在計算4個坐標時,Y坐標的正負由轉向角方向決定,假如向左,Y為負,否則,為正
//所以先定義一個這樣的標量:
int leftORright;
leftORright =left.Checked? -1 : 1; //判斷是否為向左
double LQZ = valueL / 2; //這是計算的之間量!
valueXQZ=LQZ-(LQZ*LQZ*LQZ)/(6*vbanjing*vbanjing)+Math.Pow(LQZ,5)/(120*Math.Pow(vbanjing,4));
txtxqz.Text = Math.Round(valueXQZ,3).ToString(); //計算坐標值
valueYQZ=leftORright*((LQZ*LQZ)/(2*vbanjing)-Math.Pow(LQZ,4)/(24*Math.Pow(vbanjing,3))+Math.Pow(LQZ,6)/(720*(Math.Pow(vbanjing,5))));
txtyqz.Text=Math.Round(valueYQZ,3).ToString();
valueXYZ=valueL-(valueL*valueL*valueL)/(6*vbanjing*vbanjing)+Math.Pow(valueL,5)/(120*Math.Pow(vbanjing,4));
txtxyz.Text = Math.Round(valueXYZ,3).ToString();
valueYYZ=leftORright*((valueL*valueL)/(2*vbanjing)-Math.Pow(valueL,4)/(24*Math.Pow(vbanjing,3))+Math.Pow(valueL,6)/(720*(Math.Pow(vbanjing,5))));
txtyyz.Text=Math.Round(valueYYZ,3).ToString();
//最后進行各點放樣數據的計算,主要包括了方位角計算
//,水平角計算以及三個距離的計算。
//在計算過程中,需要判斷曲線書左向還是右向,因為方向的不同會導致計算結果的不一樣。
//首先定義水平角AIZY:
double AIZY;
if (left.Checked)
AIZY = (270 / 180.0) * Math.PI;
else
AIZY =( 90 / 180.0) * Math.PI;
//下面。根據轉向角的方向確定方位角:
//三個方位角:αIJD, αIQZ, αIYZ,分別是I點到JD、QZ、YZ的方位角
double αIJD, αIQZ, αIYZ;
//在確定方位角后,就可進行放樣要素的計算了,這主要包括2個內容:距離D,以及夾角β:
//首先求得夾角B:βIJD,βIQZ,βIYZ:
double βIJD, βIQZ, βIYZ;
//假如為左:
if (left.Checked)
{
αIJD = 2 * Math.PI - Math.Atan(Math.Abs((valueYJD - valueIY) / (valueXJD - valueIX)));
αIQZ = 2 * Math.PI - Math.Atan(Math.Abs((valueYQZ - valueIY) / (valueXQZ - valueIX)));
αIYZ = 2 * Math.PI - Math.Atan(Math.Abs((valueYYZ - valueIY) / (valueXYZ - valueIX)));
βIJD = αIJD - αIZY;
βIQZ = αIQZ - αIZY;
βIYZ = αIYZ - αIZY;
}
//假如為右
else
{
αIJD = Math.Atan(Math.Abs((valueYJD - valueIY) / (valueXJD - valueIX)));
αIQZ = Math.Atan(Math.Abs((valueYQZ - valueIY) / (valueXQZ - valueIX)));
αIYZ = Math.Atan(Math.Abs((valueYYZ - valueIY) / (valueXYZ - valueIX)));
βIJD = -(αIJD - αIZY);
βIQZ = -(αIQZ - αIZY);
βIYZ = -(αIYZ - αIZY);
}
//轉換成角度(包含度,分,秒)
//定義度,分,秒以及弧度的中間量
//利用Converting()函數實現角度轉變
TXTαIJD.Text = Converting(αIJD / Math.PI * 180.0);
TXTαIQZ.Text = Converting(αIQZ / Math.PI * 180.0);
TXTαIYZ.Text = Converting(αIYZ / Math.PI * 180.0);
//轉換成角度(包含度,分,秒)
βIJD = βIJD / Math.PI * 180.0;
βIQZ = βIQZ / Math.PI * 180.0;
βIYZ = βIYZ / Math.PI * 180.0;
TXTβIJD.Text = Converting(βIJD);// βIJD.ToString();
TXTβIQZ.Text = Converting(βIQZ); //βBIQZ.ToString();
TXTβIYZ.Text = Converting(βIYZ);// βIYZ.ToString();
//最后,計算出點間距離:
double DIJD, DIQZ, DIYZ;
DIJD=Math.Sqrt((valueYJD-valueIY)*(valueYJD-valueIY)+(valueXJD-valueIX)*(valueXJD-valueIX));
DIQZ=Math.Sqrt((valueYQZ-valueIY)*(valueYQZ-valueIY)+(valueXQZ-valueIX)*(valueXQZ-valueIX));
DIYZ=Math.Sqrt((valueYYZ-valueIY)*(valueYYZ-valueIY)+(valueXYZ-valueIX)*(valueXYZ-valueIX));
TXTDIJD.Text = Math.Round(DIJD,3).ToString();
TXTDIQZ.Text = Math.Round(DIQZ,3).ToString();
TXTDIYZ.Text = Math.Round(DIYZ,3).ToString();
}
private string Converting(double jiao)//轉換函數
{
intdu, fen, miao;
string jiaodu;
du =(int) Math.Floor(jiao);
fen =(int) Math.Floor((jiao - du) * 60);
miao =(int)( Math.Round ((((jiao - du) * 60 - Math.Floor((jiao - du) * 60)) * 60),1));
jiaodu = Convert.ToString(du) + ”?“ + Convert.ToString(fen) + ”\'“ + Convert.ToString(miao) + ”\””;
return jiaodu;
}
}
}
據此源代碼,進行窗口設計的最終效果圖(如圖2),可供讀者進行參考設計。