C语言实训报告(有源程序)

《C语言程序设计与数据结构》实训报告

课题名称:                

    业:                  

    级:                  

    号:                 

    名:                  

指导教师:                 

2008    12    25 


       

课程设计目的………………………………………………… 1

课程设计题目………………………………………………… 1

课程设计报告内容…………………………………………… 1

结论…………………………………………………………… 10

结束语………………………………………………………… 11

参考书目……………………………………………………… 11

附录:(源程序清单)………………………………………… 12



一、课程设计题目

《商场销售管理管理系统》

二、实训目的

(1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。

(2)掌握C++的基本概念和基础知识。

(3)通过训练能够读懂较为复杂的C++语言源程序并具备基本C++语言程序设计的能力。

(4)熟练掌握各种常用类的定义,继承,文件的应用,为更好的理解面向对象打下更好的基础。

(5)通过实训,培养自己编写、调试、分析大型应用程序的能力。

(6)掌握面向对象的基本原理,提高学生综合程序设计的能力。

(7)培养自己独立解决问题,查找资料的能力。同学之间相互帮助,相互交流,相互合作的团队精神。

(8) 培养自己良好的学习兴趣,独立的编程风格。

(9) 通过实训检查自己学习上的不足,达到熟练掌握C++语言的基本知识和技能。

 

三、课程设计报告内容

3.1功能要求

该系统运行在DOS环境下,人机界面为命令行文本界面。完成的任务是对若干人的通信录信息进行管理,且数据保存到文件中。

实现的主要功能是:

= 登陆: 判断用户输入的密码正确性,并限制用户只能有三次机会输入,若超过则关闭计算机。

= 添加:增加一个或几个人的通信录信息。

= 删除:删除已输入的通信录信息。

= 查询:根据输入的姓名查找通信录信息。

= 修改:根据输入的姓名修改通信录信息。

= 显示:输出所有通信录信息。

3.2 设计环境

所使用的语言采用标准C,开发工具可选用在DOS环境下的Turbo C或Win-TC,也可在Windows环境下的C++Builder。

3.3 数据结构

本系统是对通信录的信息进行管理,通信录记录的信息采用C的结构体数据类型描述,定义如下:

struct ren                          /*定义个人资料结构体类型*/

{  int num;                               /*编号*/

     char name[10];                         /*姓名*/

     char tel[12];                          /*电话号码*/

     char email[20];                        /*email地址*/

     char qq[12];                           /*QQ*/

     char address[50];                      /*住址*/

};

3.4实现方法及主要算法分析

(1)口令设计模块:调用strcmp函数判断输入是否与密码正确。getch()读入一个字符不回显在屏幕上,不用回车结束。getchar()将字符输入到缓冲区直到输入回车才返回给系统。调用system("shutdown  -s ")关闭计算机。

(2)主界面的设计:主界面采用文本菜单的形式,各功能调用通过菜单进行选择。采用循环处理,以便执行完某项处理后,仍可选择其他项处理。在循环内先显示提示信息,然后读取用户输入,使用switch语句对用户的输入进行判断,分别调用相应的模块,当某模块结束后再次回到文本菜单,直到用户选择结束程序菜单,才退出循环,从而退出系统。

(3) 外部文件的类型:文件采用的二进制的文件,对文件的读写采用顺序文件的方式,并使用fread和fwrite等函数对文件进行操作。

(4)清屏函数:一般由上一级菜单屏幕进入下一级菜单屏幕或由下一级菜单屏幕返回上一级菜单屏幕都需要清除屏幕原来显示的内容。同时在调用程序的过程中,记录需要清屏的位置,然后修改代码,加入clrscr()函数清屏。

(5)提示信息:一般的输入与输出需有相应的提示信息,以增加用户的交互性,增加输出的可读性,以帮助用户使用程序。

(6)设置颜色:textbackground()、textcolor()函数设置背景和前景颜色

(7)光标定位:gotoxy(列,行); 光标定位


3.5模块设计

根据功能要求,本系统为五大主要模块,具体模块如表所示。   

表 通讯录管理管理系统的模块

3.6处理流程

(1)口令设计模块

 


(2)通讯录主界面模块

(3)增加记录模块                         (4)显示记录模块

(5)删除记录

(6)修改记录

四、结论

通信录管理系统的编写,看似杂乱无头绪,实际上却并不如此。它的每一个功能都能分成模块,有句话说的好,大事化小,小事化了。C语言编程也正式如此,把一个大的程序分为若干相互独立的模块,这样使完成每一个模块的工作变得单纯而明确,这样不仅降低了难度还使得思路清晰,很容易编写出要做的程序,从而为设计一些较大的软件打下了良好的基础。

分析问题:

通讯录管理的整体功能都包括登陆限制、增加成员、删除成员、查看成员、修改成员、登陆口令五大板块,而查看有包括姓名查看,电话查看,QQ查看,E-mail查看四个模块。

(1)  设计的数据对象包括整形:编号。字符型:姓名、电话、E-mail、QQ、地址。

(2)  数据结构线性数据结构,定义人数上限为100.

算法的设计:

(1)  自顶向下

  现有全局,在进行整体设计,然后再进行下层的设计,逐步实现精细化。采用这种方法能够做到胸有全局,能全盘考虑,不至于顾此失彼,头重脚轻。

(2)  逐步细化

   一步步地将上层的任务分解成较小的、易于实现的任务,知道可以很简单实现为止。

编写源程序:

(1)  不求速度,但求质量!一步一个脚印,编写程序时候宁可速度慢些也要尽量保证质量,做到尽量不出错。

(2)  精力集中,全神贯注!写程序时候最忌讳三心二意,这样才能思路清晰保证质量。

(3)  保持一个良好的编程心态,不要被长长的代码吓到,更不要厌烦,既然同样都是写,为什么不仲满激情的去写那?

程序的编译与运行:

(1)  查找错误是一件让人闹心的事,但是要注重技巧,注意平时经验的积累。才能在最快的时间找出错误

(2)  用心去查找,也许你会发现错误并不是很难找

(3)  程序编译成功不要满足现状,要积极测试程序的可用性,对功能不理想,存在缺点的地方,积极的改进,完善。

  

五、结束语

在实训过程中,使我良好的锻炼了自己,首先是兴趣方面,通过编写通讯录管理系统使我更加喜欢编程,使我从以前的迷茫状态中解脱出来,使我了解了编程的真正意义。我想这对我以后的人生有着很大的帮助。其次通过编写通讯录管理系统使我对写程序有了一定的思路,不像以前无从下手,使我理解了算法的意义,使我懂得了模块化思想的好处。

通过一个星期的编写代码,使我对书本上的知识有了更深的理解,甚至有很多不懂的问题在这过程中自然而然的理解了。对期末考试更有了信心。在黄爽老师的悉心指导下,我对C语言有了更深刻的理解,对程序的算法,数据的定义,程序的改错等方面的能力有了很大提高,自身的注意力,耐心,和对编程的兴趣有了很大增长,使我获益匪浅。

六、参考书目:

[1] 周成义,汤德俊,钟菊,《C语言程序设计与数据结构》,中国铁道出版社,北京,20##年8月

[2](美)克尼汉,(美)里奇 著,徐宝文,李志 译  ,《 C程序设计语言》,机械工业出版社   20##年01月

[3]

七、附录:(源程序清单)

/*通讯录程序*/

#include "stdio.h"

#define size 100

#define len sizeof(struct ren)

   struct ren

{ int num;

   char name[10];

   char tel[12];

   char email[20];

   char qq[12];

   char address[50];

 } ren[size];

  FILE *fp;

  void index();

  void add();

  void del();

  void edit();

 void search();

 void display();

 void login();

 char pause();

 void pause2();

 int load_rec();

 char search_name();

 char search_qq();

 char search_email();

 main()

{

  login();

getch();

}

 void login()

{ int i=0,count=0;

  char ch,in_psw[20],psw[20]="123";

textbackground(6);

  textcolor(3);

  clrscr();

  while(1)

  {gotoxy(25,12);

   printf("请输入密码:");

   while ((ch=getch())!=13)

  {in_psw[i++]=ch;

     printf("*") ;

     if(i>=20)

     break;

      }

    in_psw[i]='\0';

    if(strcmp(in_psw,psw)==0)

      {gotoxy(25,13);

       printf("密码正确!!!");

       getch();

       index();

       break;

      }

     else

     {

      count++;

      gotoxy(25,13);

      printf("密码错误重新输入!!!");

      getch();

      if(count>=3)

      {gotoxy(25,14);

      printf("密码错误次数过多");

      gotoxy(25,15);

      printf("所以你必须关机!");

      getch();

      system("shutdown -s ");

      break;

        }

 }

       clrscr();

       }

   }

void index()/*主界面模块*/

{ char select;

   /*实现菜单*/

   while(1)

   {  clrscr();

      printf("\n\t  通讯录");

      printf("\n\t=======================");

      printf("\n\t 1 增加记录");

      printf("\n\t 2 删除记录");

      printf("\n\t 3 修改记录");

      printf("\n\t 4 显示所有记录");

      printf("\n\t 5 查找记录");

      printf("\n\t 6 退出");

      printf("\n\t=======================");

      printf("\n\t 请选择:(1-6)");

      select=getch();

      switch(select)

      { case'1':add();

                break;

        case'2':del();

                break;

        case'3':edit();

                break;

        case'4':display();

                break;

        case'5':search();

                break;

        case'6':exit(0);

        default:printf("\n\t请选择正确的数字范围");

                getch();

       }

     }

  }

char pause()          

   { char c;

     while(1)

    { c=getch();

     if(c=='Y'||c=='y'||c=='N'||c=='n')

        break;

     }

     return(c);

   }

   void pause2()          

   { printf("\n按任意键继续...");

      getch();

   }

   int load_rec()        

   {int num=0; /*文件的记录数*/

   fp=fopen("txl.dat","rb");    

   while(!feof(fp)) 

{ fseek(fp,num*len,0);  

   fread(&ren[num],len,1,fp);

     num=num+1;

     }

     fclose(fp);

     return(num-1);

     }

  void add()

  { int n;

    char c='y';

    if((fp=fopen("txl.dat","rb"))==NULL)

       n=load_rec();      while(c=='Y'||c=='y')

        else

      {clrscr();/*清屏*/

        printf("\n输入数据");

        printf("\n=========================");

        printf("\n请输入姓名:");

        scanf("%s",ren[n].name);

        printf("\n请输入电话:");

        scanf("%s",ren[n].tel);

        printf("\n请输入E_MAIL:");

        scanf("%s",ren[n].email);

        printf("\n请输入QQ号码:");

        scanf("%s",ren[n].qq);

        printf("\n请输入地址:");

        scanf("%s",ren[n].address);

        printf("\n\t=========================");

        ren[n].num=n+1;

        printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

        printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

        ren[n].num,ren[n].name,ren[n].tel,ren[n].email,

        ren[n].qq,ren[n].address);

        printf("\n输入是否正确(Y/N):");

        c=pause(); /*等待'Y','y','N','n'键处理函数*/

        if(c=='n'||c=='N')

        { printf("\n重新输入数据");

          pause2();/*等待任意键处理函数*/

          c='y';

          continue;

        }

        fp=fopen("txl.dat","ab+");

        fseek(fp,len,2);    

   fwrite(&ren[n],len,1,fp);/*fwrite(buffer,size,count,fp)

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

          n=n+1; /*数组下标不断加1*/

          printf("\n是否继续输入(Y/N):");

          c=pause();/*等待'Y','y','N','n'键处理函数*/

          }

   }

  void del()

  {int n,i,j,m,count=0,count1=0;

    char del_name[10],c;

    clrscr();

    if((fp=fopen("txl.dat","ab"))==NULL)

     {printf("文件找不到...");

      pause2();

     }

     n=load_rec();

     gotoxy(25,12);

     printf("请输入要删除的姓名:");

     scanf("%s",del_name);

     clrscr();

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

      { clrscr();

        if(strcmp(ren[i].name,del_name)==0)

         { count++;

           printf("找到第%d个记录",count);

           printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

           printf("\n\t==============================================");

           printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

           ren[i].num,ren[i].name,ren[i].tel,ren[i].email,

           ren[i].qq,ren[i].address);

           printf("真的删除吗?(Y/N):");

           c=pause(); /*等待'Y','y','N','n'键处理函数*/

           if(c=='y'||c=='Y')

            { count1++;

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

             { ren[j].num=ren[j+1].num-1;

               strcpy(ren[j].name,ren[j+1].name);

               strcpy(ren[j].tel,ren[j+1].tel);

               strcpy(ren[j].email,ren[j+1].email);

               strcpy(ren[j].qq,ren[j+1].qq);

               strcpy(ren[j].address,ren[j+1].address);

                }

                 i--;

              printf("\n记录已删除!");

              getch();

            } }

         }

            fp=fopen("txl.dat","wb+");

             rewind(fp);

             for(m=0;m<n-count1;m++)

              {fseek(fp,m*len,0);

               fwrite(&ren[m],len,1,fp); }

               fclose(fp);

     if(i>=n)

     {printf("\n记录没有找到!");

      pause2();

      }

}

  void edit()

  { int n,i,j,m,count=0;

    char edit_name[10],c;

    clrscr();

   if((fp=fopen("txl.dat","ab"))==NULL)

     {printf("文件找不到...");

      pause2();

     }

     n=load_rec();

     gotoxy(25,12);

     printf("请输入要修改的姓名:");

     scanf("%s",edit_name);

     clrscr();

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

     {clrscr();

       if(strcmp(ren[i].name,edit_name)==0)

          {count++;

           printf("找到第%d个记录",count);

           printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

           printf("\n\t==============================================");

           printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

           ren[i].num,ren[i].name,ren[i].tel,ren[i].email,

           ren[i].qq,ren[i].address);

           printf("\n是否修改记录?(Y/N):");

           c=pause();

          loop: if(c=='y'||c=='Y')

           {printf("\n\t请输入修改后的数据:");

            printf("\n\t=========================");

            printf("\n请输入姓名:");

            scanf("%s",ren[i].name);

            printf("\n请输入电话:");

            scanf("%s",ren[i].tel);

            printf("\n请输如的E-MAIL:");

            scanf("%s",ren[i].email);

            printf("\n请输入QQ号码:");

            scanf("%s",ren[i].qq);

            printf("\n请输入的地址:");

            scanf("%s",ren[i].address);

            printf("\n\t=========================");

            printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

            printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

            ren[i].num,ren[i].name,ren[i].tel,ren[i].email,

            ren[i].qq,ren[i].address);

        printf("\n输入是否正确(Y/N):");

        c=pause();

        if(c=='n'||c=='N')

        { printf("\n重新输入数据");

          pause2();

          c='y';

          goto loop;

          }

             }

          }

          }

      fp=fopen("txl.dat","wb+");

             rewind(fp);

             for(m=0;m<n;m++)

              {fseek(fp,m*len,0);

               fwrite(&ren[m],len,1,fp); }

               fclose(fp);

               if(count==0)

               {printf("没有您要查找的记录!");

               pause2(); }

               else printf("文件尾部 ");

 }

  void display()     /*浏览所有记录*/

  { int n,i;

    clrscr();

    if((fp=fopen("txl.dat","rb"))==NULL)

    {printf("\n文件找不到...");

     pause2();

      }

     n=load_rec();

     printf("\t\t\t\t共有%d条记录",n);

     getch();

     printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

     printf("\n\t===============================================");

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

     {printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

      ren[i].num,ren[i].name,ren[i].tel,ren[i].email,ren[i].qq,ren[i].address);

      if(i>0&&(i+1)%10==0)

      {pause2();

       clrscr();

       printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

       printf("\n\t===============================================");

                 }

               }

       printf("\n\t已显示所有记录");

       pause2();

              }

 void  search()

  {

  char select;

   while(1)

   {  clrscr();

      printf("\n\t  查找方式");

      printf("\n\t=======================");

      printf("\n\t 1 按姓名查找");

      printf("\n\t 2 按qq查找");

      printf("\n\t 3 按E-mail查找");

      printf("\n\t 4 返回上一级菜单");

      printf("\n\t=======================");

      printf("\n\t 请选择:(1-4)");

      select=getch();

      switch(select)

      { case'1':search_name();

                break;

        case'2':search_qq();

                break;

        case'3':search_email();

                break;

        case'4':index();

        default:printf("\n\t请选择正确的数字范围");

                getch();

       }

     }

  }char search_name()

