




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、萬年歷查詢系統(tǒng)本題目設計目的是訓練學生的基本編程能力,了解管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的數(shù)組和函數(shù)的基本操作。本程序通過對C語言中的關系表達式、邏輯表達式、選擇結構、循環(huán)結構、數(shù)組和函數(shù)等程序設計的基本語法和語義結構的綜合訓練,掌握程序設計的基本方法、常用技巧,為進一步開發(fā)出高質量的管理信息系統(tǒng)打下堅實的基礎。1、問題定義創(chuàng)建一個萬年歷查詢系統(tǒng)。假設系統(tǒng)中日期查詢是從公元1年1月1日到公元10000年之間所有的日期。程序運行效果如下圖所示,選擇菜單后,實現(xiàn)相應功能。在問題定義階段要考慮題目的可行性和需求分析,接下來進入開發(fā)階段,完成系統(tǒng)設計和系統(tǒng)實現(xiàn)的任務。2、系統(tǒng)設計2.1 總體設計采
2、用模塊化的程序設計方法,即將較大的任務按照一定的原則分為一個個較小的任務,然后分別設計各個小任務。需要注意的是劃分出來的模塊應該相對獨立但又相關,且容易理解。可以用模塊化層次結構圖(即模塊圖)來分析其任務的劃分,一般從上到下進行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細化描述。開始密碼檢測模塊萬年歷查詢系統(tǒng)查詢某年某月的最大天數(shù)打印某年的全年日歷查詢某年是否是閏年查詢某年某月是星期幾從鍵盤輸入從函數(shù)讀入輸出至屏幕從函數(shù)讀入從鍵盤輸入從函數(shù)讀入從鍵盤輸入從函數(shù)讀入 圖2.1 萬年歷系統(tǒng)功能模塊圖本萬年歷查詢系統(tǒng)要求采用數(shù)組、函數(shù)實現(xiàn),如圖2.1所示,它由如下四大功能模塊組成: 查詢某年
3、某月是星期幾模塊。 查詢某年是否是閏年。 打印某年的全年日歷。 查詢某年某月的最大天數(shù)。22 詳細設計2.2.1數(shù)據(jù)結構設計 萬年歷查詢系統(tǒng)void screen(); /系統(tǒng)主界面void leapyear(); /查詢某年是否是閏年int IsLeapYear(int); /判斷某年是否是閏年void printmonthday(); /查詢某年某月的最大天數(shù)int everymonth(int,int); /計算每月的最大天數(shù) void whatisit(); /查詢某年某月某日是星期幾int whatisita(int,int); /計算某年某月的第一天是星期幾void printfy
4、earday(); /打印某年的全年日歷void printmonth(int,int); /打印某年某月月歷2.2.2 main函數(shù)流程圖開始密碼保護模塊進入系統(tǒng)主界面函數(shù)進入while(1)輸出主界面目錄輸入1到5中的一個數(shù)值選擇相應操作進入switch(n)主循環(huán)輸入是否為5是結束否判斷鍵值,調用相應函數(shù)完成相應功能程序流程圖如圖所示。系統(tǒng)在密碼保護模塊正確輸入用戶名和密碼后直接輸出主界面,然后執(zhí)行顯示主菜單和進入主循環(huán)操作進行按鍵判斷。在判斷鍵值時,有效的輸入為1到5之間的任意數(shù)值,其他輸入都被視為錯誤按鍵。 若輸入為5則退出。如選擇1,可調用whatisit()函數(shù),執(zhí)行查詢某年某月
5、某天是星期幾操作。若選擇2,則調用leapyear()函數(shù),執(zhí)行查詢某年是否是閏年操作。若選擇3,則調用printfyearday()函數(shù),執(zhí)行打印某年全年日歷的操作。若選擇4,則調用printmonthday函數(shù),執(zhí)行查詢某月的最大天數(shù)的操作。若輸入為1到5之外的數(shù)字,則給出按鍵錯誤的提示。3、系統(tǒng)實現(xiàn)31 編碼3.1.1 程序預處理包括加載頭文件,定義結構體、常量和變量,并對它們進行初始化工作。#include<stdio.h>#include<string.h>#include<stdlib.h>void screen(); /系統(tǒng)主界面void le
6、apyear(); /查詢某年是否是閏年int IsLeapYear(int); /判斷某年是否是閏年void printmonthday(); /查詢某年某月的最大天數(shù)int everymonth(int,int); /計算每月的最大天數(shù) void whatisit(); /查詢某年某月某日是星期幾int whatisita(int,int); /計算某年某月的第一天是星期幾void printfyearday(); /打印某年的全年日歷void printmonth(int,int); /打印某年某月月歷3.1.2 主函數(shù)main()main()函數(shù)主要實現(xiàn)了對整個程序的運行控制,以及相關
7、功能模塊的調用。3.1.3 主菜單界面void screen ()void screen () system("CLS");int n;while(1)printf("歡迎來到萬年歷查詢系統(tǒng),請您按照下列提示進行操作,祝您查詢愉快!n");printf(" n");printf(" 萬年歷查詢系統(tǒng)界面 n");printf(" * n");printf(" 1.查詢某年某月某日是星期幾 n");printf(" 2.查詢某年是否是閏年 n");printf
8、( 3.打印某年的全年日歷 n");printf(" 4.查詢某年某月的最大天數(shù) n");printf(" 5.退出 n");printf(" * n");printf(" n");printf(" 請輸入您要查詢的選項( _ ): " );scanf("%d",&n); /讀取輸入的數(shù)字switch(n) case 1:whatisit(); /查詢某年某月某日是星期幾break;case 2:leapyear(); /查詢某年是否是閏年break;cas
9、e 3:printfyearday(); /打印某年的全年日歷break;case 4: printmonthday(); /查詢某年某月的最大天數(shù)break;case 5:system("cls");printf("nn");printf("tn");printf("t*n"); printf("t* 謝謝使用本程序 *n");printf("t* 編輯者:黃麗敏 *n");printf("t* 編輯時間:2012.06.19 *n");printf(&
10、quot;t*n");printf("tn"); exit(0);default:printf("/(o)/不好意思,您輸入信息錯誤,請您按要求重新輸入!謝謝!nn");break;3.1.4 登陸界面輸入用戶名和密碼菜單選擇界面3.1.5 查詢某年某月某日是星期幾 void whatisit()int y,m,d,s,k=1,sum,n,i;char yn;while(k)printf("n請您輸入年,月,日:n");scanf("%d,%d,%d",&y,&m,&d);getc
11、har(); /吸收回車符 if(m<1 | m>12) /判斷輸入的月份是否正確printf("您輸入的月份不對!月份應為0到12月!請按要求重新輸入。n");continue; if(d<1 | d>31)printf("您輸入的日期不對!日期應為1號到31號!請按要求重新輸入。"); continue;s=0; for(i=1;i<m;i+)s=s+ai;s=s+d; /累加天數(shù)if(IsLeapYear(y) && m>2) /判斷是否是閏年,且月份大于2s=s+1;sum=s;n=(y-1+(
12、y-1)/4-(y-1)/100+(y-1)/400+sum)%7; /計算結果06printf("這天是星期%sn",weekn); /顯示星期幾printf("是否繼續(xù)本項目的查詢(Y/N)?");scanf("%c",&yn);if(yn='y'| yn='Y' )k=1;elsek=0; system("CLS"); 此函數(shù)有錯誤提示功能,如下:3.1.6查詢某年是否是閏年 int IsLeapYear(int year)return(year%4=0 &&a
13、mp; year%100!=0 | year%400=0);void leapyear()int y,k=1;char yn;while(k)printf("n請輸入要查詢的年份:n");scanf("%d",&y);getchar(); /吸收回車符if(IsLeapYear(y) /判斷是否是閏年printf("是閏年n");elseprintf("不是閏年n");printf("是否繼續(xù)本項目的查詢(Y/N)?");scanf("%c",&yn);if(
14、yn='y' | yn='Y')k=1;elsek=0;system("CLS");3.1.7 打印全年日歷void printfyearday()int y,value,sum,i,k=1;char yn;while(k) printf("n請輸入您要查詢日歷的年份:n");scanf("%d",&y);getchar();for(i=1;i<=12;i+)printf("%d年%d月的信息:n",y,i);value=whatisita(y,i); /計算某年某月的
15、第一天是星期幾sum=everymonth(y,i); /計算某年某月最大天數(shù) printmonth(value,sum); /打印一個月的日歷printf("n");printf("是否繼續(xù)查詢(Y/N)?");scanf("%c",&yn);if(yn='y' | yn='Y')k=1;elsek=0;system("CLS");.3.1.8 查詢某年某月最大天數(shù)void printmonthday()int y,m,value,k=1;char yn;while(k)p
16、rintf("n請輸入您要查詢的年份,月份:n");scanf("%d,%d",&y,&m);getchar(); /吸收回車符if(m<0 | m>12) /判斷輸入的月份是否正確printf("您輸入的月份不對!月份應為0到12月!n");continue;value=everymonth(y,m); /計算該年該月的最大天數(shù)printf("%d年%d月的最大天數(shù)為:%dn",y,m,value);printf("是否繼續(xù)本項目的查詢(Y/N)?");scanf(
17、"%c",&yn);if(yn='y' | yn='Y')k=1;elsek=0;system("CLS");3.1.8 退出system("cls");printf("nn");printf("tn");printf("t*n"); printf("t* 謝謝使用本程序 *n");printf("t* 編輯者:黃麗敏 *n");printf("t* 編輯時間:2012.06.19 *n
18、");printf("t*n");printf("tn");32 測試與調試3.2.1 概述一般情況下,為解決一個問題所編寫的程序代碼較長,可能包括幾百條甚至成千上萬條語句。在檢查并排除所有語法錯誤后,還會有不易發(fā)現(xiàn)的邏輯錯誤,因此要對程序進行認真仔細的測試與調試。測試是通過運行程序發(fā)現(xiàn)錯誤的過程,常見的錯誤有數(shù)據(jù)溢出、數(shù)組越界、進入死循環(huán)、語句順序顛倒、多加“;”或少加“”等等。調試則是確定測試中找到的錯誤性質并改正錯誤的過程。測試與調試通常交替進行,即測試調試再測試再調試。能檢查出尚未發(fā)現(xiàn)的、各種不同類型錯誤的測試才是成功的測試。測試程序需
19、要測試用例,測試用例可用如下公式表示:測試用例測試數(shù)據(jù)預期結果。好的測試用例應該是用盡可能少的測試數(shù)據(jù)發(fā)現(xiàn)盡可能多的錯誤,即發(fā)現(xiàn)錯誤的概率要大。要選擇合適的測試數(shù)據(jù),使系統(tǒng)在運行時盡量能執(zhí)行到每條語句,以測試各指令是否正確。還應分別測試輸入合法數(shù)據(jù)與非法數(shù)據(jù)時,程序的運行情況,。對于合法數(shù)據(jù),還要考慮數(shù)據(jù)的一般性與特殊性,如求最大值的問題,應測試最大值在最前面、最后面、中間某一位置的情況。測試可按模塊測試、組裝測試和確認測試的步驟進行。(1)模塊測試就是分別對各模塊進行測試的過程。在編寫一個模塊后應立即對其進行測試,因為這時對模塊記憶深刻,而且單個模塊相對較小,所以容易構造測試數(shù)據(jù),能方便地檢
20、查和改正錯誤。(2)組裝測試就是把所有模塊(應該是通過模塊測試的模塊)按預先制定的計劃逐步組裝和測試的過程。一般情況下,各模塊之間要相互傳遞數(shù)據(jù)和控制信息,因此組裝測試的主要任務是發(fā)現(xiàn)模塊接口中的錯誤。(3)確認測試是最后一個步驟,一般在將軟件交付用戶之前,應確認軟件是否確實滿足用戶的要求,通常使用接近實際的用例進行測試。測試程序時,用監(jiān)視窗口可以隨時查看變量或表達式的值,有時還可以將部分程序代碼用注釋符暫時括起來,縮短程序,以便壓縮出錯代碼的范圍。3.2.2 程序測試在登陸菜單中輸入用戶名和密碼,在驗證用戶名和密碼都正確后可進入主菜單。這時選擇,可以進行選擇各菜單,然后可以進行萬年歷查詢了。
21、選擇菜單5,則可以不作任何抄作,直接退出程序。4、系統(tǒng)維護經(jīng)測試與調試確認軟件無錯時,開發(fā)就告一段落,這時可以交付軟件供用戶使用,但是在軟件的使用過程中還會面臨更加漫長的工作,即軟件維護。一般維護的工作有:更改使用中發(fā)現(xiàn)的錯誤;為適應實際環(huán)境而對程序進行修改;為滿足新的需求而對程序作必要的改進等等。七、在C語言編程中常見錯誤C語言的最大特點是:功能強、使用方便靈活。C編譯的程序對語法檢查并不象其它高級語言那么嚴格,這就給我們留下“靈活的余地”,但還是由于這個靈活給程序的調試帶來了許多不便,尤其對我們這些初學C語言的人來說,經(jīng)常會出一些連自己都不知道錯在哪里的錯誤。看著有錯的程序,不知該如何改起
22、,我通過這次編程,也積累了一些C編程時常犯的錯誤:1. 書寫標識符時,忽略了大小寫字母的區(qū)別。編譯程序把a和A認為是兩個不同的變量名,而顯示出錯信息。C語言認為大寫字母和小寫字母是兩個不同的字符。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。2.忽略了變量的類型,進行了不合法的運算。%是求余運算,得到a/b的整余數(shù)。整型變量a和b可以進行求余運算,而實型變量則不允許進行“求余”運算。3.將字符常量與字符串常量混淆。混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,字符串常量是一對雙引號括起來的字符序列。C規(guī)定以“”作字符串結束標志,它是由系統(tǒng)自動加上的,所以字符串
23、“a”實際上包含兩個字符:a'和',而把它賦給一個字符變量是不行的。4.忽略了“=”與“=”的區(qū)別。在C語言中,“=”是賦值運算符,“=”是關系運算符。如: if (a=3) a=b;前者是進行比較,a是否和3相等,后者表示如果a和3相等,把b值賦給a。由于習慣問題,初學者往往會犯這樣的錯誤。5.忘記加分號。分號是C語句中不可缺少的一部分,語句末尾必須有分號。 a=1 b=2編譯時,編譯程序在“a=1”后面沒發(fā)現(xiàn)分號,就把下一行“b=2”也作為上一行語句的一部分,這就會出現(xiàn)語法錯誤。改錯時,有時在被指出有錯的一行中未發(fā)現(xiàn)錯誤,就需要看一下上一行是否漏掉了分號。 z=x+y; t
24、=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語句到此結束,程序將執(zhí)行I+語句,不論3是否整除a,I都將自動加1。再如: for (I=0;I<5;I+); scanf("%d",&am
25、p;x); printf("%d",x);本意是先后輸入5個數(shù),每輸入一個數(shù)后再將它輸出。由于for()后多加了一個分號,使循環(huán)體變?yōu)榭照Z句,此時只能輸入一個數(shù)并輸出它。7.輸入變量時忘記加地址運算符“&”。 int a,b; scanf("%d%d",a,b);這是不合法的。Scanf函數(shù)的作用是:按照a、b在內存的地址將a、b的值存進去。“&a”指a在內存中的地址。8.輸入數(shù)據(jù)的方式與要求不符。scanf("%d%d",&a,&b);輸入時,不能用逗號作兩個數(shù)據(jù)間的分隔符,如下面輸入不合法: 3,4
26、 輸入數(shù)據(jù)時,在兩個數(shù)據(jù)之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。scanf("%d,%d",&a,&b);C規(guī)定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數(shù)據(jù)時應輸入與這些字符相同的字符。下面輸入是合法的: 3,4 此時不用逗號而用空格或其它字符是不對的。 3 4 3:4 又如: scanf("a=%d,b=%d",&a,&b);輸入應如以下形式: a=3,b=4 9.輸入字符的格式與要求不一致。在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。scanf(&q
27、uot;%c%c%c",&c1,&c2,&c3);如輸入a b c 字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔。10.輸入輸出的數(shù)據(jù)類型與所用格式說明符不一致。例如,a已定義為整型,b定義為實型a=3;b=4.5;printf("%f%dn",a,b);語法錯邏輯錯 運行錯0.忘記定義變量:main()x=3;y=6;printf(“%dn”,x+y);11.C語言的變量一定要先定義才能使用;12.輸入輸出的數(shù)據(jù)的類型與所用格式說明符不一致int a=3;flo
28、at b=4.5;printf(“%f%dn”,a,b);它們并不是按照賦值的規(guī)則進行轉換(如把4.5轉換為4),而是將數(shù)據(jù)在存儲單元中的形式按格式符的要求組織輸出(如b占4個字節(jié),只把最后兩個字節(jié)的數(shù)據(jù)按%d,作為整數(shù)輸出)13.未注意int型數(shù)據(jù)的數(shù)值范圍int型數(shù)據(jù)的數(shù)值范圍(-3276832768)int num=89101;printf(“%d”,num);會將超過低16位的數(shù)截去從而得到23563注意:定義了long型,而在輸出時仍用”%d”說明符,仍會出現(xiàn)以上錯誤14.輸入變量時忘記使用地址符scanf(“%d%d”,a,b);15.輸入時數(shù)據(jù)的組織與要求不符對scanf函數(shù)中格
29、式字符串中除了格式說明符外,對其他字符必須按原樣輸入16.誤把”=“作為”等于”比較符“=“為附值運算符“=“為比較運算符17.語句后面漏分號t=a;a=b;b=t它是pascal的語法18.不該加分號的地方加了分號if(a>b);printf(“a is larger than bn”);for(i=0;i<10;i+);scanf(“%d”,&x);printf(“%dn”,x*x);19.對應該有花括弧的復合語句,忘記加花括弧sum=0;i=1;while(i<=100)sum=sum+1;i+;20.括弧不配對while(c=getchar()!=#)putc
30、har(c);11.在用標識時,忘記了大寫字母和小寫字母的區(qū)別int a,b,c;a=2;b=3;C=A+B;printf(“%d+%d=%D”,A,B,C);12.引用數(shù)組元素時誤用發(fā)圓括弧int i,a(10);for(i=0;i<10;i+)scanf(“%d”,&a(i);13.在定義數(shù)組時,將定義的”元素個數(shù)”誤認為是”可使用的最大下標值int a10=1,2,3,4,5,6,7,8,9,10;int i;for(i=1;i<=10;i+)printf(“%d”,ai);14.對二維或多維數(shù)組的定義和引用的方法不對int a5,4;printf(“%d”,a1+2
31、,2+2);15.誤以為數(shù)組名代表數(shù)組中全部元素int a4=1,2,3,4;printf(“%d%d%d%d”,a);16.混淆字符數(shù)組與字符指針的區(qū)別main()char str40;str=“Computer and c”;printf(“%sn”,str);17.在引用指針變量之前沒有對它賦予確定的值char *p;scanf(“%s”,p);char *p,c20;p=c;scanf(“%s”,p);18.switch語句的各分支中漏寫 break語句混淆字符和字符串的表示形式char sex;sex=“M”;19.使用自加(+)和自減(-)運算符時出的錯誤int *p,a5=1,3
32、,5,7,9;p=a;printf(“%d”,*p+);注意于*(+p)的區(qū)別;20.所調用的函數(shù)在調用語句之后才定義,而又在調用前未加說明main()float x,y,z;x=3.5;y=-7.6;z=max(x,y);printf(“%f”,z);編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。八、心得體會1. 雖然這次實訓程序沒有全部自己寫,參考了很多資料寫的,才有了頭緒,但是在看資料的程序理解過程也學到了很多東西,只要真正把它弄懂了,融會貫通我相信我也可以自己編程。2. 經(jīng)過上一個學期對C程序設計的學習,我們學習了理論知識,了解了C語言程序設計的思想,這些知識都為
33、我們的下一步學習打下了堅實的基礎。通過這次實訓,一方面是為了檢查我們一個學期來我們學習的成果,另一方面也是為了讓我們進一步的掌握和運用它,同時也讓我們認清自己的不足之處和薄弱環(huán)節(jié),加以彌補和加強。 3. 通過對c語言萬年歷的設計進一步的鞏固了用c語言編寫程序,并且有利于更好的掌握c語言! 4. 在萬年歷的編寫過程中也體會到了做事情一頂要細心、認真。更加知道了要掌握好基礎知識。還有體會到了成功的感覺!在萬年歷的設計過程中更加體會到了善于請教的重要性,“三人行必有我?guī)熝伞!碧撔南蛩藢W習真的能學到很多知識,而且能吸取各路精華,更好的的完成設計!也體會到以后在學習上虛心求教學習的必要性和重要性! 5. 通過本次實訓也培養(yǎng)了我獨立思考、 綜合運用所學有關相應知識的能力,掌握 工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關! 6. 由于C語言是近年在國內外得到迅速推廣應用的一種語言。C語言功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高,可移植性好,既具有高級
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 助產(chǎn)學第1版試題及答案
- 老師禮儀試題及答案
- 2025年交通運輸專業(yè)考試題及答案詳解
- java面試題及答案108題
- 軟件設計師設計理念總結試題及答案
- 迭代2025年西方政治制度試題及答案
- 西方政治制度的合法性與治理效率試題及答案
- 軟考網(wǎng)絡工程師考試復習時間管理試題及答案
- 軟件設計師跨領域學習試題及答案
- 軟考網(wǎng)絡工程師面向未來的技能需求試題及答案
- 新媒體視頻節(jié)目制作 課件 學習領域1 新聞短視頻制作
- 礦山應急救援鉆探技術規(guī)范
- 秦始皇帝陵的物探考古調查863計劃秦始皇陵物探考古進展情況的報告
- (完整)中醫(yī)癥候積分量表
- 【機器學習算法及應用結課論文3100字(論文)】
- 投標文件封面封皮模板
- 不良資產(chǎn)管理行業(yè)營銷策略方案
- 珠海市公安局金灣分局等單位招聘公安輔警考試題庫2023
- 地史學野外實習報告
- 致大海普希金
- 紅旗E-HS3汽車說明書
評論
0/150
提交評論