课程设计报告_android开发课程设计报告需求分析怎么写

C语言课程设计报告要求一 、 设计题目
万年历的设计
二 、设计要求
1、能够显示星期;
2、能够显示年月日;
3、能够修改;
4、当系统时间变动时 , 能自动跳到相应的时间 。
三 、 设计目的
1.通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力 , 能更好的巩固《C语言程序设计》课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!
2.通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力 。为后续各门计算机课程的学习和毕业设计打下坚实基础 。
四 、设计思想及过程
【一】由于万年历具有以下特点:
1 。平年365天(52周+1天),闰年366天(52周+2天) 。平年2月28天 , 闰年2月29天 。
由于公元1月1日设为星期六 , 故3月1日为星期三 。——注意这个“三”
为使算法达到最简 , 故本算法以“星期”为计算单位 。且选3月1日为基月 。
2 。每400年整一闰,或每4年且不为百年的一闰 。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来 , 四年就是23小时15分4秒 , 将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年 。但四年加一天又多用了44分56秒 , 这个数积满400年为三天 。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年 。)
所以百年%4=0闰或(年%4=0并且年<>0)闰 。
3 。每 4年(3个平年+1个闰年)共208周+5天——注意这个“5天”
每百年共100*(208周+5天)-1天=5217周+5天——注意这个“5天”(整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和
“1天”(4个整百年只有一个闰年)
即400年一轮回?。ㄔ赐蚰昀?00年前是一家)
【二】根据万年历以上特点进行编写:
首先对万年历年、月、日进行编写 , 编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义另一个函数#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0当为闰年时可得1加上该程序便可得到每月的天数 。具体程序见(五、万年历程序)
再对其中的星期进行编写:由于公元1月1日设为星期六,故3月1日为星期三,可以用万年3月1日星期算法(特别是那个三)
由于其公式为:
某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
或某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
闰4百年3月1日星期算法(百年%4=0)
其公式为:
某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六
平4百年3月1日星期算法(百年%4<>0)
其公式为:
某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)
1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)
1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)
1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)
2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是闰年)
9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
注:按400年一轮回?。?00年前是一家)的说法
1600年,2000年是一样的;
1700年,2100年是一样的;
1800年,2200年是一样的;
1900年 , 2300年是一样的 。
其中万年某日星期算法
其公式为:
某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
通同星期偏差表
闰年1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天数312931303130313130313031
星期360351362402
平年1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天数312831303130313130313031
星期400351362402
为对以上的万年历星期的算法是正确的对其进行了以下的计算:
⒈对于二十世纪任意日期可以用公式某日星期几=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根据上面对其进行的计算:
1900年元旦1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
1月表=4(平年)故 4+4=1 即1900年元旦是星期一
1949年国庆1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
10月表=4(平年)故 4+2=6 即1949年国庆是星期六
1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
12月表=2(平年)故 2+3=5 即1999年12月31日是星期五
⒉对于二十一世纪新前年虫算法(20%4*5=0)可以用公式:某日星期几=(百年%4*5天+年+年/4+闰年月星期表+日+2天)%7 =(20%4*5天+年+年/4+闰年月星期表+日+2天)%7以下就是根据上面对其进行的计算:
2000年元旦1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
1月表=3(闰年)故 3+3->6 即2027年元旦是星期六
2018年春节16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
2月表=0(平年)故 0+5=5 即2018年春节是星期五
2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
12月表=2(平年)故 2+2=4 即2099年12月31日是星期四
对于上面的分析以及公式的推论和计算证明可以对万年历中的星期进行了编写具体编写程序见(五 、万年历程序)中 。
五 、万年历源程序
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#include"stdlib.h"
#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0 /*判断闰年*/
int numofMonth(int y,int m){
int day,t=28;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
day=31; /*定义以上月份为31天*/
else if(m==4||m==6||m==9||m==11)
day=30; /*定义以上月份为30天*/
else{t+=Year(y);
day=t;} /*闰年二月29天,平年28天*/
return day;}
int numofYear(int y){
int t=365; /*平年365天*/
t+=Year(y);/*闰年366天*/
return t;}
int numofbeforeDays(int y,int m,int d){
int sum=d,i;
for(i=1;i<m;i++)
sum+=numofMonth(y,i);
return sum;}
int numofafterDays(int y,int m,int d){
int sum=0,i;
for(i=m;i<=12;i++)
sum+=numofMonth(y,i);
sum-=d;
return sum;}
int isDay(int y,int m,int d){
int year=1900,month=1,week=1,i; /*定义万年历是从1900年开始*/
long sum=0;
for(i=year;i<y;i++)
sum+=numofYear(i);
for(i=1;i<m;i++)
sum+=numofMonth(y,i);
/* ++sum;*/
i=sum%7;
week=(week+i)%7;
return week;}
void empty(int n){
int i;
for(i=0;i<n;i++)
printf("%*c",6,' ');}
void OutPutCalender(int y,int m,int d)/*计算x年x月x是星期几*/{
int week,i,num,t;
week=isDay(y,m,1);
printf("%6d/%02d/%02d\n",y,m,d);
printf("%6s%6s%6s%6s%6s%6s%6s\n","Sun","Mon","Tue","Wed","Thu","Fri","Sat");
empty(week);
num=numofMonth(y,m);
for(i=1;i<=num;i++){
printf("%6d",i);
t=(week+i)%7;
if(t==0)
printf("\n");} /*光标移到下一行*/
printf("\n");}
long numBTDays(int y1,int m1,int d1,int y2,int m2,int d2)/*定义两个不同日期*/{
int i;
long sum=0;
for(i=y1+1;i<y2;i++)
sum+=numofYear(i);
if(y1==y2){ sum-=d1;
for(i=m1;i<m2;i++)
sum+=numofMonth(y1,i);
sum+=d2;}
else{sum+=numofafterDays(y1,m1,d1);
sum+=numofbeforeDays(y2,m2,d2);}
return sum;}
int Select_mean(){
int sm;
printf("1. OutPut Calender\n"); /*输出当前月份的日历*/
printf("2. Help\n"); /*帮助*/
printf("0. Quit\n"); /*退出*/
printf("Please enter choose(0--2):"); /*从0-2中选择*/
do
scanf("%d",&sm); /*输入sm*/
while(sm<0||sm>3);
return sm;}
void Help()/*输出帮助栏的内容*/{
printf(" 1. OutPut Calender\n");
printf(" 2. System Help\n");
printf(" 0. Quit\n");
printf("Page Up: Up year\n"); /*上一年*/
printf("Page Down: next year\n"); /*下一年*/
printf(" --> : next month\n"); /*上一月*/
printf(" <-- : Up month\n");/*下一月*/}
main(){
int year=2006,year1=2006,month,day,y1,m1,d1,y2,m2,d2,c,t; /*定义运行后的日期是2006年*/
int inkeySCAN,inkey; /*输入键盘操作信息*/
union REGS inregs,outregs;
inregs.h.ah=0x2a;
intdos(&inregs,&outregs);
/* year=outregs.xcx; */
month=outregs.h.dh;
day=outregs.h.dl;
year1=year;
printf("%d/%02d/%02d\n",year,month,day);
while(1)/*当选择为1时,执行以下语句*/{
switch(Select_mean()){
case 1:
OutPutCalender(year,month,day);
while(1){
inkey=bioskey(0);
inkeySCAN=(inkey&0xFF00)>>8;
if(inkeySCAN==77){
if(month==12){month=1;year1++;
OutPutCalender(year1,month,day);/*输出日历*/}
else{month++;
OutPutCalender(year1,month,day);
}}
if(inkeySCAN==75){
if(month==1){month=12;year1--;
OutPutCalender(year1,month,day);}
else{month--;OutPutCalender(year1,month,day);}}
if(inkeySCAN==73){
if(year1==1900) year1=year;
else{year1--;OutPutCalender(year1,month,day);}}
if(inkeySCAN==81){
year1++;OutPutCalender(year1,month,day);}
if(inkeySCAN==28)break;}
break; /*终止循环*/
case 2:
Help();
break;
case 0:
exit(0);
default:
printf("Enter ERROR!\n");
break;} }
}
六 运行过程
1.双击TC
1.当对上面的程序进行了调试后运行会出现下面所示:
第一行所显示的就是系统时间!满足了第一条要求“显示年、月、日” 。
而当改变系统时间后!再运行该程序上面的日期也随系统时间改变,所以满足第四条“当系统时间变动时,能自动跳到相应的时间 。”
2.在光标处按下“1”后回车 , 将会显示:
以上的显示也证明了条件的第2条可以“显示星期!”
3.在光标处按下“2”后回车,将会显示:
按着帮助所讲进行了运行可知:按“ Page Up ”键其下面接着会显示上一年该月的万年历 , 按“ Page Down ”键其下面会接着显示下一年该月的万年历;按“ ← ”键下面将会接着显示当年上一个月的万年历,按“ → ”键将会接着在下面显示去下一个月的万年历 。
4.
由上所显示键入“0”后将会退去该程序 。
由以上运行的结果可知该c语言所设计的万年历满足设计要求!
七、在C语言编程中常见错误
C语言的最大特点是:功能强、使用方便灵活 。C编译的程序对语法检查并不象其它高级语言那么严格,这就给我们留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对我们这些初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误 。看着有错的程序,不知该如何改起,我通过这次编程 , 也积累了一些C编程时常犯的错误:
1.书写标识符时,忽略了大小写字母的区别 。
编译程序把a和A认为是两个不同的变量名 , 而显示出错信息 。C语言认为大写字母和小写字母是两个不同的字符 。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性 。
2.忽略了变量的类型,进行了不合法的运算 。
%是求余运算 , 得到a/b的整余数 。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算 。
3.将字符常量与字符串常量混淆 。
混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符 , 字符串常量是一对双引号括起来的字符序列 。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的 。
4.忽略了“=”与“==”的区别 。
在C语言中,“=”是赋值运算符,“==”是关系运算符 。如:
if (a==3) a=b;
前者是进行比较 , a是否和3相等,后者表示如果a和3相等,把b值赋给a 。由于习惯问题 , 初学者往往会犯这样的错误 。
5.忘记加分号 。
分号是C语句中不可缺少的一部分 , 语句末尾必须有分号 。
a=1 b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误 。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号 。
{ z=x+y;
t=z/100;
printf("%f",t);
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的) 。
6.多加分号 。
对于一个复合语句 , 如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
复合语句的花括号后不应再加分号,否则将会画蛇添足 。
又如:
if (a%3==0);
I++;
本是如果3整除a , 则I加1 。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1 。
再如:
for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先后输入5个数,每输入一个数后再将它输出 。由于for()后多加了一个分号,使循环体变为空语句 , 此时只能输入一个数并输出它 。
7.输入变量时忘记加地址运算符“&” 。
int a,b;
scanf("%d%d",a,b);
这是不合法的 。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去 。“&a”指a在内存中的地址 。
8.输入数据的方式与要求不符 。scanf("%d%d",&a,&b);输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab 。
scanf("%d,%d",&a,&b);C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符 , 则在输入数据时应输入与这些字符相同的字符 。下面输入是合法的:
3,4
此时不用逗号而用空格或其它字符是不对的 。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
输入应如以下形式:
a=3,b=4
9.输入字符的格式与要求不一致 。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入 。
scanf("%c%c%c",&c1,&c2,&c3);
如输入a b c
字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔 。
10.输入输出的数据类型与所用格式说明符不一致 。
例如,a已定义为整型,b定义为实型
a=3;b=4.5;
printf("%f%d\n",a,b);
语法错
逻辑错 运行错
0.忘记定义变量:
main()
{x=3;y=6;
printf(“%d\n”,x+y);
11.C语言的变量一定要先定义才能使用;
12.输入输出的数据的类型与所用格式说明符不一致
int a=3;float b=4.5;printf(“%f%d\n”,a,b);
它们并不是按照赋值的规则进行转换(如把4.5转换为4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节的数据按%d,作为整数输出)
13.未注意int型数据的数值范围
int型数据的数值范围(-32768~32768)
int num=89101;
printf(“%d”,num);
会将超过低16位的数截去从而得到23563
注意:定义了long型,而在输出时仍用”%d”说明符,仍会出现以上错误
14.输入变量时忘记使用地址符
scanf(“%d%d”,a,b);
15.输入时数据的组织与要求不符
对scanf函数中格式字符串中除了格式说明符外,对其他字符必须按原样输入
16.误把”=“作为”等于”比较符
“=“为附值运算符
“==“为比较运算符
17.语句后面漏分号
{
t=a;
a=b;
b=t
}
它是pascal的语法
18.不该加分号的地方加了分号
if(a>b);
printf(“a is larger than b\n”);
for(i=0;i<10;i++);
{
scanf(“%d”,&x);
printf(“%d\n”,x*x);
}
19.对应该有花括弧的复合语句,忘记加花括弧
sum=0;
i=1;
while(i<=100)
sum=sum+1;
i++;
20.括弧不配对
while((c=getchar()!=‘#’)
putchar(c);
11.在用标识时,忘记了大写字母和小写字母的区别
{
int a,b,c;
a=2;
b=3;
C=A+B;
printf(“%d+%d=%D”,A,B,C);
}
12.引用数组元素时误用发圆括弧
{
int i,a(10);
for(i=0;i<10;i++)
scanf(“%d”,&a(i));
}
13.在定义数组时,将定义的”元素个数”误认为是”可使用的最大下标值
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for(i=1;i<=10;i++)
printf(“%d”,a[i]);
}
14.对二维或多维数组的定义和引用的方法不对
{
int a[5,4];

printf(“%d”,a[1+2,2+2]);

}
15.误以为数组名代表数组中全部元素
{int a[4]={1,2,3,4};
printf(“%d%d%d%d”,a);
}
16.混淆字符数组与字符指针的区别
main()
{
char str[40];
str=“Computer and c”;
printf(“%s\n”,str);
}
17.在引用指针变量之前没有对它赋予确定的值
{
char *p;
scanf(“%s”,p);
}
{
char *p,c[20];
p=c;
scanf(“%s”,p);
}
18.switch语句的各分支中漏写 break语句
混淆字符和字符串的表示形式

char sex;
sex=“M”;

19.使用自加(++)和自减(--)运算符时出的错误
{
int *p,a[5]={1,3,5,7,9};
p=a;
printf(“%d”,*p++);
}
注意于*(++p)的区别;
20.所调用的函数在调用语句之后才定义,而又在调用前未加说明
main()
{float x,y,z;
x=3.5;y=-7.6;
z=max(x,y);
printf(“%f”,z);
}
编译时不给出出错信息,但运行结果将与原意不符 。这种错误尤其需要注意 。
八、心得体会
1.目前流行的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基础于该程序所开发的各种应用程序中的日历程序 。然而,这些程序都千篇一律的局限在一个很短的时间范围内 。(Windows各个版本一般都局限在1980年至2099年这一范围内),但是,在很多情况下 , 特别是在众多的科学研究领域中 , 一个时间跨度较大的日历程序是很有参考价值的 。C程序设计语言充分发挥了其自身无与伦比的优越性 , 用极短的程序文本填补了这一领域的空白,同时用铁的事实强有力的告诉世人:C程序设计语言作为计算机语言家族的新生事物,其发展前景是极为广阔的 。
2.经过上一个学期对《C程序设计》的学习 , 我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础 。通过课程设计,一方面是为了检查我们一个学期来我们学习的成果 , 另一方面也是为了让我们进一步的掌握和运用它 , 同时也让我们认清自己的不足之处和薄弱环节 , 加以弥补和加强 。
3.通过对c语言万年历的设计进一步的巩固了用c语言编写程序,并且有利于更好的掌握c语言!
4.在万年历的编写过程中也体会到了做事情一顶要细心、认真 。更加知道了要掌握好基础知识 。还有体会到了成功的感觉!在万年历的设计过程中更加体会到了团队合作的重要性,“一个诸葛亮比不上三个臭皮匠 。”知道了只有团队合作才会更好的完成设计!也体会到以后在工作中团队合作的必要性和重要性!
5.通过本项课程设计也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
6.由于C语言是近年在国内外得到迅速推广应用的一种语言 。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点 。通过这次的c语言程序设计更加了解了c语言的好处和其可用性!
7.在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过大家的努力终于完成了课程设计!完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了 , 而是自己对自己缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!也让我懂得了要想成功首先就必须有很强的自信心!懂得了自己以后要在做任何事情时都要自信!当自己都不相信自己能够成功时还可能会获得成功吗?
8.在C语言程序设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识 , 提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知识基础和技能基?。?br />
九、参考文献
⒈谭浩强编著.C程序设计第二版〔M〕.北京:清华大学出版社,1999
⒉陈朔鹰,陈英编著.C语言趣味程序百例精解〔M〕.北京:北京理工大学出版社,1994
⒊电脑知识与技术学术交流版〔J〕2005.2(备注:来自网络资源)
⒋HerbertSchildit著. 戴健鹏译. C语言大全 (第二版)〔M〕.北京:电子工业出版社,1994
⒌谭浩强,张基温 , 唐永炎编著.C语言程序设计教程.〔M〕北京: 高等教育出版社,1992
⒍秦友淑,曹化工编著. C语言程序设计教程. 〔M〕武汉:华中理工大学出版社,1996
⒎曹衍龙,林瑞仲,徐慧 编著.C语言实例解析精粹 〔M〕北京:人民邮电出版社,2005.3
⒏黄明等编著.21世纪进阶辅导C语言程序设计. 〔M〕大连理工大学出版
数字钟课程设计报告数字中电子技术课程设计报告
数字电子技术课程设计报告
题 目: 数字钟的设计与制作
学 年
学 期:
专 业 班 级:
学 号:姓 名:
指导教师及职称:讲师
时 间:
地点:
设计目的
熟悉集成电路的引脚安排.
掌握各芯片的逻辑功能及使用方法.
了解面包板结构及其接线方法.
了解数字钟的组成及工作原理.
熟悉数字钟的设计与制作.
设计要求
1.设计指标
时间以24小时为一个周期;
显示时,分,秒;
有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;
计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;
为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号.
2.设计要求
画出电路原理图(或仿真电路图);
元器件及参数选择;
电路仿真与调试;
PCB文件生成与打印输出.
3.制作要求 自行装配和调试,并能发现问题和解决问题.
4.编写设计报告 写出设计与制作的全过程,附上有关资料和图纸,有心得体会.
设计原理及其框图
1.数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定.通常使用石英晶体振荡器电路构成数字钟.图 3-1所示为数字钟的一般构成框图.
图3-1 数字钟的组成框图
⑴晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路.
⑵分频器电路
分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数.分频器实际上也就是计数器.
⑶时间计数器电路
时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器.
⑷译码驱动电路
译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流.
⑸数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管.
2.数字钟的工作原理
1)晶体振荡器电路
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定.
图3-2所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体,电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波.输出反馈电 阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器.电容C1,C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能.由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确.
晶体XTAL的频率选为32768HZ.该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数.
从有关手册中,可查得C1,C2均为30pF.当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施.
由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10MΩ.较高的反馈电阻有利于提高振荡频率的稳定性.
非门电路可选74HC00.
图3-2 COMS晶体振荡器
2)分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频.
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现.例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768(215),即实现该分频功能的计数器相当于15极2进制计数器.常用的2进制计数器有74HC393等.
本实验中采用CD4060来构成分频电路.CD4060在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便.
CD4060计数为14级2进制计数器,可以将32768HZ的信号分频为2HZ,其内部框图如图3-3所示,从图中可以看出,CD4060的时钟输入端两个串接的非门,因此可以直接实现振荡和分频的功能.
图3-3 CD4046内部框图
3)时间计数单元
时间计数单元有时计数,分计数和秒计数等几个部分.
时计数单元一般为12进制计数器计数器,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码.
一般采用10进制计数器74HC390来实现时间计数单元的计数功能.为减少器件使用数量,可选74HC390,其内部逻辑框图如图 2.3所示.该器件为双2—5-10异步计数器,并且每一计数器均提供一个异步清零端(高电平有效).
图3-4 74HC390(1/2)内部逻辑框图
秒个位计数单元为10进制计数器,无需进制转换,只需将QA与CPB(下降沿有效)相连即可.CPA(下降没效)与1HZ秒输入信号相连,Q3可作为向上的进位信号与十位计数单元的CPA相连.
秒十位计数单元为6进制计数器,需要进制转换.将10进制计数器转换为6进制计数器的电路连接方法如图3-5所示,其中Q2可作为向上的进位信号与分个位的计数单元的CPA相连.
图3-5 10进制——6进制计数器转换电路
分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,只不过分个位计数单元的Q3作为向上的进位信号应与分十位计数单元的CPA相连,分十位计数单元的Q2作为向上的进位信号应与时个位计数单元的CPA相连.
时个位计数单元电路结构仍与秒或个位计数单元相同,但是要求,整个时计数单元应为12进制计数器,不是10的整数倍,因此需将个位和十位计数单元合并为一个整体才能进行12进制转换.利用1片74HC390实现12进制计数功能的电路如图3-6所示.
另外,图3-6所示电路中,尚余-2进制计数单元,正好可作为分频器2HZ输出信号转化为1HZ信号之用.
图3-6 12进制计数器电路
4)译码驱动及显示单元
计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用CD4511作为显示译码电路,选用LED数码管作为显示单元电路.
5)校时电源电路
当重新接通电源或走时出现误差时都需要对时间进行校正.通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可.
根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中.图3-7所示即为带有基本RS触发器的校时电路,
图3-7 带有消抖动电路的校正电路
6)整点报时电路
一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒.其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示.
根据要求,电路应在整点前10秒钟内开始整点报时,即当时间在59分50秒到59分59秒期间时,报时电路报时控制信号.报时电路选74HC30,选蜂鸣器为电声器件.
元器件
1.实验中所需的器材
5V电源.
面包板1块.
示波器.
万用表.
镊子1把.
剪刀1把.
网络线2米/人.
共阴八段数码管6个.
CD4511集成块6块.
CD4060集成块1块.
74HC390集成块3块.
74HC51集成块1块.
74HC00集成块5块.
74HC30集成块1块.
10MΩ电阻5个.
500Ω电阻14个.
30p电容2个.
32.768k时钟晶体1个.
蜂鸣器.
2.芯片内部结构图及引脚图
图4-1 7400 四2输入与非门 图4-2 CD4511BCD七段译码/驱动器
图4-3 CD4060BD 图4-4 74HC390D
图4-5 74HC51D 图4-6 74HC30
3.面包板内部结构图
面包板右边一列上五组竖的相通,下五组竖的相通,面包板的左边上下分四组,每组中X,Y列(0-15相通,16-40相通,41-55相通,ABCDE相通,FGHIJ相通,E和F之间不相通.
个功能块电路图
一个CD4511和一个LED数码管连接成一个CD4511驱动电路,数码管可从0---9显示,以次来检查数码管的好坏,见附图5-1.
图5-1 4511驱动电路
利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00连接成一个十进制计数器,电路在晶振的作用下数码管从0—9显示,见附图5-2.
图5-2 74390十进制计数器
利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00和一个晶振连接成一个六进制计数器,数码管从0—6显示,见附图5-3.
图5-3 74390六进制计数器
利用一个六进制电路和一个十进制连接成一个六十进制电路,电路可从0—59显示,见附图5-4.
图5-4 六十进制电路
利用两个六十进制的电路合成一个双六十进制电路,两个六十进制之间有进位,见附图5-5.
图5-5 双六十进制电路
利用CD4060,电阻及晶振连接成一个分频——晶振电路,见附图5-6.
图5-6 分频—晶振电路
利用74HC51D和74HC00及电阻连接成一个校时电路,见附图5-7.
图5-7 校时电路
利用74HC30和蜂鸣器连接成整点报时电路.见附图5-8.
图5-8 整点报时电路
利用两个六十进制和一个十二进制连接成一个时,分,秒都会进位的电路总图,见附图5-9.
图5-9 时,分,秒的进位连接图
总接线元件布局简图,见附图6-1
芯片连接图见附图7-1
八,总结
设计过程中遇到的问题及其解决方法.
在检测面包板状况的过程中,出现本该相通的地方却未通的状况,后经检验发现是由于万用表笔尖未与面包板内部垂直接触所至.
在检测CD4511驱动电路的过程中发现数码管不能正常显示的状况,经检验发现主要是由于接触不良的问题,其中包括线的接触不良和芯片的接触不良,在实验过程中,数码管有几段二极管时隐时现,有时会消失.用5V电源对数码管进行检测,一端接地,另一端接触每一段二极管,发现二极管能正常显示的,再用万用表欧姆档检测每一根线是否接触良好,在检测过程中发现有几根线有时能接通,有时不能接通,把接触不好的线重新接过后发现能正常显示了.其次是由于芯片接触不良的问题,用万用表欧姆档检测有几个引脚本该相通的地方却未通,而检测的导线状况良好,其解决方法为把CD4511的芯片拔出,根据面包板孔的的状况重新调整其引脚,使其正对于孔,再用力均匀地将芯片插入面包板中,此后发现能正常显示,本次实验中还发现一块坏的LED数码管和两块坏的CD4511,经更换后均能正常显示.
在连接晶振的过程中,晶振无法起振.在排除线与芯片的接触不良问题后重新对照电路图,发现是由于12脚未接地所至.
在连接六进制的过程中,发现电路只能4,5的跳动,后经发现是由于接到与非门的引脚接错一根所至,经纠正后能正常显示.
在连接校正电路的过程中,出现时和分都能正常校正时,但秒却受到影响,特别时一较分钟的时候秒乱跳,而不校时的时候,秒从40跳到59,然后又跳回40,分和秒之间无进位,电路在时,分,秒进位过程中能正常显示,故可排除芯片和连线的接触不良的问题.经检查,校正电路的连线没有错误,后用万用表的直流电压档带电检测秒十位的QA,QB,QC和QD脚,发现QA脚时有电压时而无电压,再检测秒到分和分到时的进位端,发现是由于秒到分的进位未拔掉所至.
在制作报时电路的过程中,发现蜂鸣器在57分59秒的时候就开始报时,后经检测电路发现是由于把74HC30芯片当16引脚的芯片来接,以至接线都错位,重新接线后能正常报时.
连接分频电路时,把时个位的QD和时十位的1脚断开,然后时十位的1脚接到晶振的3脚,时十位的3脚接到秒个位的1脚,所连接的电路图无法正常工作,时十位从0-9的跳,时个位只能显示一个0,在这个电路中3脚的分频用到两次,故无法正常显示,因此要把12进制接到74HC390的一个逻辑电路空出来用于分频即可,因此把时十位的CD4511的12,6脚接地,7脚改为接74HC390的5脚,74HC390的3,4脚断开,然后4脚接9脚即可,其中空出的74HC390的3脚就可用于2Hz的分频,分频后变为1Hz,整个电路也到此为正常的数字钟计数.
2.设计体会
在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法.
在连接六进制,十进制,六十进制的进位及十二进制的接法中,要求熟悉逻辑电路及其芯片各引脚的功能,那么在电路出错时便能准确地找出错误所在并及时纠正了.
在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如仿真的连接示意图中,往往没有接高电平的16脚或14脚以及接低电平的7脚或8脚,因此在实际的电路连接中往往容易遗漏.又例如74HC390芯片,其本身就是一个十进制计数器,在仿真电路中必须连接反馈线才能正常显示,而在实际电路中无需再连接,因此仿真图和电路连接图还是有一定区别的.
在设计电路的连接图中出错的主要原因都是接线和芯片的接触不良以及接线的错误所引起的.
3.对该设计的建议
此次的数字钟设计重在于仿真和接线,虽然能把电路图接出来,并能正常显示,但对于电路本身的原理并不是十分熟悉.总的来说,通过这次的设计实验更进一步地增强了实验的动手能力.
急求图书管理系统课程设计报告一份 。。【课程设计报告_android开发课程设计报告需求分析怎么写】可行性分析报告
我们小组的信息系统开发课程设计题目是:图书管理系统开发 。系统开发的总的设计目标是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理 。
本系统主要实现对图书馆信息的管理 , 主要功能为管理有关读者,书籍,借阅和管理者的信息等 。本系统结构分为读者信息管理模块,书籍信息管理模块,借阅信息管理模块,管理者信息管理模块 。读者信息管理部分有两方面的功能,可以浏览读者的信息,可以对读者信息进行维护 。书籍信息管理可以浏览书籍的信息,可以对书籍信息进行维护 。借阅信息管理可以显示当前数据库中书籍借阅情况 , 可以对借阅信息进行维护 。管理者信息管理可以显示数据库中管理者的情况,可以对管理者信息进行维护 。可见 , 本系统并不复杂,主要解决的问题是利用关键字对数据库进行查询 。
背景
近年来,随着图书馆规模的不断扩大 , 图书数量也相应的增加,有关图书的各种信息量也成倍增加,面对着庞大的信息量 , 传统的人工方式管理会导致图书馆管理上的混乱,人力与物力过多浪费,图书馆管理费用的增加,从而使图书馆的负担过重,影响整个图书馆的运作和控制管理,因此,必须制定一套合理、有效,规范和实用的图书管理系统,对图书资料进行集中统一的管理 。
另一方面,IT产业和Internet获得了飞速发展,计算机应用已渗透到了各个领域,引起信息管理的革命 , 实现了信息的自动化处理,提高了处理的及时性和正确性 。
图书管理工作面对大量的可模块化处理的信息 , 是当今信息革命的一个重要阵地 。我们小组开发图书管理信息系统就是采用现代化的信息管理方式代替手工管理方式,提高图书管理工作效率,作到信息的规范管理,科学统计和快速查询,让图书馆更好的为学校,社会服务 。
从以前的手工管理的记录中我们可以发现这样的问题:
1.检索速度慢、效率低
因为图书馆的藏书种类多、数量多,将藏书准确地分门别类,快速检索,手工进行非常困难往往是终于查到了书的信息,馆中没有此书或已被别人借走 。图书馆的规模越大,这个问题越突出 。
2.借书、还书工作量大
借书、还书频率越大,说明图书馆的作用越大,然而随之而来的大量的借书、 还书登记、实存图书的更新以及借出图书超期、遗失等的处理,其工作量之大,往 往是人工操作所难以胜任的 。而且经常会出现这样那样的差错 。
3.图书统计工作难、藏书更新不能及时完成 。
图书馆的图书应根据科学技术的发展和教学工作的需要及时添加和更新,然而由于藏书数量及图书种类越来越多,加上自然损耗,人为破坏,使图书的统计工作难以及时完成,藏书的更新也就很难有针对性地进行 , 藏书的知识结构得不到良好地控制 。
系统开发的重点与难点
系统出现了一些技术难点大致如下:
1、建立合理的表结构,避免数据冗余
各表通过特定字段实现不同表的数据连接,避免数据冗余 , 需要设计简洁高效的表结构 。
2、建立相当的系统安全性
登录用户身份的验证机制的设计、操作页面的权限保护 。
3、建立严密的数据表操作机制
同一表有可能在多个模块中被修改,所以严密的数据表操作机制的建立十分比较困难的,但也是必须的 。除了设计时必须有相当程度的考虑,在编制时更应加强程序逻辑的可靠性和程序调试的全面性 。
可行性分析
1.技术可行性
此次信息系统开发是大学专业知识的一次综合应用与提高,我们小组可以在主教5楼机房完成系统开发 。该机房计算机配置肯定能满足系统开发的要求 。我们小组可以选定两三台计算机,建立系统开发环境,主要是安装数据库工具(MS SQL SERVER 2000),应用程序开发工具( VISUL BASIC 6.0或DELPHI) , Office程序组以及网络传输工具 。
我们小组的部分成员有计算机 , 配置是Pentium4 1.5G,256M以上内存,80G以上硬盘,可连网 。小组成员之间可以通过QQ或电话进行即时交流,协调开发工作,解决开发工作中出现的问题 。
就技术力量来说,我们小组可以完成此次开发工作 。开发过程中会出现许多问题 , 有我们预想之中的,也有一些没有我们预想到,但,我们有信心克服一切困难 。该学期,我们小组各成员已经学习了SQL SERVER,对网络技术和操作系统也有系统的了解,有些成员熟悉计算机原理,能解决常见的硬件故障和硬件选择 。目前,图书管理信息系统已得到了大量应用 , 有许多可供参考的成功系统 。而且,网上有许多关于VISUL BASIC编程的资料和SQL SERVER方面的资料 。从技术角度考虑,此信息系统开发可行 。
2.经济可行性
目标系统开发需求比较低,加上具有成熟的软硬件环境,所以在软硬件的支出上十分有限 。而且,目标系统并不是十分的复杂,开发的周期较短 , 人员经济支出有限 。当系统开发完实际运行后,将很大程度上提高计算机的功能,在为使用者带来便利的同时,也为系统的进一步推广创造了条件 。这带来的经济回报将远超过支出,并且最重要的一点是该软件的开发可以给我们对系统的开发有个全面的认识 。从经济角度考虑,此信息系统开发可行 。
3. 法律上可行
整个系统由于是自行开发,自行使用,所以系统本身不存在法律上的版权争议 。在服务器软件方面 , 应该使用正版软件 , 因为整个系统尽管是开发给内部使用 , 但它毕竟很多部分还是要依靠Internet的,一旦服务器连接到Internet上,它的操作系统可能会被Microsoft跟踪 , 如果不是正版软件 , 将不得不面临民事诉讼的风险 。
结论:
根据以上的可行性研究,我们小组认为开发此系统的条件已经具备,可以开始进行开发 。
课程设计报告结束语于怎么写通过这次的课程设计 , 在老师的带领下还有同组成员的相互交流相互探讨之后,我学会了如何将一个换热器从构想计算出详细的数据,并加上合理的 。从这一过程中我学到很多东西,在大量繁杂的手册和资料中找出与我相关的重要资料 。收获的经验很多,吸取的教训也不少 。以前虽然在作业和考试中复习过换热器的计算,但实际设计过程却要复杂许多许多 。大量的数据,繁杂的公式,实际应用取值范围要自己查找,然后的到符合此次课程设计标准的设计方案 。通过两周的课程设计,我受益匪浅 。最大的收获是能够独立完成器件的设计 。当然,在设计的过程中我也遇到很多问题,但通过和老师同学的交流探讨,加上自己上网和图书馆查找相关资料,最终顺利解决 。
这是我第一次做课程设计 , 以前都是被动的学书本上的理论知识,这次做课程设计时要求将所学理论知识灵活运用 。所以,受益很多 。主要有:
①掌握了查阅资料、搜集数据和合理选用公式的能力 。
②学会了从多方面考虑问题,比如在设计冷却器时,不仅要考虑设备本身的合理性,还要考虑到应用中的经济性和安全性等因素 。
③我的计算能力和对一些软件的熟悉度都有明显的提高 。
④学会了运用最简练的语言来表达问题,并且能够用图说明问题 。
android开发课程设计报告需求分析怎么写对于正文部分内容要求必须具备如下内容:1)目的此次课程设计的目的 。2)需求分析以无二义性的陈述说明程序设计的任务,程序要做什么?明确规定:①输入的形式和输入值的范围;②输出的形式;③程序所能达到的功能;3)概要设计说明本程序中用到的所有数据类型的定义及含义、各程序模块的功能要求以及各模块之间的层次(调用)关系 。4)详细设计实现概要设计中定义的所有数据类型,对每个操作需写出伪码算法;对主程序和其他模块也都要写出伪码算法;最终实现的源程序要按照良好风格的程序书写规则来编写 , 要求结构清晰,重点函数、重点变量以及重点功能部分要加上清晰的程序注释 。5)调试分析每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?) 。进行时间和空间复杂度分析 , 算法的改进设想 。6)测试结果列出完备的测试计划及其结果,包括输入和输出,这里的测试数据应该完整和严格 。7)用户使用说明说明如何使用最终发布的程序,详细列出每一步的操作步骤 。8)课设总结课程设计过程的收获、遇到问题、遇到问题解决问题过程的思考、程序调试能力的思考、经验和体会以及对设计与实现的回顾讨论和分析;在课程设计过程中对课程的认识等内容 。