第一篇:淺談《C語言程序設計》教學與實踐
淺談《C語言程序設計》教學與實踐
為了有效改善當前C語言程序設計教學方法的諸多問題,本文提出了一種互動式和啟發式教學方法,從實際出發,制定出切實可行的教學案例。通過測試結果表明,本文提出的方法在實際的教學實踐中取得了良好的效果。
隨著現代信息技術的發展,計算科學與信息科學相結合更加緊密,計算機編程能力已經成為非計算機專業學生的一門重要的必修課[1]。目前,許多高校都開設了《C語言程序設計》課程。由于C語言的功能強大和應用廣泛,已經成為許多高校課程首選的編程語言。與其它語言相比,C語言涉及的概念更加復雜、規則更多,如果按照傳統的教學方法,對于非計算機專業大多數學生來說,在規定的課堂教學時間內,較難掌握C語言的程序設計思想和方法。因此,傳統的教學方法需要改革與實踐。
目前,C語言教學存在的問題較多,本文歸納如下(1)計算機基礎存在很大差異。目前,我國非常重視信息和計算機科學的普及教育,大多數高級中學都開設信息技術等課程,在進入高校前,大多數學生就已經掌握了一些計算機相關的基礎知識。由于不列入高考范圍,不同地區存在很大差異,尤其是經濟欠發達地區的學生在計算機知識的掌握方面存在很大的差異;(2)教學案例。C語言涉及許多知識點,現有教材大多數都通過例子講解每個知識點,通過例子可使學生更好的理解知識點,但問題在于往往不同知識點對應的例子不同,導致學生誤認為知識點之間是孤立的,使學生無法將不同的知識點綜合起來,學到最后,大多數學生會出現無法將各個知識點串聯起來。因此,在教學過程中,選擇合適的案例來貫通多個知識點是非常重要的;(3)學生的積極性沒有得到充分調動,創新意識沒有得到體現。在C語言教學中,大多數的學生都是被動的學習,被動的接受教師課堂授課。這種教學方法,不但不能真正反映教與學的相互性,也不能調動學生學習C語言的積極性,更不能提倡和培養學生的創新精神。
為了解決上述問題,本文提出了一種互動式和啟發式教學方法,從實際出發,制定出切實可行的教學方法和教學案例,以程序設計的思想和方法為主線,充分調動學生學習的積極性和持續性。通過測試結果表明,本文提出的方法在實際的教學實踐中取得了良好的效果。教學案例
剛開始對于學生要求不能過高,初學時,只要求看懂程序,編寫簡單的程序就可以了,然后逐步深入,通過長期的學習和積累就能熟練掌握C語言。對于學時有限或者基礎較差的學生來說,有些較為難懂的內容可以通過選學或自學,把精力放在最基本、最常用的內容上,學好基本功。因此,案例的選擇至關重要。對于案例的選擇不但要有代表性,而且要有趣味性,不僅與教學內容和目的密切相關,也要能激發學生學習能動性,讓學生掌握每個知識點。如果學生養成了正確的學習方式,掌握程序設計的思想和方法,便于以后學習其它編程語言,其基本規律和方法都是一樣的。在傳統的教學過程中,教師的思維與學生思維存在較大差異,導致學生被動的學習教師的理念,很容易將理論與實踐脫離。相反,案例教學更注重激發學生學習的積極性,能夠舉一反三,掌握規律,引導學生解決實際問題的能力[4]。對于抽象的概念,往往使學生失去進一步學習的欲望,然而教學案例所引入的知識點,通過教師與學生之間的相互作用,共同分析和研究問題,使教師能夠充分調動學生的積極性和興趣,不會出現學生被動的學習情況。
通過這種方式,學生很容易接受各章知識點,對知識點的理解又進一步加深。學習程序設計,只要掌握程序設計的思路和方法,就能學活用活,舉一反三。另外,在考慮教學案例時,我們應該根據學生的實際情況來選擇案例,案例的選擇不能太易,也不能太復雜,需考慮學生的接受和理解能力。因此,教學案例可提高學生的主動性、培養學生分析和解決實際問題。互動式教學方式
傳統的教學方式,往往都是以教師為中心,學生是被動的接受知識,而現代教學方式偏向于主張學生參與到教學過程中[5]。教學本身具有兩面“教”與“學”,兩者緊密相連,教師教的過程也能總結出如何教好學生的方法。因此,教師的教學與學生的學密不可分。然而,舊的教學觀念總是強調教師的教學,以為教的越多,學生學的越多,往往會忽視學生實際掌握知識的情況,甚至沒弄清楚學生是如何學習的。因此,學生一直以來都處于被動狀態。實際上,“教”只是外部因素,“學”才是內部因素。教師的“教”是創造學生“學”的條件,學習過程就是一種認知的過程,學生“學”的動力取決于“教”。
在C語言教學過程中,教師通過互動式教學法幫助學生回顧知識,采用回答問題方式引入新的知識,然后討論和演示驗證指導學生解決問題,最后,通過新的啟發式問題引導學生進一步思考。最好這些問題從學生的背景知識中考慮,能啟發學生,讓學生從不同方面思考和解決問題。
編程思想和方法
如今的信息技術發展迅速,計算機編程語言層出不窮,對于學生,掌握一門編程語言至關重要,在教學48課時和實驗16課時,共64課時內,很難精通一門編程語言。因此,編程語言教學應該集中在使學生掌握編程思想和方法,培養他們的邏輯思考能力。只有采取這種方式,學生今后就能以同樣方式迅速的掌握其他編程語言。計算機編程語言的教學是語言學習的基礎和關鍵環節,程序設計的關鍵是如何找到問題和解決問題,俗稱算法。算法是程序設計的靈魂,是計算機進行操作的步驟。語法是編程的基礎和程序設計的工具,培養學生編程能力,我們應該集中在算法設計和分析上。算法分析可以幫助學生開放思想,開拓新思路,歸納邏輯規律。在傳統教學中,教師只要求學生看懂程序,當他們單獨編寫程序時,往往不知道從哪里開始[4]。
C語言程序設計課程教學要求學生掌握基本語法、申明、控制結構、基本思想和自上而下的結構化程序設計。同時,也要培養學生使用C語言解決實際問題。在講完C語言基本知識教學時,例如數據類型和變量聲明,我們可以使用三種基本結構程序設計、函數、數組和文件作為主線進行教學,這樣學生就可以掌握編程的基本技能。即使不同的編程語言實現代碼不同,但它們的思想和方法非常類似。當我們在C語言教學時,我們應該淡化語法教學,為了培養學生解決問題的能力應把教學的重點放在算法上。語法規則不是通過孤立的學習而是在學習編程的過程中學到的。隨著編程難度的逐步提高,算法和語法的學習同步趨于深入。學生在富有創意、引人入勝的編程中,學會了算法,掌握了語法,把枯燥無味的語法規則變成生動活潑的編程應用。
結束語
通過采用本文提出的互動式和啟發式教學方法考察類型題包括選擇題(占總成績的20%,涵蓋整個教學大綱,下同)、填空題(10%)、編程填空題(30%)和編程題(40%)。學生最后的成績信息表見表1。
綜上所述,教學與改革不僅能夠激發學生學習的動力,且能培養學生分析問題和解決問題的能力。隨著信息技術的不斷發展,我們應該不斷的完善我們的教學模式。
第二篇:C語言程序設計教學的實踐與心得
《C語言程序設計》教學的實踐與心得
【摘 要】 在21世紀的大環境下,各種實踐性學科都將面臨著強大的沖擊,而作為計算機軟件開發等的入門語言,更顯得尤為關注。強調實驗的重要性,可以促使學生在學習C語言的基本知識之外加強編程實踐,使學生在掌握C語言語法知識的同時,也掌握程序設計的思想和方法,這樣才能引導和督促學生多編程序,編出優秀的程序,增強學生的動手能力。
【關鍵詞】 C語言 可移植性 應用性 程序調試
C語言是一門高級程序設計語言,使用廣泛,表達能力強,目標代碼運行效率高,可移植性好,既具有高級語言的優點,又具有低級語言的許多特點,既可以用來編寫系統軟件,又可以用來編寫應用軟件。因此《C語言程序設計》課程在教學中占有重要地位。
《C語言程序設計》是高職高專院校計算機專業的一門核心專業基礎課程,同時也是多數非計算機專業的主要選修課。該課程是一門實踐性與應用性較強的課程,目的是培養學生算法設計的基本思想和程序設計的基本技能。課程的內容主要涉及C語言的基本概念、基本語法以及C語言程序設計的基本方法,在教學中既要重視嚴謹的系統理論教學,又要重視實踐性環節和案例的討論與分析,為以后有關課程的學習和從事軟件開發奠定基礎。以下是本人在《C語言程序設計》課程教學過程中的一些經驗和體會,與大家共勉。
一、提高教師自身素質
教師首先要提高自身的政治素質和業務水平,及時了解最新的科技成果并掌握C語言應用技術的發展方向,要不斷拓寬知識面,具備一定的知識高度,同時不斷研究與改進教學方法,理論聯系實際,提高自身的教學水平。
二、合理選擇教材
高職教育是針對崗位一線培養應用型、技能型人才的,而目前高職教育的C語言教材普遍存在的問題是結合崗位的針對性不強,技能訓練的實踐性不夠。教材是提高教學質量的基礎和前提,是學生系統學習知識的依據,一本好的教材應能培養學生的自學能力和獨立思考能力,使學生能夠依據教材理解課堂教學內容,深入了解本學科各個領域的知識。在選擇教材方面應注重以下幾個方面:(1)充分考慮高職高專教學的特色,理論知識要夠用,注重理論聯系實際,突出實用性。(2)語言表達要通俗易懂,在內容編排上盡量符合初學者的要求。(3)注意點與面的結合,注重基礎與新技術的結合,使教材不僅是師生教與學的媒介,還是能夠培養學生編程能力的工具。(4)在選擇好的教材的同時,教師應積極編寫符合實際教學需要的高質量的教材。明確C語言課程的教學目標,培養學生模塊化程序設計的邏輯思維能力,掌握程序設計的基本語法規則和程序調試方法,具備初步的分析問題與解決問題的能力。主要的教學目標包括:掌握C語言語法,能夠熟練運用基本程序結構解決簡單問題,理解模塊化程序設計原則并能針對復雜問題進行合理分解,掌握基本算法分析與設計知識。
1.作為計算機專業的基礎課,目的是使學生掌握程序設計的基本方法并逐步形成正確的程序設計思想,能夠熟練地使用C語言進行程序設計,具備調試程序的能力,為后繼課程及其他程序設計課程的學習和應用打下基礎。學生要在理解C語言的基礎上更加專注于理解《算法》或者《數據結構》等課程,而不至于被語言本身的復雜語法現象干擾,要強調C語言的實用性。另外,在掌握C語言的基礎上,比較容易學習其他主流編程語言,學生通過對C語言的學習,可以獲得針對基本程序結構的程序編寫與程序調試知識。
2.學生對C語言的熟練掌握可以在一定程度上降低后續計算機硬件技術基礎課程的學習難度。計算機硬件技術基礎課程中有很大一部分內容是對匯編語言的學習,同樣作為面向機器模型的程序設計語言,C語言僅僅是抽象程度更高一些,其程序結構與匯編語言具有一定的相似性,C語言的編程經驗對學生學習匯編語言會有很大的幫助。
3.對于非計算機專業理工類學生而言,該課程有比較強的工業基礎應用前景,C語言為用計算機解決實際問題提供了方法,是后續理論與實踐教學的基礎和重要工具,同時也是計算機二級考試所統一要求的課程之一。教學內容的改革應本著突出基礎理論知識的應用和實踐能力培養的原則,以應用為目的,以“必需、夠用”為度,加強針對性和實用性。
三、注重教學過程,優化教學方法,把握教與學的關系
高職高專C語言課程理論性強,概念性強,抽象而且復雜,在教學過程中要注意的問題主要有:培養學生對C語言的興趣;教給學生正確的學習方法;加強實踐教學環節;有效地組織課程設計;培養學生分析和解決實際問題的能力。教學過程是教師和學生的雙邊活動,只有既注重教,又注重學,才能真正做到教為學服務。教師所要做的就是傳道、授業、解惑,開闊學生的思路,激發學生學習的積極性和主動性,激發反思,調動潛能,引導學生討論,幫助學生解決遇到的問題,寓教于學。只有把握好教與學的關系,才能優化整個教學過程。
1.將案例帶到教學中來。C語言是應用性很強的一門課程,既有理論,又有實踐,既講方法,又講動手能力。采用案例教學法可以改變“滿堂灌”的做法,將學生的眼、手、腦全部調動起來,培養學生的學習興趣。本人在上課過程中,將課程內容分為若干個主題,以程序設計作為貫穿各主題的主線,每個主題的教學過程由“要點講解”、“自學/上機實踐”和“疑難解答”三個階段組成。通過案例分析,重點講解程序設計的思想和方法,輔以語言知識的介紹;然后通過上機練習,包括基本訓練(自測作業和主題作業)與綜合訓練(大型作業),教師針對學生暴露出的問題答疑解惑,結合案例教學,努力將C語言作為解決實際問題的工具,強化學生的編程能力,在分析程序與程序設計的過程中使學生逐步熟悉語法,應用語句,提高學生分析問題、解決問題的能力,由淺入深、由易到難、循序漸進地使學生在實踐中掌握知識,培養程序設計能力,逐步理解和掌握程序設計的思想和方法。最終在課堂上教師扮演“和方法,運主導”角色,而學生真正地成為“主體”。
例如:《C程序教程》(譚浩強主編)中有一題為:用循環語句結構判斷整數m是否為素數。
/* ex5_5.c */ #include“stdio.h” main(){ int m,c=2;
scanf(“%d”,&m);
while(m%c)
} 書中介紹了三種循環語句結構均可以作出判斷結果,這時我們就應該利用“比較法”,將三種循環語句結構進行對比,使學生有一個較為深刻的理解與記憶。
2.切合實際的分組教學。要真正掌握程序設計的思想用語言解決實際問題,綜合訓練勢在必行。整個過程以學生獨立完成為主,教師提供相應的理論輔導。經過這樣的模擬實際軟件開發的演練,不但提高了學生的學習興趣,培養了學生問題求解和編程能力,還有利于培養他們探索與創新的能力,更加有利于激發學生學習的積極性。
3.分層次教學。即標準化教學與個性化教學相結合,結合不同專業、不同班級學生的具體情況,制定各有特色的教案、講稿和教學課件。既發揮群體智力優勢,又充分發揮教師個體的教學風格特長,有利于提高教學水平。
4.加強實驗課與理論課的聯系。在理論課上將上機實驗任務題目進行講解,也可以將案例算法作為實驗內容。實驗課程可以分為兩部分,實驗任務問題作為理論課的內容在課堂上討論、講述,確定實現算法。對于同樣的題目,可以確定若干不同的算法,比較其優劣,分析其原因。上機實驗的任務是完成已確定算法的編碼實現和運行。這種做法相當于在教師帶領下,對實驗內容做了集體預習,貫徹了“算法重于語法,語法重于編碼”的課程指導原則,綜合運用學過的知識,加強實踐教學。學生只有通過大量的c++;
printf(“%d is a prime number.n”,m); printf(“%d is not a prime number.n”,m); if(c==m)else 練習,才能真正掌握語言知識,培養程序設計能力,逐步理解和掌握程序設計的思想和方法,學會利用計算機解決實際問題。
5.充分利用多元化、現代化的教學手段。在教學過程中應多方位應用現代教育技術手段,尤其是多媒體輔助教學手段與網絡化輔助教學手段。在課堂教學中采用多媒體教學課件,加強直觀教學,可提高學生的空間想象力。教師應從最簡單的C語言程序的調試入手,詳細演示C語言程序的調試過程與調試細節,同時讓學生參與進來,實現教師與學生、學生與學生的雙向交流和互動,提高學生的學習興趣,加深學生的理解與記憶。使其檢驗自己本階段的學習成果,加強對所學知識的吸收和消化。
總結:
改革考核方式,強化應用能力《C語言程序設計》的考核應采用多種形式考核學生的知識掌握程度和實踐能力,包括卷面考試與實驗考核,要強調職業技能。實驗考核可采用上機考試與平時訓練相結合的方式,上機考試可以使用能自動組卷和評分的考試平臺;平時訓練包括作業和綜合編程訓練的完成情況。該評價方法可以提前讓學生體驗全國計算機等級考試的過程,也可以促使學生在學習C語言的基本知識之外加強編程實踐,使學生在掌握C語言語法知識的同時,也掌握程序設計的思想和方法,這樣才能引導和督促學生多編程序,編出優秀的程序。
介于本人的能力有限,在實踐及教學環節中還存在著許許多多的問題與不足,今后將會更加關注自身能力的提高,以便取得更好的教學效果。
【參考文獻】
[1] 張陵山 《C語言程序設計教程(修訂版)》 湖南大學出版社 [2] 楊起帆 《C語言程序設計教程》 浙江大學出版社 [3] 譚浩強 《C程序設計(第二版)》 清華大學出版社
第三篇:《C語言程序設計實踐》課題
綜合實踐大作業
任務1 課題名稱:
學生順序表的處理
課題內容:
在一個數據文件中存放若干學生數據記錄,每條記錄都有如下數據項:學號,姓名,性別,成績。
編一個程序,采用順序存儲結構存儲這批數據,并對該數據進行排序。要求:數組前部為女同學,后部為男同學,并且男女同學都按成績遞減排序,分別計算男生合格率、女生合格率、全班的成績平均分,并把排序后的學生數據記錄及計算結果存入另一個數據文件中。
任務2 課題名稱:
學生成績的管理(順序存儲)
課題內容:
某班級學生C語言第一次正考的成績存于數據文件score.dat中,記錄了學生學號、姓名和考試成績,bk.dat文件中記錄了補考學生的學號、姓名和補考成績,編寫程序以順序存儲結構實現以下要求:
1、對該班級按成績降序排序并統計成績平均分及每個分數段的人數,結果寫入到result.dat中。
2、再根據補考成績修改原成績,修改成績后仍按成績降序寫在result.dat的后面。成績修改原則: 1)補考成績大于等于60,原成績以60分記;2)補考成績小于60,取兩次成績中最高值記。
任務3 課題名稱:
學生基本信息的管理(順序存儲)
課題內容:
已知學生的信息包括:學號,姓名,性別,出生年月,地址,電話,E-mail等。以順序存儲結構設計程序能實現以下功能:(1)學生信息錄入:可隨時增加學生信息到數據文件中(2)學生信息瀏覽:學生的信息輸出到屏幕(3)查詢:按學號查詢、按姓名查詢(4)修改:修改指定學生的信息(5)刪除:刪除指定學生的信息
(6)排序:按指定的關鍵字排序后輸出到屏幕。(7)系統以菜單方式工作
任務4 課題名稱:
圖書順序表的處理
課題內容:
在一個數據文件中存放若干圖書數據記錄,每條記錄都有如下數據項:書名,作者,出版社,ISBN,出版時間,價格,類別。
編寫一個程序,采用順序存儲結構存儲這批數據,并對該數據進行排序。要求:按出版社進行分類存取圖書信息,同一出版社中的圖書信息按照出版時間降序排列。分別統計每個出版社出版的圖書數量,并把排序后的圖書記錄及計算結果存入另一個數據文件中。
任務5 課題名稱:
旅游信息順序表的處理
課題內容:
在一個數據文件中存放若干旅游信息數據記錄,每條記錄都有如下數據項:線路編號、目的地、旅游天數、旅游類別、出行月份、價格。
編寫一個程序,采用順序存儲結構存儲這批數據,并對該數據進行排序。要求:順序表按旅游目的地進行分類存取,同一目的地的旅游線路按照月份升序排序。分別統計每個月、每個目的地的旅游線路總數。把排序后的旅游記錄及旅游線路總數存入另一個數據文件中。
第四篇:C語言程序設計
1.Problem A: Hello world!Description Xiao_ming有兩個哥哥,大哥叫Da_min,二哥叫Er_min。三兄弟放學回家,父母分別跟他們打招呼。
Input 無
Output 請輸出: Hello Da_min, Hello Er_min, Hello Xiao_ming!
Sample Input Sample Output Hello Da_min, Hello Er_min, Hello Xiao_ming!
HINT 請注意換行符
Append Code #include
printf(“Hello Da_min,n”);
printf(“Hello Er_min,n”);
printf(“Hello Xiao_ming!n”);} 2.Problem B: 求圓的面積和周長 Description 從鍵盤輸入圓的半徑,求圓的面積和周長,圓周率取3.14。
Input 輸入一個浮點型數據,有效數字不會超過十進制的6位。
Output 輸出為兩行。
第一行為圓的面積,第二行為圓的周長,格式見sample。
Sample Input 3
Sample Output Area: 28.260000 Perimeter: 18.840000
HINT 了解浮點類型的輸入、輸出和算術運算符
Append Code 法一
#include
#include
double r;
scanf(“%d”,&r);
printf(“Area: %lfn”,pi*r*r);
printf(“Perimeter: %lfn”,2*pi*r);
}
3.Problem C:平均值 Description 求3個數的平均值。
Input 輸入只有一行,為3個較小的整數。
Output 輸出為這3個整數的平均值,保留3位小數。
Sample Input 1 2 3 Sample Output 2.000
HINT 注意除法運算對整型數據和浮點型數據是不一樣的。
Append Code #include
4.Problem D: 求字符的值 Description 從鍵盤輸入3個字符(不含雙字節字符),分別輸出每個字符的十進制值(ASCII碼)、八進制值和十六進制值。
Input 輸入為3個字符。
Output 輸出為3行。
每一行為每個字符(對應輸入順序)的十進制、八進制和十六進制值,用空格分隔開。每個輸出的值占3個字符,不足3個字符前面補0。
Sample Input 0 A
Sample Output 048 060 030 032 040 020 065 101 041
HINT 了解字符值的存儲和整型的關系。
Append Code #include
5.Problem A: 最簡單的程序 Description 輸出一行“Hello world!”。
Input 無
Output Hello world!
Sample Input Sample Output Hello world!
HINT Append Code #include
printf(“Hello world!”);}
6.Problem B: 算術基本運算 Description 計算兩整數x和y(0 Input 輸入只有一行,格式見sample。 Output 輸出為多行,按順序每行輸出x,y的和、差、積、商、余數、x的平方和y的三次方,格式見sample Sample Input x = 11, y = 3 Sample Output x + y : 14 xy : %dn“,x-y); printf(”x * y : %dn“,x*y); printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y); printf(”x ^ 2 : %dn“,x*x); printf(”y ^ 3 : %dn“,y*y*y);} 7.Problem C: 自增自減運算 Description C語言中有自增運算++、自減運算--,并且可以前置和后置。 編寫一個程序:對輸入的一個整數a,輸出a++、a--、++a、--a的值。 Input 一個整數a,a是很小的整數。 Output 輸出為5行,第一行為a的值,后面依次為--a、a--、a++、++a的值。 5行輸出縱向a要對齊,“:”對齊,“:”前后各一個空格,后面的數值不用對齊。每行行尾都有回車。 Sample Input 0 Sample Output a : 0--a :-1 a--: 0 a++ : 0 ++a : 1 HINT Append Code #include : %dn“,a);printf(”--a : %dn“,--a);a=x;printf(” a--: %dn“,a--);a=x;printf(” a++ : %dn“,a++);a=x;printf(”++a : %dn“,++a);} 8.Problem F: 絕對值 Description 求整型數據和浮點型數據的絕對值。 Input 輸入兩個數,第一個是整數,第二個是浮點數。 Output 輸出為兩行,第一行為整數的絕對值,第二行為浮點數的絕對值,注意浮點數的絕對值不輸出無意義的0。 Sample Input-1 1 Sample Output 1 1 HINT 求絕對值可以用標準庫函數來完成,也可以自己判斷。注意浮點數的輸出格式。求絕對值的函數在哪個頭文件?貌似很多人會搞錯,包括很多編書的人! Append Code #include int n; float m; scanf(”%d%f“,&n,&m); //n=abs(n); //m=fabs(m); if(n<0) { n=-n; } if(m<0) { m=-m; } printf(”%dn“,n); printf(”%g“,m); return 0;} 9.Problem A: 奇數還是偶數? Description 輸入一個整數,判讀它是奇數還是偶數。 Input 輸入只有一行,為一個100以內的正整數。 Output 輸出為一行。 若輸入為偶數則輸出“even”,奇數輸出“odd”。Sample Input 30 Sample Output even HINT 用整數運算可以解決,練習“?:”表達式。 Append Code #include int n; scanf(”%d“,&n); if(n>=0&&n<=100){ if(n%2==0)printf(”evenn“); else printf(”oddn“); } return 0;} 10.Problem B: 簡單的打折計算 Description 商店規定:消費滿n元,可以打八八折。設某件商品標價m元,輸入購買的件數x,計算出需要支付的金額(單位:元),精確到分。 Input 輸入只有一行,三個整數m、n和x,且0 Sample Input 95 300 4 Sample Output 334.40 HINT 了解浮點型的輸出控制,注意整型和浮點型混合運算過程中的數據類型轉換。 Append Code #include int m,x,n,a; float b; scanf(”%d%d%d“,&m,&n,&x); 0 x m a=m*x; if(a>n) b=0.88*a; else b=a; printf(”%.2fn“,b); } 11.Problem C: 判斷閏年 Description 輸入一個正整數的年份,判斷是否為閏年。 Input 輸入只有一行,為一個10000以內的正整數。 Output 輸出為一行。 若輸入為閏年偶數則輸出“Yes”,否則輸出“No”。 Sample Input 2010 Sample Output No HINT 了解邏輯運算符和關系運算符。 Append Code #include int x; scanf(”%d“,&x); if(x>0&&x<10000) { if(x%4==0&&x%100!=0) printf(”Yesn“); else if(x%400==0) printf(”Yesn“); else printf(”Non“); } else printf(”error“);} 12.Problem D: 水仙花數 Description 如果一個三位十進制數等于其各位數字的立方和,則稱這個數為水仙花數。如:13+53+33=153。 Input 一個整數x,100<=x<=999。 Output x是水仙花數,則輸出“YES”,否則為“NO”。 Sample Input 153 Sample Output YES HINT Append Code #include int a,b,c,x; scanf(”%d“,&x); a=x/100; b=x/10%10; c=x%10; if(x==a*a*a+b*b*b+c*c*c) printf(”Yes“); else printf(”No“);} 13.Problem E: 三個數比較大小 Description 從鍵盤上輸入0~100之間的三個數,按從小到大的順序輸出。 Input 輸入只有一行,為三個整數。 Output 按從小到大輸出這三個數。 Sample Input 15 10 20 Sample Output 10 15 20 HINT 用if語句判斷各種情況可以解決這個問題。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a>=b) { if(b>=c) printf(”%d %d %dn“,c,b,a); else if(c>=a) printf(”%d %d %dn“,b,a,c); else printf(”%d %d %dn“,b,c,a); } else { if(a>=c) printf(”%d %d %dn“,c,a,b); else if(b>=c) printf(”%d %d %dn“,a,c,b); else printf(”%d %d %dn“,a,b,c); } } 14.Problem F: 奇怪的求和之一 Description 給定3個正整數a、b和c,按照如下規則求和: 如果這個數字是偶數,則累加到和中; 如果這個數字是奇數,則將大于該數的最小偶數累加到和中。 Input 三個正整數,均在100以內。 Output 一個和。 Sample Input 2 3 5 Sample Output 12 HINT 如果不會使用分支語句,可使用條件運算符判斷到底將哪個數累積到和中。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a%2!=0)a++; if(b%2!=0)b++; if(c%2!=0)c++; printf(”%dn“,a+b+c); } 15.Problem G: 你過線了嗎? Description 經過四年的學習,你決定報考我國著名的“285”高校之一的北青大學,經過認真的復習,殘酷的考試,終于知曉了自己的考試成績,也知道了北青大學的錄取分數線,請你編程判斷,自己過線了嗎? Input 輸入有2行,第一行有4個正整數,分別表示三門課程的分數線以及總分分數線。第二行有3個非負整數,分別表示你考的三門課程的成績。 Output 如果你的三門課程成績都不低于相應課程的分數線,且你的考試總分也不低于北青大學的總分分數線要求,則輸出“congratulations”,否則輸出“sorry”。 Sample Input 70 80 70 240 80 80 82 Sample Output congratulations HINT 如果你不會使用分支語句,同樣可以使用條件運算符實現該程序。 Append Code #include int a,b,c,d,e,f,g,h; scanf(”%d %d %d %dn%d %d %d“,&a,&b,&c,&d,&e,&f,&g); h=e+f+g; if(e>=a&&f>=b&&g>=c&&h>=d) printf(”congratulations“); else printf(”sorry“);} 16.Problem I: A+B Problem(II): Input/Output Practice Description 計算a+b,0<=a,b<1000。 Input 輸入的第一行是一個整數N,后面有N對整數a和b,每對a和b占一行,a,b用空格分開。 Output 每行輸出一個a+b的和,順序與輸入對應。 Sample Input 2 1 2 10 20 Sample Output 3 30 HINT N給出了測試樣例數,用for循環處理方便。 Append Code #include int n,a,b,i;Scanf(“%d”,&n);For(i=0;i 17.Problem H: A+B Problem Description 計算a+b,0<=a,b<1000。 Input 輸入有多對整數a和b組成,每對a和b占一行,a,b用空格分開。 Output 每行輸出一個a+b的值,順序與輸入對應。 Sample Input 1 2 10 20 Sample Output 3 30 HINT OJ系統上測試輸入結束符為EOF(End Of File),其值為-1。用scanf()把文件所有內容讀完后,會讀到EOF,所以可以用來判斷輸入是否完成,測試時可以用Ctrl+Z產生EOF。本題解法參看FAQ。Append Code #include int a,b; while(scanf(”%d%d“,&a,&b)!=EOF){ printf(”%dn“,a+b); } return 0;} 18.Problem A: 判斷是否是元音字母 Description 輸入一個英文字母,判斷是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U Input 輸入一個英文字母 Output 是元音字母,輸出“yes”,否則輸出“no”,行尾沒有回車。 Sample Input A Sample Output yes HINT Append Code #include char ch; scanf(”%c“,&ch); if(ch>='A'&&ch<='Z') ch=ch+32; if(ch=='a') printf(”yes“); else if(ch=='e') printf(”yes“); else if(ch=='i') printf(”yes“); else if(ch=='o') printf(”yes“); else if(ch=='u') printf(”yes“); else printf(”no“); } 19.Problem B: 按順序輸出三個數 Description 對于輸入的3個整數,按照從小到大的順序輸出。 Input 輸入3個int類型內的整數,兩兩之間用一個空格隔開。 Output 按照從小到大的順序輸出上述三個數,兩兩之間用一個空格隔開。 Sample Input 2 1 3 Sample Output 1 2 3 HINT Append Code #include int a,b,c,temp; scanf(”%d%d%d“,&a,&b,&c); if(a { temp=a; a=b; b=temp; } if(a { temp=a; a=c; c=temp; } if(b { temp=b; b=c; c=temp; } printf(”%d %d %dn“,c,b,a);} 20.Problem E: Description 判斷輸入整數的奇偶性。 判斷奇偶數 Input 輸入為一個整數。 Output 輸出只有一行,代表判斷結果。如果輸入的整數n是一個偶數,輸出: n is an even number.否則輸出: n is an odd number.見樣例。 Sample Input 12 Sample Output 12 is an even number.HINT Append Code #include int a; scanf(”%d“,&a); if(a%2==0) printf(”%d is an even number.“,a); else printf(”%d is an odd number.“,a);} 21.Problem A: 判斷兩個整數的大小關系 Description 輸入2個整數a和b,如果a>b,則輸出1,否則輸出0。 Input 兩個整數a和b,均不超過int類型的表示范圍。 Output 表示a>b的結果:如果a>b,則輸出1,否則輸出0。 Sample Input 3 4 Sample Output 0 HINT Append Code #include printf(”1“); else printf(”0“);return 0;} 22.Problem D: 成績的等級 Description 把百分制的考試成績轉換成五級制的成績: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之間的輸入是非法數據,輸出“Error”。 Input 輸入多行,每行一個整數。 Output 輸入所對應的成績等級。 Sample Input-1 81 92 35 68 72 100 Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch語句解決這個問題比較方便。 Append Code #include int score; while(scanf(”%d“,&score)!=EOF) { if(score<0||score>100) printf(”Errorn“); else { switch(score/10) { case 0: case 1: case 2: case 3: case 4: case 5:printf(”Failingn“);break; case 6:printf(”Passn“);break; case 7:printf(”Averagen“);break; case 8:printf(”Goodn“);break; case 9: case 10:printf(”Excellentn“);break; } } } return 0;} 23.Problem E: 輸出是m的倍數或n的倍數、但不是 m和n的公倍數的數 Description 輸出1~k之間是m的倍數或n的倍數、但不是m和n的公倍數的數,其中1<=m,n Input 輸入三個整數,依次為k、m、n。 Output 從小到大輸出符合題意的所有整數,兩數之間用一個空格分開。 Sample Input 15 2 3 Sample Output 2 3 4 8 9 10 14 15 HINT 難點在于輸出格式的控制:空格在數的中間,學會用循環時邊界情況的特殊處理。 Append Code #include a=m;else a=n;printf(”%d“,a);for(i=a+1;i<=k;i++){ } if((i%m==0&&i%n!=0)||(i%n==0&&i%m!=0)) printf(” %d“,i);} return 0; 24.Problem B: 兩整數相加減 Description 計算a+b和a-b。 Input 輸入為一對整數a和b。a,b用空格分開。 Output 輸出a+b和a-b的計算結果,各占一行。 Sample Input 1 2 Sample Output 3-1 HINT Append Code #include printf(”%dn“,a+b); printf(”%dn“,a-b);} 25 Problem C: 它滿足條件嗎? Description 需要判斷給定的一個整數是否同時滿足如下三個條件: 1.它是一個完全平方數。2.它是一個偶數。3.它是一個正數。 注:若一個數能表示成某個自然數的平方的形式,則稱這個數為完全平方數。例如: 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529 Input 一個int范圍內的整數。 Output 如果輸入的數字滿足條件,則輸出yes,否則輸出no。 Sample Input 100 Sample Output yes HINT 注意邏輯表達式判斷三個條件的順序。如果你不會使用分支語句,同樣可以使用條件運算符實現該程序。 庫函數sqrt()可以用于求一個數的平方根。 Append Code #include if(a==sqrt(a)*sqrt(a)&&a%2==0&&a>0) printf(”yes“); else printf(”no“);} 26.Problem F: 多路分支 Description 編寫一個完整的程序,運行時向用戶提問”你考試考了多少分?(0-100)“接受輸入后判斷其等級并顯示出來等級: 優:90<=分數<=100 良:80<=分數<90 中:60<=分數<80 差:0<=分數<60 Input 輸入任意一個整數分數值,顯示等級;再輸入任意一個整數分數值,顯示等級;....直到測試數據較充分,可輸入-1止。 Output 對任意輸入的分數值,輸出對應的等級,直到輸入的數為-1時才退出運行.Sample Input 102 100 90 80 70 60 50 0-80-1 Sample Output grad must between 0 and 100 優 優 良 中 中 差 差 grad must between 0 and 100 grad must between 0 and 100 HINT Append Code #include int x; while(scanf(”%d“,&x)!=EOF) { if(x<0||x>100) printf(”grad must between 0 and 100n“); else if(x>=90) printf(”優n“); else if(x>=80) printf(”良n“); else if(x>=60) printf(”中n“); else if(x>=0) printf(”差n“); } return 0;} Problem D: 有多少人? Description 學校舉行運動會,如果全體學生按照3人一隊列隊,則多了1個人;如果按照4人一隊列隊,則多了2個人;如果按照5人一隊排隊,則多了3個人。請問這個學校有多少學生? Input 一個int類型的正整數N,是學生人數的上界,即:該校學生數不超過N。 Output 所有可能的學生數,每個數占一行。 Sample Input 200 Sample Output 58 118 178 HINT Append Code #include int n,i; scanf(”%d“,&n); for(i==1;i<=n;i++){ if(i%3==1&&i%4==2&&i%5==3) printf(”%dn“,i);} return 0;} Problem C: 正負數各有幾個? Description 輸入若干個整數,求其中正數、負數的個數。 Input 輸入分為2行:第一行是一個數字N>0,表示下面有N個整數。第2行是N個整數,都是int類型的。 Output 輸出所輸入的N個整數的正數個數和負數個數,并用空格分開2個輸出。Sample Input 10 2 3 4 5-1-2-3-4-5 Sample Output 5 5 HINT 貌似還有一種叫做0的數。 Append Code #include int n,a,i,num1=0,num2=0; scanf(”%d“,&n);for(i=0;i { scanf(”%d“,&a); if(a>0) num1++; else if(a<0) num2++; } printf(”%d %dn“,num1,num2); return 0;} Problem A: A+B Problem(III): Input/Output Practice Description 計算a+b,0<=a,b<1000。 Input 輸入有多對整數a和b組成,每對a和b占一行,a,b用空格分開。當測試樣為0 0時表示輸入結束,0 0不參與運算。 Output 每行輸出一個a+b的值,順序與輸入對應。 Sample Input 1 2 10 20 0 0 Sample Output 3 30 HINT 練習break的使用。 Append Code #include { if(a!=0||b!=0) } printf(”%dn“,a+b); else break; return 0;} 30 Problem B: A+B Problem(IV): Input/Output Practice Description 計算a+b,0<=a,b<1000。 Input 輸入有多對整數a和b組成,每對a和b占一行,a,b用空格分開。 Output 每行輸出一個a+b的值,順序與輸入對應。每個格式樣例之間用一個空行分隔開。 Sample Input 1 2 10 20 15 35 Sample Output 3 30 50 HINT 由于輸出的和比空行多一個,所以全部計算放在一個循環里是不行的,必須要特殊處理開頭或者結尾。 Append Code #include n++; if(n==1) printf(”%dn“,a+b); else printf(”n%dn“,a+b); } return 0;} Problem C: n個數的最大值和最小值 Description 找出n個數中最大的數和最小的數,并將它們的值輸出出來。 Input 輸入為n+1個整數,都在int類型范圍內。這些數可能用若干空格或者換行符分隔開。輸入的第1個數為n,表示后續有n個數輸入。從輸入的第2個數開始,求出直到第n+1個數中最大的數和最小的數。 Output 輸出為兩行,格式見sample。 Sample Input 3 0 1-1 Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格還是回車都是空白符,對scanf(”%d“)來說沒有區別;先讀入n,然后用for循環就很容易控制讀入n個數的過程。 Append Code #include int n,i,max,min; scanf(”%d“,&n); int a[n]; for(i=0;i scanf(”%d“,&a[i]); max=a[0]; min=a[0]; for(i=0;i { if(max max=a[i]; if(min>a[i]) min=a[i]; } printf(”The maximum number is %d.n“,max); printf(”The minimum number is %d.“,min); return 0;} 32.Problem D: 求100以內的素數 Description 素數是只能被1和自身整除的正整數,根據數學定義1不是素數。素數也叫質數。 Input 輸入為兩個整數m和n,滿足0<=m<=n<=100。 Output 從大到小輸出m~n之間的所有素數,一個素數一行。如果m~n之間沒有素數,則不輸出任何數。 輸出的所有數在兩行“=====”之間。 Sample Input 2 12 Sample Output ===== 11 7 5 3 2 ===== HINT 利用素數的數學規律可以很容易的解出此題,題目給出的數據范圍是關鍵。 Append Code #include t=0; for(j=2;j<=sqrt(i);j++) if(i%j==0) t=1; if(t==0&&i>1) printf(”%dn“,i);} printf(”=====“);return 0;} 33.Problem E: 是否構成三角形? Description 給出三個整數,代表三條邊的長度,判斷這三條邊的長度是否能構成一個三角形? Input 第一行是n(1<=n<=100),表示有n組測試數據 接下來有n行,每一行包含三個整數,表示三個邊長(1<=邊長<=100) Output 如果三條邊能構成三角形,輸出YES,否則輸出NO Sample Input 3 1 2 3 2 8 7 20 20 1 Sample Output NO YES YES HINT Append Code #include {scanf(”%d%d%d“,&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) printf(”YESn“);else printf(”NOn“);} return 0;} 34.Problem C: 簡單的整數排序 Description 對給出的若干整數按從小到大排序。 Input 輸入的第一個數為n(n<=1000),后接n個整數。 Output 按從小到大的順序輸出這些整數,每兩個整數之間用一個空格分隔開,最后一個整數后面沒有空格。 Sample Input 10 3 9 1 5 2 8 5 6 7 3 Sample Output 1 2 3 3 5 5 6 7 8 9 HINT 排序前必須把所有的整數都存儲下來。因為只有最多1000個數,1秒的時間足夠任何排序算法運行處結果來。 Append Code #include int c,i,n,j; int a[1000]; scanf(”%d“,&n); for(i=0;i scanf(”%d“,&a[i]); for(i=1;i<=n-1;i++) { for(j=0;j { if(a[j]>a[j+1]) { c=a[j]; a[j]=a[j+1]; a[j+1]=c; } } } printf(”%d“,a[0]); for(i=1;i printf(” %d“,a[i]); return 0;} 35.Problem A: Description 購物的路程 Saya和Kudo一起去購物。假定她們逛的街是一條直線,而商鋪是這條直線上的一些點。她們將車停在該直線最左端的店鋪處,然后從左向右開始逛每一個店鋪,然后從最右邊的店鋪再返回到停車處。你的任務是計算她們走了多少路。 Input 輸入有多組。每一組的第一行是N(0 Output 對每組輸入,輸出她們走的路長。 Sample Input 4 13 89 37 6 7 30 41 14 39 42 0 Sample Output 152 70 HINT Append Code #include int n,i,max,min,a[100001]; while(scanf(”%d“,&n)&&n!=0) { scanf(”%d“,&a[0]); min=max=a[0]; for(i=1;i { scanf(”%d“,&a[i]); if(a[i]>max) max=a[i]; if(a[i] min=a[i]; } printf(”%dn“,(max-min)*2); } return 0;} 36.Problem B: 求累加和 Description 編程求min~max的累加和(含min和max),其中max>=min>0。部分程序已經給出,請填充其中的空白語句,并提交填充后的完整程序。 Input 輸入為多行。第一行是一個整數N>0,表示后面有N個測試用例。后面有N行,每行包含2個整數,分別是min和max。 Output 輸出為N行,每個測試用例的計算結果占據一行。每行的格式為: case i:sum=s.其中i表示測試用例的編號(從1開始),s是該測試用例對應的累加和(設不超過int的表示范圍)。 Sample Input 3 1 10 1 100 1 1 Sample Output case 1:sum=55.case 2:sum=5050.case 3:sum=1.HINT Append Code #include int n,i,j,max,min,sum; scanf(”%d“,&n); for(i=0;i { sum=0; scanf(”%d%d“,&min,&max); if(max==min) printf(”case %d:sum=%d.n“,i+1,min); else { for(j=min;j<=max;j++) sum=sum+j; printf(”case %d:sum=%d.n“,i+1,sum); } } return 0;} 37.Problem G: 順序輸出字母 Description 按字母順序輸出兩個字母st和ed之間的所有字母,但不包括st和ed。不輸出逆序。 Input 兩個字母st和ed,都是大寫字母,用一個空格分開。 Output 在一行內按順序輸出st和ed之間的所有字母,但不包括st和ed。例如: 輸入為A和E,則輸出為BCD; 輸入為A和B,則什么字母也不輸出,只有一個空行; 輸入為E和A,也是什么字母也不輸出,只有一個空行。最后要輸出一行(行尾不回車): ***END*** Sample Input A C Sample Output B ***END*** HINT Append Code #include char st,ed,a; int i; scanf(”%c%c%c“,&st,&a,&ed); { for(i=st+1;i printf(”%c“,i); printf(”n***END***“); } return 0;} 38.Problem F: 單字母變換 Description Tom和Jack是密碼學愛好者,他們在聊天時經常使用一些暗語。他們使用的一種最簡單的暗語是:將要說的每句話里面的英文字母變成這個字母之后的某個字母。現在要求你寫一個程序,將一個字母變成它之后的某個字母。 Input 輸入有2個:一個大寫字母c和一個正整數d(0 Output 輸出字母c之后的第d個字母。大小寫與c一致。如果c之后的某個字母已經超出'Z',則再從字母'A'開始計數。 如:c='A',d=3,則輸出應為:D。若:c='Y',d=3,則輸出應為:B。 Sample Input A 3 Sample Output D HINT Append Code #include char c; int d; scanf(”%c%d“,&c,&d); if(c+d<='Z') printf(”%c“,c+d); else printf(”%c“,c+d-26); return 0;} 39.Problem B: 登錄密碼驗證 Description 編寫一個程序,模擬用戶登錄系統的密碼驗證過程。系統提供給用戶的密碼長度最長為20個字符,若密碼輸入錯誤可以再次輸入。但為了保證用戶密碼安全,若連續輸入密碼錯誤超過5次就會鎖定賬號一段時間。 Input 輸入為若干個串,至EOF結束。輸入的第一個串是用戶的正確密碼,后面的串為模擬用戶登錄時的輸入的密碼。 Output 每次輸入錯誤的密碼,輸出一個“Wrong!”,若輸入的密碼為正確的,輸出一個“Welcome!”,并結束密碼測試。若前5次輸入的密碼都是錯誤的,則后面的輸入中不管是否有正確的密碼都輸出“Out of limited!”。 Sample Input abcdefg 123456 kkkkkkkk abcdefg Sample Output Wrong!Wrong!Welcome! HINT 輸入可以用scanf(”%s“)處理,密碼比較用字符串的比較可以完成。 Append Code #include char a[20],b[20]; int i,j=1; scanf(”%s“,a); while(scanf(”%s“,b)!=EOF) { if(j<=5) { if((strcmp(a,b)==0)) { printf(”Welcome!n“); break; } else printf(”Wrong!n“); j++; } else printf(”Out of limited!n"); } } 40.Problem C: 兔子的繁殖問題 Description 假設一對兔子每月能生一對小兔(一雌一雄),每對小兔出生后的下一個月是沒有繁殖能力的,至出生后的第三個月開始又可以每月生一隊小兔,問從一對剛出生的小兔開始,經過若干個月后一共有多少兔子(假設在此過程中兔子沒有死亡)? 這個問題是意大利數學家菲波那契(Fibonacci)在他1202年出版的《算盤全書》中提出來的,從第一對剛出生的小兔開始每月的兔子數被乘坐菲波那契序列。 Input 輸入的第一個數為n,接下來有n個數字。每個數字為一個月份m(m<=45)。 Output 輸出為n行,每行為第m個月后的兔子總數。 《C 語言程序設計》主要在計算機軟件、計算機網絡、計算機應用、通信技術、智能電子、電子信息工程、多媒體以及核工程與核技術等專業中開設,是電子信息類、機械類等工科專業的重要專業基礎課。 本校從2001至今,每年都開設《C語言程序設計》課程,由于,我校最開始時的特殊情況,主要把重點放在C語言中的各類重點、難點的語法、語義上,使得學生經過比較復雜和痛苦的過程后,對C語言在使用上很難做到自己編寫程序。而且很多學生產生了畏懼心理。 2004年,學院成立計算機科學與技術系,為了更好學習和掌握C語言,計算機科學與技術專業和計算機維護專業(計算機應用技術前身)除了開設《C語言程序設計》課程外,在后續一學期還開設了《C語言程序設計課程設計》,使得計算機專業學生編程思想和能力得到了極大提高。 2005年,為了讓我院工科學生更好的掌握C語言編程以及通過四川省計算機二級考試,在《C語言程序設計》課程后設置《C語言程序設計課程設計》,極大地提高了學生的動手機會和能力,過級率顯著提高! 2007年,依托我校建設精品課程的契機,我們將C語言中的各個知識點進行重新規整,提出適用于三本院校學生的語言設計學習的方法。我們提出,先了解C語言,再學習C語言,再用C語言的思想。即在開始時讓學生初步知道C語言,然后引入比較簡單的運算符以及基本輸入、輸出和簡單的順序結構程序設計。通過這樣的方式,我們發現,學生在C語言的學習就不會從開始的時候陷入大量難懂的語法、語義和數據結構中。有了以上鋪墊再層層進入,最終進入復雜的各類數據結構以及指針等學習。通過以上的內容規整后,教學效果有明顯提高。第五篇:C 語言程序設計