VC课程设计指导书和报告范例(部分)

计算机程序设计(VC++)课程设计

指导书

江苏科技大学 南徐学院

2012 年 2 月

  一.课程设计教学目的和任务

《计算机程序设计(VC++)课程设计》是实践性教学环节,是学生必修的一门计算机实践课程。

本课程设计的目的是通过综合性程序设计训练,使学生进一步巩固对计算机程序设计语言(VC++)基本语法、基本算法的理解,加深对面向对象程序设计的理解与应用,并使学生养成模块化、结构化程序设计的良好风格,以及一定的程序组织能力,掌握基本程序设计的方法和技巧,为学习后续课程和实际编程打下良好的基础。

本课程设计的重点要求学生掌握基本程序设计理念和方法,培养学生基本程序设计的应用和开发能力。

  二.课程设计目标与要求

1.课程设计教学目标

本课程通过编程技能训练,使学生掌握下列基本算法和数据结构的综合运用:

(1)基本算法:穷举、迭代、递推、递归、排序和查找。

(2)数据结构:数组、结构体、指针、动态内存分配、类。

能熟练运用计算机程序设计语言(VC++)工具,编程解决实际生活中常见的问题。

2.课程设计基本要求

完成或基本完成“计算机程序设计(VC++)课程设计指导书”上的任课教师选定(或“课程设计任务书”中规定的任务(包括编程以及上机调试).

(1)根据课程设计题目的要求,完成算法分析、算法流程图和源程序。

(2)上机调试源程序,并进行充分的测试,力求程序的正确性、可读性、健壮性和运行的高效性。

(3)课程设计结束后,按照指导书上要求的报告格式写出课程设计报告。

 三.教学内容、学时分配及其基本要求

1.课程设计选题原则

课程设计的选题,可根据教学的实际情况,由任课教师在 “计算机程序设计(VC++)课程设计指导书” 中选定。(也可以自行拟定一部分,以“课程设计任务书”的形式另行发布。)

2.学时分配及基本要求

实施参考方案: 1周小综合+1周大综合。

先进行一周的程序设计的基本练习(小综合),后进行一周的综合练习(大综合),具体要求如下:

(1)小综合:每天3~4道小综合题,程序规模为50-100行。

(2)大综合:选一道较为实际的应用题,如学生成绩管理、图书管理、通讯录等,程序规模为100-500行。

课程设计报告等开发文档由学生课后完成。

四.课程设计成绩的考核与评定方法

1.过程考核:考查学生的课程设计态度、组织纪律、考勤情况、工作进度、分析问题和解决问题能力等,平时考核占总成绩的20%。

2.现场考核:主要考查学生程序设计、程序调试情况以及现场提问的回答情况,现场考核占总成绩的50%。

3.设计结果考核:考核占总成绩的30%。

根据以上三项的考核情况评定总成绩,分优秀、良好、中等、及格、不及格五个等级。

五.主要教学参考书目或资料

1. 南徐学院自编.计算机程序设计(VC++)课程设计指导书2.

2. 张岳新.Visual C++程序设计.苏州:苏州大学出版社,2002

3.钱能主编.《C++程序设计教程》.清华大学出版社  1999

六.课程设计内容(小综合题+大综合题)

小综合题(必做)

基础题

1.       编程统计键盘输入的一行字符串中的单词个数。设单词之间以一个或多个空格分开。
P117

2.       求满足以下指定条件的所有三位数:1) 该三位数是某一个二位数的平方;2)该三位数的个位数、十位树和百位数各不相同。要求每行输出五个数。例如,满足以上条件的数为
169  196         256         289         324
361  529         576         X 625            729
784  841         961
#include<iostream.h>

3.       void main()

4.       {

5.       int a,b,c,k=0;

6.       for ( int i=100;i<1000;i++)  

7.              for( int j=10;j<100;j++)

8.                    if(i==j*j)

9.                      {     a=i/100;

10.                      b=i/10%10;

11.                      c=i%10; 

12.                         if(a!=b&&b!=c&&c!=a)

13.                         {    k++;

14.                              cout<<i;

15.                        if(k%5==0)cout<<'\n';

16.                              else cout<<'\t';

17.                                }

18.              }

19.    

20.   }

