C语言设计课程实训报告

时间:2024.3.31

昆明理工大学城市学院

课程设计报告

2013 年  7 月 12 日

任 务 书

实训的目标

1.进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解。

2.针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

3.掌握C语言的编程技巧和上机调试程序的方法。

4.掌握程序设计中的常用算法。

任务名称:万年历

项目功能:1、能够显示当前月的日历以及标志出当前日期。

2、可以翻页、翻年。

3、可以输入年月日查看输入的年月的日历。

4、拥有记事本的功能。

教师签名:   

目录

一、         实训要求:... 3

1.     掌握时间函数的运用。... 3

2.     掌握在WinTC下的动画制作。... 3

3.     掌握bioskey和随机函数的运用。... 3

4.     学会边界的判断。... 3

5.     掌握链表和文件。... 3

6.     综合所学内容编写一个程序。... 3

二、实训题目:... 3

1.     ①给出时间计算与几天的差值;②给出天数计算日期;③给出两个日期计算差值。     3

2.     ①让一个圆在屏幕上动起来;②制作一个太阳、地球、月亮的动画。... 3

3.     ①区域内有障碍物使方块不能穿过;②小球在区域内运动,碰到边界后随机改变方向继续运动。     3

4.     ①创建一个结构体;②创建链表并输出;③删除已有链表中的一个节点;④在已有链表中增加一个节点。     3

5.     万年历... 3

三、实训过程:... 3

1.     时间函数:... 3

思考过程:... 3

2.     动画制作:... 3

思考过程:... 3

障碍物(边界判断)... 3

思考过程... 3

链表及文件:... 3

思考过程... 3

1.     课程设计:万年历(带记事本功能)... 4

① 思考过程... 4

②源代码:... 4

③ 运行结果... 9

四、实训心得:... 10

一、实训要求:

1.       掌握时间函数的运用。

2.       掌握在WinTC下的动画制作。

3.       掌握bioskey和随机函数的运用。

4.       学会边界的判断。

5.       掌握链表和文件。

6.       综合所学内容编写一个程序。

二、实训题目:

1.       ①给出时间计算与几天的差值;②给出天数计算日期;③给出两个日期计算差值。

2.       ①让一个圆在屏幕上动起来;②制作一个太阳、地球、月亮的动画。

3.       ①区域内有障碍物使方块不能穿过;②小球在区域内运动,碰到边界后随机改变方向继续运动。

4.       ①创建一个结构体;②创建链表并输出;③删除已有链表中的一个节点;④在已有链表中增加一个节点。

5.       万年历

三、实训过程:

1.       时间函数:

a)       思考过程: 第一小题:先把系统当前时间用time函数转换成秒,再把输入的天数用24乘3600秒转换成秒,再与系统当前的秒数相加减,最后用ctime函数以字符串输出。第二小题:调用localtime取得系统当前年月日,然后把当前年月日提取出来用自己输入的年月日进行替换,用mktime把该年月日转换成秒,然后再把系统当前时间转换成秒,两个秒数进行相加减,把加减后的结果除以(24*3600)就得到相差的天数。第三小题和第二小题同理,输入两个日期、转换成秒以后相加减,最后除以(24*3600),就得到了两个日子相差的天数。

2.       动画制作:

思考过程:做个循环,先用白色画一个圆,然后再用背景色画一个圆把当前圆覆盖,然后改变圆心,然后在画圆再覆盖~最后循环完之后,再用白色在用位置画个圆,因为不这样干的话,屏幕上就没有最好运行的位置了…第二小题同理~

障碍物(边界判断);

① 思考过程:第一小题:判断出上下左右移动的时候能运动的范围(即控制外边界),然后再把范围内的某些不能通过的点的范围找出来,把他们分别排除在外,其他的坐标点就是可以任意移动的了,用bioskey计算按下的键的键值,然后判断可以移动之后,就在当前位置用背景色画一个方框,然后在移动之后的位置用白色画方框和障碍物等。 第二小题划定一个匡,然后在匡的范围再把小球的半径减去,就是最后小球能运动的范围了…然后我设置的是让小球逆时针转动,然后用随机函数(系统时间做种子)来控制小球偏移的位置(或者说角度)。

