数电课程设计报告 万年历

北京工商大学《数字电子技术基础》课程设计报告学 专院: 业:计算机与信息工程学院 信实 薛子朦 1004060121 1.具有运算及存储功能的计算机 2.数字万年历学 生 姓 名: 学 号:课程设计题目:设 计 时间:2012/12.23 至 2012/12.26题目要求:一.运算存储计算机自行设计指令,实现两个数字相加或相减的运算,指令得到 译码后控制存储器的相关元件,使数据输入目的地并用代码存在存储 器里,用 0、1 字符串来表示;最后运算的结果要有所表示;可参考冯 诺依曼计算机体系结构。 二.数字万年历 实现万年历数字显示功能,能显示准确的年(平年闰年) 、 月(大小月) 、星期、日、小时、分钟、秒,并能实现上闹钟功能。

一、设计目的 1、掌握不同集成芯片的逻辑功能及使用方法 2、掌握加法器、存储器的工作原理 3、掌握数字电子钟及万年历的组成及工作原理 4、数字电子钟及万年历的设计与制作 5、熟悉 multisim 电子电路设计及仿真软件的应用 6、灵活运用课本知识解决实际问题 7、锻炼主动思考的思维方式二、设计思路---运算、存储计算机 1.74LS283 超前进位并行加法器的串接可以计算八位二进制数的加法运算 2.将输出的八位二进制数转换成三位十进制数,通过数码管显示 3.通过 8421BCD 码编码器,将十进制数转化成四位二进制数 4.选择 74LS283 超前进位并行加法器的组合形成 8421BCD 码加法器 5.编码器与 74LS283 加法器相接,通过 8421BCD 码加法器串接可以计算三位十 进制数的加法运算,输出结果通过数码管显示八位二进制加数 与被加数输入 三位十进制加数 与被加数输入八位二进制数 加法运算三 位 十 进 制 BCD码 加法运算 九位二进制数到三位 十 进 制 BCD码 的 转 换三位数码管显示输出四位数码管显示输出

设计思路---数字万年历1、设计 60 进制秒计数器,用来实现秒-分及分-时的计数功能 2、设计 24 进制时计数器,用来实现时-日的计数功能 3、设计 31、30、29、28 制天计数器,用来实现不同月份的月计数功能 4、设计 12 机制月计数器,用来实现月-年计数功能 5、设计 7 进制周计数器,用来实现日-周计数功能 6、设计闰年平年不同月份不同进制逻辑电路 7、设计调整时间电路 8、整合所有电路并根据演示需要增加控制开关三、系统综述(运算、存储计算机)控制电路是总体电路的枢纽,是控制电路开启和关闭的部分。电路的控制可 以采用多种方式,诸如开关、脉冲等。本次设计主要侧重于三位十进制数(000 到 255)的输入,于是就要通过一个双掷开关来实现高低电平的输入,双掷开关 的另外两头一个接高电平 5 伏电压,一个接地,通过开关的开和关来实现 1 和 0 的输入,这样就实现了电路的控制。本次设计一共用到 54 个双掷开关,其型号 为 SPDT。开关从下往上、从左往右依次来表示二进制数 1 到 9 的输入,其中开 关都断开表示 0 的输入。 在如图所示的部分开关电路中,J1 到 J9 别表示 1 到 9, 实现了 0 到 9 的输入。 编码电路是总体电路的第二部分, 其主要作用是实现十进制数到二进制数的 转换,本次设计中要用到的是 10 线-4 线优先编码器 74LS147,通过输入一个十 进制数转换到了四位二进制数, 由于 74LS147 的输入和输出都是低电平有效,因 此输出的是四位十进制数的反码,而后面要进行计算,则此时必须将输出的四个 数接到非门,然后输出,这次设计中用到的非门为 74LS05,可以实现反码的转 换。 加法电路是总电路的第三部分,也是总电路的中心环节, 74LS283 是中规模 四位二进制超前进位加法器, 它实现的是四位二进制数的相加,但是题目中要设 计的是 12 位 BCD 码的相加,这样就需要用到 3 个加法器。BCD 码是用 4 位二