21.                        

3如果一个数恰好等于它的所有因子(包括1但不包括自身)之和,则称之为“完数”。例如6的因子是1,2,3,且6=1+2+3,因此6是完数。编写程序找出1000之内的所有完数及这些完数的和。
要求:
(1) 要求使用for循环
(2) 输出形式为:完数1+完数2...=和值
算法说明(下列算法仅供参考,学生可以采用其它算法):
(1) sum=0,m=2
(2) 当m<=1000时,反复执行(2.1)(2.2)(2.3)(2.4),否则转(3)
   (2.1)  k=m/2,n=0,j=1
   (2.2)  当j<=k时,反复执行(2.2.1)(2.2.2) ,否则转(2.3)
      (2.2.1)  if j是m的因子  则执行n=n+j
      (2.2.2)  j++
   (2.3)  if m=n 则输出完数m, sum=sum+m
   (2.4)  m++
(3)输出m值

填空题

1.题目:

一个数的各位数字倒过来所得到的新数叫原数的反序数.如果一个数等于它的反序数,则称它为对称数或回文数。求10000—11000之间的二进制对称数

  算法说明:先将正整数n的二进制字符形式放在字符数组s2中,二进制字符形式的反序放在字符数组s1中,然后,比较这两个字符串,若相等,则是二进制对称数

#include <iostream.h>

#include <string.h>

int func(int n, char *s1)

{

  char ch, s2[33], *p,*q;

  p=s1; q=s2+32;

  *q- -=              

  while(n){

     ch=                                      //求n的最低二进制位的字符表示形式

     n/=2;

     *p++=ch;

     *q- -=ch;

  }

  *p=0;

  q++;

  if(              ) return true;

  else  return false;

}

void main(void)

{

  char s[33]={0};

  int count=0;

  cout<<”二进制对称数如下:\n”;

  for(int n=10000; n<11000; n++)

  {

if(              ) {

   cout<<”n=”<<n<<”\t二进制形式为:”<<s<<endl;

 count++;}

   }

   cout<<”对称数的个数为:”<<count<<’\n’;

 }

2. 题目

以下程序中的函数fun(int *a, int n)的功能是:把形参a所指向的数组中的最小值放在a[0]中,接着把形参a所指数组中的最大值放在a[1]中;把a所指数组中的次小值放在a[2]中,把a所指数组中的次大值放在a[3]中,其余依次类推,直至将数组中数据依次处理完为止

    例如:把a所指向数组中的数据最初排列为:5,1,3,2,9,7,6,8,4.按以上规则移动数组中的数据后,数据的排列为:1,9,2,8,3,7,4,6,5

  #include <iostream.h>

  #define N 9

  void fun(int *a, int n)

  {

     int max, min, px, pn, t;

for( int i=0; i<n-1;  ___      _____){

   max=min=a[i];

  px=pn=i;

  for(int j=i+1; j<n; j++){

    if(max<a[j]){

        max=a[j];

        px=j;

    }

    if(min>a[j]){

       min=a[j];

       pn=j;

    }

 }

 if(pn!=i){

    t=a[i];

    a[i]=min;

    ____        ____

    if(px==i)  px=pn;

 }

 if(                         ){

    t=a[i+1];

    a[i+1]=max;

                             

 }

}

  }

void main(void)

{

  int b[N]={5,1,3,2,9,7,6,8,4};

  cout<<”数组中的数据依次为:”<<endl;

  for(int i=0; i<N; i++)

     cout<<b[i]<<’\t’;

  cout<<endl;

  fun(b,N);

  cout<<”处理后数组中的数据依次为:”<<endl;

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

   cout<<b[i]<<’\t’;

  cout<<endl;

}


计算机程序设计(VC++)课程设计

报告

班级:           

学号:           

姓名:           


(手写稿)

小综合题

基础题

1、  题干

分析或流程图

源程序

2、

3、

填空题

1、题干

分析或流程图

所填内容

2、

改错题

1、题干

分析或流程图

正确的源程序