{int i,count=0,n;

 char  _name[10] ,c;

clrscr();

if((fp=fopen("txl.dat","ab"))==NULL)

     {printf("文件找不到...");

      pause2();

     }

     n=load_rec();

      gotoxy(25,12);

     printf("请输入要查找的姓名:");

     scanf("%s",_name);

     clrscr();

     printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

     printf("\n\t==============================================");

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

      {

        if(strcmp(ren[i].name,_name)==0)

     { count++;

       printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

       ren[i].num,ren[i].name,ren[i].tel,ren[i].email,

       ren[i].qq,ren[i].address);

  } }

           if(count==0)

           {clrscr();

           gotoxy(25,12);

           printf("对不起,没有这个人名!!!");getch();}

           else

           {printf("\t一共%d条记录",count); getch();}

}

char search_qq()

{int i,count=0,n;

 char  _qq[12] ,c;

clrscr();

if((fp=fopen("txl.dat","ab"))==NULL)

     {printf("文件找不到...");

      pause2();

     }

     n=load_rec();

     gotoxy(25,12);

     printf("请输入要查找的QQ:");

     scanf("%s",_qq);

     clrscr();

     printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

     printf("\n\t==============================================");

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

      {

        if(strcmp(ren[i].qq,_qq)==0)

         { count++;

           printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

           ren[i].num,ren[i].name,ren[i].tel,ren[i].email,

           ren[i].qq,ren[i].address);

            }

 } if(count==0)

           { clrscr();

           gotoxy(25,12);

           printf("对不起,没有这个QQ!!!");getch();

             }

           else

           {printf("\t一共%d条记录",count); getch();}

}

char search_email()

{int i,count=0,n;

 char  _email[20] ,c;

clrscr();

if((fp=fopen("txl.dat","ab"))==NULL)

     {printf("文件找不到...");

      pause2();

     }

     n=load_rec();

      gotoxy(25,12);

     printf("请输入要查找的email:");

     scanf("%s",_email);

     clrscr();

     printf("\n\t编号\t姓名\t电话\temail\tQQ\t地址");

     printf("\n\t==============================================");

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

      {

        if(strcmp(ren[i].email,_email)==0)

         { count++;

           printf("\n\t%d\t%s\t%s\t%s\t%s\t%s\n",

           ren[i].num,ren[i].name,ren[i].tel,ren[i].email,

           ren[i].qq,ren[i].address); }

         }

           if(count==0)

           {clrscr();

           gotoxy(25,12);

           printf("对不起,没有这个email!!");getch();}

           else

           {printf("\t一共%d条记录",count); getch();}

}

 

相关推荐