进制数表示 1 位十进制数,4 位二进制数内部为二进制,BCD 码之间是十进制, 即逢 10 进 1。采用判“9”电路,当和数大于 9 时,8421BCD 码即产生进位,而 此时十六进制则不一定产生进位,因此需要对二进制数进行修正,即加上 6 (0110) ,让其产生一个进位,当和数小于 9 时,则不需要修正。 将大于 9 的最小项列在卡诺图里,同时,还要考虑到,若相加产生进位,则 同样出现大于 9 的结果,综合考虑,可得卡诺图为:S1S0 S3S2 000001111001 11 101 1 1 1 1 1通过上述的卡诺图,可得到修正和数的条件为 L=C3+S3S2+S3S1,于是可通过一个 非门(74LS05)、三个与非门(74LS00 和 74LS10)和两个加法器来 74LS283 来构 建成一个新的加法器, 这个新的加法器就可以实现一位 8421BCD 码的加法计算。 本次设计中, 要进行运算的是十二位字码的相加,需要将三个这样的新加法器串 联在一起, 于是, 将与非门出来的线与加法器向高位的进位端出来的线共同接到 一个或门(74LS32)的两个入线端,然后将出线端接到下一个新加法器的低位 进位输入端,这样就完成了 8421BCD 码的计算。 译码电路是总体电路的第四部分,作用在于将加法器输出得到的十二位数通 过译码器再转换为三位十进制数。 输出电路是总电路的最后一部分,它的作用是显示最后的计算结果。 当 BCD 码是 0000 时,显示 0;当 BCD 码是 0001 时,显示 1;当 BCD 码是 0010 时,显示 2;当 BCD 码是 0011 时,显示 3;当 BCD 码是 0100 时,显示 4;当 BCD 码是 0101 时,显示 5;当 BCD 码是 0110 时,显示 6;当 BCD 码是 0111 时,显示

7;当 BCD 码是 1000 时,显示 8;当 BCD 码是 1010 时,显示 9。上述关系即为最 后显示电路的实现关系。系统框图:个位(十位、百位)部分相加的真值表 加数 0000 0001 0001 0010 0010 0011 0011 0100 被加数 0000 0000 0001 0001 0010 0010 0011 0011 和 0000 0001 0010 0011 0100 0101 0110 0111

0100 0101 0101 0110 0110 0111 0111 1000 1000 1001 10010100 0100 0101 0101 0110 0110 0111 0111 1000 1000 10011000 1001 10000 10001 10010 10011 10100 10101 10110 10111 11000显示部分: 自行设计指令:15+1=16,显示结果如下经编码、译码后存入计算机

编码部分三、设计过程(万年历)1、60 进制计数器 设计图:

两个芯片之间采用串行进位方式,接成 60 进制计数器。2、二十四进制计数器

3、天计数器及周计数器 备注:该部分单独可以实现,但是总电路图中没有连出。

4、闰年平年各月份不同进制逻辑控制电路设计 通过二与门,三与门,将 28 日,29 日,30 日,31 日的特征信 号输出;特征信号引入数据选择器,由地址信号进行选择,然后接回 控制日期的 160 芯片。数据选择器的 A、B 信号由“月”的特征信号 及”闰年”的特征信号,通过逻辑电路给出,通过不同信号选择不通