2、

提高题

1、题干

分析或流程图

源程序

2、

大综合题(以第3题为例)

一、设计需求

1.设计描述

虚拟计算机和人类之间的情感。假想的情景如下:计算机扮演一个男子,而用户则扮演一个女子,他们可能从陌生走到婚姻的殿堂,或者他们只是朋友,或者他们永远是陌生人。编写程序实现该功能。

2.设计效果图

图4-1虚拟情感游戏案例效果图

3.功能说明

在本案例的情境中,故事主角之间的关系,可以大致分为几个阶段:陌生人、相识、朋友、恋爱和夫妻。通过相互交流,加强了解,才可能促进关系的发展。

(1)计算机需要主动向用户表示友好,并提出问题。

(2)用户给予肯定回答则会促进人-机的亲密关系;反之,用户给出否定回答,那么计算机和用户的关系不会有所进展。

(3)若用户多次(比如8次)否定回答后,计算机会认为它的交往对象不够友好,停止游戏。

二、案例分析

本案例向大家介绍了一种重要的设计方法,即用自动状态机来处理消息并实时响应。所谓自动状态机,实质上就是一个普通的C++类,该类中包含一组数据成员,其中有一个数据成员用来标识自动机的状态;还包含一组成员函数,其中有一个是事件处理函数,它完成在不同状态下对消息进行不同处理,体现了自动机的行为特征。

从编写程序的角度来看,事件处理函数的核心就是一个switch-case语句,每一个case分支表示一个特定的状态,case分支下的其余程序表达了自动机在这一状态下可能发生的行为。

三、案例设计

1.类的设计

基于上述分析,需要自定义一个枚举类型AState、一个数据类型AMsg、一个类Vemotion。其中枚举类型Astate存储了6种计算机和用户的关系,Amsg类型存储用户的回答信息,Vemotion类完成了虚拟情感游戏的相关功能,包括:显示初始欢迎界面、处理用户回答信息、获得目前计算机和用户的关系状态以及获得用户拒绝计算机要求的次数。

(1)枚举类型Astate

STRANGE代表陌生人,KNOWN代表相识,FRIEND代表朋友,LOVER代表相爱,COUPLE代表夫妻,BYEBYE代表分手。

图4-2枚举类型AState

(2)自定义类型AMsg

Amsg类型的变量用于存储用户回答计算机提问的响应信息。

typedef char AMsg[MSG_LEN_MAX];

(3)VEmotion类的设计

图4-3 VEmotion类图

l    数据成员

       AState Relation;                   

用来存储自动机状态,即目前计算机和用户的关系,包括:陌生、相识等

int Rejection;                                  

用来存储计算机被用户拒绝次数

l    函数成员

    VEmotion();                         //构造函数                 

构造函数,在构造函数当中完成显示欢迎界面、初始化计算机和用户的最初关系、初始化计算机被拒绝的次数等功能。

int event(AMsg pMsg );         

自动机事件处理函数,完成对用户响应信息的处理。

AState getRelation()    ;      

获取自动机状态,即计算机和用户目前的关系。

       int getRejection();                          

获取计算机被拒绝的次数。

2.主程序设计

主程序的设计并不复杂,首先是初始化一些相关变量,定义一个VEmotion类的实例sample。接着请用户输入自己的姓名,调用sample的成员函数显示欢迎画面,计算机循环提出一系列的问题,用户逐一回答,利用sample的成员函数完成对用户响应的处理。根据用户对每个问题的回答情况来发展计算机和用户的关系,可能关系发展得不错,也可能根本无缘。(或流程图)

四、程序实现

五、设计总结与提高(不少于1000字)

 

第二篇:我的VC++课程设计报告

VC++课程设计报告

一、 课题名称: 电话簿管理

1.1程序功能简介:一个电话簿管理小程序。利用文本文件存储电话簿数据,具有添加、删除、显示和查询联系人电话号码的功能。

1.2课程设计要求:

(1)将电话簿数据和相应的函数封装在类中,改写程序使之结构化。

(2)增加记录修改功能,能选择修改用户的姓名、电话。