链表及文件:

①       思考过程:第一个问题需要做的是结构体的认识并运,定义一个结构体,然后输入内容,然后再输出之前输入的内容。第二个问题则是创建链表并输出,         将一个节点分成了两份,一边是指针域,一边是数据域,而指针域,指针域是下一节点的地址,我把头结点不存储数据,以方便之后两题的操作;第三个问题是删除链表,首先定义一个空的字符串,P,P1,P2,把头指针赋值给P,随后让用户输入要删去数据的名字,储存在字符串中,利用strcmp函数进行查找,随后如果第一个有数据的节点就符合要求,就把第二个节点的地址赋值给头节点的指针域后跳出循环,如果不是第一个节点符合要求就执行循环,让P赋值给P2,再把p->next赋值给P,这时P就到了下一个节点,再把p->next赋值给P1,也就是让P1得到第三个节点的首地址,P指向第二个节点,P2指向第一个节点,再进行循环,还是没找到就把P,P1,P2同时向后移动一个节点,如果找到了,就把P2的值赋给p->next,再把p->next的值赋给P,这时P就回到了上一个节点,再把p->next直接指向P1,就把中间的那个节点跳过,完成了删除功能;第四个问题则是增加节点,同样定义一个整型数据(即学号),P,P1,P2,P3,让用户键入想要添加的位置,之后让头指针赋值给P,p->next就赋值给P1,也就是让p1指向下一个节点,随后执行循环,让用户输入想学号和每个节点内的学号比较,如果找到了,就创建一个新的链表,并让P3指向它,让用户输入添加的信息,并且把p->next赋值给P2和P,这是P就到了下一个节点,再把p->next赋值给P1,也就是让P1指向第二个,P和P2都指向第一个,返回循环,如果符合要求就让p3->next指向P1,p2->next指向P3,这样,新的节点就进入了链表中,满足要求,最后在主函数中先输入数据,然后执行一个死循环,让用户选择功能,如果选择1就删除一个节点,选择2就增加一个节点,选择0就跳出循环结束程序。

1.       课程设计:万年历(带记事本功能)

① 思考过程:用localtime取得当前的系统时间,并且提取出年月日,然后把公元元年到今年一月一日前的天数计算出来,把这个天数除7取余为a,然后就获得了今年元旦前的一天是星期几。然后循环、从一月循环到当前月的上一月的最后一天,在这个循环中,循环一次a+1;当a=7时a置零,这个是用来计算当前月的上一月的最后一天是星期几,然后从新在次循环外另开一个循环来输出当前月的日历,并标记出今天用()标记,然后用bioskey读取用户按下的键值,并实现相应的翻页、标记特殊日子、记事本、从新输入年份等功能…

②源代码:

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

void f();                                    /*计算公元元年到某年某月的时间*/

void f1(long int t,long int n,int y,int r);    /*按日历模式输出要得到的那个月的日历*/

void w();                                    /*当前月的日历*/

void s();                                    /*输入某个年份和月份*/

void m(long int n,int y,int r);              /*记事本功能的函数*/

struct jishiben                             /*记事本的结构体定义*/

{

    long int a;

    char name[100];

};

void w()                         /*输出当前月的日历*/

