Ⅰ c語言課程報告設計
一 引言
人類已進入21世紀,科學技術突飛猛進,經濟知識和信息產業初見端倪,特別是信息技術和網路技術的訊速發展和廣泛應用,對社會的政治、經濟、軍事、文化等領域產生越來越深刻的影響,也正在改變人們的工作、生活學習、交流方式。信息的獲取、處理、交流和應用能力,已經成為人們最重要的能力之一。 在不久的將來知識經濟將佔世界經濟發展的主導地位,國家綜合國力和國際競爭能力越來越取決於教育發展、科學技術和知識創新的水平,教育在經濟和社會發展過程中將呈現出越來越突出的重要作用。學生成績管理系統是一個學校不可缺少的部分,它的內容對於學校的決策者和管理者來說都至關重要,所以學生成績管理系統應該能夠為用戶提供充足的信息和快捷的查詢手段。
1 系統的需求分析
當今時代是飛速發展的信息時代,在各行各業中離不開信息處理,這正是計算機被廣泛應用於信息管理系統的環境。計算機的最大好處在於利用它能夠進行信息管理。使用計算機進行信息控制,不僅提高了工作效率,而且大大的提高了其安全性。尤其對於復雜的信息管理,計算機能夠充分發揮它的優越性。
管理信息系統是進行信息的採集、存儲、加工、維護和使用的系統[1,2],它是隨著管理科學和技術科學的發展而形成的。學生成績管理系統是一個教育單位不可缺少的部分,它的內容對於學校的決策者和管理者來說都至關重要,所以學生成績管理系統應該能夠為用戶提供充足的信息和快捷的查詢手段,對學生來說可以輕松的查閱自己在校的成績以及信息等。但是一直以來人們都是靠傳統人工的方式管理學生成績,這種管理方式存在著許多缺點,如:效率低,另外時間一長,將產生大量的文件和數據,這對於查找、更新和維護都帶來了不少的困難。
另外,隨著學校規模的不斷擴大,專業、班級、學生的數量急劇增加,有關學生各門課程的成績的各種信息量也成倍增長,而目前許多高校的學生成績管理仍停留在復雜的人工操作上,重復工作較多,工作量大,效率低,因此,迫切需要開發學生成績管理系統。
2 設計系統的意義
在學生成績的規范管理、科學統計和快速查詢方面具有較大的實用意義。它提高了信息的開放性,大大地改善了學生、教師對其最新信息查詢的准確性。建立學生成績管理系統,採用計算機對學生成績進行管理,進一步提高辦學效益和現代化水平。幫助廣大教師提高工作效率,實現學生成績信息管理工作流程的系統化、規范化和自動化。
作為計算機應用的一部分,使用計算機對學生成績管理系統進行信息管理,有著手工管理所無法比擬的優點,這些優點能夠極大地提高學生成績系統管理的效率,也是學校的科學化、正規化管理重要條件。
二 系統總體設計
1 系統設計方案
通過本課程設計可以在復習、鞏固C語言的基礎知識的同時,進一步加深對C語言的理解和掌握。主要運用C語言中的結構體、數組、鏈表、文件等數據結構進行設計一個簡單的管理系統應用程序,使程序具有數據錄入、查詢、刪除、顯示等基本功能。主要的設計思想是通過編寫各種不同類型的函數模塊來實現該系統的不同功能,還採用創建結構體類型來見不同的數據類型組合成一個有機的整體。
2 函數實現說明:
(1) luru( )函數:
該函數主要用於數據的輸入和添加,將各個學生的成績信息准確錄入到系統中為後面的操作提供基礎數據,以供學生查詢。
(2) display( )函數:
該函數是一個顯示函數。它通過for語句的運用,將所有已輸入的學生成績信息清楚的顯示在眼前,使我們對學生成績一目瞭然。
(3) paixu( )函數:
該函數構成了一個排序模塊,它實現了學生成績的排序。該函數定義的變數雖少,但通過文件的連接和if循環語句的使用[1],該功能完整的顯現出來了,仍然使用for語句,實現了目標。
(4) del( )函數:
該函數實現的是刪除功能。該函數雖然定義的變數不多,但通過if語句和scanf語句的使用,對文件進行了讀取和運用,簡便的刪除所選的目標。
(5) chaxun1( )和chaxun2( )函數:
該函數都是通過if和for語句實現不同的查詢功能,前者是根據學號查詢,後者是根據姓名查詢。
(6) main()函數:
一個程序主函數不能少。當以上的函數均編完之後,要實現各個功能操作的連接,還必須有主函數將它們聯系起來,這樣才能達到理想的結果。對以上函數的連接,此程序採用了switch語句,格式清晰、容易接受。至此學生成績管理的基本功能便基本實
3 系統總體設計框圖
圖1 系統總體設計框圖
3系統總體設計流程圖
圖2 系統總體設計流程圖
三 詳細設計
1 錄入函數
圖3 錄入函數設計流程圖
2 顯示函數
圖4 顯示函數設計流程圖
3 排序函數
圖5 排序函數設計流程圖
4 按照學號查詢
圖6 學號查詢函數設計流程圖
5 按照姓名查詢
圖7 姓名查詢函數設計流程圖
四 總結
經歷了這次學生成績管理程序的編輯之後,我們發現編程初看起來似乎是一件很枯燥、乏味的事情,但是其實裡面還是充滿樂趣的。雖然本程序運用的函數不多,再編寫過程中也出現這樣那樣的錯誤,這一切的一切無疑地說明我是多麼粗心,自己還有很多要學的東西。編程尤其是調試,是一項細致深入的工作,需要下工夫、動腦子、善於積累經驗,這往往能反映出一個人的水平、經驗和科學態度。我在編寫系統過程中曾經出現系統報錯但就是找不到原因在哪兒,最後咨詢老師才知道原來區分全形半形的。另外,編譯、連接的成功並不意味著程序的最終成功。邏輯上的錯誤機器不易檢查出來,這時需要對數據結果進行分析。這種錯誤的查找是最難的,需要編程序的人有相當的耐心和細心去把問題找出來。這也是本次程序編輯過程中碰到的最大的難題。
不過值得高興的是最後還是完成任務,雖然這個系統還不算好,還有很多功能不能實現,但能在能有這樣的成果我很欣慰。在編寫程序的過程中,我們得到了老師的精心指導以及孜孜不倦的教誨,在老師的指導下,我們的能力得到了提高,同時養成了科學、嚴謹的作風和習慣,在此,我們對老師的精心栽培表示衷心的感謝!
參考文獻
[1]譚浩強,張基溫.C語言程序設計教程[M].第3版.高等教育出版社,2006
[2] 袁志祥,秦鋒主.數據結構(C語言版)例題詳解與課程設計指導.第二版.中國科學技術大學出版社出版.112
附錄
……
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct score /*各科成績*/
{
float s;
};
struct student /*學生數據*/
{
int num;
struct score f[9];
char name[20];
float ave;
float sum;
};
int i=0; /*統計個數*/
struct student stu[99];
void luru(struct student a[] ); /*錄入函數*/
void paixu(struct student a[]); /*排序函數*/
void del(struct student a[]); /*刪除函數*/
void display(struct student a[]); /*顯示函數*/
void cprint(struct student a[],int m); /*查詢輸出函數*/
void chaxun1(struct student a[]); /*學號查詢函數*/
void chaxun2(struct student a[]); /*姓名查詢函數*/
void main()
{ int number;
printf("\n\n");
printf(" 歡迎使用學生成績管理系統 \n");
printf("-------------------------------------------------------------\n\n");
printf(" ****************** 學生成績管理系統 ****************** \n\n\n");
printf("1.錄入新學生成績數據 ");
printf("2.顯示學生成績數據\n\n");
printf("3.按總成績排序 ");
printf("4.刪除學生成績數據\n\n");
printf("5.按學生學號查詢 ");
printf("6.按學生姓名查詢\n\n");
printf("7.退出\n\n\n");
printf("\t\t\t請輸入功能選擇編號(1-7):\n");
printf("**************************************************************\n");
do
{
scanf("%d",&number);
printf("--------------------------------------------------------------\n");
switch (number)
{
case 1:luru(stu);break; /*錄入新學生成績數據*/
case 2:display(stu);break; /*顯示學生成績數據*/
case 3:paixu(stu);break; /*按總成績排序*/
case 4:del(stu);break; /*刪除學生成績數據*/
case 5:chaxun1(stu);break; /*按學生學號查詢*/
case 6:chaxun2(stu);break; /*按學生姓名查詢*/
case 7:break; /*退出*/
}
}while(number!=7);
printf("--------------------------------------------------------------\n");
printf(" 謝謝使用! ");
}
void luru(struct student a[]) /*錄入函數*/
{
int m;
int k;
char b;
float sum=0;
printf("請輸入科目數(最多6科):");
scanf("%d",&m);
printf("請輸入學生信息\n");
do
{
printf("學號:");
scanf("%d",&a[i].num);
printf("姓名:");
scanf("%s",a[i].name);
for(k=0;k<m;k++)
{
printf("請輸入第%d科目成績:",k+1);
float temp;
scanf("%f",&temp);
a[i].f[k].s = temp;
}
/*計算總分*/
a[i].sum=0;
for(k=0;k<m;k++)
{
a[i].sum=a[i].sum+a[i].f[k].s;
}
/*計算平均分*/
a[i].ave=0;
a[i].ave=a[i].sum/m;
i++;
printf("是否繼續錄入學生數據?\n(Y/N)");
fflush(stdin); /*刷新標准輸入緩沖區*/
scanf("%c",&b);
}while(b=='Y'||b=='y');
display(a);
}
void display(struct student a[]) /*顯示函數*/
{
int k,m;
system("cls"); /*清屏*/
printf("學號\t姓名\t第1科\t第2科\t第3科\t第4科\t第5科\t第6科\t總分\t平均分\n");
printf("\n------------------------------------------------------------------------------\n\n");
for(k=0;k<i;k++)
{
printf("%d\t%s\t",a[k].num,a[k].name);
for(m=0;m<6;m++)
{
printf("%.2f\t",a[k].f[m].s);
}
printf("%.2f\t%.2f\n",a[k].sum,a[k].ave);
}
printf("\n------------------------------------------------------------------------\n\n");
printf("請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6.姓名查詢\t7.退出\n\n");
}
void paixu(struct student a[]) /*排序函數*/
{
int j,k;
struct student temp;
for(k=0;k<i;k++)
{
for(j=0;j<i-k;j++)
{
if(a[j].ave<a[j+1].ave)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("按總分排升序後的學生數據如下\n");
display(a);
}
void del(struct student a[]) /*刪除函數*/
{
int k,j;
printf("請輸入要刪除的學生學號:");
scanf("%d",&k);
for(j=0;j<i;j++)
{
if(k==a[j].num) /*記錄要刪除的學生的位置*/
{
break;
}
}
if (j<i)
{
for(;j<i;j++)
{
a[j]=a[j+1];
}
i--;
printf("刪除後的學生數據\n");
display(a);
}
else
{
printf("\n\t\t沒有您要刪除的學生數據\n\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢6.姓名查詢\t7.退出\n\n");
}
}
void cprint(struct student a[],int m)/*查詢輸出函數*/
{
int o;
system("cls"); /*清屏*/
printf("學號\t姓名\t第1科\t第2科\t第3科\t第4科\t第5科\t第6科\t總分\t平均分\n");
printf("\n------------------------------------------------------------------------------\n\n");
printf("%d\t%s\t",a[m].num,a[m].name);
for(o=0;o<6;o++)
{
printf("%.2f\t",a[m].f[o].s);
}
printf("%.2f\t%.2f\n",a[m].sum,a[m].ave);
printf("\n------------------------------------------------------------------------------\n\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6.姓名查詢\t7.退出\n\n");
}
void chaxun1(struct student a[])/*學號查詢函數*/
{
int m,t;
printf("請輸入要查詢的學號:");
scanf("%d",&t);
for(m=0;m<=i;m++)
{
if(a[m].num==t)
{
cprint(a,m);
break;
}
if(m==i&&a[m].num!=t)
{
system("cls"); /*清屏*/
printf("\n\t\t沒有查到您要找的學生資料\n");
printf("\n--------------------------------------------------------------------------------\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6.姓名查詢\t7.退出\n\n");
}
}
}
void chaxun2(struct student a[]) /*姓名查詢函數*/
{
int m;
char t[20];
printf("請輸入要查詢的姓名:");
scanf("%s",t);
for(m=0;m<=i;m++)
{
if(strcmp(a[m].name,t)==0)
{
cprint(a,m);
break;
}
if(m==i&&(strcmp(a[m].name,t)!=0))
{
system("cls"); /*清屏*/
printf("\n\t\t沒有查到您要找的學生資料\n");
printf("\n--------------------------------------------------------------------------------\n");
printf("\n請選擇功能:\n1.錄入\t2.顯示\t3.排序\t4.刪除\t5.學號查詢\t6姓名查詢\t7.退出\n\n");
}
}
}
Ⅱ c語言程序設計結課報告
重慶科技學院《
c
語言程序設計》程序設計報告
1
1
設計內容、任務以及要求
...................................... 1
1.1
設計題目的內容
................................................
1
1.2
要求
..........................................................
1
2
總體設計思路
............................................... 2
2.1
系統基本功能
..................................................
2
2.2
具體設計思想
..................................................
2
2.3
系統的總體流程圖
...............................................
3
3 .
功能模塊的詳細設計
........................................ 5
3.1
結構的定義
..........................................................................................................
5
3.2
各個函數的設計具體設計思想和流程圖
......................................................................
5
4
.功能模塊的調試及測試
.
......................................27
4.1
添加函數的測試
...............................................
2
7
4.2
判斷函數的測試
...............................................................................................
2
8
4.3
刪除函數的測試
...............................................
2
8
4.4
統計函數的測試
...............................................................................................
2
8
4.5
密碼確認函數的測試
......................................................................................
2
8
4.6
密碼的修改函數
...............................................
3
1
4.7
主函函數的測試
...............................................
3
2
5
總結
......................................................34
6
致謝
......................................................35
參考文獻
....................................................36
原程序代碼:
.................................................35
Ⅲ 大一計算機導論 學習心得
一篇好的學習心得,必須要結合自己的實際情況,深入的分析這門學科帶給你的感受, 如果一味的寫理論知識,是得不到高分的,我從網上搜索了一個大二學生學習計算機的心得,你可以參考一下,可以結合你自己的實際情況加以修改。
大一大二兩年軟體開發學習心得 出處:博客園
轉眼間在從大一踏進學校的校門到現在剛剛好兩年了,在這兩年裡面,有學到了不少東西,包括怎麼去獨立生活,怎麼去與人溝通,等等,當然最重要的還是學到了自己想要的專業知識。
大一的時候主要是學習計算機導論和C語言,對於急於想看到效果的我,C語言學起來就比較枯燥,因為C語言編寫出來的程序主要還是在命令行的操作,我很想開發出windows界面的軟體出來,但是沒有辦法,C語言是基礎,沒有這個基礎就往高處想,恐怕夢想不會那麼容易實現。所以我就認真的把C語言的基礎打好,先掌握好裡面的語法,程序控制邏輯和一些基本的演算法,說真的,盡管是比較枯燥,但是一旦陷入了編程中,自然就會發現其中的快樂。
大一第二學期的時候開始接觸NIIT的課程,平時雖然一點作業都沒有,但是我上課的時候不是那麼認真聽課的人,所以課後總是要花時間來看看和理解老師上課的例子,在這個學期中,我們主要學習了C++和Java,都是剛剛開始接觸到面向對象的語言中來,由於對一些面向對象的特性不熟悉,畢竟是剛開始接觸這方面的語言,所以學起來就有點吃力,再加上平時實踐的時間比較少。
終於到了學期的期末,學期期末的項目是使用Java語言開發一個網路的聊天室,在我還沒有開發之前一聽到這個項目,我做夢都沒有想到我可以編寫出一個聊天室出來,但是既然是課程提出來的項目,就一定有它的理由,我也相信最後一定也可以完成它。功夫不負有心人,經過接近一個月的研究,我總於完成了我來到學校的第一件作品。在這個月中,我不斷得查閱資料,詢問老師,平時和同學多交流,終於在最後的評審中,我獲得了全班第二的好成績。通過這個學期的開發中,我幾乎把整個學期學到的知識都用到了我的聊天室裡面,所以在實踐中也等於復習了這個學期所學的內容,而且我發現這樣的實踐,比我在平時課後看書,看資料所學到的還多。
大二的第一學期,進入了資料庫和高級Java的學習,說真的,在學資料庫的那段時期是最煩的,因為每天就學了一大堆SQL的語言,非常的枯燥,都是關於怎麼去查找數據表格裡面的內容,那是時期,因為課堂上聽課了之後覺得都是比較簡單的,所以課後很少去動手。到了後來項目開發中,我才發現資料庫的重要性,整個系統的信息都是存儲在資料庫裡面的,所有的在程序中對數據的操作都是等同於對數據的增刪改查詢操作。
在期末的項目中,根據項目所要求的內容,我不斷翻看以前沒有掌握好的資料庫知識,感覺如果我前面有認真學習的話,到了後面開發項目的時候就不會那麼吃力了。對此,我總結出,如果在前面學資料庫的時候不要單純學習SQL的語言,把資料庫和程序結合起來,如果老師的講課的過程中可以說清楚資料庫怎麼綁定到程序中去使用的話,那麼我想對於我來說我會更加有興趣去學好資料庫,因為只要在程序開發中才可以去體驗資料庫的魅力和重大的作用。
在學期末的J2EE開發電子商務網站中,我學到了很多關於怎麼製作動態網頁的一些必要元素的基本的原理,體會到軟體設計在網站開發中的重要性。
轉眼間來到了大二的第二個學期,可以說在這個學期中,是我最有感觸,學到最多知識,達到質的飛躍的一個重要學期。有了前面幾個學期的學習基礎,我對面向對象語言已經基本掌握清楚,運用起來也覺得沒有什麼特別困難,基本已經入門了,這個學期主要是進入了.net的學習。
好的開發工具是保證效率的一個重要因素,Microsoft Visual Studio .NET 2003就是這樣的一個開發工具,令我剛剛一接觸就深深得愛上了它,它的易學易用令我對編程的興趣倍增,以前學習Java之所以見效不大是因為沒有好的開發工具和環境,總是在環境配置中浪費大量的時間,而真正的涉及到編程很少,所以這也是我以前為什麼學起來沒有那麼有興趣的原因。
我覺得學編程就應該學習它的思想,編寫代碼就應該盡量避免寫出與邏輯無關的代碼,比如界面代碼可以讓機器去自動生成不必浪費時間手動去編寫,所以好的開發工具可以幫助我們做到這一點,只編程邏輯代碼,很多代碼都可以讓機器去自動生成。在.net就可以快速地開發既有漂亮界面也有強大功能的程序。有了這么好的開發工具,所以令我頓時感悟,有種相見恨晚的感覺。
有了好的開發工具後接下來要做什麼呢,當我們為之興奮的時候,當然是很有慾望去做出某某自己很想做的東西,因為你一拿到好的開發工具,就會整天的陷入開發狀態,對其愛不釋手,一開始我是試著開發一個Flash播放器,感覺編寫起來不是編寫起來不是那麼難,因為前面已經有學習Java的經驗了,初次學習.net的時候選擇編寫Flash播放器也是有理由的,一方面是程序比較簡單,另一方面的涉及到的控制項和界面比較多,所以一開始接觸這樣的語言就首先學習怎麼去調用.net平台上提供的控制項,只要掌握好這些控制項,以後編寫windows界面的控制項就簡單很多了。
經過幾天的時間,終於把Flash播放器做出來了,以後想Flash影集的時候都用自己開發的播放器進行播放,感覺別有一翻滋味,因為這就是為自己量身定做的,這就使我再一次感覺到開發的樂趣。
每年的11月份都有一個高校杯的軟體設計大賽,這時間正到了5月,我們屈指一算,離比賽的時間還有6個月的時間,這段時間我正處在開發的興奮期,所以對這個軟體設計比賽就感興趣起來,第一是可以知道自己的編程程度和其他人的距離,第二是可以利用這個一個項目實踐來鍛煉自己的開發技能,第三是可以鍛煉團隊的合作。以前幾乎都是自己開發的軟體,很少和其他人合作,所以就令我想到這種開發模式將來帶到工作會另自己處於不利的地位,現在不是都講究團隊的合作么。
經過思考後,我找來另外的兩個志同道合的同學,利用五一放假的時間想好主題,還有進行需求分析,最後定下來「多媒體日記本」這一項目。定好題目後我們就進行了分工,一個人負責資料庫方面,一個人負責界面的美化和界面的布局,另外一個負責功能的實現,分好工後我們立刻就展開了工作,在合作的過程中,我們學到了許多課本上沒講的或者只是粗略帶過的知識,有些特別的技術難點還要到網上去搜索,查閱有關的資料,在語言方面我們幾乎把.net裡面的基本框架和特性都用上了,這樣對於我們學習就達到了事半功倍的效果,邊學邊做學到的知識可以很快吸收,又可以很快得運用的實際中去,這是我通過這個項目感觸最深的。很快就到了期末,學校舉行「IT精英杯」軟體大賽,我們小組終於不負眾望,拿到了一等獎的好成績。
經過這次我比賽我總結出心得,首先比賽的題目要定好,一方面是開發的軟體要有實用性和市場前景,另一方面還要在實用性上加上點創新,給人耳目一新的感覺,我覺得只要先抓住好這兩點,做出來的軟體才會給人留下好的印象。
利用暑假的時間,我又參加系裡面組織的軟體工程培訓,又一次在開發項目中學到了許多許多看書只能朦朧懂的知識。
轉眼間大三第一個學期就開學了,回顧這兩年來學習軟體開發的經歷,寫了這樣的一遍心得,一方面算是對自己的總結,另一方面也可以拿出來給大家參考和交流。最後我還是要再歸納一次,總結出如何才可以比較容易地進入學習狀態達到快速開發的目的。
1. 打好基礎,掌握好C語言C++基礎的語言,對學習數據結構和演算法有很大的幫助。
2. 面向對象是高級也是最流行的語言,所有的面向對象語言幾乎都是通用的,結構和特性都差不多,只要掌握和歸納好它們的一些共同的特性,哪怕將來轉向其他的語言都是輕而易舉,得心應手,達到融會貫通的效果。
3. 好的開發工具是你提高開發效率,提高編程興趣的前提,學習語言的過程中還應該研究怎麼利用開發工具有效地提高開發的效率。
4. 善於總結,在開發過程中我們可以總結出許許多多規律性的東西,這些規律一方面可以讓我們避免在以後的開發中犯同樣的錯誤,另一方面對我們掌握其他的規律都是有所幫助的,規律都是交叉在一起的。跟著規律走,實事求是。
5. 項目開發是最好的學習方法,這一點是我最有感觸的,軟體開發是實踐性很強的活動,但靠理論知識學起來比較吃力,而且枯燥無味,學習種理論學習和開發實踐的比例應該是1:2,而且是交叉進行。這樣才可以比較快的掌握一個知識點。
6. 團隊合作,現在的項目幾乎很少一個人去完成,頻繁的溝通和密切的配合是成功的必要條件。
Ⅳ 求完整C語言程序設計報告!!
C語言課程設計報告--學生成績管理系
C語言課程設計報告:
學生成績管理系統
系統需求
一、 當前學生信息:通過結構體struct student 來保存學生的姓名,學號,性別,語文,數學,英語和計算機等等相關信息,並且通過cin函數來進行給當前學生輸入初始信息.
二、學生成績查詢: 輸入一個學號, 在文件中查找此學生, 若找到則輸出此學生的全部信息和成績; 若找不到則輸出查找失敗的信息. 同時也可以全部把各科的平均成績,最高和最低分輸出。
三、新生插入 :通過給該生的學號來和原班上的學生的學號比較大小,若大就在後,若小則靠前排,將此生的信息保存下來。
四、輸出全部學生信息和全部學生成績。
五、退出系統.
六、附加說明:系統將來完善的功能有:可以通過性別來模糊查詢,也可以通過姓名的姓來先進行模糊查詢,以便後面精確查找。
總體設計
一、 仔細閱讀系統要求,首先將此系統化分為如下模塊(即如下函數)
1、輸入初始的學生信息:其中包括學生的姓名、學號和性別以及學生的語文、數學、英語和計算機等相關信息;可用函數cin(stu *p1)來實現此操作。
2、查詢模塊:可用stu *lookdata(stu *p1) 來實現。找到就輸出此學生全部信息包括學生的語文、數學、英語和計算機等的成績。
3、插入模塊:可用insert( )函數來實現。其中通過學號的大小來比較的,並且以此來排序。
4、輸出學生的信息以及成績:通過學生的姓名來查看學生的語文、數學、英語和計算機等相關成績,同時也可以分別通過caverage() 、 maverage() 、eaverage() 和comaverage() 來輸出語文、數學、英語和計算機等成績的平均分數、最高和最低分數。
5、退出系統:可用一個函數exit()來實現,首先將信息保存到文件中,釋放動態創建的內存空間,再退出此程序。
二、系統主模塊結構圖:
詳細設計
一、 界面設計
此系統界面採用圖形和數字化菜單設計。
主界面設計如下:
學生成績管理系統
請選擇相應的數字執行相應的功能:
1:是否輸入其他數據
2:查看數據
3:插入數據
4:查找數據
5:更新數據
6:保留數據
7:顯示或列印數據
8:語文成績狀況
9:數學成績狀況
10:英語成績狀況
11:計算機成績狀況
12:?
13:退出系統
二、 數據結構設計:
程序設計中用到的結構體類型:
學生信息結構體類型:
typedef struct student{
char name[MAX];
int num[MAX];
char sex[MAX];
int chinese;
int mathematic;
int english;
int computer;
struct student *next;
}
程序代碼:
//原始密碼是123456
#include"stdio.h"
#include"stddef.h"
#include"stddef.h"
#include"string.h"
#define MAX 10
typedef struct student{ /*定義結構體*/
char name[MAX]; /*姓名*/
int num[MAX]; /* 學號*/
char sex[MAX]; /*性別*/
int chinese; /*語文*/
int mathematic; /* 數學*/
int english; /*英語*/
int computer; /*計算機*/
struct student *next; /*結構體指針*/
}stu;
stu *head; /*頭指針*/
void print() /*顯示或列印函數*/
{
system("cls");
printf("\t\t\tScore Manage System\n"); /*成績管理系統*/
printf("<1>Enter Record\t"); /*輸入數據*/
printf("<2>Display\t"); /*顯示*/
printf("<3>Insert\t"); /*插入數據*/
printf("<4>Quest\t"); /*訪問數據*/
printf("<5>Update\t"); /*以前數據*/
printf("<6>Save\t"); /*保留數據*/
printf("<7>Fresh\t"); /*更新數據*/
printf("<8>Chinese Average\t"); /*語文平均成績*/
printf("<9>Math Average\t"); /*數學平均成績*/
printf("<10>English Average\t"); /*英語平均成績*/
printf("<11>Computer Average\t"); /*計算機平均成績*/
printf("<12>Quit\t\n"); /*退出*/
}
void cin(stu *p1) /*輸入相關數據的函數*/
{ printf("Enter name:\n");
scanf("%s",&p1->name);
printf("Enter num:\n");
scanf("%d",&p1->num);
printf("Enter sex:\n");
scanf("%s",&p1->sex);
printf("Enter score:\n");
printf("Enter chinese:\n");
scanf("%d",&p1->chinese);
printf("Enter math:\n");
scanf("%d",&p1->mathematic);
printf("Enter English:\n");
scanf("%d",&p1->english);
printf("Enter Computer:\n");
scanf("%d",&p1->computer);
}
stu *cindata() /*其他數據是否繼續輸入的函數*/
{ stu *p1,*p2;
int i=1;
char ch;
p1=(stu *)malloc(sizeof(stu));
head=p1;
while(i)
{
cin(p1);
printf("Do you Want to Continue?yes or no"); /*是否繼續輸入數據*/
ch=getchar();
ch=getchar();
if(ch=='n'||ch=='N')
{ i=0;
p1->next=NULL;
}
else
{ p2=p1;
p1=(stu *)malloc(sizeof(stu));
p2->next=p1;
}
}
return(p1->next);
}
stu *lookdata(stu *p1) /*查看數據的函數*/
{
while(p1!=NULL)
{ printf("Num:%d\t",p1->num);
printf("Name:%s\t",p1->name);
printf("Sex:%s\t",p1->sex);
printf("\n");
printf("Chinese:%d\t",p1->chinese);
printf("Math:%d\t",p1->mathematic);
printf("English:%d\t",p1->english);
printf("Computer:%d\t",p1->computer);
printf("\n");
p1=p1->next;
}
return p1;
}
void insert() /*通過比較學號來插入數據的函數*/
{ stu *p1,*p3,*p2;
char ch;
p1=head;
p3=(stu *)malloc(sizeof(stu));
p3->next=NULL;
if(head==NULL){ head=p3; return;}
cin(p3);
while(p1!=NULL&&(p1->num<p3->num)) /*通過學號的比較來插入*/
{ p2=p1;p1=p1->next;}
if(p2==head) {p3->next=head; head=p3; return;}
p3->next=p1;
p2->next=p3;
}
find(stu *p2) /*通過姓名查找查看數據的函數*/
{ char name[20];
int b=0;
printf("Enter the name of the student you want to find:"); /*通過姓名查看*/
scanf("%s",name);
while(p2!=NULL)
{if(strcmp(name,p2->name)==0)
{
printf("The data you want has be found\n");
printf(" Name:%s\t",p2->name);
printf("Num:%d\t",p2->num);
printf("sex%s\t",p2->sex);
printf("\n");
printf("Chinese:%d\t",p2->chinese);
printf("Math:%d\t",p2->mathematic);
printf("English:%d\t",p2->english);
printf("Computer:%d\t",p2->computer);
printf("\n");
b=1;
}
else if(b==0)
printf("sorry not find data!");
p2=p2->next;
}
if(b==1)
{
print();
printf("Find one\n");}
else
{print();
printf("Not find\n");
}
}
void caverage() /*求各學生語文平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->chinese;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->chinese)
max=p1->chinese;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->chinese)
min=p1->chinese;
}
printf("Chinese Average:%f",aver);
printf("Chinese Max:%f",max);
printf("Chinese Min:%f",min);
}
void maverage() /*求各學生數學平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->mathematic;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->mathematic)
max=p1->mathematic;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->mathematic)
min=p1->mathematic;
}
printf("Mathe Average:%f",aver);
printf("Mathe Max:%f",max);
printf("Mathe Min:%f",min);
}
void eaverage() /*求各學生英語平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->english;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->english)
max=p1->english;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->english)
min=p1->english;
}
printf("English Average:%f",aver);
printf("English Max:%f",max);
printf("English Min:%f",min);
}
void comaverage() /*求各學生計算機平均分、最高和最低分成績的函數*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf("not data!");
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->computer;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->computer)
max=p1->computer;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->computer)
min=p1->computer;
}
printf("Computer Average:%f",aver);
printf("Computer Max:%f",max);
printf("Computer Min:%f",min);
}
update(stu *p2) /*通過姓名查找來更新數據*/
{
char name[10]; /*p2為指向結構體struct student的指針*/
int b=0;
printf("Enter The Name"); /*輸入姓名*/
scanf("%s",name);
while(p2!=NULL)
{if(strcmp(name,p2->name)==0)
{
printf("Find you data\n");
scanf("Name:%s",p2->name);
scanf("Num:%s",p2->num);
scanf("Sex:%s",p2->sex);
scanf("Chinese:%d",p2->chinese);
scanf("Math:%d",p2->mathematic);
scanf("english:%d",p2->english);
scanf("Computer:%d",p2->computer);
printf("Success!");
b=1;}
else if(b==0)
printf("Sorry not Find data!");
p2=p2->next;}
if(b==0)
{print();
printf("Sorry not Find data!");
}
else
{
print();
printf("Finish!");
}
}
save(stu *p2) /*保留數據函數*/
{
FILE *fp;
char file[10];
printf("Enter file name"); /*輸入文件名*/
scanf("%s",file);
fp=fopen(file,"w");
while(p2!=NULL)
{
fprintf(fp,"%s",p2->name);
fprintf(fp,"%s",p2->num);
fprintf(fp,"%s",p2->sex);
fprintf(fp,"%d",p2->chinese);
fprintf(fp,"%d",p2->mathematic);
fprintf(fp,"%d",p2->english);
fprintf(fp,"%d",p2->computer);
p2=p2->next;
}
fclose(fp);
}
char password[7]="123456"; /*定義初始密碼*/
void main() /*主函數*/
{ int choice;
stu *p2;
char s[8];
int flag=0,i; /*標志項*/
int n=3;
do{ printf("Enter password:\n");
scanf("%s",s);
if(!strcmp(s,password)) /*進行密碼匹配驗證*/
{ printf("PASS\n\n\n");
flag=1;
break;
}
else{
printf("Error Enter again:\n");
n--;
}
}
while(n>0);
if(!flag)
{printf("you have Enter 3 times!"); /*輸入密碼超過了3次!!*/
exit(0); /*自動退出*/
}
/*密碼驗證成功後進入的界面*/
printf("~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n"); /*操作界面*/
printf("\t\tWelcom to the Mis\n");
printf("Author:-----\tClass:------\tNum:------\n"); /*作者,班級和號碼*/
printf("Adress:HG\n"); /*地址*/
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("\t\tEnter OP:\n");
printf("\n\n\n\n");
printf("==============\t\t==============\n");
printf("==============\t\t==============\n");
printf("\t\tEnter the MIS yes or no\n"); /*問進入系統與否*/
scanf("%d",&choice);
if(choice=='n'||choice=='N')
exit(1);
print();
while(1)
{
printf("Enter choice:");
scanf("%d",&i);
if(i<1||i>13)
{
printf("Enter num from 1 to 13:\n"); /*再從1-13中進行選擇*/
exit(1);
}
switch(i)
{ case 1:
p2=cindata(); /*其他數據是否繼續輸入的函數*/
break;
case 2:
p2=lookdata(head); /*查看數據的函數*/
break;
case 3:
insert(); /*通過比較學號來插入數據的函數*/
break;
case 4:
find(head); /*通過姓名查找查看數據的函數*/
break;
case 5:
update(head); /*通過姓名查找來更新數據*/
break;
case 6:
save(head); /*保留數據函數*/
break;
case 7:
print(); /*顯示或列印函數*/
break;
case 8:
caverage(); /*求各學生語文平均分、最高和最低分成績的函數*/
break;
case 9:
maverage(); /*求各學生數學平均分、最高和最低分成績的函數*/
break;
case 10:
eaverage(); /*求各學生英語平均分、最高和最低分成績的函數*/
break;
case 11:
comaverage(); /*求各學生計算機平均分、最高和最低分成績的函數*/
break;
case 12:
; /*空操作*/
case 13:
exit(1); /*退出*/
break;
}
scanf("%d",&i);
}
}
程序中出現的問題及解決方法
問題一、學生初始信息模塊:
其中包括學生的姓名、學號和性別以及學生的語文、數學、英語和計算機等相關信息;可用函數cin(stu *p1)來實現此操作。當正確輸入存在的學生學號,系統進行判斷時,提示不存在此學生。
解決辦法及步驟:
1、一個個輸出所有的學生的學號,檢查文件中是否有此學生,發現有。
2、既然有此學生,那麼檢查循環判斷是否有此學生的語句發現沒有錯
3、輸出用於循環檢查語句中的學生信息,發現亂碼
4、仔細分析亂碼的原因,最後發現是變數的類型錯誤,錯將學生類型的結構體指針變數定義為了其他類型的指針變數。
問題二、查詢模塊:
可用stu *lookdata(stu *p1) 來實現。找到就輸出此學生全部信息包括學生的語文、數學、英語和計算機等的成績。當正確輸入查找信息時,系統卻不能夠得到所要查找的學生信息以及學生的語文、數學、英語和計算機的成績。
解決辦法及步驟:
1、檢查所編寫的程序代碼是否完全正確,若不是,則改之,然後再繼續正確輸入查找信息看能否得到所要查找的學生信息以及學生的語文、數學、英語和計算機的成績。
2、檢查當我們在輸入查找信息時,看是否我們輸入的信息有誤,若是這樣的話,我們應當仔細輸入查找信息。
問題三、插入模塊:
可用insert( )函數來實現。其中通過學號的大小來比較的,並且以此來排序。當我們輸入插入信息時,系統卻提示插入不進數據。
解決辦法及步驟:
1、檢查所編寫的程序代碼是否完全正確,若不是,則改之,然後再繼續正確輸入插入信息看能否插入進去得到所要插入的學生信息以及學生的語文、數學、英語和計算機的成績。
2、檢查當我們在輸入插入信息時,看是否我們輸入的插入信息有
Ⅳ C語言課程設計報告要求
一 、 設計題目
萬年歷的設計
二 、設計要求
1、能夠顯示星期;
2、能夠顯示年月日;
3、能夠修改;
4、當系統時間變動時,能自動跳到相應的時間。
三 、 設計目的
1. 通過本項課程設計,可以培養獨立思考、 綜合運用所學有關相應知識的能力,能更好的鞏固《C語言程序設計》課程學習的內容,掌握 工程軟體設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關!更加了解了c語言的好處和其可用性!同時增加了同學之間的團隊合作精神!更加也體會到以後在工作中團隊合作的重要性和必要性!
2. 通過C語言課程設計,使學生了解高級程序設計語言的結構,掌握基本的程序設計過程和技巧,掌握基本的分析問題和利用計算機求解問題的能力,具備初步的高級語言程序設計能力。為後續各門計算機課程的學習和畢業設計打下堅實基礎。
四 、設計思想及過程
【一】由於萬年歷具有以下特點:
1。平年365天(52周+1天),閏年366天(52周+2天)。平年2月28天,閏年2月29天。
由於公元1月1日設為星期六,故3月1日為星期三。 ——注意這個「三」
為使演算法達到最簡,故本演算法以「星期」為計算單位。且選3月1日為基月。
2。每400年整一閏,或每4年且不為百年的一閏。(原因:地球繞太陽一周的時間是365天5小時46秒,為了使一年的天數為整數,將一年的天數定為365天,餘下的時間積累起來,四年就是23小時15分4秒,將近一天,把這一天加在某年的二月而成29天,該年稱為閏年,其它年稱為平年。但四年加一天又多用了44分56秒,這個數積滿400年為三天。因此400年中只能有97個閏年,所以凡能被400整除,或不能被100整除但能被4整除的年份為閏年。)
所以百年%4=0閏或(年%4=0並且年<>0)閏。
3。每 4年(3個平年+1個閏年)共208周+5天 ——注意這個「5天」
每百年共100*(208周+5天)-1天=5217周+5天 ——注意這個「5天」(整百年暫設為平年)
每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天——注意這個「0天」和
「1天」(4個整百年只有一個閏年)
即400年一輪回!(原來萬年歷400年前是一家)
【二】根據萬年歷以上特點進行編寫:
首先對萬年歷年、月、日進行編寫,編寫程序先定義每月的天數為28天,如月份為1、3、5、7、8、10、12就定義天數為31天反之如果月份為4、6、9、11就輸出天數為30天,由上可見2月份為28天但是如果為閏年就有29天就要定義另一個函數#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0當為閏年時可得1加上該程序便可得到每月的天數。 具體程序見(五、萬年歷程序)
再對其中的星期進行編寫:由於公元1月1日設為星期六,故3月1日為星期三,可以用萬年3月1日星期演算法(特別是那個三)
由於其公式為:
某年3月1日星期幾=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
某年3月1日星期幾=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
或 某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
閏4百年3月1日星期演算法(百年%4=0)
其公式為:
某年3月1日星期幾=(年+年/4+月星期表+日+2天)%7
例:0000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
1600年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
2000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
2001年3月1日星期幾=(1+1/4+0+1+2)%7=4%7=星期四
2004年3月1日星期幾=(4+4/4+0+1+2)%7=8%7=星期一
2008年3月1日星期幾=(8+8/4+0+1+2)%7=13%7=星期六
2042年3月1日星期幾=(42+42/4+0+1+2)%7=55%7=星期六
平4百年3月1日星期演算法(百年%4<>0)
其公式為:
某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
例:1700年3月1日星期幾=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)
1800年3月1日星期幾=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)
1900年3月1日星期幾=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)
1901年3月1日星期幾=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
1918年3月1日星期幾=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
1958年3月1日星期幾=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
1988年3月1日星期幾=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
1999年3月1日星期幾=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
2100年3月1日星期幾=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)
2101年3月1日星期幾=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
2102年3月1日星期幾=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
2103年3月1日星期幾=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
2104年3月1日星期幾=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是閏年)
9999年3月1日星期幾=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
註:按400年一輪回!(400年前是一家)的說法
1600年,2000年是一樣的;
1700年,2100年是一樣的;
1800年,2200年是一樣的;
1900年,2300年是一樣的。
其中萬年某日星期演算法
其公式為:
某日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
通同星期偏差表
閏年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天數 31 29 31 30 31 30 31 31 30 31 30 31
星期 3 6 0 3 5 1 3 6 2 4 0 2
平年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天數 31 28 31 30 31 30 31 31 30 31 30 31
星期 4 0 0 3 5 1 3 6 2 4 0 2
為對以上的萬年歷星期的演算法是正確的對其進行了以下的計算:
⒈對於二十世紀任意日期可以用公式某日星期幾=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根據上面對其進行的計算:
1900年元旦 1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
1月表=4(平年) 故 4+4=1 即1900年元旦是星期一
1949年國慶 1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
10月表=4(平年) 故 4+2=6 即1949年國慶是星期六
1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
12月表=2(平年) 故 2+3=5 即1999年12月31日是星期五
⒉對於二十一世紀新前年蟲演算法(20%4*5=0)可以用公式:某日星期幾=(百年%4*5天+年+年/4+閏年月星期表+日+2天)%7 =(20%4*5天+年+年/4+閏年月星期表+日+2天)%7以下就是根據上面對其進行的計算:
2000年元旦 1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
1月表=3(閏年) 故 3+3->6 即2027年元旦是星期六
2018年春節 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
2月表=0(平年) 故 0+5=5 即2018年春節是星期五
2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
12月表=2(平年) 故 2+2=4 即2099年12月31日是星期四
對於上面的分析以及公式的推論和計算證明可以對萬年歷中的星期進行了編寫具體編寫程序見(五 、萬年歷程序)中。
五 、萬年歷源程序
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#include"stdlib.h"
#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0 /*判斷閏年*/
int numofMonth(int y,int m){
int day,t=28;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
day=31; /*定義以上月份為31天*/
else if(m==4||m==6||m==9||m==11)
day=30; /*定義以上月份為30天*/
else{t+=Year(y);
day=t;} /*閏年二月29天,平年28天*/
return day;}
int numofYear(int y){
int t=365; /*平年365天*/
t+=Year(y);/*閏年366天*/
return t;}
int numofbeforeDays(int y,int m,int d){
int sum=d,i;
for(i=1;i<m;i++)
sum+=numofMonth(y,i);
return sum;}
int numofafterDays(int y,int m,int d){
int sum=0,i;
for(i=m;i<=12;i++)
sum+=numofMonth(y,i);
sum-=d;
return sum;}
int isDay(int y,int m,int d){
int year=1900,month=1,week=1,i; /*定義萬年歷是從1900年開始*/
long sum=0;
for(i=year;i<y;i++)
sum+=numofYear(i);
for(i=1;i<m;i++)
sum+=numofMonth(y,i);
/* ++sum;*/
i=sum%7;
week=(week+i)%7;
return week;}
void empty(int n){
int i;
for(i=0;i<n;i++)
printf("%*c",6,' ');}
void OutPutCalender(int y,int m,int d)/*計算x年x月x是星期幾*/{
int week,i,num,t;
week=isDay(y,m,1);
printf("%6d/%02d/%02d\n",y,m,d);
printf("%6s%6s%6s%6s%6s%6s%6s\n","Sun","Mon","Tue","Wed","Thu","Fri","Sat");
empty(week);
num=numofMonth(y,m);
for(i=1;i<=num;i++){
printf("%6d",i);
t=(week+i)%7;
if(t==0)
printf("\n");} /*游標移到下一行*/
printf("\n");}
long numBTDays(int y1,int m1,int d1,int y2,int m2,int d2)/*定義兩個不同日期*/{
int i;
long sum=0;
for(i=y1+1;i<y2;i++)
sum+=numofYear(i);
if(y1==y2){ sum-=d1;
for(i=m1;i<m2;i++)
sum+=numofMonth(y1,i);
sum+=d2;}
else{sum+=numofafterDays(y1,m1,d1);
sum+=numofbeforeDays(y2,m2,d2);}
return sum;}
int Select_mean(){
int sm;
printf("1. OutPut Calender\n"); /*輸出當前月份的日歷*/
printf("2. Help\n"); /*幫助*/
printf("0. Quit\n"); /*退出*/
printf("Please enter choose(0--2):"); /*從0-2中選擇*/
do
scanf("%d",&sm); /*輸入sm*/
while(sm<0||sm>3);
return sm;}
void Help()/*輸出幫助欄的內容*/{
printf(" 1. OutPut Calender\n");
printf(" 2. System Help\n");
printf(" 0. Quit\n");
printf("Page Up: Up year\n"); /*上一年*/
printf("Page Down: next year\n"); /*下一年*/
printf(" --> : next month\n"); /*上一月*/
printf(" <-- : Up month\n");/*下一月*/}
main(){
int year=2006,year1=2006,month,day,y1,m1,d1,y2,m2,d2,c,t; /*定義運行後的日期是2006年*/
int inkeySCAN,inkey; /*輸入鍵盤操作信息*/
union REGS inregs,outregs;
inregs.h.ah=0x2a;
intdos(&inregs,&outregs);
/* year=outregs.xcx; */
month=outregs.h.dh;
day=outregs.h.dl;
year1=year;
printf("%d/%02d/%02d\n",year,month,day);
while(1)/*當選擇為1時,執行以下語句*/{
switch(Select_mean()){
case 1:
OutPutCalender(year,month,day);
while(1){
inkey=bioskey(0);
inkeySCAN=(inkey&0xFF00)>>8;
if(inkeySCAN==77){
if(month==12){month=1;year1++;
OutPutCalender(year1,month,day);/*輸出日歷*/}
else{month++;
OutPutCalender(year1,month,day);
}}
if(inkeySCAN==75){
if(month==1){month=12;year1--;
OutPutCalender(year1,month,day);}
else{month--;OutPutCalender(year1,month,day);}}
if(inkeySCAN==73){
if(year1==1900) year1=year;
else{year1--;OutPutCalender(year1,month,day);}}
if(inkeySCAN==81){
year1++;OutPutCalender(year1,month,day);}
if(inkeySCAN==28)break;}
break; /*終止循環*/
case 2:
Help();
break;
case 0:
exit(0);
default:
printf("Enter ERROR!\n");
break;} }
}
六 運行過程
1.雙擊TC
1. 當對上面的程序進行了調試後運行會出現下面所示:
第一行所顯示的就是系統時間!滿足了第一條要求「顯示年、月、日」。
而當改變系統時間後!再運行該程序上面的日期也隨系統時間改變,所以滿足第四條「當系統時間變動時,能自動跳到相應的時間。」
2. 在游標處按下「1」後回車,將會顯示:
以上的顯示也證明了條件的第2條可以「顯示星期!」
3. 在游標處按下「2」後回車,將會顯示:
按著幫助所講進行了運行可知:按「 Page Up 」鍵其下面接著會顯示上一年該月的萬年歷,按「 Page Down 」鍵其下面會接著顯示下一年該月的萬年歷;按「 ← 」鍵下面將會接著顯示當年上一個月的萬年歷,按「 → 」鍵將會接著在下面顯示去下一個月的萬年歷。
4.
由上所顯示鍵入「0」後將會退去該程序。
由以上運行的結果可知該c語言所設計的萬年歷滿足設計要求!
七、在C語言編程中常見錯誤
C語言的最大特點是:功能強、使用方便靈活。C編譯的程序對語法檢查並不象其它高級語言那麼嚴格,這就給我們留下「靈活的餘地」,但還是由於這個靈活給程序的調試帶來了許多不便,尤其對我們這些初學C語言的人來說,經常會出一些連自己都不知道錯在哪裡的錯誤。看著有錯的程序,不知該如何改起,我通過這次編程,也積累了一些C編程時常犯的錯誤:
1. 書寫標識符時,忽略了大小寫字母的區別。
編譯程序把a和A認為是兩個不同的變數名,而顯示出錯信息。C語言認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常量名用大寫,變數名用小寫表示,以增加可讀性。
2.忽略了變數的類型,進行了不合法的運算。
%是求余運算,得到a/b的整余數。整型變數a和b可以進行求余運算,而實型變數則不允許進行「求余」運算。
3.將字元常量與字元串常量混淆。
混淆了字元常量與字元串常量,字元常量是由一對單引號括起來的單個字元,字元串常量是一對雙引號括起來的字元序列。C規定以「\」作字元串結束標志,它是由系統自動加上的,所以字元串「a」實際上包含兩個字元:『a'和『\',而把它賦給一個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在C語言中,「=」是賦值運算符,「==」是關系運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1 b=2
編譯時,編譯程序在「a=1」後面沒發現分號,就把下一行「b=2」也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf("%f",t);
}
對於復合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個復合語句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
復合語句的花括弧後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。
7.輸入變數時忘記加地址運算符「&」。
int a,b;
scanf("%d%d",a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。「&a」指a在內存中的地址。
8.輸入數據的方式與要求不符。scanf("%d%d",&a,&b);輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
scanf("%d,%d",&a,&b);C規定:如果在「格式控制」字元串中除了格式說明以外還有其它字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字元是不對的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4
9.輸入字元的格式與要求不一致。
在用「%c」格式輸入字元時,「空格字元」和「轉義字元」都作為有效字元輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c
字元「a」送給c1,字元「 」送給c2,字元「b」送給c3,因為%c只要求讀入一個字元,後面不需要用空格作為兩個字元的間隔。
10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf("%f%d\n",a,b);
語法錯
邏輯錯 運行錯
0.忘記定義變數:
main()
{x=3;y=6;
printf(「%d\n」,x+y);
11.C語言的變數一定要先定義才能使用;
12.輸入輸出的數據的類型與所用格式說明符不一致
int a=3;float b=4.5;printf(「%f%d\n」,a,b);
它們並不是按照賦值的規則進行轉換(如把4.5轉換為4),而是將數據在存儲單元中的形式按格式符的要求組織輸出(如b佔4個位元組,只把最後兩個位元組的數據按%d,作為整數輸出)
13.未注意int型數據的數值范圍
int型數據的數值范圍(-32768~32768)
int num=89101;
printf(「%d」,num);
會將超過低16位的數截去從而得到23563
注意:定義了long型,而在輸出時仍用」%d」說明符,仍會出現以上錯誤
14.輸入變數時忘記使用地址符
scanf(「%d%d」,a,b);
15.輸入時數據的組織與要求不符
對scanf函數中格式字元串中除了格式說明符外,對其他字元必須按原樣輸入
16.誤把」=「作為」等於」比較符
「=「為附值運算符
「==「為比較運算符
17.語句後面漏分號
{
t=a;
a=b;
b=t
}
它是pascal的語法
18.不該加分號的地方加了分號
if(a>b);
printf(「a is larger than b\n」);
for(i=0;i<10;i++);
{
scanf(「%d」,&x);
printf(「%d\n」,x*x);
}
19.對應該有花括弧的復合語句,忘記加花括弧
sum=0;
i=1;
while(i<=100)
sum=sum+1;
i++;
20.括弧不配對
while((c=getchar()!=『#』)
putchar(c);
11.在用標識時,忘記了大寫字母和小寫字母的區別
{
int a,b,c;
a=2;
b=3;
C=A+B;
printf(「%d+%d=%D」,A,B,C);
}
12.引用數組元素時誤用發圓括弧
{
int i,a(10);
for(i=0;i<10;i++)
scanf(「%d」,&a(i));
}
13.在定義數組時,將定義的」元素個數」誤認為是」可使用的最大下標值
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for(i=1;i<=10;i++)
printf(「%d」,a[i]);
}
14.對二維或多維數組的定義和引用的方法不對
{
int a[5,4];
…
printf(「%d」,a[1+2,2+2]);
…
}
15.誤以為數組名代表數組中全部元素
{int a[4]={1,2,3,4};
printf(「%d%d%d%d」,a);
}
16.混淆字元數組與字元指針的區別
main()
{
char str[40];
str=「Computer and c」;
printf(「%s\n」,str);
}
17.在引用指針變數之前沒有對它賦予確定的值
{
char *p;
scanf(「%s」,p);
}
{
char *p,c[20];
p=c;
scanf(「%s」,p);
}
18.switch語句的各分支中漏寫 break語句
混淆字元和字元串的表示形式
…
char sex;
sex=「M」;
…
19.使用自加(++)和自減(--)運算符時出的錯誤
{
int *p,a[5]={1,3,5,7,9};
p=a;
printf(「%d」,*p++);
}
注意於*(++p)的區別;
20.所調用的函數在調用語句之後才定義,而又在調用前未加說明
main()
{float x,y,z;
x=3.5;y=-7.6;
z=max(x,y);
printf(「%f」,z);
}
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。
八、心得體會
1. 目前流行的計算機日歷程序,比較典型的是Windows各版本中的日歷程序以及基礎於該程序所開發的各種應用程序中的日歷程序。然而,這些程序都千篇一律的局限在一個很短的時間范圍內。(Windows各個版本一般都局限在1980年至2099年這一范圍內),但是,在很多情況下,特別是在眾多的科學研究領域中,一個時間跨度較大的日歷程序是很有參考價值的。C程序設計語言充分發揮了其自身無與倫比的優越性,用極短的程序文本填補了這一領域的空白,同時用鐵的事實強有力的告訴世人:C程序設計語言作為計算機語言家族的新生事物,其發展前景是極為廣闊的。
2. 經過上一個學期對《C程序設計》的學習,我們學習了理論知識,了解了C語言程序設計的思想,這些知識都為我們的下一步學習打下了堅實的基礎。通過課程設計,一方面是為了檢查我們一個學期來我們學習的成果,另一方面也是為了讓我們進一步的掌握和運用它,同時也讓我們認清自己的不足之處和薄弱環節,加以彌補和加強。
3. 通過對c語言萬年歷的設計進一步的鞏固了用c語言編寫程序,並且有利於更好的掌握c語言!
4. 在萬年歷的編寫過程中也體會到了做事情一頂要細心、認真。更加知道了要掌握好基礎知識。還有體會到了成功的感覺!在萬年歷的設計過程中更加體會到了團隊合作的重要性,「一個諸葛亮比不上三個臭皮匠。」知道了只有團隊合作才會更好的完成設計!也體會到以後在工作中團隊合作的必要性和重要性!
5. 通過本項課程設計也培養了我獨立思考、 綜合運用所學有關相應知識的能力,掌握 工程軟體設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關!
6. 由於C語言是近年在國內外得到迅速推廣應用的一種語言。C語言功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高,可移植性好,既具有高級語言的優點,又具有低級語言的許多特點。通過這次的c語言程序設計更加了解了c語言的好處和其可用性!
7. 在這次課程設計中也知道了自己的動手能力不強有待進一部的提高!在設計過程中不能夠把書本上的知識與實踐相結合,這也就增加了設計不好該程序的想法!在設計過程中的一次次設計錯誤增加了我放棄的想法!不過經過大家的努力終於完成了課程設計!完成該程序後想起自己以前的每一次對自己失去信心,就覺得並不是在知識掌握上打敗了,而是自己對自己缺乏信心!只要自己對自己不失去信心相信就可以完成那些以前認為完成不了的事情!也讓我懂得了要想成功首先就必須有很強的自信心!懂得了自己以後要在做任何事情時都要自信!當自己都不相信自己能夠成功時還可能會獲得成功嗎?
8. 在C語言程序設計的過程中也知道了自己在以前的學習中有很大的不足導致在設計過程中出現了很多的問題,有些地方看不懂也不知道怎麼去設計,但是在設計過程中也學習了很多,掌握了自己以前沒有學好的知識,雖然一時可以掌握完以前沒有學好的知識,不過也給自己敲響了警鍾,在學習中不可以伏於表面,要想學好每一門課程都要踏踏實實,做什麼都不是給別人看的!都是要更好的掌握該門知識,提高自己的自身的修養,提高自己的能力!為以後的工作打下良好的知識基礎和技能基礎!
九、參考文獻
⒈譚浩強編著.C程序設計第二版〔M〕.北京:清華大學出版社,1999
⒉陳朔鷹,陳英編著.C語言趣味程序百例精解〔M〕.北京:北京理工大學出版社,1994
⒊電腦知識與技術學術交流版〔J〕2005.2 (備註:來自網路資源)
⒋Herbert Schildit著. 戴健鵬譯. C語言大全 (第二版)〔M〕.北京:電子工業出版社,1994
⒌譚浩強,張基溫,唐永炎編著. C語言程序設計教程.〔M〕北京: 高等教育出版社,1992
⒍秦友淑,曹化工編著. C語言程序設計教程. 〔M〕武漢:華中理工大學出版社,1996
⒎曹衍龍,林瑞仲,徐慧 編著.C語言實例解析精粹 〔M〕北京:人民郵電出版社,2005.3
⒏黃明等編著.21世紀進階輔導C語言程序設計. 〔M〕大連理工大學出版
Ⅵ c語言課程設計報告模板
課程設計報告內容
報告應包括以下內容:
摘要(300~400字)
目錄
1. 概述
2. 課程設計任務及要求
2.1 設計任務
2.2 設計要求
3. 理論設計
3.1方案論證
3.2 系統設計
3.2.1 結構框圖及說明
3.2.2 系統原理圖及工作原理
3.3 單元電路設計
3.3.1單元電路工作原理
3.3.2元件參數選擇
4. 系統設計
4.1 軟體設計
4.2 編程過程
4.2 編程結果
5. 安裝調試
5.2 安裝調試過程
5.3 故障分析
6. 結論
7. 使用儀器設備清單
8. 收獲、體會和建議
9. 參考文獻
Ⅶ 關於為什麼要學習c語言的可行性報告
很多人對學習C語言感到無從下手,經常問我同一個問題:究竟怎樣學習C語言?我是一個教師,已經開發了很多年的程序,和很多剛剛起步的人一樣,學習的第一個計算機語言就是C語言。經過這些年的開發,我深深的體會到C語言對於一個程序設計人員多麼的重要,如果不懂C語言,你想寫底層程序這幾乎聽起來很可笑,不懂C語言,你想寫出優秀高效的程序,這簡直就是天方夜譚。為什麼C語言如此重要呢? 第一:C語言語法結構很簡潔精妙,寫出的程序也很高效,很便於描述演算法,大多數的程序員願意使用C語言去描述演算法本身,所以,如果你想在程序設計方面有所建樹,就必須去學它。 第二:C語言能夠讓你深入系統底層,你知道的操作系統,哪一個不是C語言寫的?所有的windows,Unix,Linux,Mac,os/2,沒有一個里外的,如果你不懂C語言,怎麼可能深入到這些操作系統當中去呢?更不要說你去寫它們的內核程序了。 第三:很多新型的語言都是衍生自C語言,C++,Java,C#,J#,perl...哪個不是呢?掌握了C語言,可以說你就掌握了很多門語言,經過簡單的學習,你就可以用這些新型的語言去開發了,這個再一次驗證了C語言是程序設計的重要基礎。還有啊,多說一點:即使現在招聘程序員,考試都是考C語言,你想加入it行業,那麼就一定要掌握好C語言。 那麼究竟怎樣學習C語言呢? 1:工欲善其事,必先利其器 這里介紹幾個學習C語言必備的東東: 一個開發環境,例如turbo C 2.0,這個曾經占據了DOS時代開發程序的大半個江山。但是現在windows時代,用turbo C有感覺不方面,編輯程序起來很吃力,並且拖放,更沒有函數變數自動感應功能,查詢參考資料也不方便。建議使用Visual C++,這個東西雖然比較大塊頭,但是一旦安裝好了,用起來很方便。 一本學習教程,現在C語言教材多如牛毛,但推薦大家使用《C語言程序設計》譚浩強主編 第二版 清華大學出版社,此書編寫的很適合初學者,並且內容也很精到。除此以外,現在有很多輔助學習的軟體,畢竟現在是Window時代了,學習軟體多如牛毛,不象我們當初學習,只有讀書做題這么老套。我向大家推薦一個「集成學習環境(C語言)」,里邊的知識點總結和常式講解都非常好,還有題庫測試環境,據說有好幾千題,甚至還有一個windows下的trubo C,初學者甚至不用裝其它的編譯器,就可以練習編程了,非常適合初學者。還有一個「C語言學習系統」軟體,不過感覺只是一個題庫系統,如果你覺得題做的不夠,不妨也可以試試。 2:葵花寶典 學習計算機語言最好的方法是什麼?答曰:讀程序。 沒錯,讀程序是學習C語言入門最快,也是最好的方法。如同我,現在學習新的J#,C#等其他語言,不再是抱著書本逐行啃,而是學習它們的常式。當然,對於沒有學過任何計算機語言的初學者,最好還是先閱讀教程,學習完每一章,都要認真體會這一章的所有概念,然後不放過這一章中提到的所有常式,然後仔細研讀程序,直到每一行都理解了,然後找幾個編程題目,最好是和常式類似的或一樣的,自己試圖寫出這段已經讀懂的程序,不要以為常式你已經讀懂了,你就可以寫出和它一樣的程序,絕對不一定,不相信你就試一試吧,如果寫不出來,也不要著急,回過頭來再繼續研究常式,想想自己為什麼寫不出來,然後再去寫這段程序,反反復復,直到你手到擒來為止,祝賀你,你快入門了。 3:登峰造極 寫程序的最高境界其實就是掌握各種解決問題的手段(數據結構)和解決問題的方法(演算法)。 是不是寫出底層程序就是程序設計高手呢?非也,寫底層程序,無非是掌握了硬體的結構,況且硬體和硬體還不一樣,要給一個晶元寫驅動程序,無非就是掌握這塊晶元的各種寄存器及其組合,然後寫值讀值,僅此而已。這不過是熟悉一些io函數罷了。那麼怎樣才算精通程序設計呢?怎樣才能精通程序設計呢?舉個例子:你面前有10個人,找出一個叫「張三」的人,你該怎麼辦?第一種方法:直接對這10個人問:「誰叫張三」。第2種方法:你挨個去問「你是不是張三?」,直到問到的這個人就是張三。第三種方法:你去挨個問一個人「你認不認識張三,指給我看」。不要小看這個問題,你說當然會選第一種方法,沒錯恭喜你答對了,因為這個方法最快,效率最高,但是在程序設計中找到解決問題的最優方法和你用的手段卻是考驗一個程序員程序設計水平的重要標志,而且是不容易達到的。剛才這個問題類似於數據結構和演算法中的:Map數據結構,窮舉查找和折半查找。所以掌握好數據結構和一些常用演算法,是登峰造極的必然之路。最後給大家推薦嚴尉敏的《數據結構》清華大學出版社,希望每一個想成為程序設計高手的人研讀此書。
Ⅷ c語言程序設計實驗報告
五、 課程設計小結心得體會
1設計思想
1)、設定一個一維數組,可先按員工序號設定每位員工的工資
2)、利用While語句和Prinft語句完成用戶菜單的設計
功能為:第1項 設為員工編號和工資數據
第2項 設為修改員工工資數據
第3項 設為查詢員工工資數據
第4項 設為結束系統
3)、當用戶選擇1、2項時,需輸入員工編號,所以需要設計編號校正功能,如果出錯可輸出「The error employe number」
4)、當選擇2時,進行工資數據的修改,並將新數據存回該員工的工資數組中
5)、利用for循環中判斷語句,將用戶工資數與數組中的工資數進行比較,如相同則輸出,將計數器加1,如此下去,直到把整個數組遍歷一遍
6)、判斷計數器是否為0, 是0表示找不到相符的工資,如果不為0,則輸出共查出幾比相符的工資
以上當然裡面也涉及了「函數的模塊化」理念,可以避免但需要重復列印頭文件時重復編寫列印信頭的語句。像這樣的程序是多見的,這樣不但降低了程序還發效率,而且耗時浪費資源「共用體」的使用簡化了程序的「復雜」性,正如(4)中,學號與姓名同時表示一個人,但在函數使用了「共用體」,從而程序的簡單可以便於糾錯,查找問題,避免了代碼的重復,這樣就給編譯時帶來了一定的難度與「量」的繁雜。一般不採取這樣的做法,力求「簡單、明了、清晰」。
Ⅸ c語言實驗報告心得
c語言實驗心得:
1、只有頻繁用到或對運算速度要求很高的變數才放到data區內,如for循環中的計數值。
2、其他不頻繁調用到和對運算速度要求不高的變數都放到xdata區。
3、常量放到code區,如字型檔、修正系數。
4、邏輯標志變數可以定義到bdata中。
在51系列晶元中有16個位元組位定址區bdata,其中可以定義8*16=128個邏輯變數。這樣可以大大降低內存佔用空間。定義方法是: bdata bit LedState;但位類型不能用在數組和結構體中。
5、data區內最好放局部變數。
因為局部變數的空間是可以覆蓋的(某個函數的局部變數空間在退出該函數是就釋放,由別的函數的局部變數覆蓋),可以提高內存利用率。當然靜態局部變數除外,其內存使用方式與全局變數相同;
6、確保程序中沒有未調用的函數。
在Keil C里遇到未調用函數,編譯器就將其認為可能是中斷函數。函數里用的局部變數的空間是不釋放,也就是同全局變數一樣處理。這一點Keil做得很愚蠢,但也沒辦法。
7、如果想節省data空間就必須用large模式。
將未定義內存位置的變數全放到xdata區。當然最好對所有變數都要指定內存類型。
8、使用指針時,要指定指針指向的內存類型。
在C51中未定義指向內存類型的通用指針佔用3個位元組;而指定指向data區的指針只佔1個位元組;指定指向xdata區的指針佔2個位元組。如指針p是指向data區,則應定義為: char data *p;。還可指定指針本身的存放內存類型,如:char data * xdata p;。其含義是指針p指向data區變數,而其本身存放在xdata區。
以前沒搞過C51,大學時代跟單片機老師的時候也是搗鼓下匯編,現在重新搞單片機,因為手頭資料不多,找到一些C51的程序,發現裡面有這些關鍵字,不甚明了,沒辦法只好找了下,發現如下描述:
從數據存儲類型來說,8051系列有片內、片外程序存儲器,片內、片外數據存儲器,片內程序存儲器還分直接定址區和間接定址類型,分別對應code、data、xdata、idata以及根據51系列特點而設定的pdata類型,使用不同的存儲器,將使程序執行效率不同,在編寫C51程序時,最好指定變數的存儲類型,這樣將有利於提高程序執行效率(此問題將在後面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對應不同的實際硬體系統,也將有不同的編譯結果。
在51系列中data,idata,xdata,pdata的區別
data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補充:c中idata做指針式的訪問效果很好)
xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata:外部擴展RAM的低256個位元組,地址出現在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優點,具體用法屬於中級問題,這里不提。
三、有關單片機ALE引腳的問題
"單片機不訪問外部鎖存器時ALE端有正脈沖信號輸出,此頻率約為時鍾振盪頻率的1/6.每當訪問
外部數據存儲器是,在兩個機器周期中ALE只出現一次,即丟失一個ALE脈沖."這句話是不是有毛
病.我覺得按這種說法,應該丟失3個ALE脈沖才對,我一直想不通是怎麼回事,希望大蝦們幫幫我.
小弟感激涕零.
答:
其他所有指令每6個機器周期發出一個ALE,而MOVX指令佔用12個機器周期只發出一個ALE
四、如何將一個INT型數據轉換成2個CHAR型數據?
經keil優化後,char1=int1/256,char2=int1%256或char1=int1>>8,char2=int1&0x00ff效率是一樣的。
五、在KEIL C51上模擬完了,怎樣生成HEX文件去燒寫??
右鍵點項目中Target 1,選第二個,在OUTPUT中選中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一個新的數據類型,但實際上這個新的數據類型是已經存在的,只不過是定義了
一個新的名字.
#define只是一個標號的定義.
你舉的例子兩者沒有區別,但是#define還可以這樣用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,這些情況下是不能用typedef定義的
七、請問如何設定KELC51的模擬工作頻(時鍾)
用右鍵點擊左邊的的target 1,然後在xtal一欄輸入
八、不同模塊怎樣共享sbit變數,extern不行?
把SBIT定義單獨放到一個.H中,每個模塊都包含這個.h文件
九、C51中對於Px.x的訪問必須自己定義嗎?
是的。
如sbit P17 = 0x97;即可定義對P1.7的訪問
十、SWITCH( )語句中表達式不可以是位變數對嗎?
可以用位變數:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case '0':{printf("0\n");break;}
case '1':{printf("1\n");break;}
default:break;
}
}
bit 變數只有兩種狀態,if 語句足夠啦,!!!
十一、const常數聲明占不佔內存???
const 只是用來定義「常量」,所佔用空間與你的定義有關,如:
const code cstStr[] = {"abc"};
佔用代碼空間;而如:
const char data cstStr[] = {"abc"};
當然佔用內存空間。
另外,#define 之定義似乎不佔用空間。
十二、philips的單片機P89C51RD+的擴展RAM在C51中如何使用?
試一試將auxr.1清0,然後在c語言中直接聲明xdata類型的變數
十三、BUG of Keil C51
程序中用如下語句:
const unsigned char strArr[] = {"數學"};
結果發現strArr[] 內容為 {0xCA,0xD1,0xA7},真奇怪!
凡是有0xfd,則會通通不見了,所以只能手工輸入內碼了,例如 uchar strArr[]=
{0xCA,0xfd,0xd1,0xa7}(用Ultraedit會很方便)。
十四、Keil C51中如何實現代碼優化?
菜單Project下Option for target "Simulator"的C51.
看到Code optimization了嗎?
十五、請教c的!和 ~ 符號有甚區別??
!是邏輯取反,~是按位取反。
十六、c51編程,讀埠,還要不要先輸出1?
我怎麼看到有的要,有的不要,請高手給講講,到底咋回事?謝了
要輸出1的,除非你能保證之前已經是1,而中間沒有輸出過其他值。
十七、當定時器1(T1)用於產生波特率時,P3^5還是否可以用作正常的I/O口呢?
p3.5完全可以當普通的io使用
十八、C51中 INT 轉換為 2個CHAR?
各位高手:
C51中 INT 轉換為 CHAR 如何轉換諸如:
X = LOW(Z);
Y = HIGH(Z);
答:
x=(char)z;
y=(char)(z>>8);
十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?
現在對位操作指令我一些不太明白請各位多多指教:
如 SETB 07H 表示的是20H.7置1,對嗎?(我在一本書上是這么看到的)
那麼如果我想使2EH的第7位置1的話,象我舉的這個例子怎麼表示呢?謝謝!
SETB 77H
setb (2eh-20h)*8+7
20h-2fh每位元組有8個可位操作(00h-7fh),其它RAM不可位直接操作
二十、char *addr=0xc000 和char xdata *addr=0xc000有何區別?
char *addr=0xc000;
char xdata *addr=0xc000;
除了在內存中佔用的位元組不同外,還有別的區別嗎?
char *addr=0xc000; 是通用定義,指針變數 addr 可指向任何內存空間的值;
char xdata *addr=0xc000; 指定該指針變數只能指向 xdata 中的值;
後一種定義中該指針變數(addr)將少佔用一個存儲位元組。
uchar xdata *addr=0xc000;指針指向外ram;
如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在於內ram(data)
中
以此類推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;
data uchar idata *addr=0xa0;.........
二十一、while(p1_0)的執行時間?
假設,P1_0為單片機P1口的第一腳,請問,
while(P1_0)
{
P1_0=0;
}
while(!P1_0)
{
P1_0=1;
}
以上代碼,在KEIL C中,需要多長時間,執行完。能具體說明while(P1_0)的執行時間嗎?
模擬運行看看就知道了,
我模擬了試了一下,約14個周期
二十二、怎樣編寫C51的watchdog程序?
各位大蝦,我用KEIL C51 編寫了一個帶外部開門狗的程序,可程序無法運行起來,經過查
找,發現程序在經過C51編譯後,在MAIN()函數的前部增加了一端初始化程序,等到進入
主程序設置開門狗時,開門狗已經時間到,將我的程序復位了,請問我怎樣才能修改這一端
初始花程序,使他一運行,就設置開門狗?
可以在startup.a51中加入看門狗刷新指令,當然用匯編,然後重新編譯startup.a51
,將他和你的程序連接即可。新的startup.a51會自動代替系統默認的啟動模塊。
二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中
直接加入即可
注意不要改動?STACK,?C_START,?C_STARTUP等符號。startup.a51直接加入項目,不用修改也可。可在內面自己修改匯編的一些限制或堆棧指針。
二十四、關於波特率的設置
我在設定串口波特率時發現一個問題:在晶體震盪器為11.0592MHz時,若設9600BPS的話,
TH1=0XFD,TL1=0XFD,而要設19200BPS的話,TH1、TL1有否變化,如果沒變,為什麼?
如果變了,又為什麼?(因為我看書上倆個是一樣的),希望大家點撥。
答:
當電源控制寄存器(PCON)第BIT7(SMOD)為1時波特率加倍。
TH1和TL1的值不變.
二十五、如何在C中聲明保留這部分RAM區不被C使用?
我不知道在C源程序中怎麼控制這個,但在匯編程序中加入下面一段就行:
DSEG AT 20H
AA: DS 10
這樣C51就不會佔用20H--29H了
或者在c51里這樣定義:
uchar data asm_buff[10] _at_ 0x20;
二十六、問浮點運算問題
我在用C51時發現它對傳遞浮點參數的個數有限制,請問:
1)參數是以全局變數的形式傳遞的,請問以全局變數的形式傳遞的參數也有限制嗎?
2)這種傳遞浮點參數的限制有多少呢?
3)float*float的結果是float類型還是double類型?能否直接賦值給float類型的變數?
答:
由於KEIL C51的參數傳遞是通過R0-R7來傳遞的,所以會有限制。
不過KEIL提供了一個編譯參數,可以支持更多參數的傳遞。具體
的內容見KEIL的PDF文檔。
我建議你把多個要傳遞的參數定義到指針或結構體中去,傳遞參
數通過指針或結構進行,這樣好一些。
第3個問題回答是YES,你自己試試不就知道了。
二十七、如何在某一個地址定義ram
用_at_ 命令,這樣可以定位靈活一點的地址
uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM
將dis_buff[16]定位在0x6020開始的16個位元組
二十八、keil c中,用什麼函數可以得到奇偶校驗位?
例如32位數據,將四個位元組相互異或後檢查P即可,若耽心P被改變,可用內嵌匯編。
#include
unsigned char parity(unsigned char x){
x^=x;
if(P)return(1);
else return(0);
}
unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}
Ⅹ c語言課程的總結
1.先學習C語言的基礎知識。現在正在學C語言的在校學生可以直接進入第2步學習。
2.按照《C語言程序設計入門學習六步曲》進行上機練習。
3.在上機練習時要養成良好的編程風格。點擊查看C語言的編程風格
4.積極參加C、C++興趣小組,養成和老師與同學交流習慣,從而相互收益。有時別人不經意的一句話可能使你茅塞頓開--「一句話點醒夢中人」。
5.及時總結自己的學習經驗,養成寫C語言日記的習慣。軟體有編程日記功能。
6.從網上或教材上找一個自己感興趣的題目(選題時根據自己的能力,可先易後難,培養自己的成就感,如果有了成就感,即使再苦再累還是感覺C語言學習是一件快樂的事,同學們喜歡打游戲,經常通宵達旦地玩游戲也樂而不疲就是這個道理)進行實戰訓練,提高自己的C語言綜合應用能力。
7. 由於C語言靈活、強大,初學者要全面地掌握它是不可能的,因此在學習C語言的過程中,不要在細枝末節上浪費精力(比如++、--用於表達式的計算,實際上是沒有意義的),但一定要熟練掌握C語言的流程式控制制語句、數組、函數、指針等基礎知識的應用,為學習面向對象程序設計打下堅實的基礎。如果這些知識你學不好,要後續學習好C++、可視化的程序設計Visual C++或C++Builder就像空中樓閣,是不現實的。
C語言程序設計入門學習六步曲
筆者在從事教學的過程中,聽到同學抱怨最多的一句話是:老師,上課我也能聽懂,書上的例題也能看明白,可是到自己動手做編程時,卻不知道如何下手。發生這種現象的原因有三個:
一、所謂的看懂聽明白,只是很膚淺的語法知識,而我們編寫的程序或軟體是要根據要解決問題的實際需要控製程序的流程,如果你沒有深刻地理解C語言的語句的執行過程(或流程),你怎麼會編寫程序解決這些實際問題呢?
二、用C語言編程解決實際問題,所需要的不僅僅是C語言的編程知識,還需要相關的專業知識。例如,如果你不知道長方形的面積公式,即使C語言學得再好你也編不出求長方形的面積的程序來。
三、C語言程序設計是一門實踐性很強的課程,「紙上談兵」式的光學不練是學不好C語言的。例如,大家都看過精彩自行車雜技表演,假如,你從來沒有騎過自行車,光聽教練講解相關的知識、規則、技巧,不要說上台表演、就是上路你恐怕都不行。
出現問題原因清楚了,那麼如何學習呢?請你看【C語言學習六步曲】
在程序開發的過程中,上機調試程序是一個不可缺少的重要環節。「三分編程七分調試」,說明程序調試的工作量要比編程大得多。這里以如何上機調試C程序來說明C語言的學習方法。
第一步、驗證性練習
在這一步要求按照教材上的程序實例進行原樣輸入,運行一下程序是否正確。在這一步基本掌握C語言編程軟體的使用方法(包括新建、打開、保存、關閉C程序,熟練地輸入、編輯C程序;初步記憶新學章節的知識點、養成良好的C語言編程風格)。
初學者最容易犯的錯誤是:
1、沒有區分開教材上的數字1和字母l,字母o和數字0的區別,造成變數未定義的錯誤。另一個易錯點是將英文狀態下的逗號,分號;括弧()雙引號""輸入出入成中文狀態下的逗號,分號;括弧(),雙引號「」造成非法字元錯誤。
2、C語言初學者易犯語法錯誤:使用未定義的變數、標示符(變數、常量、數組、函數等)不區分大小寫、漏掉「;」、「{」與「}」、「(」與「)」不匹、控制語句(選擇、分支、循環)的格式不正確、調用庫函數卻沒有包含相應的頭文件、調用未C聲明的自定義函數、調用函數時實參與形參不匹配、數組的邊界超界等。
3、修改C語言語法錯誤時要注意以下兩點:
(1)、由於C語言語法比較自由、靈活,因此錯誤信息定位不是特別精確。例如,當提示第10行發生錯誤時,如果在第10行沒有發現錯誤,從第10行開始往前查找錯誤並修改之。
(2)、一條語句錯誤可能會產生若干條錯誤信息只要修改了這條錯誤,其他錯誤會隨之消失。特別提示:一般情況下,第一條錯誤信息最能反映錯誤的位置和類型,所以調試程序時務必根據第一條錯誤信息進行修改,修改後,立即運行程序,如果還有很多錯誤,要一個一個地修改,即,每修改一處錯誤要運行一次程序。
第二步、照葫蘆畫瓢
在第一步輸入的C程序的基礎上進行試驗性的修改,運行一下程序看一看程序結果發生了什麼變化,分析結果變化的原因,加深新學知識點的理解。事實上這和第一步時同步進行的,實現「輸入」加深知識的記憶,「修改」加深對知識的理解。記憶和理解是相輔相成的,相互促進。
例如:將最簡單的Hello World!程序
#include "stdio.h"
int main()
{
printf("Hello World!\n");
return 0;
}
中的
printf("Hello World!\n");
中的Hello World!改成你的姓名,運行一下程序,看有什麼變化?
再如求1+2+3...+100的和的程序
#include <stdio.h>
main()
{
int i,sum=0;
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
}
第1次將for(i=1;i<=100;i++)中的100改成50,運行一下程序,看有什麼變化?
第2次將for(i=1;i<=100;i++)中的i++改成i=i+2,運行一下程序,看有什麼變化?
找出程序結果變化的原因,就加深了對C語句的理解。
第三步、不看教材看是否能將前兩步的程序進行正確地輸入並運行。
在這一步要求不看教材,即使程序不能運行,看能否將其改正,使其能正確運行。目的是對前兩步的記憶、理解進一步強化。
第四步、增強程序的調試能力
在教材中每章都有C語言初學者易犯的錯誤,按照易出錯的類型,將教材中的正確的程序改成錯誤的程序,運行一下程序,看出現的錯誤信息提示,並記下錯誤信息,再將程序改成正確的,運行一下程序。這樣反復修改,就能夠學習C語言程序發生錯誤的原因和修改錯誤的能力。
注意:每次只改錯一個地方,目的是顯示發生該錯誤的真正原因,避免一次改動多個地方,搞清發生錯誤的真正原因,切記!!!!
注意:上機調試程序時要帶一個記錄本,記下英文錯誤提示信息和解決該錯誤問題的方法,積累程序調試經驗,避免在編程犯同樣的錯誤,切記!!!!。
例如,將Hello World程序中語句
printf("Hello World!\n");
中的;改成中文的分號;
運行一下程序,看有什麼結果?
調試程序是一種實踐性很強的事,光紙上談兵是是沒用的,就像游泳運動員只聽教練講解示範,而不親自下水練習,是永遠學不會游泳的。
即使在優秀的程序員編寫程序也會犯錯誤的,可能事最低級的語法錯誤,但他能快速發現錯誤並改正錯誤,而我們C語言初學者面對錯誤提示,不知道發生了什麼錯誤,如何改正,這就事差別。
第五步、研究典型的C語言程序,提高程序設計能力
C語言初學者遇到最多的困惑是:上課也能聽懂,書上的例題也能看明白,可是到自己動手做編程時,卻不知道如何下手。發生這種現象的原因是:所謂的看懂聽明白,只是很膚淺的語法知識,而沒有深刻地理解C語言的語句的執行過程(或流程)。
計算機是按照人的指令(編寫的程序)去執行的,如果不知道這些C語句在計算機中是如何執行的,你怎麼回靈活運用這些知識去解決實際問題呢?
解決問題的方法是要先理解C語言各種語句的流程(即計算機是如何執行這些語句的過程),然後研讀現成C語言經典程序,看懂別人事如何解決問題的,以提高自己的程序設計能力。
第六步、研究課程設計源成序,提高C語言的綜合應用能力.