(3)增加录入时间的显示及存储。

(4)增加缺省的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。

1.3评定难易级别:A级

二、具体实现:

2.1程序总体方案 2.11开发平台:

操作系统:Windows XP

开发工具:Microsoft Visual C++ 6.0

2.12程序结构或流程图:(见另一Word)

2.2所做改进:

2.2.1改进一

2.2.1.1 改进方案:用类封装所有的函数与相应的数据

2.2.1.2 具体实现:

class CTelRecord //电话簿记录类

{

public:

char szDate[30]; //时间单元

CTelRecord(); //构造函数(得到系统时间,并赋给szDate) char szName[20]; //电话簿的数据:姓名

char szNumber[20]; //电话簿的数据:电话号码 };

class CNode //定义结点类

{

private:

CTelRecord *pData; //用于指向数据类的指针

CNode *pNext; //指向链表下一个结点的指针 public:

CNode(){pData=0;pNext=0;} //结点构造函数

friend class CList; //定义链表类为友元类

};

class CList //定义链表类

{

public:

CNode *pHead; //链表头指针结点

CList(){pHead=0;}

void AddNode(); //添加结点,并插入链表

void ShowList(); //打印整个链表

void DeleteList(); //删除整个链表

void Insert(CNode *pnode); //根据姓名的顺序将结点插入链表

void Write_List_To_File(); //将链表数据写入文件

void Load_List_From_File(); //从文件FRIENDS.DAT中读取数据重建链表处理函数

void search_by_szName(); //根据姓名查询电话簿数据 void handle_choice(int); //根据不同的值调用不同的函数 void DeleteNode(); //在链表中删除结点

void Modify(); //修改电话簿数据

void LookChar(); //根据首字母智能查找电话簿数据 };

2.2.2改进二

2.2.2.1 改进方案:增加记录修改功能,能选择修改用户的姓名、电话

2.2.2.2 具体实现:

void CList::Modify()

{

//先找到要修改的结点

system("cls");

char search_string[20];

CNode * previousNode;

previousNode =NULL;

CNode *currentNode;

currentNode =pHead;

cin.ignore(20,'\n');

cout<<"\n 请输入您要修改的联系人的姓名:";

cin.get(search_string,20);

cin.ignore(20,'\n');

while

((currentNode !=NULL)&&(strcmp(currentNode->pData->szName,search_string) !=0))

{

previousNode =currentNode;

currentNode =currentNode->pNext;

}

if (currentNode !=NULL)

{

cout<<"\n 发现您要修改的结点\n";

cout<<endl;

cout<<"Name Phone Number 录入时的系统时间 \n";

cout<<"---------------------------------------------------------\n";

cout.setf(ios::left);

cout<<setw(20)<<currentNode->pData->szName;

cout<<setw(20)<<currentNode->pData->szNumber;

cout<<setw(30)<<currentNode->pData->szDate<<endl;

}

int i;

do

{

cout<<"您想修改电话号码还是想修改联系人姓名呢?修改电话号码请按1,修改姓名请按2!"<<endl;

cin>>i;

if(i==1)

{ //修改电话号码

cout<<"请输入新号码:"<<endl;

char temp[20];

cin>>temp;

strcpy(currentNode->pData->szNumber,temp);

cout<<"修改号码成功!"<<endl;

}

if(i==2)

{ //修改联系人姓名(先删除结点,再建立新结点,然后输入信息)

cout<<"要修改联系人姓名,您必须先删除该结点,再建立结点,然后输入信息。"<<endl;

cout<<"您还要继续吗?(Y/N)"<<endl;

char yesno;

cin>>yesno;

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

{

//删除当前结点

if (currentNode ==pHead)

//***删除链表头结点

{

if (pHead->pNext !=NULL)

pHead =currentNode->pNext;

else

pHead =NULL;

delete currentNode;

}

else

{

if (currentNode->pNext ==NULL)

//***删除链表尾结点

{

delete currentNode;

previousNode->pNext =NULL;

currentNode =pHead;

}

else

//***删除在链表中部的当前结点

previousNode->pNext =currentNode->pNext; delete currentNode;

currentNode =pHead;

}

cout<<"\n 该结点已经删除 \n";

cout<<"建立新结点输入信息并插入链表:"<<endl;

AddNode();

}

else

break;

}

if(i!=1&&i!=2)

cout<<"输入有误! 请重新输入!"<<endl;

}while(i!=1 && i!=2);

}

2.2.3改进三

2.2.3.1 改进方案:增加了得到系统时间的函数

2.2.3.2 具体实现:

CTelRecord::CTelRecord() //构造函数

{

int Year,Month,Day,Hour,Minute; //得到系统时间

tm *CurrentTime;

time_t timer;

timer = time(NULL);

CurrentTime = localtime(&timer);

Year=CurrentTime->tm_year+1900;

Month=CurrentTime->tm_mon+1;

Day=CurrentTime->tm_mday;

Hour=CurrentTime->tm_hour;

Minute=CurrentTime->tm_min;

sprintf(szDate,"%d年 %d月 %d日 %d:%d",Year,Month,Day,Hour,Minute); //将int型Year,Month,Day,Hour,Minute转换为字符型并赋给字符串szDate

}

2.2.4改进四

2.2.4.1改进方案:增加了录入时间的显示及存储

2.2.4.2具体实现:

在构造函数CTelRecord中,当创建对象时,自动调用构造函数,得到系统时间,并转换成字符型赋值给szDate,然后输入到结点中,再Insret函数插入到链表中,再通过Write_List_To_File函数写入文件中。

如果要显示的话,只需通过Load_List_From_File函数从文件中取出,然后加入链表中,再通过ShowList函数显示出来

(关键源代码可见源程序)

2.2.5改进五

2.2.5.1改进方案:增加了智能查询,只需列出名字的首字母,则所有符合条件的信息均可显示出来

2.2.5.2具体实现:

void CList::LookChar()

{

cout<<"请输入您要查找信息的首字母:";

char temp;

int i=0;

cin>>temp;

CNode *tempNode;

tempNode = pHead;

while(tempNode!=NULL)

{

if(tempNode->pData->szName[0]==temp)

{

i=1;

cout<<"Name Phone Number 录入时的系统时间 \n";

cout<<"---------------------------------------------------------\n";

cout.setf(ios::left);

cout<<setw(20)<<tempNode->pData->szName; //输出(姓名)

cout<<setw(20)<<tempNode->pData->szNumber; //输出电话号码

cout<<setw(20)<<tempNode->pData->szDate<<endl;

tempNode =tempNode->pNext; //结点后移

cout<<endl;

}

else

tempNode =tempNode->pNext;

}

if(i==0)

cout<<"\n\t\t抱歉!没有找到您想要的信息!"<<endl;

}

三、调试报告:

我的VC课程设计报告

1、 这个程序比设计到了指针,比上次哪个21点又增加了难度,刚开始把程序改变结构的时候,一调试发现有很多错误。经一检查,发现其中有不少低级错误,比如还没有定义就用,有的没赋初值,特别是那次在handle_choice函数里面少写了一个break,结果就是找不到到底是哪里的错误。想了足足一个半小时才找到原因。

2、 在增加录入系统时间功能的时候,我花了很多功夫,要将时间写入文件比较容易,但是要将时间从文件中拿出却阻止了我的进程,我找了好几本参考书,专看文件部分,但都是字符之间的操作,而得到的时间是整型。这真的令我一筹莫展。后来,我用sprintf(szDate,"%d年 %d月 %d日 %d:%d",Year,Month,Day,Hour,Minute)函数达到了我的目的!

四、总体小结:

1、说实话,以前写程序,我还没有学会调试,在这次作业中,我逐渐学会了一些较简单的调试功能。

2.本程序有几个地方要用到我们教材上没有的知识点,问同学也少有人知道,看MSDN又全是英文,看不懂,我就又进入VC98的include里面去找头文件,通过多方面的找资料,我终于弄懂了一些我们教材外的知识点,养成了独立学习,遇到问题不是马上就坐立不安,而是自己查找各种各样的资料来解决的习惯。

五、分工介绍:

独立完成

相关推荐