{

     int y,r,a,b,c;             /*分别定义月份日期以及记录键值记录日期以及某月最后一天*/

     long int n;               /*定义年份的变量*/

    time_t timep;

    struct tm *p;

    time(&timep);

    p=localtime(&timep); /*取得当地时间*/

    printf ("%d--%d--%d \n", (1900+p->tm_year),( 1+p->tm_mon), p->tm_mday); /*输出当前的年月日*/

    n=(1900+p->tm_year);       /*获得当前年份*/

    y=( 1+p->tm_mon);          /*获得当前月份*/

    r=p->tm_mday;              /*获得当前的是几号*/

    for(;;)

      {

          printf ("jin tian shi %d--%d--%d \n", (1900+p->tm_year),( 1+p->tm_mon), p->tm_mday);     /*输出当前年月日*/

          f(n,y,r);                                                                           /*调用函数f获得某年某月的日历*/

          printf("an fang xiang jian ke tiao jie nian huo yue\n");

          printf("ru xu shu ru nian fen qing an hui ge jian \n");

          printf("ruo xu shi yong ji shi ben qing an hui che\n");

          if(y==1||y==3||y==5||y==7||y==8||y==10||y==12)c=31;

          if(y==4||y==6||y==9||y==11)c=30;

          if(y==2&&(((n%4==0)&&(n%100!=0))||((n%100==0)&&(n%400==0))))c=29;

          if(y==2&&((n%4!=0)||((n%100==0)&&(n%400!=0))))c=28;                           /*判断月份及最后一天*/

          a=bioskey(0);                                   /*取得按下的键值*/

          if(a==18432)n=n-1;                              /*按方向键向上则年份减一*/

          if(a==20480)n=n+1;                              /*按方向键向下则年份加一*/

          if(a==19200){y=y-1;if(y==0){y=12;n=n-1;}}        /*按方向键向左则月份减一*/

          if(a==19712){y=y+1;if(y==13){y=1;n=n+1;}}       /*按方向键向右则月份加一*/

          if(a==18488){b=r;r=r-7;if(r<1)r=b;}             /*按小键盘8则上一周*/

          if(a==19509){b=r;r=r+7;if(r>c)r=b;}              /*按小键盘5则下一周*/

          if(a==19252){b=r;r=r-1;if(r<1)r=b;}              /*按小键盘4则上一日*/

          if(a==19766){b=r;r=r+1;if(r>c)r=b;}               /*按小键盘则下一日*/

          if(a==7181) m(n,y,r);                              /*调用m函数 进行记事本功能*/

          if(a==3592) s();                                  /*按回格键调用函数s 出入年份和月份*/

          if(a==283)exit(0);                                 /*按esc键 直接退出程序*/

          system("CLS");

      }

}

void f(long n,int y,int r)                   /*计算公元元年一月一号到某年的天数n y r为年月日*/

{

long int i,t;                                /*定义 i为循环变量  t为天*/

t=0;

for(i=1;i<n;i++)

{

    if(((i%4==0)&&(i%100!=0))||((i%100==0)&&(i%400==0)))  /*判断闰年*/

    t=t+366;

    if((i%4!=0)||((i%100==0)&&(i%400!=0)))               /*判断平年*/

    t=t+365;

    if(t%7==0)                                           /*为防止数据过大 所以当t除7的余数是0的时候,让t=0;*/

    t=0;

}

f1(t,n,y,r);                                         /*调用函数f输出某月的日历*/

}

void f1(long int t,long int n,int y,int r)     /*按日历模式输出某月的日历n y r为年月日*/

{

 int i,j,k,a;                                   /*a为记录星期的*/

 a=t%7;

 for(i=1;i<y;i++)                               /*循环到某月的前一个月*/

   {

      for(j=1;;j++)

      {

         a=a+1;

         if(a==7)a=0;

         if((i==1||i==3||i==5||i==7||i==8||i==10||i==12)&&j==31)break;

         if((i==4||i==6||i==9||i==11)&&j==30)break;

         if(i==2&&(((((n%4==0)&&(n%100!=0))||((n%100==0)&&(n%400==0)))&&j==29)||(((n%4!=0)||((n%100==0)&&(n%400!=0)))&&j==28)))break;

      }

   }

  printf("%ld nian %d yue ri li\n",n,y);

 printf(" 1   2   3   4   5   6   7 \n");

 printf("MON TUE WED THU FRI SAT SUN\n");

 for(k=0;k<a;k++)printf("    ");

 for(j=1;;j++)                            /*按日历模式输出某月*/

 {

    if(j==r)printf("(%2d)",j);            /*标记出当前的日子以及特殊的日期*/

    else printf(" %2d ",j);

    a=a+1;

    if(a==7){a=0;printf("\n");}          /*当循环一个星期以后,输出一个换行符*/

    if((y==1||y==3||y==5||y==7||y==8||y==10||y==12)&&j==31)break;

    if((y==4||y==6||y==9||y==11)&&j==30)break;

    if(y==2&&(((((n%4==0)&&(n%100!=0))||((n%100==0)&&(n%400==0)))&&j==29)||(((n%4!=0)||((n%100==0)&&(n%400!=0)))&&j==28)))break; /*判断这个月的最后一天时跳出循环*/

 }

 printf("\n");

}