进制。如下:A 0 0 1 1 B 0 1 0 1 进制 28 29 30 31而闰年信号通过再加一个四进制计数器,平年输出信号为 0,闰 年输出信号为 1, 另其与月份信号够成选择信号, 实现各进制的转换。 对于大小月,首先列出真值表十位 Q3 0 0 0 0 0 0 0 0 0 0 0 0 Q2 0 0 0 0 0 0 0 0 0 0 0 0 Q1 0 0 0 0 0 0 0 0 0 0 0 0 Q0 0 0 0 0 0 0 0 0 0 1 1 1 Q3 0 0 0 0 0 0 0 1 1 0 0 0 Q2 0 0 0 1 1 1 1 0 0 0 0 0 个位 Q1 0 1 1 0 0 1 1 0 0 0 0 1 Q0 1 0 1 0 1 0 1 0 1 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 31 30 31 30 31 31 30 31 31 30 31 月份 大小月

数字万年历总设计图

分解: (年、月部分)分解: (针对年、月的选择判断)

分解: (分、秒、时)四.总结 在具体设计的过程中出现了许多难题。我不断提出新的问题,然后去论证、推翻,再接 着提出新的问题。 在这个循环往复的过程中, 从宏观到微观上都对电路电子设计有了初步的 概念与认知。 由于长时间生病我没有对出现的问题实施解决方案, 比如说定时闹钟方案的实 施以及为了图省事把万年历变成 10 年历;生病和时间紧不应该成为借口,如果基础知识扎 实的话要做出来结果不成问题。Multisim 软件是可以将一个系统分为好几个子模块的,而且 连线之间也可以规则化;这一点在即将完成时才知道,导致我之前做的所有“不规则”图形

都要被推翻,我试着改变设计图,最终还是没能够在验收的时候全部改完;这也是当初考虑 问题不周到、对系统不熟悉就急于上手导致的闹剧。两个系统的原理还是比较清晰的;我在 仿真的过程中遇到最大的困难就是对于芯片本身的了解没有做足功课, 比如在使用 74LS160 和 74LS161 两种芯片的时候,基于印象而没有查找资料,于是出久久调试不出来、最后才 想到…总之本次课程设计任务使我了解到自己知识上的漏洞并且掌握了教训, 行动之前的思 考和准备功课非常重要。

 

第二篇:C语言课程设计报告——万年历

每百年共100*(208周+5天)-1天=5217周+5天 ——注意这

个“5天”(整百年暂设为平年)

每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注

意这个“0天”和

“1天”(4个整百年只有一个闰年)

即400年一轮回!(原来万年历400年前是一家)

【二】根据万年历以上特点进行编写:

首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义另一个函数#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0当为闰年时可得1加上该程序便可得到每月的天数。 具体程序见(五、万年历程序)

再对其中的星期进行编写:由于公元1月1日设为星期六,故3月1日为星期

三,可以用万年3月1日星期算法(特别是那个三)

由于其公式为:

某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%

7

某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7 或 某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7

闰4百年3月1日星期算法(百年%4=0)

其公式为:

某年3月1日星期几=(年+年/4+月星期表+日+2天)%7

例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三

1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三

20xx年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三

20xx年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四

20xx年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一

20xx年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六

20xx年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年是平年)

19xx年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注

意:19xx年是平年)

19xx年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五 19xx年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%

7=40%7=星期五

19xx年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)

%7=90%7=星期六

19xx年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0

+3)%7=128%7=星期二

19xx年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3

+3)%7=141%7=星期一

2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7

=8%7=星期一(注意:2100年是平年)

2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7

=9%7=星期二

2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7

=10%7=星期三

2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7

=11%7=星期四

2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7

=9%7=星期二(注意:2104年是闰年)

9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3

+3)%7=141%7=星期一

注:按400年一轮回!(400年前是一家)的说法

1600年,20xx年是一样的;

1700年,2100年是一样的;

1800年,2200年是一样的;

19xx年,2300年是一样的。

其中万年某日星期算法

其公式为:

某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7

通同星期偏差表

闰年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

天数 31 29 31 30 31 30 31 31 30 31 30 31 星期 3 6 0 3 5 1 3 6 2 4 0 2

平年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

天数 31 28 31 30 31 30 31 31 30 31 30 31 星期 4 0 0 3 5 1 3 6 2 4 0 2

