第一篇:萬年歷C語言課程設(shè)計(jì)報(bào)告
程序?qū)嵺`報(bào)告
任務(wù)分配:
1、頭文件,定義常量,全局變量,自定義函數(shù)和打印輸出模塊。即1~50和140~290
2、功能控制模塊和一部分日歷顯示模塊,即50~140和290~400
3、一部分日歷顯示模塊和鍵值獲取模塊,即400~
1、基本思路
功能模塊圖
本系統(tǒng)包括4個(gè)模塊,分別是功能控制模塊、打印輸出模塊、日歷顯示模塊和鍵值獲取模塊。(1)功能控制模塊。該模塊用于實(shí)現(xiàn)日期有效性檢查、判斷是否是閏年和返回指定日期對應(yīng)的星期。
(2)打印輸出模塊。該模塊主要是進(jìn)行輸出顯示,包括打印指定個(gè)數(shù)的空格、打印分隔線、打印用戶使用手冊、打印當(dāng)前日期對應(yīng)的星期以及打印給定的星期。
(3)日歷顯示模塊。該模塊是系統(tǒng)的核心模塊,是用來顯示指定日期所在月份的月歷。(4)鍵值獲取模塊。該模塊接受鍵盤操作,獲取鍵值,來進(jìn)行日期調(diào)整,并調(diào)用日歷顯示模塊中的函數(shù)來顯示調(diào)整后的日歷。
日歷顯示模塊
日歷顯示是系統(tǒng)的核心模塊,它控制著日歷的生成和顯示。其實(shí)現(xiàn)流程如圖所示。程序輸入的是包含年月日(year,month和day)的日期,輸出month所在月份的月歷,并突出顯示day所在的日期和year是否是閏年的標(biāo)識。程序首先根據(jù)year判斷其是否是閏年,如果是則需要將該年2月份的天數(shù)設(shè)置為29天,接著判斷day是否超過month所在月份的最大天數(shù),如果超過則顯示系統(tǒng)日期所在的月歷。然后進(jìn)行星期輸出的判斷,如果輸出的是該月的第一個(gè)星期,則判斷該星期中還有幾天在本月(如,該月1號是星期五,則表示該月第一個(gè)星期中只有兩天在本月,星期一到星期四在上月,則星期一到星期四在本月就不輸出,僅有空格表示),輸出空格。輸出完第一周后,接著輸出第二到第五(或者六)周,每周7天。在輸出過程中,如果遇到了day所在的日期,則突出顯示。
鍵值獲取流程圖
鍵值獲取實(shí)現(xiàn)的是從鍵盤調(diào)整日期并顯示調(diào)整后的月歷。其實(shí)現(xiàn)流程如圖所示。系統(tǒng)首先判斷從鍵盤輸入的值,如果是右移鍵,表示增加月份。此時(shí),如果當(dāng)前月份是12月,則增加月份后就進(jìn)入下一年的一月;如果是左移鍵,表示減少月份。此時(shí),如果當(dāng)前月份是1月,則減少月份后就進(jìn)入上一年的12月;如果是上移鍵表示增加年份,直接年份加1即可;如果是下移鍵表示減少奶奶分,直接年份減1即可;如果是向上翻頁鍵表示減小日期。如果是1月1號,則減少日期后進(jìn)入上一年的12月31號,如果是某一個(gè)月的1號,則減小日期后進(jìn)入上一月的最后一天;如果是向下翻頁鍵表示增加日期。如果是12月31號,則增加日期后進(jìn)入到下一年的1月1號,如果是某一個(gè)月的最后一天,則增加日期后進(jìn)入到下一個(gè)月的第一天;如果是Q/q鍵表示查詢?nèi)掌?,此時(shí)將輸出提示信息,提示用戶輸入查詢?nèi)掌凇T谟脩糨斎氩樵內(nèi)掌诤?,系統(tǒng)就愛那個(gè)調(diào)用日期檢查函數(shù)對輸入日期的合法性進(jìn)行檢測,如果輸入日期不合格,則提示錯(cuò)誤信息并顯示當(dāng)前系統(tǒng)日期所在月的月歷;如果是空格鍵表示重置,顯示當(dāng)前系統(tǒng)日期所在月的月歷;如果是Esc鍵表示退出系統(tǒng),按此鍵后,系統(tǒng)將詢問用戶是否確定退出,在得到確定回答(用戶輸入Y/y)后將退出系統(tǒng)。
2、函數(shù)功能描述
1)checkDate()函數(shù)原型:void checkDate()checkDate()函數(shù)用于檢查輸入日期的合法性,包括檢查輸入日期中的年、月、日部分。對于
年,檢查其是否是負(fù)數(shù)或者是0;對于月,檢查其是否是范圍在1~12中的值;對于日,檢查其是否是范圍在1~31中的值。如果有一個(gè)部分不合法,則程序提示用戶。2)isLeapyear()函數(shù)原型:int isLeapyear(int year)isLeapyear()函數(shù)用于判斷制定月份是否是閏年。參數(shù)year為待判斷的年份。3)getWeek()函數(shù)原型:int getWeek(int year,int month,int day)getWeek()函數(shù)用于計(jì)算并返回給定日期對應(yīng)的星期。其中參數(shù)year、month和day都為整型,分別表示輸入的年、月和日。4)printSpace()函數(shù)原型:void printSpace(int n)printSpace()函數(shù)用于輸出制定個(gè)數(shù)的空格。其中整型參數(shù)n表示需要輸出的空格的個(gè)數(shù)。5)printSepatator()函數(shù)原型:void printSeparator()printSeparator()函數(shù)用于在制定位置輸出用戶使用手冊。輸出位置在函數(shù)中已經(jīng)設(shè)定。7)printWeek()函數(shù)原型:void printWeek()printWeek()函數(shù)用于輸出當(dāng)前日期對應(yīng)的星期,即由 currentYear,currentMonth和currentDay確定的日期對應(yīng)的星期。該函數(shù)首先調(diào)用getWeek()函數(shù)返回當(dāng)前日期對應(yīng)的星期。8)printWeek2()函數(shù)原型:void printWeek2(int week)printWeek2()函數(shù)用于根據(jù)制定值輸出星期。參數(shù)week是一個(gè)整型變量,其值可取0到6,分別表示星期一到星期日。8)showCalendar()函數(shù)原型:void showCalendar(int year,int month,int day)showCalendar()函數(shù)用于顯示日歷。參數(shù)year,month和day分別表示年、月和日。該函數(shù)顯示year所在年是否是閏年,顯示month所在月的月歷,突出顯示day所在日的日期。
10)getKeyValue()函數(shù)原型:void getKeyValue()getKeyValue()函數(shù)用于獲取鍵盤的輸入。根據(jù)鍵盤的輸入(上下移鍵、左右移鍵、上下翻頁鍵、Q/q鍵)調(diào)整當(dāng)前日期,并顯示當(dāng)前日期所在月的月歷等。
4、遇到的問題和相應(yīng)的解決措施
1.dos.h頭文件不能在常用的Visual C++里使用。若使用Turbo C,則鍵入的漢字無法顯示,且無法復(fù)制粘貼。
解決措施:經(jīng)過上網(wǎng)查詢和詢問同學(xué),知道了導(dǎo)致問題的原因,但若把dos.h在visual c++中換成time.h,過程太復(fù)雜,很難實(shí)現(xiàn)。最后,我們跟同學(xué)借了一個(gè)win-TC,是C語言程序,且可以使用中文和進(jìn)行復(fù)制粘貼;2.鍵入程序代碼的時(shí)候顯示“非法字符’?(0xa3)在showCalender函數(shù)中”
解決措施:把showCalender函數(shù)全部檢查一遍也沒有找出問題所在,然后咨詢老師,經(jīng)驗(yàn)豐富的老師一眼看出函數(shù)中的一個(gè)左括號是用拼音輸出的,不是英文;3.程序可以運(yùn)行,但應(yīng)該只顯示一個(gè)向下箭頭的地方顯示了三行,且覆蓋了其他的字符。
解決措施:認(rèn)真的又檢查了一遍,發(fā)現(xiàn)“指定輸出字符為向下的箭頭”的函數(shù)中,_CX=01,寫成了_CH=01;4.萬年歷需要獲取系統(tǒng)時(shí)間,不知從何下手。
解決措施:經(jīng)查閱資料,得知應(yīng)用:currentYear=sysTime.da_year;
currentMnth=sysTime.da_mon;
currentDay=sysTime.da_day;
5、心得體會
經(jīng)歷了這次課程設(shè)計(jì)的設(shè)計(jì)和制作的整個(gè)過程,我們才發(fā)現(xiàn)我們知識的貧乏和知識面的狹窄,原本以為不就是一個(gè)小小的課程設(shè)計(jì),小case,很容易就可以搞定,可是到了后來實(shí)際的操作的時(shí)候可是花費(fèi)了我們九牛二虎之力,不說其他的,只說時(shí)間上面,我們就花費(fèi)了大把的時(shí)間,當(dāng)然我們也從中體會了很多平時(shí)不能收獲的東西。經(jīng)過一個(gè)多月的自主上機(jī)和三個(gè)多星期的大作業(yè)編寫,我們一隊(duì)三人的齊心努力,查閱書籍,上網(wǎng)查詢等各種途徑,完成了這次的大作業(yè)編寫。其中遇到了很多問題,一一解決的過程讓我們學(xué)會了很多,當(dāng)然有很多最初的構(gòu)想沒有實(shí)現(xiàn),這也是我們的遺憾之處。
這次作課程設(shè)計(jì)我們也是收獲很大,我們更深入的體會到團(tuán)隊(duì)的重要性,通過自學(xué)學(xué)到了更多C語言的編譯,如插入顏色,讀取系統(tǒng)時(shí)間等,這會是我們終身的財(cái)富。
首先,我們對C語言有了更深的了解,使用起來也更加的熟練,原來有一些不知道和不熟悉的函數(shù),我們學(xué)會用了。其次,我們這一次找了不少的資料,找專業(yè)的書籍、上網(wǎng)找各方面的資料,也使我們學(xué)到了一些書本中學(xué)不到的知識,讓我們長了見識。同時(shí)我們同學(xué)之間也互相的探討,也增進(jìn)了我們同學(xué)之間的感情。這次的萬年歷設(shè)計(jì),雖然我們自己覺的很有的成就感,但是這必竟是我們第一次C語言的課程設(shè)計(jì),必然會有很多的不足之處有待改進(jìn),相信以后我們一定會做的更好。
同時(shí)也感謝老師們的耐心講解與指導(dǎo),我們期待下一次可以做的更好!
【程序代碼】 /*加載頭文件*/ #include
/*定義常量*/ /*左移鍵*/ #define LEFT 0x4b00 /*右移鍵*/ #define RIGHT 0x4d00 /*下移鍵*/ #define DOWN 0x5000 /*上移鍵*/
#define UP 0x4800 /*向上翻頁鍵*/ #define PAGEUP 0x4900 /*向下翻頁鍵*/ #define PAGEDOWN 0x5100 /*小寫字母q*/ #define QLOWER 0x1071 /*大寫字母Q*/ #define QUPPER 0x1051 /*空格鍵*/ #define SPACE 0x3920 /*Esc鍵*/ #define ESC 0x011b
/*定義全局變量*/ struct date sysTime;int currentYear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;
/*--------------------------自定義函數(shù)-------------------------*/ void checkDate();int isLeapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printSaparator();void printUsage();void printWeek();void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyValue();
welcome(){ int i, graphdriver,graphmode,size,page;char s[30];graphdriver=DETECT;initgraph(&graphdriver,&graphmode,“");cleardevice();setbkcolor(BLUE);
setviewport(40,40,600,440,1);setfillstyle(1,2);setcolor(YELLOW);rectangle(1,1,560,400);floodfill(50,50,14);rectangle(20,20,540,380);setfillstyle(1,13);
/*
開圖視口
*/ /*
用綠色填畫出的矩形框
*/
floodfill(2l,300,14);setcolor(BLACK);settextstyle(1,0,6);/*
用淡洋紅色填畫出的矩形框
*/ /*
設(shè)要顯示字符串的字形方向,尺寸
*/ outtextxy(100,60,”Welcom you“);setviewport(100,150,540,380,0);/*
又開一窗口 */ setcolor(14);setfillstyle(1,10);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);/*
用深藍(lán)色填充
*/ sprintf(s,”Hey girl!Do you want to know?“);
/*
將字符串存到 s 字符數(shù)組*/
setcolor(1);settextstyle(10,0,10);/*
設(shè)選用字形 4,放大 3 倍,水平設(shè)置
*/ outtextxy(110,80,s);
/*
顯示 s 字符串
*/ getch();closegraph();} /*功能控制模塊*/ /*檢查日期有效性函數(shù)*/ void checkDate(){ /*如果給定的日期中年份部分為負(fù)數(shù)或者0*/ if(currentYear<=0){ gotoxy(1,27);printf(”The year should be a positive number!n“);gotoxy(1,28);printf(”Press any key to comtinue.......“);getchar();
getchar();/*以當(dāng)前系統(tǒng)時(shí)間重新賦值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果給定的日期中月份部分為負(fù)數(shù),為0或者大于12*/ if(currentMonth>12||currentMonth<1){gotoxy(1,27);printf(”The month should be a number between 1 and 12!n“);gotoxy(1,28);printf(”Press any key to continue......“);getchar();getchar();/*以當(dāng)前系統(tǒng)時(shí)間重新賦值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果給定的日期中天數(shù)部分為負(fù)數(shù),為0或者大于31*/ if(currentDay>31||currentDay<1){ gotoxy(1,27);printf(”The day should be a number between 1 and 31!n“);gotoxy(1,28);printf(”Press any key to continue......“);getchar();getchar();/*以當(dāng)前系統(tǒng)時(shí)間重新賦值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} }
/*判斷是否是閏年函數(shù)*/ int isLeapyear(int year){
/*閏年的判斷:(1)year被4整除,并且year不被100整除
或(2)year被4整除,并且被400整除*/
if(year%4==0&&year%100||year%400==0)
return 1;
else
return 0;} /*根據(jù)給定日期計(jì)算星期函數(shù)*/ int getWeek(int year,int month,int day){
int leapFlag;
int week;
int i;
/*該數(shù)組用于保存每個(gè)月的天數(shù)*/
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int count=0;
/*判斷給定年份是否是閏年*/
leapFlag=isLeapyear(year);
/*如果是閏年則2月份的日期應(yīng)該為29天*/
if(leapFlag==1)
a[2]++;
/*計(jì)算從給定年份的1月1日到給定月份的1號之間的天數(shù)*/
for(i=1;i { count+=a[i]; } /*計(jì)算從給定年份的1月1日到給定日期之間的天數(shù)*/ count+=day; /*計(jì)算星期*/ week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7; return week;} /*打印輸出模塊*/ /*輸出指定個(gè)數(shù)空格函數(shù)*/ void printSpace(int n){ int i; for(i=0;i printf(” “);} /*輸出分割線函數(shù)*/ void printSeparator(){ int i; for(i=0;i<38;i++) { printf(”=“); } printf(”n“);} /*輸出使用方法函數(shù)*/ void printUsage(){ gotoxy(45,3); /*設(shè)定字體顏色*/ textcolor(YELLOW); /*送格式化輸出至屏幕*/ cprintf(”-----------Usage-----------“); gotoxy(45,5); textcolor(YELLOW); cprintf(”YEAR“); gotoxy(50,5); printf(” Up key()to increase;n“); gotoxy(50,7); printf(” Down key()to decrease.n“); gotoxy(45,9); textcolor(YELLOW); cprintf(”MONTH:“); gotoxy(50,9); printf(” Right key()to increase;n“); gotoxy(50,11); printf(” Left key()to decrease.n“); gotoxy(45,13); textcolor(YELLOW); cprintf(”DAY“); gotoxy(50,13); printf(” PageDown key to increase;n“); gotoxy(50,15); printf(” PageUp key to decrease.n“); gotoxy(45,17); textcolor(YELLOW); cprintf(”QUERY“); gotoxy(50,17); printf(” Q/q keyn“); textcolor(YELLOW); gotoxy(45,19); cprintf(”RESET“); gotoxy(50,19); printf(” SPACE key.n“); gotoxy(45,21); textcolor(YELLOW); cprintf(”EXIT“); gotoxy(50,21); printf(” Esc keyn“); gotoxy(59,5); /*設(shè)置寄存器,表示在指定位置輸出一次指定的字符*/ _CX=01; _AH=0xa; /*指定輸出字符為向上的箭頭*/ _AL=24; /*產(chǎn)生一次中斷,輸出向上的箭頭*/ geninterrupt(0x10); gotoxy(61,7); _CX=01; _AH=0xa; /*指定輸出字符為向下的箭頭*/ _AL=25; geninterrupt(0x10); gotoxy(62,9); _CX=01; _AH=0xa; _AL=26; /*指定輸出字符為向右的箭頭*/ geninterrupt(0x10); gotoxy(61,11); _CX=01; _AH=0xa; /*指定輸出字符為向左的箭頭*/ _AL=27; geninterrupt(0x10); /*還原字體顏色*/ textcolor(7);} /*根據(jù)系統(tǒng)日期輸出星期函數(shù)*/ void printWeek(){ int day; /*根據(jù)日期獲得星期*/ day=getWeek(currentYear,currentMonth,currentDay); textcolor(11); /*輸出星期,0表示星期天,1表示星期一??6表示星期六*/ if(day==0) cprintf(”%d-%d-%d,Sunday!“,currentYear,currentMonth,currentDay); if(day==1) cprintf(”%d-%d-%d,Monday!“,currentYear,currentMonth,currentDay); if(day==2) cprintf(”%d-%d-%d,Tuesday!“,currentYear,currentMonth,currentDay); if(day==3) cprintf(”%d-%d-%d,Wednesday!“,currentYear,currentMonth,currentDay); if(day==4) cprintf(”%d-%d-%d,Thursday!“,currentYear,currentMonth,currentDay); if(day==5) cprintf(”%d-%d-%d,Friday!“,currentYear,currentMonth,currentDay); if(day==6) cprintf(”%d-%d-%d,Saterday!“,currentYear,currentMonth,currentDay); textcolor(7);} /*輸出指定星期函數(shù)*/ void printWeek2(int week){ if(week==0) cprintf(”,Sunday“); if(week==1) cprintf(”,Monday“); if(week==2) cprintf(”,Tuesday“); if(week==3) cprintf(”,Wendesday“); if(week==4) cprintf(”,Thursday“); if(week==5) cprintf(”,Friday“); if(week==6) cprintf(”,Staturday“);} /*日歷顯示模塊*/ /*顯示日歷函數(shù)*/ void showCalendar(int year,int month,int day){ int i; int j; /*輸出的日期*/ int outDay; int leapFlag; /*本月第一個(gè)星期中,在上月的天數(shù)*/ int dayLastMon; int week; /*該數(shù)組用于保存每個(gè)月的天數(shù)*/ int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; outDay=0; dayLastMon=0; week=0; /*判斷給定年份是否是閏年*/ leapFlag=isLeapyear(year); /*如果是閏年則2月應(yīng)該是29天*/ if(leapFlag==1) { a[2]++; } /*如果給定的日期中,天數(shù)大于該月的最大天數(shù)*/ if(day>a[month]) { printf(”The number of this month's day is %d at most!n“,a[month]); printf(”press any key to continue.....n“); getchar(); getchar(); /*以當(dāng)前系統(tǒng)時(shí)間重新賦值*/ year=sysTime.da_year; month=sysTime.da_mon; day=sysTime.da_day; currentYear=sysTime.da_year; currentMonth=sysTime.da_mon; currentDay=sysTime.da_day; } /*當(dāng)前月的天數(shù)*/ n_currentMon=a[month]; /*上一月的天數(shù)*/ n_lastMon=a[month-1]; /*根據(jù)給定日期,獲取給定月份1號的星期*/ week=dayLastMon=getWeek(year,month,1); /*清除文本模式窗口*/ clrscr(); printf(”nThe calendar of %d:“,year); textcolor(10); /*顯示給定是否是閏年*/ if(leapFlag==1) cprintf(”[leap year]“,year); if(leapFlag==0) cprintf(”[not leap year]“,year); printf(”n“); textcolor(7); printSeparator(); textcolor(YELLOW); /*輸出月份提示,1~12分別表示1月到12月*/ switch(month) { case 1: cprintf(”January 1“); break; case 2: cprintf(”Fabruary 2“); break; case 3: cprintf(”March 3“); break; case 4: cprintf(”April 4“); break; case 5: cprintf(”May 5“); break; case 6: cprintf(”June 6“); break; case 7: cprintf(”July 7“); break; case 8: cprintf(”August 8“); break; case 9: cprintf(”September 9“); break; case 10: cprintf(”O(jiān)ctober 10“); break; case 11: cprintf(”November 11“); break; case 12: cprintf(”December 12“); break; } textcolor(7); printf(”nn“); textcolor(13); cprintf(”Sun Mon Tue Wed Thu Fri Sat“); textcolor(7); printf(”nn“); /*因?yàn)橐粋€(gè)月中最多跨度6個(gè)星期,所以循環(huán)從0到5*/ for(i=0;i<6;i++) { /*如果是該月的第一星期*/ if(i==0) { /*第一個(gè)星期中還要7-daylastmon天本月,有daylastmon天在上個(gè)月,所以輸出 daylastmon*4個(gè)空格符,每個(gè)日期在日歷中占用4個(gè)空格*/ printSpace(dayLastMon*4); /*剩余在本月的第一個(gè)星期中的天數(shù)為7-dayLastmon*/ for(j=0;j<7-dayLastMon;j++) { /*到達(dá)day的前一天時(shí),輸出++outDay*/ if(outDay==day-1) { /*黃色字體突出顯示*/ textcolor(YELLOW); cprintf(”[%d]“,++outDay); textcolor(7); } /*到達(dá)day當(dāng)天時(shí),并且不是星期天*/ else if(outDay==day&&week!=0) { printf(”%3d“,++outDay); } /*到達(dá)day當(dāng)天時(shí),并且是星期天*/ else { printf(”%4d“,++outDay); } /*計(jì)算當(dāng)天的星期,如果前一天時(shí)星期六(6),當(dāng)天時(shí)星期天(0),其他情況則直 接星期加1*/ week=(week<6)?week+1:0; } printf(”nn“); } /*如果不是該月的第一個(gè)星期*/ else { /*則輸出該星期中的7天*/ for(j=0;j<7;j++) { /*輸出的天數(shù)小于該月的最大天數(shù)*/ if(outDay { /*到達(dá)day的前一天時(shí),輸出++outDay*/ if(outDay==day-1) { /*輸出一位數(shù)字*/ if(outDay<9) { textcolor(YELLOW); cprintf(”[%d]“,++outDay); textcolor(7); } /*輸出兩位數(shù)字*/ else { textcolor(YELLOW); cprintf(”[%2d]“,++outDay); textcolor(7); } } /*到達(dá)day當(dāng)天時(shí),并且不是星期天*/ else if(outDay==day && week!=0) { printf(”%3d“,++outDay); } /*到達(dá)day當(dāng)天時(shí),并且是星期天*/ else { printf(”%4d“,++outDay); } } /*計(jì)算當(dāng)天星期*/ week=(week<6)?week+1:0; } printf(”nn“); if(outDay==a[month])break;} } /*輸出分割線*/ printSeparator(); /*輸出當(dāng)前選擇的日期和星期*/ printf(”The day you choose is:nn“);printWeek();gotoxy(1,22);textcolor(10);cprintf(”--------------------n“);textcolor(7); /*輸出系統(tǒng)日期和星期*/ printf(”nToday is: %d-%d-%d“,sysTime.da_year,sysTime.da_mon,sysTime.da_day);printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));printf(”nn“);/*顯示按鍵操作*/ printUsage();gotoxy(1,25);} /*鍵值獲取模塊*/ /*通過鍵盤調(diào)整日期函數(shù)*/ void getKeyValue() { int key;char ch;/*默認(rèn)顯示當(dāng)前系統(tǒng)日期和星期*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentYear,currentMonth,currentDay); while(1){ /*獲取鍵值,根據(jù)鍵值調(diào)整日歷輸出*/ key=bioskey(0); /*右移鍵,增加月份*/ if(key==RIGHT) { /*月份值在1~12之間,則直接加1*/ if(currentMonth<12 && currentMonth>=1) { currentMonth++; } /*如果月份為12,則加1后進(jìn)位,即年份加1,月份變?yōu)?*/ else { currentYear++; currentMonth=1; } } /*左移鍵,減少月份*/ if(key==LEFT){ /*月份值在1~12之間,則直接減1*/ if(currentMonth<=12 && currentMonth>1) { currentMonth--; } /*如果月份為1,則減1后,到上一年,月份變?yōu)?2*/ else { currentYear--; currentMonth=12; } } /*上移鍵,增加年份*/ if(key==UP){ currentYear++;} /*下移鍵,減少年份*/ if(key==DOWN){ currentYear--;} /*上移鍵,減少天數(shù)*/ if(key==PAGEUP){ /*當(dāng)前日不是該月的第一天,則天數(shù)直接減1*/ if(currentDay!=1) { currentDay--; } /*當(dāng)前日是該月的第一天,并且是該年的第一個(gè)月(即1月1日),則天數(shù)減1后,變?yōu)樯弦荒甑淖詈笠粋€(gè)月的最后一天(即12月31日)*/ else if(currentDay==1 && currentMonth==1) { currentYear--; currentMonth=12; currentDay=31; } /*當(dāng)前日是該年中某一個(gè)月的第一天,則天數(shù)減一后,變?yōu)樯蟼€(gè)月的最后一天*/ else { currentMonth--; currentDay=n_lastMon; } } /*下移鍵,增加天數(shù)*/ if(key==PAGEDOWN){ /*當(dāng)前日不是該月的最后一天,則天數(shù)直接加1*/ if(n_currentMon!=currentDay) { currentDay++; } /*當(dāng)前日是該年的最后一天(即12月31日),則天數(shù)加1后,變?yōu)橄乱荒甑牡谝粋€(gè)月的第一天(即1月1日)*/ else if(n_currentMon==currentDay && currentMonth==12) { currentYear++; currentMonth=1; currentDay=1; } /*當(dāng)前日是該年中某一個(gè)月的最后一天,則天數(shù)加1后,變?yōu)橄聜€(gè)月的第一天*/ else { currentMonth++; currentDay=1; } } /*Q或者q鍵,表示查詢指定日期的星期*/ if(key==QLOWER||key==QUPPER){ { printf(”Input date(eg,%d-%d-%d):“,sysTime.da_year,sysTime.da_mon,sysTime.da_day); scanf(”%d-%d-%d“,¤tYear,¤tMonth,¤tDay); checkDate(); } } /*空格鍵,重置到系統(tǒng)日期*/ if(key==SPACE) { currentYear=sysTime.da_year; currentMonth=sysTime.da_mon; currentDay=sysTime.da_day; } /*Esc鍵退出系統(tǒng)*/ if(key==ESC) { printf(”Do you really want to quit?(Y/N)“); ch=getchar(); if(ch=='y'||ch=='Y') break; } showCalendar(currentYear,currentMonth,currentDay); } } void printtext(unsigned char *temp[],int i){ setcolor(4); /*設(shè)置顏色*/ settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);/*設(shè)置字符的字體,方向和大小*/ outtextxy(100,40+i*50,temp[i]); /*在所指定的坐標(biāo)出顯示字符串*/ } /*主函數(shù)*/ void main(){ int i,graphdriver,graphmode; unsigned char *temp[4]; int freq[96]={659,587,659,587,659,494,587,523,440,330,440,494,330,494,523,659,587,659,587,659,494,587,523,440,330,440,494,330,523,494,440,440,494,523,587,659,659,330,699,659,587,587,330,659,587,523,523,330,587,523,494,494}; int dely[96]={50,50,50,50,50,50,50,50,100,50,50,100,50,50,100,50,50,50,50,50,50,50,50,100,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100}; graphdriver=DETECT; graphmode=0; temp[0]=”Welcome!“; temp[1]=”Please press any key to start the music......“; temp[2]=”Do you like it?“; temp[3]=”Press any key to end the music!“; temp[4]=”Welcome to calendar“; initgraph(&graphdriver,&graphmode,”"); /*系統(tǒng)初始化*/ cleardevice(); /*清除屏幕*/ settextjustify(LEFT_TEXT,CENTER_TEXT); /*設(shè)置字符排列方式*/ for(i=0;i<2;i++) printtext(temp,i); getch(); for(i=2;i<4;i++) printtext(temp,i); i=0; while(i<96&&!kbhit()) { sound(freq[i]); /*揚(yáng)聲器根據(jù)頻率發(fā)聲*/ delay(1100*dely[i]); /*聲音延時(shí)*/ i++; } nosound(); /*關(guān)閉揚(yáng)聲器*/ printtext(temp,4); getch(); closegraph(); welcome(); window(1,1,80,25); textbackground(0); textcolor(WHITE); /*清除文本模式窗口*/ clrscr(); /*設(shè)置屏幕顯示方式*/ _AL=03; _AH=0; geninterrupt(0x10); getdate(&sysTime); getKeyValue();} /*關(guān)閉圖形模式*/ C語言課程設(shè)計(jì)報(bào)告 Experiment Designing reporter 課程名稱 : C語言課程設(shè)計(jì) 英文名稱 : C Program Experiment Designing 專 業(yè) : 學(xué) 號 : 姓 名 : 指導(dǎo)教師 : 日 期: 2011年7月18日 至2011年7月22日 《C語言課程設(shè)計(jì)》報(bào)告 C Program Experiment Designing 課程編號:01200308005 學(xué)時(shí): 40學(xué)時(shí) 適用專業(yè):軟件工程專業(yè) 授課單位:軟件學(xué)院 一、C語言課程設(shè)計(jì)目的及要求 目的: 根據(jù)課堂講授內(nèi)容,學(xué)生做相應(yīng)的自主練習(xí),消化課堂所講解的內(nèi)容;通過調(diào)試典型例題或習(xí)題積累調(diào)試C程序的經(jīng)驗(yàn);通過完成輔導(dǎo)教材中的編程題,逐漸培養(yǎng)學(xué)生的編程能力、用計(jì)算機(jī)解決實(shí)際問題的能力。 要求: 1. 熟悉Turbo C 的編程環(huán)境、主要菜單功能。 2. 通過上機(jī)驗(yàn)證運(yùn)算符、表達(dá)式、運(yùn)算規(guī)則、函數(shù)使用。3. 熟練使用C語言的典型語句編寫簡單程序。4. 調(diào)試典型例題或習(xí)題。5. 提高上機(jī)編程能力 二、實(shí)驗(yàn)類型 設(shè)計(jì)類型 三、實(shí)驗(yàn)學(xué)時(shí) 40學(xué)時(shí) 四、實(shí)驗(yàn)設(shè)備 微型計(jì)算機(jī)、WINDOWS98以上版本的操作系統(tǒng)、Turbo C2.0 軟件一套 五、C語言課程參考教材: 1.李瑞 C語言程序基礎(chǔ)(第二版)清華大學(xué)出版社 2.梁旭 C語言課程設(shè)計(jì).電子工業(yè)出版社 課程設(shè)計(jì)(報(bào)告)任務(wù)書 任務(wù)及要求: 1.設(shè)計(jì)(研究)內(nèi)容和要求 研究內(nèi)容:C語言課程設(shè)計(jì)題目相關(guān)內(nèi)容 任務(wù)和要求: (1).學(xué)習(xí)C語言基礎(chǔ)知識,掌握C語言編程和程序調(diào)試的基本技能。(2).對指導(dǎo)教師下達(dá)的題目進(jìn)行系統(tǒng)分析。(3).根據(jù)分析結(jié)果完成系統(tǒng)設(shè)計(jì)。 (4).編程:在計(jì)算機(jī)上實(shí)現(xiàn)題目的代碼實(shí)現(xiàn)。(5).完成對該系統(tǒng)的測試和調(diào)試。(6).提交課程設(shè)計(jì)報(bào)告。(7).指標(biāo): 要求完成課程設(shè)計(jì)報(bào)告3千字以上(約二、三十頁).完成若干綜合性程序設(shè)計(jì)題目,每個(gè)綜合設(shè)計(jì)題目的語句行數(shù)的和在300行語句以上.2.原始依據(jù) 了解C語言的基礎(chǔ)知識,有一定的語言編程基礎(chǔ),能夠熟練運(yùn)用C語言進(jìn)行程序設(shè)計(jì)。通過用C語言完成的題目,提高用C語言解決實(shí)際問題的能力。3.參考文獻(xiàn) [1] 黃明等.C語言程序設(shè)計(jì)輔導(dǎo)教材.大連理工大學(xué)出版社,2006 [2] 馬靖善等.C語言程序設(shè)計(jì).清華大學(xué)出版社,2005 [3] 譚浩強(qiáng).C語言程序設(shè)計(jì)(第二版).北京:高等教育出版社,2002 目錄 C語言課程設(shè)計(jì)報(bào)告................................................................................錯(cuò)誤!未定義書簽。 1. 輸出楊輝三角.............................................................................................................1 1.1 系統(tǒng)分析..............................................................................................................1 1.2 設(shè)計(jì)說明..............................................................................................................1 1.3 程序運(yùn)行截圖......................................................................................................2 1.4 源程序代碼..........................................................................................................2 2 漢諾塔求解方法.............................................................................................................3 2.1 系統(tǒng)分析..............................................................................................................3 2.2 設(shè)計(jì)說明..............................................................................................................3 2.3 程序運(yùn)行截圖......................................................................................................4 2.4 源程序代碼..........................................................................................................4 3 輸出200以內(nèi)的素?cái)?shù).....................................................................................................5 3.1功能說明...............................................................................................................5 3.2 設(shè)計(jì)說明..............................................................................................................5 3.3 程序運(yùn)行截圖......................................................................................................5 3.4 源程序代碼..........................................................................................................6 4 進(jìn)制轉(zhuǎn)換計(jì)算器.............................................................................................................6 4.1功能說明...............................................................................................................6 4.2 設(shè)計(jì)說明..............................................................................................................6 4.3程序運(yùn)行截圖.......................................................................................................7 4.4 源程序代碼..........................................................................................................7 5 一元稀疏多項(xiàng)式.............................................................................................................8 5.1 功能說明..............................................................................................................8 5.2 設(shè)計(jì)說明..............................................................................................................8 5.3 程序運(yùn)行截圖....................................................................................................10 5.4 源程序代碼........................................................................................................11 1. 輸出楊輝三角 1.1 系統(tǒng)分析 以等腰直角三角形輸出楊輝三角 1.2 設(shè)計(jì)說明 1、包含頭文件 #include #include 其中,頭文件 2、子函數(shù) 函數(shù)名:int num(i,j) 函數(shù)功能:以遞歸的方式進(jìn)行計(jì)算,用函數(shù)代替二維數(shù)組 函數(shù)參數(shù):int i;int j; 含義:相當(dāng)于二維數(shù)組的a[i][j] 函數(shù)流程 Step1:輸出最外行,即三角形兩直角邊的結(jié)果都為 1 ; Step2:討論其余情況,相當(dāng)于數(shù)組中的 a[i][j] = a[i-1][j-1] + a[i-1][j]。 3、main()函數(shù) 1為保證結(jié)果完整輸出,先進(jìn)行清屏; ○2輸入要打印的行數(shù),由于一行只能顯示80個(gè)字符,建議不要超過13行; ○3用循環(huán)調(diào)用函數(shù)int num(int i , int j)○ 其中循環(huán)為三重循環(huán):i 循環(huán)控制行打印 j 循環(huán)控制列打印 k 循環(huán)控制空格打印 每執(zhí)行一次i 循環(huán)輸出一個(gè)換行符,直角三角形定點(diǎn)放在第36個(gè)字符的位置上。 每個(gè)數(shù)字占6個(gè)字符的格。 1.3 程序運(yùn)行截圖 1.4 源程序代碼 #include int num(i,j){ int i,j; if(I == j ||j == 0)return(1); else return(num(i-1 , j-1)+num(i-1 , j));} int main(void){ int n,k,i,j; clrscr(); puts(“input row n:”); scanf(“%d”,&n); for(i = 0;i < n;i++) { { for(k = 0;k < 36-3*i;k++) putchar(' '); } { for(j = 0;j <= i;j++) printf(“%6d”,num(i , j)); } puts(“"); } getch(); return 0; } 漢諾塔求解方法 2.1 系統(tǒng)分析 漢諾塔求解方法 2.2 設(shè)計(jì)說明 1、包含頭文件: #include 其中,#include 2、子函數(shù) 函數(shù)名:void move(int n , char a , char b) 函數(shù)功能:打印移動的主子編號 函數(shù)參數(shù):int n , char a , char b; 含義:n為移動的序數(shù),a為源柱號,b目的柱號 函數(shù)流程 Step1:輸出盤子移動情況; Step2:打印換行。 函數(shù)名:void hanoi(int n,char a,char b,char c) 函數(shù)功能:以游戲規(guī)則求解移動盤子的方法 函數(shù)參數(shù):int n,char a,char b,char c; 含義:n移動的序數(shù),a為源柱號,b為目的柱號,c為中間柱號 函數(shù)流程 Step1:遞歸調(diào)用函數(shù) hanoi(n-1,a,c,b); Step2:調(diào)用函數(shù)move(n-1,a,b); Step3:繼續(xù)遞歸調(diào)用函數(shù)hanoi(n-1,c,b,a); 3、主函數(shù)main()1為了使程序可以重復(fù)運(yùn)行,定義了變量ch,當(dāng)ch == N 時(shí),退出游戲; ○2使用while()循環(huán)使游戲重復(fù)運(yùn)行; ○3輸入盤子的數(shù)目以調(diào)整游戲的難度; ○3調(diào)用函數(shù)hanoi()○ 2.3 程序運(yùn)行截圖 2.4 源程序代碼 #include ”stdio.h“ #include ”ctype.h“ //應(yīng)用函數(shù)toupper void move(int n,char a,char b) //n為移動的序數(shù),a為源柱號,b目的柱號*/ { printf(”Disc%d move from %c to %c;“,(n+1),a,b); printf(”n“);} void hanoi(int n,char a,char b,char c){ //n移動的序數(shù),a為源柱號,b為目的柱號,c為中間柱號 if(n>0) { hanoi(n-1,a,c,b); //遞歸調(diào)用 move(n-1,a,b); hanoi(n-1,c,b,a); } } main(){ int n; char ch ='Y'; printf(”Now let us play the game of hanoitowern“); while(ch == 'Y') //通用性設(shè)計(jì) { printf(”n Input the number of disc[2-15]:“); scanf(”%d“,&n);getchar(); printf(”n The orders of moving %d discs from A to B are:n“,n); hanoi(n,'A','B','C'); //調(diào)用函數(shù) printf(”n Continue(Y/N):“); ch=getchar(); getchar(); ch=toupper(ch);} return 0;} 3 輸出200以內(nèi)的素?cái)?shù) 3.1功能說明 輸出200以內(nèi)的素?cái)?shù) 3.2 設(shè)計(jì)說明 1、宏定義 #define M 200 //范圍,表示輸出200以內(nèi)的素?cái)?shù) #define N((M+1)/2) //奇數(shù)的個(gè)數(shù) 處理流程: Step1:第一步篩選掉所有的偶數(shù),將剩余的奇數(shù)存放在a[N]中; Step2:第二部篩選掉多有可以被整除的數(shù) Step3:將得到的素?cái)?shù)10個(gè)一行打印。 3.3 程序運(yùn)行截圖 3.4 源程序代碼 #include ”stdio.h“ #define M 200 //范圍 #define N((M+1)/2) //奇數(shù)的個(gè)數(shù) main(){ int i,j,a[N]; a[0]=2; for(i=1;i //初始數(shù)組實(shí)現(xiàn)第一步篩選 a[i]=2*i+1; for(i=1;i<(N-1);i++) //第二步篩選 if(a[i]!=0) for(j=i+1;j if((a[j]%a[i]==0)) //倍數(shù)時(shí)置零篩去 a[j]=0; printf(”n The primer are[2-%d]:n“,M); for(i=0,j=0;i //顯示得到素?cái)?shù) { if(a[i]!=0) { printf(”%5d“,a[i]); if((++j)%10==0) //十個(gè)數(shù)換行 printf(”n“); } } return 0;} 進(jìn)制轉(zhuǎn)換計(jì)算器 4.1功能說明 進(jìn)行進(jìn)制轉(zhuǎn)換。 4.2 設(shè)計(jì)說明 1、處理流程: Step1:輸入原始數(shù)值xa,原始權(quán)a,已經(jīng)希望轉(zhuǎn)換的進(jìn)制b;Step2:逐位取值,將原始數(shù)值轉(zhuǎn)換成10進(jìn)制 Step3:逐位取值,將原始數(shù)值轉(zhuǎn)換成b 進(jìn)制 4.3程序運(yùn)行截圖 4.4 源程序代碼 void main()#include ”stdio.h“ main() { int a=0,/*原始進(jìn)制*/ b=8,/*轉(zhuǎn)換進(jìn)制,默認(rèn)為八*/ k=1; /*位權(quán)*/ long xa=0,/*原始數(shù)值*/ xb=0,/*轉(zhuǎn)換數(shù)值*/ x1=0,x2=0; /*十進(jìn)制數(shù)值*/ printf(”n Input the number and weight a->b:“); scanf(”%ld%d%d“,&xa,&a,&b); x1=xa; while(x1!=0) /*轉(zhuǎn)換為十進(jìn)制數(shù)*/ { x2+=(x1%10)*k; /*逐位取值*/ x1/=10;k*=a; } k=1; x1=x2; while(x1!=0) /*轉(zhuǎn)換為b進(jìn)制數(shù)*/ { xb+=(x1%b)*k;x1/=b;k*=10; } printf(”n %ld(%d)=%ld(%d)=%ld(%d)“,xa,a,x2,10,xb,b); return;} 一元稀疏多項(xiàng)式 5.1 功能說明 求一元稀疏多項(xiàng)式的運(yùn)算: 1、求兩多項(xiàng)式加法; 2、求兩多項(xiàng)式減法; 3、求兩多項(xiàng)式乘法; 4、求兩多項(xiàng)式導(dǎo)數(shù); 5、求兩多項(xiàng)式在x=m處的值。 5.2 設(shè)計(jì)說明 1、鏈表結(jié)點(diǎn)的定義: typedef struct polyn { float coef; //多項(xiàng)式系數(shù) int expn; //多項(xiàng)式指數(shù) struct polyn * prior,* next;} polyn, *linkpolyn; 2、子函數(shù),多項(xiàng)式的基本運(yùn)算。函數(shù)名:linkpolyn CREATEPOLYN()函數(shù)功能:創(chuàng)建多項(xiàng)式鏈表,在輸入的時(shí)候進(jìn)行升序排列 返回值:return head,即建立的多項(xiàng)式頭結(jié)點(diǎn) 參數(shù):linkpolyn head,含義:鏈表頭結(jié)點(diǎn) 處理流程: Step1:輸入第一個(gè)結(jié)點(diǎn),且第一個(gè)結(jié)點(diǎn)自然有序; Step2:循環(huán)輸入其余結(jié)點(diǎn),當(dāng)輸入0 0是表示輸入結(jié)束; Step3:輸入過程中進(jìn)行升冪排序,用二分法,找到新結(jié)點(diǎn)插入點(diǎn); Step4:插入新結(jié)點(diǎn);繼續(xù)循環(huán),直到輸入0 0,循環(huán)結(jié)束,鏈表建立成功。Step5:返回建立鏈表頭結(jié)點(diǎn),函數(shù)結(jié)束。 函數(shù)名:linkpolyn DERIVATIONPOLYN(linkpolyn L)函數(shù)功能:多項(xiàng)式求導(dǎo) 返回值:return(head),即求導(dǎo)多項(xiàng)式的鏈表頭結(jié)點(diǎn) 參數(shù):linkpolyn L,含義:把建立好的鏈表A和B傳遞給L 處理流程: Step1:分別用指針指向L的頭結(jié)點(diǎn)和求導(dǎo)多項(xiàng)式的頭結(jié)點(diǎn)head; Step2:用循環(huán)逐個(gè)對L鏈表中的結(jié)點(diǎn)求導(dǎo),一次存放在求導(dǎo)多項(xiàng)式中的新結(jié)點(diǎn)中; Step3:循環(huán)中考慮,當(dāng)L鏈表中的結(jié)點(diǎn)僅存放一個(gè)常數(shù),則跳過該結(jié)點(diǎn),繼續(xù)遍歷下一結(jié)點(diǎn); Step4:當(dāng)循環(huán)結(jié)束,即L中的各項(xiàng)以被求導(dǎo),返回求導(dǎo)多項(xiàng)式頭結(jié)點(diǎn)head。 函數(shù)名:linkpolyn INITPOLYN()函數(shù)功能:鏈表初始化 返回值:return(head),即求導(dǎo)多項(xiàng)式生成的鏈表頭結(jié)點(diǎn) 參數(shù):無參數(shù) 處理流程: Step1:生成一個(gè)新的空間作為新結(jié)點(diǎn); Step2:將新節(jié)點(diǎn)的coef域賦0,expn域賦-1,以區(qū)分其他節(jié)點(diǎn); Step3:將頭結(jié)點(diǎn)的前去指針和后即指針置空,并返回頭結(jié)點(diǎn)。 函數(shù)名:void PRINTLIST(linkpolyn head)函數(shù)功能:以類數(shù)學(xué)表達(dá)式的形式打印 返回值:無返回值 參數(shù):linkpolyn head,含義:處理過的鏈表頭結(jié)點(diǎn) 處理流程: Step1:討論是否鏈表為空,若為空,則輸出0; Step2:若鏈表不為空,則輸出第一個(gè)值,第一個(gè)值不用輸出符號; Step3:用循環(huán)依次輸出其余各項(xiàng),附加符號輸出; 函數(shù)名:linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B)函數(shù)功能:加法運(yùn)算 返回值:return ptr,即和多項(xiàng)式的頭結(jié)點(diǎn) 參數(shù):linkpolyn A , linkpolyn B,含義:創(chuàng)建的鏈表A和B 處理流程: Step1:分別以兩個(gè)指針pa和pb遍歷鏈表A和B; Step2:當(dāng)A和B兩鏈表都為遍歷完畢時(shí),進(jìn)行加法運(yùn)算,分配新的空間存放和多項(xiàng)式,并用二分法進(jìn)行升冪排序; Step3:當(dāng)A遍歷完畢而B未遍歷完畢,將B其余各項(xiàng)拷貝到 和多項(xiàng)式鏈表中; Step4:當(dāng)B遍歷完畢而A未遍歷完畢,將A其余各項(xiàng)拷貝到 和多項(xiàng)式鏈表中; 函數(shù)名:linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B)函數(shù)功能:計(jì)算A-B的值 返回值:return ptr,即差多項(xiàng)式的頭結(jié)點(diǎn) 參數(shù):linkpolyn A , linkpolyn B,含義:創(chuàng)建的鏈表A和B 處理流程: Step1:分別以兩個(gè)指針pa和pb遍歷鏈表A和B; Step2:當(dāng)A和B兩鏈表都為遍歷完畢時(shí),進(jìn)行減法運(yùn)算,分配新的空間存放和多項(xiàng)式,并用二分法進(jìn)行升冪排序; Step3:當(dāng)A遍歷完畢而B未遍歷完畢,將B其余各項(xiàng)拷貝到 和多項(xiàng)式鏈表中; Step4:當(dāng)B遍歷完畢而A未遍歷完畢,將A其余各項(xiàng)拷貝到 差多項(xiàng)式鏈表中; Step5:返回多項(xiàng)式頭結(jié)點(diǎn) 函數(shù)名:float WORK(float x,int e)函數(shù)功能:求x的冪 返回值:return t,即計(jì)算冪結(jié)果 參數(shù):float x,int e,含義:x為輸入的x的值,e為x的指數(shù) 處理流程: Step1:分別討論正指數(shù)與負(fù)指數(shù)的的情況; Step2:若e>0,則累乘e次x; Step3:若e<0,則累除e次x;; Step4:將所求結(jié)果返回; 3、主函數(shù)main()Step1:依次調(diào)用函數(shù)進(jìn)行運(yùn)算操作; Step2:調(diào)用函數(shù)創(chuàng)建鏈表; Step3:調(diào)用函數(shù)進(jìn)行運(yùn)算; 5.3 程序運(yùn)行截圖 5.4 源程序代碼 #include ”stdio.h“ #include typedef struct polyn { float coef;//多項(xiàng)式系數(shù) int expn;//多項(xiàng)式指數(shù) struct polyn * prior,* next;} polyn, *linkpolyn; void DESTROYPOLYN(linkpolyn head){ //銷毀鏈表 linkpolyn s,p;p=head; while(p->next!= NULL){ s = p; p = p->next; free(s);} } //DESTROYPOLYN linkpolyn INITPOLYN(){ //鏈表初始化 struct polyn * head;head=(linkpolyn)malloc(sizeof(polyn));head->coef=0.0;//假設(shè)頭結(jié)點(diǎn)系數(shù)為0 head->expn=-1;//假設(shè)頭結(jié)點(diǎn)指數(shù)為-1 head->next=NULL;head->prior=NULL;return head;} //INITPOLYN void INSERTPOLYN(linkpolyn p,linkpolyn s){ //將結(jié)點(diǎn)s插入到p之后 if(NULL!= p->next){ s->next = p->next; s->next->prior = s;} s->prior = p;p->next = s; } //INSERPOLYN linkpolyn CREATEPOLYN(){ //創(chuàng)建多項(xiàng)式鏈表,在輸入的時(shí)候進(jìn)行升序排列 linkpolyn head,s,p,m,r; int num = 1;//計(jì)數(shù)器 head = INITPOLYN();//初始化鏈表 head r = head;//設(shè)置為指針 s=(linkpolyn)malloc(sizeof(polyn)); /******************************************/ printf(”請輸入第%d項(xiàng)系數(shù)和指數(shù):“,num);/**輸入第一個(gè)結(jié)點(diǎn),并且第一個(gè)結(jié)點(diǎn)自然有序**/ scanf(”%f%d“,&s->coef,&s->expn);/******************************************/ r->next = s;s->prior = r;r = r->next;//r指向尾結(jié)點(diǎn) r->next = NULL;p = r;//p為s的插入點(diǎn)前一個(gè)結(jié)點(diǎn) m = r;//m為拍完結(jié)點(diǎn)中間的節(jié)點(diǎn),二分法排序 while(++num)//while # 當(dāng)將 s->coef 與 s->expn 都賦值為0的時(shí)候,認(rèn)為輸入結(jié)束 { s =(linkpolyn)malloc(sizeof(polyn));printf(”請輸入第%d項(xiàng)系數(shù)和指數(shù):“,num);scanf(”%f%d“,&s->coef,&s->expn); if((fabs(s->coef)<= FZ)&&(s->expn == 0))//if @ { free(s); break; } //else @ else //else @ { if(s->expn <= p->expn)//if # { while(p->prior!= NULL && p->expn > s->expn) p = p->prior;//p向前遍歷鏈表,找到插入點(diǎn) if(s->expn == p->expn) { p->coef += s->coef; free(s); r=r; } else { INSERTPOLYN(p,s);//在p后面插入結(jié)點(diǎn)s m = m->prior; p = m; } } // if # else //else # { while(p->next!= NULL && p->next->expn < s->expn) p = p->next;//p向后遍歷鏈表,找到插入點(diǎn) if(s->expn == p->expn) { p->coef += s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r = r->next; r->next = NULL; } } } //else # } //else @ } //while # return head;} //CREATEPOLYN void PRINTPOLYN(linkpolyn head){ //以類數(shù)學(xué)表達(dá)式的形式打印 linkpolyn p; p = head->next;if(p == NULL)//鏈表為空 puts(”0“);else //else @ { //鏈表不為空,輸出第一個(gè)結(jié)點(diǎn)的值 if(p->expn == 0)printf(”%f“,p->coef);//指數(shù)為0時(shí)不輸出x else { if(p->coef==1)printf(”x^%d“,p->expn);/**************************/ else if(p->coef ==-1)printf(”-x^%d“,p->expn);/**第一項(xiàng)前不需要輸出符號**/ else printf(”%gx^%d“,p->coef,p->expn);/**************************/ } p = p->next;while(p!= NULL) { //依次輸出以后各節(jié)點(diǎn) if(p->coef>0) { //當(dāng)系數(shù)為正時(shí),討論輸出符號問題 if(p->expn == 0)printf(”+%g“,p->coef);else if(p->coef == 1)printf(”+x^%d“,p->expn);else printf(”+%gx^%d“,p->coef,p->expn); } else { //當(dāng)系數(shù)為負(fù)時(shí),討論輸出符號問題 if(p->expn == 0)printf(”%g“,p->coef);else if(p->coef ==-1)printf(”-x^%d“,p->expn);else printf(”%gx^%d“,p->coef,p->expn); } p = p->next; } } //else @ } //PRINTPOLYN linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B){ //加法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多項(xiàng)式頭結(jié)點(diǎn)初始化 ptr = q;//ptr指向和多項(xiàng)式頭結(jié)點(diǎn) while((qa!= NULL)&&(qb!= NULL)){ //升冪求和 if(qa->expn == qb->expn)//指數(shù)相同的項(xiàng) { x = qa->coef + qb->coef;//系數(shù)相加 if(x!= 0)//求得系數(shù)非0 { q->next =(linkpolyn)malloc(sizeof(polyn));// q = q->next; q->coef = x; q->expn = qa->expn; } 生成和多項(xiàng)式的節(jié)結(jié)點(diǎn) qa = qa->next; qb = qb->next; } else //指數(shù)不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q = q->next; if(qa->expn > qb->expn)//A多項(xiàng)式當(dāng)前指數(shù)大于B { q->coef = qb->coef;//B多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qb->expn; qb = qb->next; } else //B多項(xiàng)式當(dāng)前指數(shù)大于A { q->coef = qa->coef;//A多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一個(gè)多項(xiàng)式已經(jīng)處理完畢 while(qa!= NULL)//A未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qb->coef; q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多項(xiàng)式最末的節(jié)點(diǎn)指向頭結(jié)點(diǎn) return ptr;//返回多項(xiàng)式頭指針 } //LINKPOLYN linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B){ //減法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多項(xiàng)式頭結(jié)點(diǎn)初始化 ptr = q;//ptr指向和多項(xiàng)式頭結(jié)點(diǎn) while((qa!= NULL)&&(qb!= NULL)){ //升冪求差 if(qa->expn == qb->expn)//指數(shù)相同的項(xiàng) { x = qa->coef-qb->coef;//多項(xiàng)式A的系數(shù)減去B的系數(shù) if(x!= 0)//求得系數(shù)非0 { q->next =(linkpolyn)malloc(sizeof(polyn));//生成和多項(xiàng)式的節(jié)結(jié)點(diǎn) q = q->next; q->coef = x; q->expn = qa->expn; } qa = qa->next; qb = qb->next; } else //指數(shù)不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q=q->next; if(qa->expn > qb->expn)//A多項(xiàng)式當(dāng)前指數(shù)大于B { q->coef =-(qb->coef);//B多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qb->expn; qb = qb->next; } else //B多項(xiàng)式當(dāng)前指數(shù)大于A { q->coef = qa->coef;//A多項(xiàng)式當(dāng)前的值復(fù)制到和多項(xiàng)式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一個(gè)多項(xiàng)式已經(jīng)處理完畢 while(qa!= NULL)//A未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未處理完畢,將其余各項(xiàng)復(fù)制到和多項(xiàng)式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef =-(qb->coef); q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多項(xiàng)式最末的節(jié)點(diǎn)指向頭結(jié)點(diǎn) return ptr;//返回多項(xiàng)式頭指針 } //SUBTRACTPOLYN linkpolyn MULTIPLYPOLYN(linkpolyn A,linkpolyn B){ //乘法 linkpolyn pa,pb,s,head,m,r,p;pa = A->next;pb = B->next;head = INITPOLYN();r = head; s=(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef;//計(jì)算第一個(gè)結(jié)點(diǎn),并且第一個(gè)結(jié)點(diǎn)自然有序 s->expn = pa->expn + pb->expn;r->next = s;s->prior = r;r =r->next;r->next = NULL;p=r;//p為插入點(diǎn)前一結(jié)點(diǎn) m=r;//m指向排完結(jié)點(diǎn)中間節(jié)點(diǎn) pb=pb->next;// 第一個(gè)乘積處理完畢 for(pa= A->next;pa!= NULL;pa=pa->next)//for pa 處理其余乘積 { //用A的第一個(gè)結(jié)點(diǎn)分別與B的其余結(jié)點(diǎn)相乘 if(pa == A->next) pb = B->next->next; else pb = B->next; for(;pb!= NULL;pb = pb->next)//for pb { s =(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef; s->expn = pa->expn + pb->expn;if(s->expn <= p->expn)//if # { while(p->prior!=NULL && p->expn > s->expn)p=p->prior;//p向前遍歷鏈表,找到插入點(diǎn) if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s);//在p后面插入結(jié)點(diǎn)s m=m->prior; p=m; } } // if # else //else # { while(p->next!=NULL && p->next->expn < s->expn) p=p->next;//p向前遍歷鏈表,找到插入點(diǎn) if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r=r->next; r->next=NULL; } } } //else # } //for pb } //for pa return head;} //MULTIPLYPOLYN linkpolyn DERIVATIONPOLYN(linkpolyn L){ //多項(xiàng)式求導(dǎo) linkpolyn head,p,s,r;head = INITPOLYN();//head為求導(dǎo)多項(xiàng)式頭結(jié)點(diǎn) r = head;p = L->next;while(p!= NULL){ if(p->expn == 0) { p = p->next;continue;} s =(linkpolyn)malloc(sizeof(polyn));s->coef = p->coef * p->expn;s->expn = p->expn-1;s->prior = r; r->next = s; r = r->next; r->next = NULL; p = p->next;} return(head);} //DERIVATIONPOLYN float WORK(float x,int e){ //求x的冪 float t = 1;if(e>0){ while(e) { t *= x;e--;} } if(e<0){ while(e) { t *= 1/x;e++;} } return(t);} //WORK float CALCULATEPOLYN(linkpolyn head,float x){ //計(jì)算多項(xiàng)式在x處的值 float t = 0;linkpolyn p;p = head->next;while(p){ t = t +((p->coef)*(WORK(x,p->expn)));p = p->next;} return(t);} //CALCULATEPOLYN int main(void){ linkpolyn A, B,addp,decp,mulp,derp1,derp2;int i;float x;start: system(”cls“);printf(”一元稀疏多項(xiàng)式計(jì)算nn“);printf(”1.建立多項(xiàng)式n“);printf(”2.多項(xiàng)式加法n“);printf(”3.多項(xiàng)式減法n“);printf(”4.多項(xiàng)式乘法n“);printf(”5.計(jì)算多項(xiàng)式在x處的值n“);printf(”6.對多項(xiàng)式求導(dǎo)n“);printf(”7.清空數(shù)據(jù)n“);printf(”8.關(guān)閉計(jì)算器n“);printf(”請輸入選項(xiàng)(1~7):“);scanf(”%d“,&i);switch(i){ case(1): system(”cls“);printf(”建立多項(xiàng)式nn“);printf(”建立多項(xiàng)式A,當(dāng)輸入0 0 時(shí)表示出入完畢n“);A = CREATEPOLYN();printf(”建立多項(xiàng)式成功n“);printf(”建立多項(xiàng)式B,當(dāng)輸入0 0 時(shí)表示出入完畢n“);B = CREATEPOLYN();printf(”建立多項(xiàng)式成功n“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B); printf(”nn輸入回車返回上一級“);getchar();getchar();goto start;case(2): system(”cls“);printf(”多項(xiàng)式加法nn“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);addp = ADDPOLYN(A,B);printf(”多項(xiàng)式A+B:“);PRINTPOLYN(addp);printf(”n“);printf(”nn輸入回車返回上一級“);getchar();getchar();goto start;case(3): system(”cls“);printf(”多項(xiàng)式減法nn“);printf(”多項(xiàng)式B:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);decp = SUBTRACTPOLYN(A,B);printf(”多項(xiàng)式A-B:“);PRINTPOLYN(decp);printf(”n“);printf(”nn輸入回車返回上一級“);getchar();getchar();goto start;case(4): system(”cls“);printf(”多項(xiàng)式乘法nn“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);mulp = MULTIPLYPOLYN(A,B);printf(”多項(xiàng)式AB:“);PRINTPOLYN(mulp);printf(”n“);printf(”nn輸入回車返回上一級“); getchar();getchar();goto start;case(5): system(”cls“);printf(”計(jì)算多項(xiàng)式在x處的值n“);printf(”請輸入x的值:“);scanf(”%f“,&x);printf(”n多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n值為:%f“,CALCULATEPOLYN(A,x));printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n值為:%f“,CALCULATEPOLYN(B,x));printf(”nn輸入回車返回上一級“);getchar();getchar();goto start;case(6): system(”cls“);printf(”多項(xiàng)式求導(dǎo)n“);printf(”多項(xiàng)式A:“);PRINTPOLYN(A);printf(”n“);printf(”多項(xiàng)式B:“);PRINTPOLYN(B);printf(”n“);derp1 = DERIVATIONPOLYN(A);printf(”求導(dǎo)后A':“);PRINTPOLYN(derp1);printf(”n“);derp2 = DERIVATIONPOLYN(B);puts(”求導(dǎo)后B':“);PRINTPOLYN(derp2);printf(”nn輸入回車返回上一級“);getchar();getchar();goto start;case(7): system(”cls“);DESTROYPOLYN(A);DESTROYPOLYN(B);DESTROYPOLYN(addp);DESTROYPOLYN(decp);DESTROYPOLYN(mulp);DESTROYPOLYN(derp1);DESTROYPOLYN(derp2);printf(”已清空所有數(shù)據(jù)n“);printf(”nn輸入回車返回上一級“);getchar();getchar(); goto start;case(8): printf(”退出");} return(0);} 目錄 1前言..............................................................1 2正文..............................................................1 2.1設(shè)計(jì)目的........................................................1 2.2設(shè)計(jì)意義........................................................1 2.3設(shè)計(jì)方案與內(nèi)容..................................................2 2.3.1設(shè)計(jì)內(nèi)容......................................................2 2.3.2程序調(diào)試......................................................4 3致謝..............................................................7 4參考文獻(xiàn)..........................................................7 5附錄..............................................................8 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 前言 17世紀(jì)初,西方國家的計(jì)算工具有了較大的發(fā)展,英國數(shù)學(xué)家納皮爾發(fā)明的“納皮爾算籌”,英國牧師奧卻德發(fā)明了圓柱型對數(shù)計(jì)算尺,這種計(jì)算尺不僅能做加減乘除、乘方、開方運(yùn)算,甚至可以計(jì)算三角函數(shù),指數(shù)函數(shù)和對數(shù)函數(shù),這些計(jì)算工具不僅帶動了計(jì)算器的發(fā)展,也為現(xiàn)代計(jì)算器發(fā)展奠定了良好的基礎(chǔ),成為現(xiàn)代社會應(yīng)用廣泛的計(jì)算工具. 1642年,年僅19歲的法國偉大科學(xué)家帕斯卡引用算盤的原理,發(fā)明了 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 其自身的優(yōu)勢,仍然是一種重要的語言,而且它還是通往c++的必由之路。它是融合了控制特性的的現(xiàn)代語言,其設(shè)計(jì)使得用戶可以自然的采用自頂向下的規(guī)劃、結(jié)構(gòu)化的編程,以及模塊化的設(shè)計(jì)。這種做法使得編寫出的程序更可靠、更易懂。它是一種高級語言,在設(shè)計(jì)上它充分利用了當(dāng)前計(jì)算機(jī)在能力上的優(yōu)點(diǎn)。C程序往往很緊湊且運(yùn)行速度快,其還表現(xiàn)出通常只有匯編語言才具有的精細(xì)控制能力,可以用于電腦cpu的編程控制語言,如果愿意,可以細(xì)調(diào)程序以獲得最大速度或最大內(nèi)存使用率。其可移植性的特點(diǎn),可以使其在不經(jīng)過太大的修改,便可在其它系統(tǒng)上運(yùn)行,同時(shí),它也是很多大型系統(tǒng)的編程語言,(比如說UNIX的操作系統(tǒng)就是建立在c之上的)。 2.3設(shè)計(jì)方案與內(nèi)容 我此次設(shè)計(jì)的是一個(gè)計(jì)算器,主要是利用我們所學(xué)的知識,做到進(jìn)一步掌握c語言的奧秘,使這種功能強(qiáng)大的高級語言走近我們的生活。本計(jì)算系統(tǒng)主要是作加減乘除運(yùn)算。 該計(jì)算系統(tǒng)程序包括:main()函數(shù)、加函數(shù)、減函數(shù)、乘函數(shù)、除函數(shù)和顯示函數(shù)。2.3.1設(shè)計(jì)內(nèi)容 1、加運(yùn)算: int jia(int a,int b){int c;c=a+b;printf(“c=%d n”,c);} 2、減運(yùn)算: int jian(int a,int b){int c;c=a-b;printf(“ c=%d n”,c);} 3、乘運(yùn)算: int cheng(int a,int b){int c;c=a*b;printf(“ c=%d n”,c);} 4、除運(yùn)算: int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} 5、顯示函數(shù)程序: 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*選擇提示*/ printf(“***************************n”);/*分隔號*/ printf(“0:apply overn”);/*輸入0選項(xiàng)則提示結(jié)束,輸出0*/ printf(“1:apply is additionn”);/*選擇加號*/ printf(“2:apply is subtractionn”);/*選擇減號*/ printf(“3: apply is multiplicationn”);/*選擇乘號*/ printf(“4:apply is divisionn”);/*選擇除號*/ } 顯示界面程序圖如圖2-1所示 圖2-1顯示界面 程序分析: 1)printf(“please choose lower level operation sign n”);/*選擇提示*/這句可以根據(jù)需要寫成時(shí)間,一句鼓勵自己的話,或者別的什么,都將不影響改程序的正常運(yùn)行,只要在規(guī)定的“n”里,用戶可以根據(jù)自己的需要把它用一句英文表達(dá)出來。 2)printf(“***************************n”);/*分隔號*/此句無關(guān)緊要,可以去掉也可以保留,看個(gè)人心情,不過個(gè)人建議,還是保留的比較好,它能保持計(jì)算器界面的美觀特點(diǎn),還能作為分隔運(yùn)算程序的作用,讓使用者能最快的對運(yùn)算區(qū)進(jìn)行劃區(qū)。3)printf(“0:apply overn”);/*輸入0選項(xiàng)則提示結(jié)束,輸出0*/此句在運(yùn)算界面里出現(xiàn),當(dāng)用戶使用時(shí),不小心輸入了一個(gè)字符,非1~4以內(nèi),則會提示錯(cuò)誤,按‘enter’結(jié)束該片段,然后根據(jù)提示,選擇自己所希望使用的運(yùn)算符號進(jìn)行運(yùn)算。 4)printf(“1:apply is additionn”);/*選擇加號*/此句是加法運(yùn)算提示,當(dāng)輸入‘1’后按‘enter’會得到可以使用加法的提示,然后就可以使用加法運(yùn)算了,使用空格將數(shù)字與要加的數(shù)字分開,按‘enter’將得到你要的答案。5)printf(“2:apply is subtractionn”);/*選擇減號*/這是加法運(yùn)算提示。它的使用方法和 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 相同。 2.3.2程序調(diào)試 1、加法運(yùn)算 加法運(yùn)算運(yùn)行結(jié)果如圖2-2所示。 圖2-2加法運(yùn)算運(yùn)行結(jié)果 2、減法運(yùn)算 減法運(yùn)算結(jié)果如圖2-3所示。 圖2-3減法運(yùn)算 3、乘法運(yùn)算 乘法運(yùn)算如圖2-4所示。 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 圖2-4乘法運(yùn)算 4、除法運(yùn)算 除法運(yùn)算如圖2-5所示 圖2-5除法運(yùn)算 6、主函數(shù)程序: int main(){ int a, b; 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) for(;;){ xian();switch(getchar()){ case '0':printf(“ tui chu: ”);getchar();return 0;case '1': printf(“ apply is '+': n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jia(a,b);break;case '2':printf(“ apply is '-':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jian(a,b);break;case '3':printf(“apply is '*':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();cheng(a,b);break;case '4':printf(“ apply is '/':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();chu(a,b);break;default:printf(“wrong!please push down'enter' go on with ”);/*提示錯(cuò)誤*/ getchar();break; 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) } } return 0;/*一輪運(yùn)算結(jié)束后返回符號選擇功能選項(xiàng)*/ } 該主函數(shù)程序中使用了xian()函數(shù)、switch(getchar())語句、getchar()、for、break、return。xian()函數(shù)的功能是在程序運(yùn)行中,具有顯示界面的功能。switch(getchar())語句具有多分支選擇功能。getchar()是庫函數(shù)。for循環(huán)語句。是break語句是實(shí)現(xiàn)跳出循環(huán)的功能的語句。Return語句是返回語句,是程序最后一個(gè)語句,在int main(void)中int表示main()函數(shù)的返回值應(yīng)該是一個(gè)整數(shù)。該程序具備的選擇功能: (1)選擇提示:該計(jì)算器編輯界面有5個(gè)提示,它們分別是‘0’、‘1’,‘2’、‘3’、‘4’,當(dāng)使用者在該界面上輸入它們其中一個(gè)數(shù)字,會得到相對應(yīng)的提示,其中1~4分別表示加、減、乘、除運(yùn)算。‘0’表示結(jié)束工作框結(jié)束。 (2)使用方法:進(jìn)入選擇界面后,要選擇加法運(yùn)算,請輸入‘1’,然后按下‘enter’鍵。會得到提示 致謝 在本次課程設(shè)計(jì)中,首先我要感謝張老師。是他至始至終的教導(dǎo)讓我能夠在編程方面迅速的入門。在我們對程序語言的學(xué)習(xí)過程中,是他不斷的給我們講解語句內(nèi)容并且糾正我們存在的錯(cuò)誤。不斷的給我們提供幫助并且給我們分析遇到的問題。老師認(rèn)真負(fù)責(zé)的工作態(tài)度,嚴(yán)謹(jǐn)治學(xué)的精神和深厚的理論水平都使我受益匪淺。他們無論在理論上還是實(shí)踐中都給了我很大的幫助,使我整體水平得到了提高,對于我以后的學(xué)習(xí)和工作都有一定的幫助,感謝張兵老師的耐心輔導(dǎo)! 參考文獻(xiàn) [1]孫雄勇.Visual C++ 6.0 實(shí)用教程.北京:中國鐵道出版社,2004.[2]新電腦課堂編委會.Visual C++ 編程篇.北京:電子工業(yè)出版社,2004.[3]陳清華.Visual C++課程設(shè)計(jì)案例精選與編程指導(dǎo).北京:北京大學(xué)出版社,2005.[4]李東玉.Visual C++.NET實(shí)用編程100例.北京:中國鐵道出版社,2003.[6]張志清.管理信息系統(tǒng).南京:東南大學(xué)出版社,2003. 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) 附錄 #include int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*選擇提示*/ printf(“***************************n”);/*分隔號*/ printf(“0:apply overn”);/*輸入0選項(xiàng)則提示結(jié)束,輸出0*/ printf(“1:apply is additionn”);/*選擇加號*/ printf(“2:apply is subtractionn”);/*選擇減號*/ printf(“3: apply is multiplicationn”);/*選擇乘號*/ printf(“4:apply is divisionn”);/*選擇除號*/ } int main(){ 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) int a, b; for(;;){ xian(); switch(getchar()) { case '0':printf(“ tui chu: ”); getchar(); return 0; case '1': printf(“ apply is '+': n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jia(a,b); break; case '2':printf(“ apply is '-':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jian(a,b); break; case '3':printf(“apply is '*':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); cheng(a,b); break; case '4':printf(“ apply is '/':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); chu(a,b); break; 塔里木大學(xué)信息工程學(xué)院課程設(shè)計(jì) default:printf(“wrong!please push down'enter' go on with ”);/*提示錯(cuò)誤*/ getchar(); break; } } return 0;/*一輪運(yùn)算結(jié)束后返回符號選擇功能選項(xiàng)*/ } C語言課程設(shè)計(jì)報(bào)告 班 級: 10電子本1 學(xué) 號: 10303033122 姓 名: 指導(dǎo)老師: 方文森 完成日期: 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 目 錄 1、課程設(shè)計(jì)目的和要求.....................................................................................................2 2、課程設(shè)計(jì)任務(wù)內(nèi)容.........................................................................................................2 3、詳細(xì)設(shè)計(jì)說明.................................................................................................................3 3.1分析.........................................................................................................................3 3.2軟件設(shè)計(jì).................................................................................................................3 3.3軟件調(diào)試(對編程中的錯(cuò)誤進(jìn)行記錄,并給出你的解決辦法).....................3 4、軟件使用說明.................................................................................................................4 5、課程設(shè)計(jì)心得與體會.....................................................................................................4 附錄1:參考文獻(xiàn)................................................................................................................5 附錄2:部分程序清單(帶有較詳細(xì)的注釋)................................................................5 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) C語言課程設(shè)計(jì)報(bào)告 1、課程設(shè)計(jì)目的和要求 目的:(1)鞏固和加深學(xué)生對C語言課程的基本知識的理解和掌握(2)掌握C語言編程和程序調(diào)試的基本技能(3)利用C語言進(jìn)行基本的軟件設(shè)計(jì)(4)掌握書寫程序設(shè)計(jì)說明文檔的能力(5)提高運(yùn)用C語言解決實(shí)際問題的能力 要求:(1)分析課程設(shè)計(jì)題目的要求(2)寫出詳細(xì)設(shè)計(jì)說明 (3)編寫程序代碼,調(diào)試程序使其能正確運(yùn)行(4)設(shè)計(jì)完成的軟件要便于操作和使用(5)設(shè)計(jì)完成后提交課程設(shè)計(jì)報(bào)告 2、課程設(shè)計(jì)任務(wù)內(nèi)容 1)一個(gè)班級有4個(gè)學(xué)生,共學(xué)習(xí)5門課程(大學(xué)英語、高等數(shù)學(xué)、C語言程序設(shè)計(jì)、VB程序設(shè)計(jì)、大學(xué)語文)。要求編寫程序完成相應(yīng)功能。2) 輸入并保存]5門課程名稱; 3) 輸入并保存]4個(gè)學(xué)生的學(xué)號及其[個(gè)人相關(guān)信息]; 4) 輸入并保存]每個(gè)學(xué)生對應(yīng)的每門課程成績; 5)求出每門功課的平均分; 6)找出有兩門以上功課不及格的學(xué)生,輸出他們的學(xué)號和全部課程成績及該學(xué)生5門課程的平均成績; 7)找出平均成績在90分以上或者全部課程成績在85分以上的學(xué)生,輸出他們的學(xué)號和全部課程成績及該學(xué)生5門課程的平均成績; 8)計(jì)算每位學(xué)生的總分,并按總分進(jìn)行排名,按由高到低輸出他們的學(xué)號及總成績; 9)對前面問題進(jìn)行優(yōu)化,即在一維數(shù)駔的基礎(chǔ)上,考慮采用二維數(shù)組、函數(shù)及其參數(shù)傳遞的方式來解決相關(guān)問題; 10)對前面問題進(jìn)行優(yōu)化,在學(xué)號的基礎(chǔ)上,增加學(xué)生的其它個(gè)人信息,包括:學(xué)號、姓名、年齡、性別,并采用結(jié)構(gòu)體形式加以表示; 11)利用文件實(shí)現(xiàn)對輸入及分析輸出數(shù)據(jù)的存取操作。 12)參照教材P27頁,3-11題引入選擇功能,輸入功能編號可以實(shí)現(xiàn)以上功能(考慮清屏函數(shù),自查)。 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 3、詳細(xì)設(shè)計(jì)說明 3.1分析 3.2軟件設(shè)計(jì) 開始菜單(功能選擇)Key=?Key=1Key=2Key=3Key=4Key=5Key=0Key=99Key=6Key=7Key=8Key=9Key=10寫入課程名讀取課程名輸入學(xué)生信息讀取學(xué)生信息建立了學(xué)生信息及課程名稱?退出程序讀取課程、學(xué)生、成績讀取課程成績輸出功課的平均分兩門以上功課不及格的學(xué)生輸出高分的學(xué)生總分由高到低排序No保存保存Yes輸入課程成績(提示)必須輸入課程名稱、學(xué)生信息才能建立成績保存清屏 3.3軟件調(diào)試(對編程中的錯(cuò)誤進(jìn)行記錄,并給出你的解決辦法) 取地址。 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 4、軟件使用說明 1.2.3.4.5.6.7.8.9.10.11.12.[99]讀取課程、學(xué)生、成績 [1]輸入課程名稱.[2]讀取課程名稱.[3]輸入學(xué)生信息.[4]讀取學(xué)生信息.[5]輸入課程成績.[6]讀取課程成績.[7]功課的平均分.[8]兩門以上功課不及格的學(xué)生 [9]-高分的學(xué)生-.[10]學(xué)生總分排序.[0]退出應(yīng)用程序.5、課程設(shè)計(jì)心得與體會 在大家的共同努力下,忙碌了兩個(gè)星期,我們順利完成了對此程序的編譯及試運(yùn)行。在設(shè)計(jì)程序的過程中,我們了解到要設(shè)計(jì)一個(gè)完整的程序,其中最難的可能就屬設(shè)計(jì)整個(gè)程序的框架,其中可能會需要經(jīng)過很多次的修改與調(diào)試,所以必須要有耐心,直至最后設(shè)計(jì)出自己想要的程序。 另外平時(shí)學(xué)習(xí)c語言的基礎(chǔ)也很關(guān)鍵,因?yàn)槿绻綍r(shí)學(xué)得就不怎么樣,那么你面對這么一個(gè)比較有難度的程序,可能會望而卻步,看懂他人的程序都是個(gè)難點(diǎn),更別說讓自己去設(shè)計(jì)。為了解決此類問題,最好就是多向同學(xué),老師請教,查找資料。 設(shè)計(jì)一個(gè)程序的過程就是解決一個(gè)實(shí)際問題的過程,從解決實(shí)際問題的角度,我們可以這樣來看:首先要了解這個(gè)問題的基本要求,即輸入、輸出、完成從輸入到輸出的要求是什么;在次我們必須捋清思路,逐一的解決問題的各個(gè)方面,即從輸入開始入手,著重考慮如何從輸入導(dǎo)出輸出,在這個(gè)過程中,可確定所需的變量、數(shù)組、函數(shù),然后確定處理過程--算法。 感謝這次的課程設(shè)計(jì),它使我更加深刻地體會到c語言程序編寫過程的嚴(yán)謹(jǐn)與細(xì)致,還有就是無論做任何事都要有耐心。當(dāng)然團(tuán)隊(duì)合作也是非常重要的一個(gè)環(huán)節(jié),這會使你在學(xué)習(xí)過程中倍感輕松 總的來說,這次程序設(shè)計(jì)讓我獲益匪淺,對C語言也有了進(jìn)一步的認(rèn)識:C語言功能高、表達(dá)能力強(qiáng)、使用靈活方便、目標(biāo)程序效率高等等。C語言是在國內(nèi)外廣泛使用的一種計(jì)算機(jī)語言,相信除了以上優(yōu)點(diǎn),還有許多我們還未發(fā)現(xiàn),希望能在以后的學(xué)習(xí)中有更深入的認(rèn) 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) 識。 附錄1:參考文獻(xiàn) 《C語言程序設(shè)計(jì)與實(shí)踐教程》 附錄2:部分程序清單(帶有較詳細(xì)的注釋) #include #define N 4 #define M 5 #define Debug 1 typedef struct { char SNo[5];char SName[10];}Student; void ScoreRead(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i 溫州大學(xué)城市學(xué)院課程設(shè)計(jì) void ScoreWrite(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i void CoureseRead(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;char ch;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} i=0;j=0;while(1){ ch = fgetc(fp);if(ch==EOF)break;if(ch=='n'){ Cname[i][j]='
第二篇:C語言課程設(shè)計(jì)報(bào)告
第三篇:C語言課程設(shè)計(jì)報(bào)告
第四篇:C語言課程設(shè)計(jì)報(bào)告