void s()                          /*输入年月的函数*/

{

long int n;

int y,r,a;

for(;;)

 {

   printf("qing shu ru nian he yue\n");

   scanf("%ld%d",&n,&y);

   if(y<12&&y>0)break;               /*判断输入的月份是否正确*/

   else printf("yue fen shu ru cuo wu\n");

 }

for(;;)

{

r=0;                                /*这里不需要标记处某天,所以令r=0*/

f(n,y,r);                           /*调用函数f来输出需要的某月的日历*/

printf("an fang xiang jian ke tiao jie nian huo yue\n");

printf("ru xu shu ru nian fen qing an hui ge jian \n");

printf("an r jian fan hui dang qian yue\n");

a=bioskey(0);

if(a==18432)n=n-1;                        /*按方向键上键 则年份减一*/

if(a==20480)n=n+1;                         /*按方向键下键 则年份加一*/

if(a==19200){y=y-1;if(y==0){y=12;n=n-1;}}  /*按方向键左键月份减一*/

if(a==19712){y=y+1;if(y==13){y=1;n=n+1;}}  /*按方向键右键 月份加一*/

if(a==283)exit(0);                         /*按esc退出程序*/

system("CLS");                            /*清屏*/

if(a==4978) w();                          /*按小写的r 则调用函数w显示当前月的日历*/

if(a==3592) s();                          /*按回格键 调用它自己 从新输入一个年月*/

}

}

void m(long int n,int y,int r)

{

    long int c;                             /*c是用来计算结构体长度的*/

    long int s=r+100*y+10000*n;          /*转换年月日 例如20##-7-10 就转换成20130710*/

    struct jishiben kefu;               /*定义结构体*/

    FILE *fp;                           /*定义文件指针*/

    c=sizeof(struct jishiben);  /*计算结构体需要的长度*/

    system("CLS");   /*清屏*/

    if((fp=fopen("qw2.txt","a+"))==NULL)       /*判断这个文件是否存在*/

    {printf("da kai shi bai qing xian chuang jian gai wen jian\n");exit(-1);}

    else

    {  

        for(;!feof(fp);) {fread(&kefu,sizeof(kefu),1,fp); if(kefu.a==s)break; }  /*筛选数据*/

        if(kefu.a==s)

        {    printf("ri qi %ld---%s \n",kefu.a,kefu.name);}           /*若得到了需要的数据 则显示出来*/

       

         else                                                   /*否则录入数据*/

         {                                                     /*录入前先把文件关闭掉  然后再从新以追加方式打开*/

            fclose(fp);

            fp=fopen("qw2.txt","a");

            fseek(fp,-c,2);

            printf("qing shu ru xing xi \n");

            kefu.a=s;                           /*令长整型变量等于s 方便筛选*/

            printf("qing shu ru nei rong\n");

            printf("%ld\n",kefu.a);

            gets(kefu.name);                /*输入字符*/

            fwrite(&kefu,c,1,fp);          /*把数据写入*/

           

         }

         getch();

        fclose(fp);               /*关闭文件*/

    }

    w();                     /*返回w函数再进行相应的操作*/

}

int main()

{

w();                                           /*调用函数w来开始第一次运行*/

getch();

}

③ 运行结果

按回车实现记事本功能:

按回车返回记事本:

