第一篇:万年历C语言课程设计报告
程序实践报告
任务分配:
1、头文件,定义常量,全局变量,自定义函数和打印输出模块。即1~50和140~290
2、功能控制模块和一部分日历显示模块,即50~140和290~400
3、一部分日历显示模块和键值获取模块,即400~
1、基本思路
功能模块图
本系统包括4个模块,分别是功能控制模块、打印输出模块、日历显示模块和键值获取模块。(1)功能控制模块。该模块用于实现日期有效性检查、判断是否是闰年和返回指定日期对应的星期。
(2)打印输出模块。该模块主要是进行输出显示,包括打印指定个数的空格、打印分隔线、打印用户使用手册、打印当前日期对应的星期以及打印给定的星期。
(3)日历显示模块。该模块是系统的核心模块,是用来显示指定日期所在月份的月历。(4)键值获取模块。该模块接受键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。
日历显示模块
日历显示是系统的核心模块,它控制着日历的生成和显示。其实现流程如图所示。程序输入的是包含年月日(year,month和day)的日期,输出month所在月份的月历,并突出显示day所在的日期和year是否是闰年的标识。程序首先根据year判断其是否是闰年,如果是则需要将该年2月份的天数设置为29天,接着判断day是否超过month所在月份的最大天数,如果超过则显示系统日期所在的月历。然后进行星期输出的判断,如果输出的是该月的第一个星期,则判断该星期中还有几天在本月(如,该月1号是星期五,则表示该月第一个星期中只有两天在本月,星期一到星期四在上月,则星期一到星期四在本月就不输出,仅有空格表示),输出空格。输出完第一周后,接着输出第二到第五(或者六)周,每周7天。在输出过程中,如果遇到了day所在的日期,则突出显示。
键值获取流程图
键值获取实现的是从键盘调整日期并显示调整后的月历。其实现流程如图所示。系统首先判断从键盘输入的值,如果是右移键,表示增加月份。此时,如果当前月份是12月,则增加月份后就进入下一年的一月;如果是左移键,表示减少月份。此时,如果当前月份是1月,则减少月份后就进入上一年的12月;如果是上移键表示增加年份,直接年份加1即可;如果是下移键表示减少奶奶分,直接年份减1即可;如果是向上翻页键表示减小日期。如果是1月1号,则减少日期后进入上一年的12月31号,如果是某一个月的1号,则减小日期后进入上一月的最后一天;如果是向下翻页键表示增加日期。如果是12月31号,则增加日期后进入到下一年的1月1号,如果是某一个月的最后一天,则增加日期后进入到下一个月的第一天;如果是Q/q键表示查询日期,此时将输出提示信息,提示用户输入查询日期。在用户输入查询日期后,系统就爱那个调用日期检查函数对输入日期的合法性进行检测,如果输入日期不合格,则提示错误信息并显示当前系统日期所在月的月历;如果是空格键表示重置,显示当前系统日期所在月的月历;如果是Esc键表示退出系统,按此键后,系统将询问用户是否确定退出,在得到确定回答(用户输入Y/y)后将退出系统。
2、函数功能描述
1)checkDate()函数原型:void checkDate()checkDate()函数用于检查输入日期的合法性,包括检查输入日期中的年、月、日部分。对于
年,检查其是否是负数或者是0;对于月,检查其是否是范围在1~12中的值;对于日,检查其是否是范围在1~31中的值。如果有一个部分不合法,则程序提示用户。2)isLeapyear()函数原型:int isLeapyear(int year)isLeapyear()函数用于判断制定月份是否是闰年。参数year为待判断的年份。3)getWeek()函数原型:int getWeek(int year,int month,int day)getWeek()函数用于计算并返回给定日期对应的星期。其中参数year、month和day都为整型,分别表示输入的年、月和日。4)printSpace()函数原型:void printSpace(int n)printSpace()函数用于输出制定个数的空格。其中整型参数n表示需要输出的空格的个数。5)printSepatator()函数原型:void printSeparator()printSeparator()函数用于在制定位置输出用户使用手册。输出位置在函数中已经设定。7)printWeek()函数原型:void printWeek()printWeek()函数用于输出当前日期对应的星期,即由 currentYear,currentMonth和currentDay确定的日期对应的星期。该函数首先调用getWeek()函数返回当前日期对应的星期。8)printWeek2()函数原型:void printWeek2(int week)printWeek2()函数用于根据制定值输出星期。参数week是一个整型变量,其值可取0到6,分别表示星期一到星期日。8)showCalendar()函数原型:void showCalendar(int year,int month,int day)showCalendar()函数用于显示日历。参数year,month和day分别表示年、月和日。该函数显示year所在年是否是闰年,显示month所在月的月历,突出显示day所在日的日期。
10)getKeyValue()函数原型:void getKeyValue()getKeyValue()函数用于获取键盘的输入。根据键盘的输入(上下移键、左右移键、上下翻页键、Q/q键)调整当前日期,并显示当前日期所在月的月历等。
4、遇到的问题和相应的解决措施
1.dos.h头文件不能在常用的Visual C++里使用。若使用Turbo C,则键入的汉字无法显示,且无法复制粘贴。
解决措施:经过上网查询和询问同学,知道了导致问题的原因,但若把dos.h在visual c++中换成time.h,过程太复杂,很难实现。最后,我们跟同学借了一个win-TC,是C语言程序,且可以使用中文和进行复制粘贴;2.键入程序代码的时候显示“非法字符’?(0xa3)在showCalender函数中”
解决措施:把showCalender函数全部检查一遍也没有找出问题所在,然后咨询老师,经验丰富的老师一眼看出函数中的一个左括号是用拼音输出的,不是英文;3.程序可以运行,但应该只显示一个向下箭头的地方显示了三行,且覆盖了其他的字符。
解决措施:认真的又检查了一遍,发现“指定输出字符为向下的箭头”的函数中,_CX=01,写成了_CH=01;4.万年历需要获取系统时间,不知从何下手。
解决措施:经查阅资料,得知应用:currentYear=sysTime.da_year;
currentMnth=sysTime.da_mon;
currentDay=sysTime.da_day;
5、心得体会
经历了这次课程设计的设计和制作的整个过程,我们才发现我们知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,小case,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我们九牛二虎之力,不说其他的,只说时间上面,我们就花费了大把的时间,当然我们也从中体会了很多平时不能收获的东西。经过一个多月的自主上机和三个多星期的大作业编写,我们一队三人的齐心努力,查阅书籍,上网查询等各种途径,完成了这次的大作业编写。其中遇到了很多问题,一一解决的过程让我们学会了很多,当然有很多最初的构想没有实现,这也是我们的遗憾之处。
这次作课程设计我们也是收获很大,我们更深入的体会到团队的重要性,通过自学学到了更多C语言的编译,如插入颜色,读取系统时间等,这会是我们终身的财富。
首先,我们对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我们学会用了。其次,我们这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我们学到了一些书本中学不到的知识,让我们长了见识。同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。这次的万年历设计,虽然我们自己觉的很有的成就感,但是这必竟是我们第一次C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我们一定会做的更好。
同时也感谢老师们的耐心讲解与指导,我们期待下一次可以做的更好!
【程序代码】 /*加载头文件*/ #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;
/*--------------------------自定义函数-------------------------*/ 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);/*
用淡洋红色填画出的矩形框
*/ /*
设要显示字符串的字形方向,尺寸
*/ 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);/*
用深蓝色填充
*/ sprintf(s,”Hey girl!Do you want to know?“);
/*
将字符串存到 s 字符数组*/
setcolor(1);settextstyle(10,0,10);/*
设选用字形 4,放大 3 倍,水平设置
*/ outtextxy(110,80,s);
/*
显示 s 字符串
*/ getch();closegraph();} /*功能控制模块*/ /*检查日期有效性函数*/ void checkDate(){ /*如果给定的日期中年份部分为负数或者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();/*以当前系统时间重新赋值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果给定的日期中月份部分为负数,为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();/*以当前系统时间重新赋值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果给定的日期中天数部分为负数,为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();/*以当前系统时间重新赋值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} }
/*判断是否是闰年函数*/ 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;} /*根据给定日期计算星期函数*/ int getWeek(int year,int month,int day){
int leapFlag;
int week;
int i;
/*该数组用于保存每个月的天数*/
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int count=0;
/*判断给定年份是否是闰年*/
leapFlag=isLeapyear(year);
/*如果是闰年则2月份的日期应该为29天*/
if(leapFlag==1)
a[2]++;
/*计算从给定年份的1月1日到给定月份的1号之间的天数*/
for(i=1;i { count+=a[i]; } /*计算从给定年份的1月1日到给定日期之间的天数*/ count+=day; /*计算星期*/ week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7; return week;} /*打印输出模块*/ /*输出指定个数空格函数*/ void printSpace(int n){ int i; for(i=0;i printf(” “);} /*输出分割线函数*/ void printSeparator(){ int i; for(i=0;i<38;i++) { printf(”=“); } printf(”n“);} /*输出使用方法函数*/ void printUsage(){ gotoxy(45,3); /*设定字体颜色*/ 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); /*设置寄存器,表示在指定位置输出一次指定的字符*/ _CX=01; _AH=0xa; /*指定输出字符为向上的箭头*/ _AL=24; /*产生一次中断,输出向上的箭头*/ 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);} /*根据系统日期输出星期函数*/ void printWeek(){ int day; /*根据日期获得星期*/ 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);} /*输出指定星期函数*/ 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“);} /*日历显示模块*/ /*显示日历函数*/ void showCalendar(int year,int month,int day){ int i; int j; /*输出的日期*/ int outDay; int leapFlag; /*本月第一个星期中,在上月的天数*/ int dayLastMon; int week; /*该数组用于保存每个月的天数*/ 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月应该是29天*/ if(leapFlag==1) { a[2]++; } /*如果给定的日期中,天数大于该月的最大天数*/ 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(); /*以当前系统时间重新赋值*/ year=sysTime.da_year; month=sysTime.da_mon; day=sysTime.da_day; currentYear=sysTime.da_year; currentMonth=sysTime.da_mon; currentDay=sysTime.da_day; } /*当前月的天数*/ n_currentMon=a[month]; /*上一月的天数*/ n_lastMon=a[month-1]; /*根据给定日期,获取给定月份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(”October 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“); /*因为一个月中最多跨度6个星期,所以循环从0到5*/ for(i=0;i<6;i++) { /*如果是该月的第一星期*/ if(i==0) { /*第一个星期中还要7-daylastmon天本月,有daylastmon天在上个月,所以输出 daylastmon*4个空格符,每个日期在日历中占用4个空格*/ printSpace(dayLastMon*4); /*剩余在本月的第一个星期中的天数为7-dayLastmon*/ for(j=0;j<7-dayLastMon;j++) { /*到达day的前一天时,输出++outDay*/ if(outDay==day-1) { /*黄色字体突出显示*/ textcolor(YELLOW); cprintf(”[%d]“,++outDay); textcolor(7); } /*到达day当天时,并且不是星期天*/ else if(outDay==day&&week!=0) { printf(”%3d“,++outDay); } /*到达day当天时,并且是星期天*/ else { printf(”%4d“,++outDay); } /*计算当天的星期,如果前一天时星期六(6),当天时星期天(0),其他情况则直 接星期加1*/ week=(week<6)?week+1:0; } printf(”nn“); } /*如果不是该月的第一个星期*/ else { /*则输出该星期中的7天*/ for(j=0;j<7;j++) { /*输出的天数小于该月的最大天数*/ if(outDay { /*到达day的前一天时,输出++outDay*/ if(outDay==day-1) { /*输出一位数字*/ if(outDay<9) { textcolor(YELLOW); cprintf(”[%d]“,++outDay); textcolor(7); } /*输出两位数字*/ else { textcolor(YELLOW); cprintf(”[%2d]“,++outDay); textcolor(7); } } /*到达day当天时,并且不是星期天*/ else if(outDay==day && week!=0) { printf(”%3d“,++outDay); } /*到达day当天时,并且是星期天*/ else { printf(”%4d“,++outDay); } } /*计算当天星期*/ week=(week<6)?week+1:0; } printf(”nn“); if(outDay==a[month])break;} } /*输出分割线*/ printSeparator(); /*输出当前选择的日期和星期*/ printf(”The day you choose is:nn“);printWeek();gotoxy(1,22);textcolor(10);cprintf(”--------------------n“);textcolor(7); /*输出系统日期和星期*/ 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);} /*键值获取模块*/ /*通过键盘调整日期函数*/ void getKeyValue() { int key;char ch;/*默认显示当前系统日期和星期*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentYear,currentMonth,currentDay); while(1){ /*获取键值,根据键值调整日历输出*/ key=bioskey(0); /*右移键,增加月份*/ if(key==RIGHT) { /*月份值在1~12之间,则直接加1*/ if(currentMonth<12 && currentMonth>=1) { currentMonth++; } /*如果月份为12,则加1后进位,即年份加1,月份变为1*/ else { currentYear++; currentMonth=1; } } /*左移键,减少月份*/ if(key==LEFT){ /*月份值在1~12之间,则直接减1*/ if(currentMonth<=12 && currentMonth>1) { currentMonth--; } /*如果月份为1,则减1后,到上一年,月份变为12*/ else { currentYear--; currentMonth=12; } } /*上移键,增加年份*/ if(key==UP){ currentYear++;} /*下移键,减少年份*/ if(key==DOWN){ currentYear--;} /*上移键,减少天数*/ if(key==PAGEUP){ /*当前日不是该月的第一天,则天数直接减1*/ if(currentDay!=1) { currentDay--; } /*当前日是该月的第一天,并且是该年的第一个月(即1月1日),则天数减1后,变为上一年的最后一个月的最后一天(即12月31日)*/ else if(currentDay==1 && currentMonth==1) { currentYear--; currentMonth=12; currentDay=31; } /*当前日是该年中某一个月的第一天,则天数减一后,变为上个月的最后一天*/ else { currentMonth--; currentDay=n_lastMon; } } /*下移键,增加天数*/ if(key==PAGEDOWN){ /*当前日不是该月的最后一天,则天数直接加1*/ if(n_currentMon!=currentDay) { currentDay++; } /*当前日是该年的最后一天(即12月31日),则天数加1后,变为下一年的第一个月的第一天(即1月1日)*/ else if(n_currentMon==currentDay && currentMonth==12) { currentYear++; currentMonth=1; currentDay=1; } /*当前日是该年中某一个月的最后一天,则天数加1后,变为下个月的第一天*/ 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(); } } /*空格键,重置到系统日期*/ if(key==SPACE) { currentYear=sysTime.da_year; currentMonth=sysTime.da_mon; currentDay=sysTime.da_day; } /*Esc键退出系统*/ 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); /*设置颜色*/ settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);/*设置字符的字体,方向和大小*/ outtextxy(100,40+i*50,temp[i]); /*在所指定的坐标出显示字符串*/ } /*主函数*/ 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,”"); /*系统初始化*/ cleardevice(); /*清除屏幕*/ settextjustify(LEFT_TEXT,CENTER_TEXT); /*设置字符排列方式*/ 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]); /*扬声器根据频率发声*/ delay(1100*dely[i]); /*声音延时*/ i++; } nosound(); /*关闭扬声器*/ printtext(temp,4); getch(); closegraph(); welcome(); window(1,1,80,25); textbackground(0); textcolor(WHITE); /*清除文本模式窗口*/ clrscr(); /*设置屏幕显示方式*/ _AL=03; _AH=0; geninterrupt(0x10); getdate(&sysTime); getKeyValue();} /*关闭图形模式*/ C语言课程设计报告 Experiment Designing reporter 课程名称 : C语言课程设计 英文名称 : C Program Experiment Designing 专 业 : 学 号 : 姓 名 : 指导教师 : 日 期: 2011年7月18日 至2011年7月22日 《C语言课程设计》报告 C Program Experiment Designing 课程编号:01200308005 学时: 40学时 适用专业:软件工程专业 授课单位:软件学院 一、C语言课程设计目的及要求 目的: 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。 要求: 1. 熟悉Turbo C 的编程环境、主要菜单功能。 2. 通过上机验证运算符、表达式、运算规则、函数使用。3. 熟练使用C语言的典型语句编写简单程序。4. 调试典型例题或习题。5. 提高上机编程能力 二、实验类型 设计类型 三、实验学时 40学时 四、实验设备 微型计算机、WINDOWS98以上版本的操作系统、Turbo C2.0 软件一套 五、C语言课程参考教材: 1.李瑞 C语言程序基础(第二版)清华大学出版社 2.梁旭 C语言课程设计.电子工业出版社 课程设计(报告)任务书 任务及要求: 1.设计(研究)内容和要求 研究内容:C语言课程设计题目相关内容 任务和要求: (1).学习C语言基础知识,掌握C语言编程和程序调试的基本技能。(2).对指导教师下达的题目进行系统分析。(3).根据分析结果完成系统设计。 (4).编程:在计算机上实现题目的代码实现。(5).完成对该系统的测试和调试。(6).提交课程设计报告。(7).指标: 要求完成课程设计报告3千字以上(约二、三十页).完成若干综合性程序设计题目,每个综合设计题目的语句行数的和在300行语句以上.2.原始依据 了解C语言的基础知识,有一定的语言编程基础,能够熟练运用C语言进行程序设计。通过用C语言完成的题目,提高用C语言解决实际问题的能力。3.参考文献 [1] 黄明等.C语言程序设计辅导教材.大连理工大学出版社,2006 [2] 马靖善等.C语言程序设计.清华大学出版社,2005 [3] 谭浩强.C语言程序设计(第二版).北京:高等教育出版社,2002 目录 C语言课程设计报告................................................................................错误!未定义书签。 1. 输出杨辉三角.............................................................................................................1 1.1 系统分析..............................................................................................................1 1.2 设计说明..............................................................................................................1 1.3 程序运行截图......................................................................................................2 1.4 源程序代码..........................................................................................................2 2 汉诺塔求解方法.............................................................................................................3 2.1 系统分析..............................................................................................................3 2.2 设计说明..............................................................................................................3 2.3 程序运行截图......................................................................................................4 2.4 源程序代码..........................................................................................................4 3 输出200以内的素数.....................................................................................................5 3.1功能说明...............................................................................................................5 3.2 设计说明..............................................................................................................5 3.3 程序运行截图......................................................................................................5 3.4 源程序代码..........................................................................................................6 4 进制转换计算器.............................................................................................................6 4.1功能说明...............................................................................................................6 4.2 设计说明..............................................................................................................6 4.3程序运行截图.......................................................................................................7 4.4 源程序代码..........................................................................................................7 5 一元稀疏多项式.............................................................................................................8 5.1 功能说明..............................................................................................................8 5.2 设计说明..............................................................................................................8 5.3 程序运行截图....................................................................................................10 5.4 源程序代码........................................................................................................11 1. 输出杨辉三角 1.1 系统分析 以等腰直角三角形输出杨辉三角 1.2 设计说明 1、包含头文件 #include #include 其中,头文件 2、子函数 函数名:int num(i,j) 函数功能:以递归的方式进行计算,用函数代替二维数组 函数参数:int i;int j; 含义:相当于二维数组的a[i][j] 函数流程 Step1:输出最外行,即三角形两直角边的结果都为 1 ; Step2:讨论其余情况,相当于数组中的 a[i][j] = a[i-1][j-1] + a[i-1][j]。 3、main()函数 1为保证结果完整输出,先进行清屏; ○2输入要打印的行数,由于一行只能显示80个字符,建议不要超过13行; ○3用循环调用函数int num(int i , int j)○ 其中循环为三重循环:i 循环控制行打印 j 循环控制列打印 k 循环控制空格打印 每执行一次i 循环输出一个换行符,直角三角形定点放在第36个字符的位置上。 每个数字占6个字符的格。 1.3 程序运行截图 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 系统分析 汉诺塔求解方法 2.2 设计说明 1、包含头文件: #include 其中,#include 2、子函数 函数名:void move(int n , char a , char b) 函数功能:打印移动的主子编号 函数参数:int n , char a , char b; 含义:n为移动的序数,a为源柱号,b目的柱号 函数流程 Step1:输出盘子移动情况; Step2:打印换行。 函数名:void hanoi(int n,char a,char b,char c) 函数功能:以游戏规则求解移动盘子的方法 函数参数:int n,char a,char b,char c; 含义:n移动的序数,a为源柱号,b为目的柱号,c为中间柱号 函数流程 Step1:递归调用函数 hanoi(n-1,a,c,b); Step2:调用函数move(n-1,a,b); Step3:继续递归调用函数hanoi(n-1,c,b,a); 3、主函数main()1为了使程序可以重复运行,定义了变量ch,当ch == N 时,退出游戏; ○2使用while()循环使游戏重复运行; ○3输入盘子的数目以调整游戏的难度; ○3调用函数hanoi()○ 2.3 程序运行截图 2.4 源程序代码 #include ”stdio.h“ #include ”ctype.h“ //应用函数toupper void move(int n,char a,char b) //n为移动的序数,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移动的序数,a为源柱号,b为目的柱号,c为中间柱号 if(n>0) { hanoi(n-1,a,c,b); //递归调用 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') //通用性设计 { 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'); //调用函数 printf(”n Continue(Y/N):“); ch=getchar(); getchar(); ch=toupper(ch);} return 0;} 3 输出200以内的素数 3.1功能说明 输出200以内的素数 3.2 设计说明 1、宏定义 #define M 200 //范围,表示输出200以内的素数 #define N((M+1)/2) //奇数的个数 处理流程: Step1:第一步筛选掉所有的偶数,将剩余的奇数存放在a[N]中; Step2:第二部筛选掉多有可以被整除的数 Step3:将得到的素数10个一行打印。 3.3 程序运行截图 3.4 源程序代码 #include ”stdio.h“ #define M 200 //范围 #define N((M+1)/2) //奇数的个数 main(){ int i,j,a[N]; a[0]=2; for(i=1;i //初始数组实现第一步筛选 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)) //倍数时置零筛去 a[j]=0; printf(”n The primer are[2-%d]:n“,M); for(i=0,j=0;i //显示得到素数 { if(a[i]!=0) { printf(”%5d“,a[i]); if((++j)%10==0) //十个数换行 printf(”n“); } } return 0;} 进制转换计算器 4.1功能说明 进行进制转换。 4.2 设计说明 1、处理流程: Step1:输入原始数值xa,原始权a,已经希望转换的进制b;Step2:逐位取值,将原始数值转换成10进制 Step3:逐位取值,将原始数值转换成b 进制 4.3程序运行截图 4.4 源程序代码 void main()#include ”stdio.h“ main() { int a=0,/*原始进制*/ b=8,/*转换进制,默认为八*/ k=1; /*位权*/ long xa=0,/*原始数值*/ xb=0,/*转换数值*/ x1=0,x2=0; /*十进制数值*/ printf(”n Input the number and weight a->b:“); scanf(”%ld%d%d“,&xa,&a,&b); x1=xa; while(x1!=0) /*转换为十进制数*/ { x2+=(x1%10)*k; /*逐位取值*/ x1/=10;k*=a; } k=1; x1=x2; while(x1!=0) /*转换为b进制数*/ { xb+=(x1%b)*k;x1/=b;k*=10; } printf(”n %ld(%d)=%ld(%d)=%ld(%d)“,xa,a,x2,10,xb,b); return;} 一元稀疏多项式 5.1 功能说明 求一元稀疏多项式的运算: 1、求两多项式加法; 2、求两多项式减法; 3、求两多项式乘法; 4、求两多项式导数; 5、求两多项式在x=m处的值。 5.2 设计说明 1、链表结点的定义: typedef struct polyn { float coef; //多项式系数 int expn; //多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; 2、子函数,多项式的基本运算。函数名:linkpolyn CREATEPOLYN()函数功能:创建多项式链表,在输入的时候进行升序排列 返回值:return head,即建立的多项式头结点 参数:linkpolyn head,含义:链表头结点 处理流程: Step1:输入第一个结点,且第一个结点自然有序; Step2:循环输入其余结点,当输入0 0是表示输入结束; Step3:输入过程中进行升幂排序,用二分法,找到新结点插入点; Step4:插入新结点;继续循环,直到输入0 0,循环结束,链表建立成功。Step5:返回建立链表头结点,函数结束。 函数名:linkpolyn DERIVATIONPOLYN(linkpolyn L)函数功能:多项式求导 返回值:return(head),即求导多项式的链表头结点 参数:linkpolyn L,含义:把建立好的链表A和B传递给L 处理流程: Step1:分别用指针指向L的头结点和求导多项式的头结点head; Step2:用循环逐个对L链表中的结点求导,一次存放在求导多项式中的新结点中; Step3:循环中考虑,当L链表中的结点仅存放一个常数,则跳过该结点,继续遍历下一结点; Step4:当循环结束,即L中的各项以被求导,返回求导多项式头结点head。 函数名:linkpolyn INITPOLYN()函数功能:链表初始化 返回值:return(head),即求导多项式生成的链表头结点 参数:无参数 处理流程: Step1:生成一个新的空间作为新结点; Step2:将新节点的coef域赋0,expn域赋-1,以区分其他节点; Step3:将头结点的前去指针和后即指针置空,并返回头结点。 函数名:void PRINTLIST(linkpolyn head)函数功能:以类数学表达式的形式打印 返回值:无返回值 参数:linkpolyn head,含义:处理过的链表头结点 处理流程: Step1:讨论是否链表为空,若为空,则输出0; Step2:若链表不为空,则输出第一个值,第一个值不用输出符号; Step3:用循环依次输出其余各项,附加符号输出; 函数名:linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B)函数功能:加法运算 返回值:return ptr,即和多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行加法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 和多项式链表中; 函数名:linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B)函数功能:计算A-B的值 返回值:return ptr,即差多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行减法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 差多项式链表中; Step5:返回多项式头结点 函数名:float WORK(float x,int e)函数功能:求x的幂 返回值:return t,即计算幂结果 参数:float x,int e,含义:x为输入的x的值,e为x的指数 处理流程: Step1:分别讨论正指数与负指数的的情况; Step2:若e>0,则累乘e次x; Step3:若e<0,则累除e次x;; Step4:将所求结果返回; 3、主函数main()Step1:依次调用函数进行运算操作; Step2:调用函数创建链表; Step3:调用函数进行运算; 5.3 程序运行截图 5.4 源程序代码 #include ”stdio.h“ #include typedef struct polyn { float coef;//多项式系数 int expn;//多项式指数 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;//假设头结点系数为0 head->expn=-1;//假设头结点指数为-1 head->next=NULL;head->prior=NULL;return head;} //INITPOLYN void INSERTPOLYN(linkpolyn p,linkpolyn s){ //将结点s插入到p之后 if(NULL!= p->next){ s->next = p->next; s->next->prior = s;} s->prior = p;p->next = s; } //INSERPOLYN linkpolyn CREATEPOLYN(){ //创建多项式链表,在输入的时候进行升序排列 linkpolyn head,s,p,m,r; int num = 1;//计数器 head = INITPOLYN();//初始化链表 head r = head;//设置为指针 s=(linkpolyn)malloc(sizeof(polyn)); /******************************************/ printf(”请输入第%d项系数和指数:“,num);/**输入第一个结点,并且第一个结点自然有序**/ scanf(”%f%d“,&s->coef,&s->expn);/******************************************/ r->next = s;s->prior = r;r = r->next;//r指向尾结点 r->next = NULL;p = r;//p为s的插入点前一个结点 m = r;//m为拍完结点中间的节点,二分法排序 while(++num)//while # 当将 s->coef 与 s->expn 都赋值为0的时候,认为输入结束 { s =(linkpolyn)malloc(sizeof(polyn));printf(”请输入第%d项系数和指数:“,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向前遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); r=r; } else { INSERTPOLYN(p,s);//在p后面插入结点s m = m->prior; p = m; } } // if # else //else # { while(p->next!= NULL && p->next->expn < s->expn) p = p->next;//p向后遍历链表,找到插入点 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){ //以类数学表达式的形式打印 linkpolyn p; p = head->next;if(p == NULL)//链表为空 puts(”0“);else //else @ { //链表不为空,输出第一个结点的值 if(p->expn == 0)printf(”%f“,p->coef);//指数为0时不输出x else { if(p->coef==1)printf(”x^%d“,p->expn);/**************************/ else if(p->coef ==-1)printf(”-x^%d“,p->expn);/**第一项前不需要输出符号**/ else printf(”%gx^%d“,p->coef,p->expn);/**************************/ } p = p->next;while(p!= NULL) { //依次输出以后各节点 if(p->coef>0) { //当系数为正时,讨论输出符号问题 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 { //当系数为负时,讨论输出符号问题 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();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求和 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef + qb->coef;//系数相加 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));// q = q->next; q->coef = x; q->expn = qa->expn; } 生成和多项式的节结点 qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q = q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef = qb->coef;//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qb->coef; q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //LINKPOLYN linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B){ //减法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求差 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef-qb->coef;//多项式A的系数减去B的系数 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));//生成和多项式的节结点 q = q->next; q->coef = x; q->expn = qa->expn; } qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q=q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef =-(qb->coef);//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef =-(qb->coef); q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //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;//计算第一个结点,并且第一个结点自然有序 s->expn = pa->expn + pb->expn;r->next = s;s->prior = r;r =r->next;r->next = NULL;p=r;//p为插入点前一结点 m=r;//m指向排完结点中间节点 pb=pb->next;// 第一个乘积处理完毕 for(pa= A->next;pa!= NULL;pa=pa->next)//for pa 处理其余乘积 { //用A的第一个结点分别与B的其余结点相乘 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向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s);//在p后面插入结点s m=m->prior; p=m; } } // if # else //else # { while(p->next!=NULL && p->next->expn < s->expn) p=p->next;//p向前遍历链表,找到插入点 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){ //多项式求导 linkpolyn head,p,s,r;head = INITPOLYN();//head为求导多项式头结点 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){ //计算多项式在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(”一元稀疏多项式计算nn“);printf(”1.建立多项式n“);printf(”2.多项式加法n“);printf(”3.多项式减法n“);printf(”4.多项式乘法n“);printf(”5.计算多项式在x处的值n“);printf(”6.对多项式求导n“);printf(”7.清空数据n“);printf(”8.关闭计算器n“);printf(”请输入选项(1~7):“);scanf(”%d“,&i);switch(i){ case(1): system(”cls“);printf(”建立多项式nn“);printf(”建立多项式A,当输入0 0 时表示出入完毕n“);A = CREATEPOLYN();printf(”建立多项式成功n“);printf(”建立多项式B,当输入0 0 时表示出入完毕n“);B = CREATEPOLYN();printf(”建立多项式成功n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B); printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(2): system(”cls“);printf(”多项式加法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);addp = ADDPOLYN(A,B);printf(”多项式A+B:“);PRINTPOLYN(addp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(3): system(”cls“);printf(”多项式减法nn“);printf(”多项式B:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);decp = SUBTRACTPOLYN(A,B);printf(”多项式A-B:“);PRINTPOLYN(decp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(4): system(”cls“);printf(”多项式乘法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);mulp = MULTIPLYPOLYN(A,B);printf(”多项式AB:“);PRINTPOLYN(mulp);printf(”n“);printf(”nn输入回车返回上一级“); getchar();getchar();goto start;case(5): system(”cls“);printf(”计算多项式在x处的值n“);printf(”请输入x的值:“);scanf(”%f“,&x);printf(”n多项式A:“);PRINTPOLYN(A);printf(”n值为:%f“,CALCULATEPOLYN(A,x));printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n值为:%f“,CALCULATEPOLYN(B,x));printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(6): system(”cls“);printf(”多项式求导n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);derp1 = DERIVATIONPOLYN(A);printf(”求导后A':“);PRINTPOLYN(derp1);printf(”n“);derp2 = DERIVATIONPOLYN(B);puts(”求导后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(”已清空所有数据n“);printf(”nn输入回车返回上一级“);getchar();getchar(); goto start;case(8): printf(”退出");} return(0);} 目录 1前言..............................................................1 2正文..............................................................1 2.1设计目的........................................................1 2.2设计意义........................................................1 2.3设计方案与内容..................................................2 2.3.1设计内容......................................................2 2.3.2程序调试......................................................4 3致谢..............................................................7 4参考文献..........................................................7 5附录..............................................................8 塔里木大学信息工程学院课程设计 前言 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具. 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了 塔里木大学信息工程学院课程设计 其自身的优势,仍然是一种重要的语言,而且它还是通往c++的必由之路。它是融合了控制特性的的现代语言,其设计使得用户可以自然的采用自顶向下的规划、结构化的编程,以及模块化的设计。这种做法使得编写出的程序更可靠、更易懂。它是一种高级语言,在设计上它充分利用了当前计算机在能力上的优点。C程序往往很紧凑且运行速度快,其还表现出通常只有汇编语言才具有的精细控制能力,可以用于电脑cpu的编程控制语言,如果愿意,可以细调程序以获得最大速度或最大内存使用率。其可移植性的特点,可以使其在不经过太大的修改,便可在其它系统上运行,同时,它也是很多大型系统的编程语言,(比如说UNIX的操作系统就是建立在c之上的)。 2.3设计方案与内容 我此次设计的是一个计算器,主要是利用我们所学的知识,做到进一步掌握c语言的奥秘,使这种功能强大的高级语言走近我们的生活。本计算系统主要是作加减乘除运算。 该计算系统程序包括:main()函数、加函数、减函数、乘函数、除函数和显示函数。2.3.1设计内容 1、加运算: int jia(int a,int b){int c;c=a+b;printf(“c=%d n”,c);} 2、减运算: int jian(int a,int b){int c;c=a-b;printf(“ c=%d n”,c);} 3、乘运算: int cheng(int a,int b){int c;c=a*b;printf(“ c=%d n”,c);} 4、除运算: int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} 5、显示函数程序: 塔里木大学信息工程学院课程设计 void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出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”);/*选择提示*/这句可以根据需要写成时间,一句鼓励自己的话,或者别的什么,都将不影响改程序的正常运行,只要在规定的“n”里,用户可以根据自己的需要把它用一句英文表达出来。 2)printf(“***************************n”);/*分隔号*/此句无关紧要,可以去掉也可以保留,看个人心情,不过个人建议,还是保留的比较好,它能保持计算器界面的美观特点,还能作为分隔运算程序的作用,让使用者能最快的对运算区进行划区。3)printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/此句在运算界面里出现,当用户使用时,不小心输入了一个字符,非1~4以内,则会提示错误,按‘enter’结束该片段,然后根据提示,选择自己所希望使用的运算符号进行运算。 4)printf(“1:apply is additionn”);/*选择加号*/此句是加法运算提示,当输入‘1’后按‘enter’会得到可以使用加法的提示,然后就可以使用加法运算了,使用空格将数字与要加的数字分开,按‘enter’将得到你要的答案。5)printf(“2:apply is subtractionn”);/*选择减号*/这是加法运算提示。它的使用方法和 塔里木大学信息工程学院课程设计 相同。 2.3.2程序调试 1、加法运算 加法运算运行结果如图2-2所示。 图2-2加法运算运行结果 2、减法运算 减法运算结果如图2-3所示。 图2-3减法运算 3、乘法运算 乘法运算如图2-4所示。 塔里木大学信息工程学院课程设计 图2-4乘法运算 4、除法运算 除法运算如图2-5所示 图2-5除法运算 6、主函数程序: int main(){ 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;default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar();break; 塔里木大学信息工程学院课程设计 } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } 该主函数程序中使用了xian()函数、switch(getchar())语句、getchar()、for、break、return。xian()函数的功能是在程序运行中,具有显示界面的功能。switch(getchar())语句具有多分支选择功能。getchar()是库函数。for循环语句。是break语句是实现跳出循环的功能的语句。Return语句是返回语句,是程序最后一个语句,在int main(void)中int表示main()函数的返回值应该是一个整数。该程序具备的选择功能: (1)选择提示:该计算器编辑界面有5个提示,它们分别是‘0’、‘1’,‘2’、‘3’、‘4’,当使用者在该界面上输入它们其中一个数字,会得到相对应的提示,其中1~4分别表示加、减、乘、除运算。‘0’表示结束工作框结束。 (2)使用方法:进入选择界面后,要选择加法运算,请输入‘1’,然后按下‘enter’键。会得到提示 致谢 在本次课程设计中,首先我要感谢张老师。是他至始至终的教导让我能够在编程方面迅速的入门。在我们对程序语言的学习过程中,是他不断的给我们讲解语句内容并且纠正我们存在的错误。不断的给我们提供帮助并且给我们分析遇到的问题。老师认真负责的工作态度,严谨治学的精神和深厚的理论水平都使我受益匪浅。他们无论在理论上还是实践中都给了我很大的帮助,使我整体水平得到了提高,对于我以后的学习和工作都有一定的帮助,感谢张兵老师的耐心辅导! 参考文献 [1]孙雄勇.Visual C++ 6.0 实用教程.北京:中国铁道出版社,2004.[2]新电脑课堂编委会.Visual C++ 编程篇.北京:电子工业出版社,2004.[3]陈清华.Visual C++课程设计案例精选与编程指导.北京:北京大学出版社,2005.[4]李东玉.Visual C++.NET实用编程100例.北京:中国铁道出版社,2003.[6]张志清.管理信息系统.南京:东南大学出版社,2003. 塔里木大学信息工程学院课程设计 附录 #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选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } int main(){ 塔里木大学信息工程学院课程设计 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; 塔里木大学信息工程学院课程设计 default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar(); break; } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } C语言课程设计报告 班 级: 10电子本1 学 号: 10303033122 姓 名: 指导老师: 方文森 完成日期: 温州大学城市学院课程设计 目 录 1、课程设计目的和要求.....................................................................................................2 2、课程设计任务内容.........................................................................................................2 3、详细设计说明.................................................................................................................3 3.1分析.........................................................................................................................3 3.2软件设计.................................................................................................................3 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法).....................3 4、软件使用说明.................................................................................................................4 5、课程设计心得与体会.....................................................................................................4 附录1:参考文献................................................................................................................5 附录2:部分程序清单(带有较详细的注释)................................................................5 温州大学城市学院课程设计 C语言课程设计报告 1、课程设计目的和要求 目的:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握(2)掌握C语言编程和程序调试的基本技能(3)利用C语言进行基本的软件设计(4)掌握书写程序设计说明文档的能力(5)提高运用C语言解决实际问题的能力 要求:(1)分析课程设计题目的要求(2)写出详细设计说明 (3)编写程序代码,调试程序使其能正确运行(4)设计完成的软件要便于操作和使用(5)设计完成后提交课程设计报告 2、课程设计任务内容 1)一个班级有4个学生,共学习5门课程(大学英语、高等数学、C语言程序设计、VB程序设计、大学语文)。要求编写程序完成相应功能。2) 输入并保存]5门课程名称; 3) 输入并保存]4个学生的学号及其[个人相关信息]; 4) 输入并保存]每个学生对应的每门课程成绩; 5)求出每门功课的平均分; 6)找出有两门以上功课不及格的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 7)找出平均成绩在90分以上或者全部课程成绩在85分以上的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 8)计算每位学生的总分,并按总分进行排名,按由高到低输出他们的学号及总成绩; 9)对前面问题进行优化,即在一维数驵的基础上,考虑采用二维数组、函数及其参数传递的方式来解决相关问题; 10)对前面问题进行优化,在学号的基础上,增加学生的其它个人信息,包括:学号、姓名、年龄、性别,并采用结构体形式加以表示; 11)利用文件实现对输入及分析输出数据的存取操作。 12)参照教材P27页,3-11题引入选择功能,输入功能编号可以实现以上功能(考虑清屏函数,自查)。 温州大学城市学院课程设计 3、详细设计说明 3.1分析 3.2软件设计 开始菜单(功能选择)Key=?Key=1Key=2Key=3Key=4Key=5Key=0Key=99Key=6Key=7Key=8Key=9Key=10写入课程名读取课程名输入学生信息读取学生信息建立了学生信息及课程名称?退出程序读取课程、学生、成绩读取课程成绩输出功课的平均分两门以上功课不及格的学生输出高分的学生总分由高到低排序No保存保存Yes输入课程成绩(提示)必须输入课程名称、学生信息才能建立成绩保存清屏 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法) 取地址。 温州大学城市学院课程设计 4、软件使用说明 1.2.3.4.5.6.7.8.9.10.11.12.[99]读取课程、学生、成绩 [1]输入课程名称.[2]读取课程名称.[3]输入学生信息.[4]读取学生信息.[5]输入课程成绩.[6]读取课程成绩.[7]功课的平均分.[8]两门以上功课不及格的学生 [9]-高分的学生-.[10]学生总分排序.[0]退出应用程序.5、课程设计心得与体会 在大家的共同努力下,忙碌了两个星期,我们顺利完成了对此程序的编译及试运行。在设计程序的过程中,我们了解到要设计一个完整的程序,其中最难的可能就属设计整个程序的框架,其中可能会需要经过很多次的修改与调试,所以必须要有耐心,直至最后设计出自己想要的程序。 另外平时学习c语言的基础也很关键,因为如果平时学得就不怎么样,那么你面对这么一个比较有难度的程序,可能会望而却步,看懂他人的程序都是个难点,更别说让自己去设计。为了解决此类问题,最好就是多向同学,老师请教,查找资料。 设计一个程序的过程就是解决一个实际问题的过程,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;在次我们必须捋清思路,逐一的解决问题的各个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。 感谢这次的课程设计,它使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有就是无论做任何事都要有耐心。当然团队合作也是非常重要的一个环节,这会使你在学习过程中倍感轻松 总的来说,这次程序设计让我获益匪浅,对C语言也有了进一步的认识:C语言功能高、表达能力强、使用灵活方便、目标程序效率高等等。C语言是在国内外广泛使用的一种计算机语言,相信除了以上优点,还有许多我们还未发现,希望能在以后的学习中有更深入的认 温州大学城市学院课程设计 识。 附录1:参考文献 《C语言程序设计与实践教程》 附录2:部分程序清单(带有较详细的注释) #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 温州大学城市学院课程设计 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]=' ';i++;j=0;6 温州大学城市学院课程设计 } else { Cname[i][j]=ch;j++;} } #if(Debug==1)for(i=0;i void CoureseWrite(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} for(i=0;i第二篇:C语言课程设计报告
第三篇:C语言课程设计报告
第四篇:C语言课程设计报告