为对以上的万年历星期的算法是正确的对其进行了以下的计算:

⒈对于二十世纪任意日期可以用公式某日星期几=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根据上面对其进行的计算:

19xx年元旦 1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4

1月表=4(平年) 故 4+4=1 即19xx年元旦是星期一

19xx年国庆 1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2

10月表=4(平年) 故 4+2=6 即19xx年国庆是星期六

19xx年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3 12月表=2(平年) 故 2+3=5 即19xx年12月31日是星

期五

⒉对于二十一世纪新前年虫算法(20%4*5=0)可以用公式:某日星期几=(百年%4*5天+年+年/4+闰年月星期表+日+2天)%7 =(20%4*5天+年+年/4+闰年月星期表+

日+2天)%7以下就是根据上面对其进行的计算:

20xx年元旦 1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3

1月表=3(闰年) 故 3+3->6 即20xx年元旦是星期六

20xx年春节 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5

2月表=0(平年) 故 0+5=5 即20xx年春节是星期五

20xx年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2 12月表=2(平年) 故 2+2=4 即20xx年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; /*定义万年历是从19xx年开始*/

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; /*定义运行

后的日期是20xx年*/

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

输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键t

ab。

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各个版本一般都局限在19xx年至20xx年这一范围内),但是,在很多情况下,特别是在众多的科学研究领域中,一个时间跨度较大的日历程序是很有参考价值的。C程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程序文本填补了这一领域的空白,同时用铁的事实强有力的告诉世人:C程序设计语言作为计算机语言家族的新生事物,其发展前景是极为广阔的。

2. 经过上一个学期对《C程序设计》的学习,我们学习了理论知识,了解了C

语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己

的不足之处和薄弱环节,加以弥补和加强。

3. 通过对c语言万年历的设计进一步的巩固了用c语言编写程序,并且有利

于更好的掌握c语言!

4. 在万年历的编写过程中也体会到了做事情一顶要细心、认真。更加知道了

要掌握好基础知识。还有体会到了成功的感觉!在万年历的设计过程中更加体会到了团队合作的重要性,“一个诸葛亮比不上三个臭皮匠。”知道了只有团队合作才会更好的完成设计!也体会到以后在工作中团队合作的

必要性和重要性!

5. 通过本项课程设计也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与

实践相结合的难关!

6. 由于C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰

富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。通过这次的c

语言程序设计更加了解了c语言的好处和其可用性!

7. 在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!在设

计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过大家的努力终于完成了课程设计!完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!也让我懂得了要想成功首先就必须有很强的自信心!懂得了自己以后要在做任何事情时都要自信!当自己都不相信自己能够成功时还

可能会获得成功吗?

8. 在C语言程序设计的过程中也知道了自己在以前的学习中有很大的不足导

致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识,提高自己的自身的修养,提

高自己的能力!为以后的工作打下良好的知识基础和技能基础!

九、参考文献

⒈谭浩强编著.C程序设计第二版[M].北京:清华大学出版社,1999

⒉陈朔鹰,陈英编著.C语言趣味程序百例精解[M].北京:北京理工大学出版社,1

994

⒊电脑知识与技术学术交流版[J]2005.2 (备注:来自网络资源)

⒋Herbert Schildit著. 戴健鹏译. C语言大全 (第二版)[M].北京:电子工

业出版社,1994

⒌谭浩强,张基温,唐永炎编著. C语言程序设计教程.[M]北京: 高等教育

出版社,1992

⒍秦友淑,曹化工编著. C语言程序设计教程. [M]武汉:华中理工大学出版社,

1996

⒎曹衍龙,林瑞仲,徐慧 编著.C语言实例解析精粹 [M]北京:人民邮电出

版社,2005.3

⒏黄明等编著.21世纪进阶辅导C语言程序设计. [M]大连理工大学出版

相关推荐