在特殊日子下按回车,查询是否有要做的事情:

四、实训心得:

    通过为期三个星期是实训,让我收获很多,比之前在课堂上的对c语言的理解更加的深刻了。在第一周学习了时间函数的使用和用c语言来画动画;第二周学习了怎么创建和使用链表、并且学习了文件的操作,虽然在文件操作方面我学习的还是不是很熟练,但是还是能够自己写个记事本了~最后一周,我们自己写了自己的课程设计,在课程设计的过程中,不断加强自己的程序的功能,这对我们来说虽然有些难度,但是经过自己的努力,还是实现了一些曾经自己都不敢接触的东西。这次的实训,让的对c语言有了更加深刻的理解、增加的对c语言的兴趣,并且比之前更加的能够熟练的使用c语言了;我相信在以后对c的更深入的学习和c++、java的学习中,我也能够通过实训加强自己的~

更多相关推荐:
《C语言程序设计》课程设计报告(小组)

东莞理工学院《C语言程序设计》课程设计题目:图书信息管理系统院系:电子工程学院专业:电子信息工程年级:20##班别:2班指导教师:##组长:##同组成员:##目录一、目的....................…

c语言课程设计报告

C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体设计四详细设计五运行结果六课程设计体会一实验目的1通过课程设计加深对结构化程序设...

C语言课程设计报告

河南理工大学计算机科学与技术学院课程设计报告20XX20XX学年第一学期课程名称C语言课程设计设计题目《小学算术运算测试》学生姓名学号专业班级计算机07-2班指导教师20XX年9月12日目录1.设计任务书21.…

C语言课程设计报告范例

C语言课程设计报告设计题目专业班级学号姓名任课老师时间目录一课程设计题目及所涉及知识点二课程设计思路及设计流程图三课程设计中遇到的难点及解决办法四小结五附录原程序2一课程设计题目及所涉及知识点一课程设计题目1基...

厦门理工学院11级C语言C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期题目专业班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求1二方案实现与调试221掷骰子游戏222射击游戏323汽车...

C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期专业计算机科学与技术班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求3二方案实现与调试321掷骰子游戏322汽车加...

c语言程序贪吃蛇课程设计报告

山东工商学院信电学院自动111班第一组贪吃蛇课程设计报告高级语言程序设计课程设计报告ExperimentDesigningreporter课程名称高级语言程序设计英文名称CProgramExperimentDe...

C语言程序设计基础课程设计报告

程序设计基础课程设计报告课程名称课程设计题目程序设计基础课程设计学生信息管理系统姓名系专业年级学号指导教师职称计算机科学技术系计算机网络技术讲师20xx年1月1日一设计题目及要求1题目学生信息管理系统2要求1建...

《C语言程序设计》课程设计报告格式 (2)

C语言程序设计课程设计报告20xx20xx学年第1学期专业软件工程软件测试服务班级1班姓名学号陈家汀指导教师谢小竹成绩计算机与信息工程学院20xx年1月12日目录一课程设计的目的与要求页码二方案实现与调试页码2...

C语言课程设计报告---学籍信息管理系统

中国地质大学本科生课程论文封面1课程设计评语注1无评阅人签名成绩无效2必须用钢笔或圆珠笔批阅用铅笔阅卷无效3如有平时成绩必须在上面评分表中标出并计算入总成绩2目录课程设计评语2目录31课程论文题目42程序设计思...

C语言课程设计报告_运动会分数统计系统

C语言课程设计报告_运动会分数统计系统一.需求分析1问题描述运动会分数统计系统参加运动会有n个系,系编号为1n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1m,女子m+1m+w。不同的项目取前五名或前…

C语言课程设计报告-图书管理系统

课程设计报告图书馆管理系统目录1题目与要求22系统总体设计要给出必要的文字说明及必要的图示321功能需求分析明确选题的功能需求322系统功能模块划分要给出系统功能模块图43详细设计431重要数据的数据结构设计即...

c语言程序设计课程设计报告(34篇)