这个程序编译出错…………

MpsLee 2010-04-28 12:44:27
#include<iostream>
#include<cmath>
const double PI=3.1416;
using namespace std;
class shape
{
public:
shape(double w=0) {
r=w;
}
virtual double Area()=0;
protected:
double r;
};
class circle:public shape
{
circle(double g=0):shape(g)
{
}
double Area()
{

double s=PI*r*r;
return s;
}
};
class square:public shape
{
square(double a=0,double b=0):shape(a),l(b) {}
double Area()
{

double s=l*r;
}
protected:
double l;
};
class triangle:public shape
{
triangle(double c=0,double e=0,double d=0):shape(c)
{
r1=e;
angle=PI*d/180.0;
}
double Area()
{
double s=0.5*r*r1*sin(angle);
return s;
}
protected:
double r1;
double angle;
};
double fun(shape *p)
{
return p->Area();
}

int main()
{
square sq(1,1);
triangle tr(1,1,45);
circle ci(1);
shape *p;
double s=0;
p=&sq;
cout<<"正方形面积是:"<<fun(p)<<endl;
s+=fun(p);
p=&tr;
cout<<"三角形面积是:"<<fun(p)<<endl;
s+=fun(p);
p=&ci;
cout<<"圆形的面积是:"<<fun(p)<<endl;
s+=fun(p);

cout<<"三图形总面积是:"<<s<<endl;


return 0;
}


形状.cpp
C:\Documents and Settings\Administrator\桌面\形状.cpp(61) : error C2248: 'square::square' : cannot access private member declared in class 'square'
C:\Documents and Settings\Administrator\桌面\形状.cpp(29) : see declaration of 'square::square'
C:\Documents and Settings\Administrator\桌面\形状.cpp(62) : error C2248: 'triangle::triangle' : cannot access private member declared in class 'triangle'
C:\Documents and Settings\Administrator\桌面\形状.cpp(40) : see declaration of 'triangle::triangle'
C:\Documents and Settings\Administrator\桌面\形状.cpp(63) : error C2248: 'circle::circle' : cannot access private member declared in class 'circle'
C:\Documents and Settings\Administrator\桌面\形状.cpp(17) : see declaration of 'circle::circle'
执行 cl.exe 时出错.


各位高手帮帮忙
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2010-04-28
  • 打赏
  • 举报
回复
帮顶一个
尹成 2010-04-28
  • 打赏
  • 举报
回复
private成员是无法在类外面使用的,即使类的对象也不可以
chp845 2010-04-28
  • 打赏
  • 举报
回复
vc类中默认为私有...
hzy694358 2010-04-28
  • 打赏
  • 举报
回复
1楼正解
由错误提示:
error C2248: 'square::square' : cannot access private member declared in class 'square'
就可以看出你定义成private成员了,而private成员是无法在类外面使用的
zuiyuezhou888 2010-04-28
  • 打赏
  • 举报
回复
你可以双击报错的语句 VS就会找到那句话 你就可以看看到底是什么样的问题 要学会分析和解决问题
icanfly1234 2010-04-28
  • 打赏
  • 举报
回复
cout<<"Õý·½ÐÎÃæ»ýÊÇ£º"<<fun(p)<<endl;
s+=fun(p);
后面 cout<<"Èý½ÇÐÎÃæ»ýÊÇ£º"<<fun(p)<<endl;
s+=fun(p);
的s再相加就成了正方形和三角形面积的和,应该在s+=之前加上s=0;
后面的同样????
Eleven 2010-04-28
  • 打赏
  • 举报
回复
你的square类,triangle类和circle类中的构造函数默认都是private访问权限,修改为public即可,我想你是忘记加public标记了,不写的话,默认是private访问的,这个和struct结构体不同,struct中如果不写,默认的是public访问的。
还有你的square类的double Area()函数需要返回一个double类型的值。
代码帮你修改完成:

#include<iostream>
#include<cmath>
const double PI=3.1416;
using namespace std;
class shape
{
public:
shape(double w=0) {
r=w;
}
virtual double Area()=0;
protected:
double r;
};
class circle:public shape
{
public:
circle(double g=0):shape(g)
{
}
double Area()
{

double s=PI*r*r;
return s;
}
};
class square:public shape
{
public:
square(double a=0,double b=0):shape(a),l(b) {}
double Area()
{

double s=l*r;
return s;
}
protected:
double l;
};
class triangle:public shape
{
public:
triangle(double c=0,double e=0,double d=0):shape(c)
{
r1=e;
angle=PI*d/180.0;
}
double Area()
{
double s=0.5*r*r1*sin(angle);
return s;
}
protected:
double r1;
double angle;
};
double fun(shape *p)
{
return p->Area();
}

int main()
{
square sq(1,1);
triangle tr(1,1,45);
circle ci(1);
shape *p;
double s=0;
p=&sq;
cout<<"Õý·½ÐÎÃæ»ýÊÇ£º"<<fun(p)<<endl;
s+=fun(p);
p=&tr;
cout<<"Èý½ÇÐÎÃæ»ýÊÇ£º"<<fun(p)<<endl;
s+=fun(p);
p=&ci;
cout<<"Ô²ÐεÄÃæ»ýÊÇ£º"<<fun(p)<<endl;
s+=fun(p);

cout<<"ÈýͼÐÎ×ÜÃæ»ýÊÇ£º"<<s<<endl;
return 0;
}

第一章 C程序设计筑基..........................................................................................................1 1.1 二进制基础.................................................................................................................1 1.1.1 为什么采用二进制.........................................................................................1 1.1.2 二进制、十六进制和八进制...........................................................................2 1.1.3 原码、反码与补码...........................................................................................4 1.1.4 模216原则.......................................................................................................7 1.1.5 浮点小数的二进制表示.................................................................................8 1.2 程序员眼中的计算机.................................................................................................9 1.2.1 数据在计算机中的存储形式.........................................................................9 1.2.2 计算机的运行方式与特点...........................................................................11 1.3 程序设计的方法......................................................................................................13 1.3.1 程序设计的两大要素...........................................................................13 1.3.2 算法的描述.......................................................................................15 1.3.3 流程的跟踪执行...........................................................................18 1.4 C程序初步......................................................................................................19 1.4.1 计算机语言分类...........................................................................19 1.4.2 C语言简史及特点.................................................................................20 1.4.3 C程序示例及组成...........................................................................21 1.5 C程序解题分析.................................................................................................25 1.5.1 详解判断素数程序.......................................................................................25 1.5.2 综合示例......................................................................................................32 1.5.3 C程序书写风格...........................................................................................34 1.6 编程学习方法总结...................................................................................................36 第二章 上机指导与解题分析..............................................................................................39 2.1 上机编程环境...........................................................................................................39 2.2 Turbo C集成开发环境............................................................................….............40 2.2.1 Turbo C集成开发环境介绍.........................................................................40 2.2.2 文本编辑..................................................................….............................42 2.2.3 编译和连接..........................................….....................................…............44 2.2.4 程序运行与调试..................................….....................................…............46 2.2.5 Turbo C环境设置..............................….....................................…............50 2.3 常见的变量类型、运算符及输入出格式.....…........................................…............50 2.4 程序举例.............................................…...................………..........….....…............52 2.5 Turbo C上机实验...............................….....…..……............…....….......…............59 第三章 基本数据类型、运算符与输入输出函数...….....…..…….…....…......…............67 3.1 基本数据类型...….....…..……………….....…....…..…....….......….......………....67 3.2 常量……………………..……………….............…...…..…....…….......………....67 3.2.1 整型常量…….…….……………........…....…..….........….......………....67 3.2.2 实型常量…..………………………….............…..….....….......………....68 3.2.3 字符常量…..…………………………….............…....….....…....…...…....68 3.2.4 字符串常量…..………………………….............…....….....…....…...…....69 3.2.5 符号常量…..…………………………….............…....….....…....…...…....69 3.3 变量…..…………………………………...........…………....….....….......……...70 3.3.1 C标识符……………………...........…………..........….......…….……...70 3.3.2 整型变量………………….....…......…………..........….......…………...70 3.3.3 实型变量….....……………………......…………..........….......………...71 3.3.4 字符型变量………………………………………......….....…………….71 3.3.5 变量的初始化………………...…......…………..........….......…………...72 3.4 C语言的运算符和表达式……………...........…………....…......….......……....72 3.4.1 算术运算符和算术表达式..………………….…....….....….......……...73 3.4.2 赋值运算符和赋值表达式………..……..……….…....….....…...……....74 3.4.3 关系运算符和关系表达式………….........…….…....….....….....……….74 3.4.4 逻辑运算符和逻辑表达式………....…...……….…....….....…...……....75 3.4.5 条件运算符和条件表达式………...........……….…....….....…...……....76 3.4.6 逗号运算符和逗号表达式………...........……….…....….....…...……....78 3.4.7 指针运算符………....………...……........……….…....….....…...……....78 3.4.8 sizeof运算符…………..………….........……….…....….....…...……....79 3.4.9 不同类型数据之间的转换………...........……….…....….....…...……....79 3.4.10 C运算符优先级和结合性………….......……….…....….....…...……....80 3.5 输入输出函数……………………………........…………....…......….......……....80 3.5.1 格式化输入输出函数..……………………….…....….....….......……...81 3.5.2 字符输入输出函数………..……………..……….…....….....…...……....84 第四章 语句与程序控制结构……………………………..........……….….........……....89 4.1 语句总述…………………………………….......…….…......….....….....….....…89 4.1.1 说明语句、表达式语句和空语句……………..........…….........………....89 4.1.2 控制语句………………………….........………....….....….....………....89 4.1.3 复合语句……….….……………….......……………....….....….......…....89 4.2 顺序结构…………………………………………......………......….......………..90 4.3 选择结构………….…………………………...........………....….....….......…....91 4.3.1 if语句…………….………….…..........…….…….....….......………..91 4.3.2 switch语句…………...........……………….……....….....….......………..95 4.4 循环结构…………………………………….......…….…......….....….....….....…100 4.4.1 while语句……………………………………..........…...........………....100 4.4.2 do-while语句…………………….........………....….....….....………....102 4.4.3 for语句……….….………………........……………....….....….......…....103 4.4.4 break语句……….….……………........……………....….....….......…....105 4.4.5 continue语句……….….…......……....……………....….....….......…....107 4.4.6 goto语句…………………….…..........……………....….....….......…....108 4.4.7 多重循环………………….….…..........……………....….....….......…....109 4.5 程序举例……….….………………..........…………………....…..............….......111 第五章 数组和字符串…..………………......……………...…………....…........……....117 5.1 一维数组…..………..…………....…........…………………...…........………....117 5.1.1 一维数组的定义和引用..………..…...........…………....…......………..117 5.1.2 一维数组初始化…..…………..…..…...........…………....…....………..118 5.1.3 程序举例…..………..…..…..…..……........…………....…......………....120 5.2 二维数组…………….........…..…..………………………………....…......…....127 5.2.1 二维数组的定义和引用…………..…...………………....…....………....127 5.2.2 二维数组初始化……………..…..………………………....…......…....128 5.2.3 程序举例…………………..………………………………………..…….129 5.3 字符串处理…………..…..…..…..…..….........……………………...…......…....133 5.3.1 字符数组与字符串………..…..…..…..……......………….…....…..…....133 5.3.2 字符串的输入和输出…………….......…..…...……………......…..…....133 5.3.3 字符串处理函数….………….....…………………………....…....……...136 5.3.4 程序举例…….........……..…..………………………....…...…...……...138 第六章 函数..…..……....…......……………………………...………….………………...144 6.1 模块化程序设计思想…….........…………………..…………....…......………..144 6.2 模块设计举例.........……………………………………………..…….......……...144 6.3 函数概念….........……………………………………….……....…......………..145 6.3.1 函数定义….........……………………………..…..……....…......……...145 6.3.2 函数说明和函数调用……………………….…….……....….....………..146 6.3.3 形参与实参...………………………………..…….……....….....……...149 6.3.4 函数返回值.......……………………………..…..……....…......………..150 6.3.5 传值与传址...………………………………..…….……....….....……...151 6.3.6 数组作为函数的参数的例子……………………….……....….....……...152 6.4 函数的嵌套........……………………………....…......…………………………...153 6.5 函数的递归………..…..………….…………...….......………………………...155 6.6 变量作用域和存储类别………..…..………………….…………………………160 6.6.1 局部变量和全局变量…….……….....…………………….……………..160 6.6.2 变量存储类别…..…..……....…......……………………….……………..161 6.7 使用库函数………..…..…………………………...……………………………162 6.8 程序举例………..…..……………………………………………...……………165 第七章 指针..…..……....…......……………………...………….………………...170 7.1 指针概念..…..……....…......………………………………….……………...170 7.2 指针变量的定义和使用..………….....…......………….……….………....172 7.3 指针与一维数组……......…......………………….……………………..….....175 7.3.1 一维数组的内存安排…......…………......….….…...…………..………..175 7.3.2 指向数组的指针运算...…………...…………….……….…………..…...176 7.3.3 下标法与指针法表示的等价性…….....…...…………………….………...178 7.3.4 程序举例……………….……………….………..…..……….……….....179 7.4 指针与函数……......…......…………….…………………………………..….....181 7.4.1 指针作为函数参数…......…………......….….……...…………..………..181 7.4.2 指针做为函数返回类型...…………...………….……….…………..…...184 7.4.3 动态内存分配与释放函数…….....…...…………......………….………...185 7.4.4 函数指针……………….……………….………..…..……….……….....187 7.5 指针数组、多级指针与指向一维数组的指针………….……………………..….....189 7.5.1 指针数组与多级指针…......…………......….….…...…………..………..189 7.5.2 二维数组与指向一维数组的指针...………….……….…………..…...191 7.5.3 二维数据的构造举例…….....…...……………......………….………...193 7.6 指针与字符串……......…......…………….…………………………………..….....194 7.6.1 字符串的内存安排…......…………......….….……...…………..………..194 7.6.2 字符串处理程序举例...…………...………….………….…………..…...196 7.6.3 多字符串的表示与处理…….....…...……………......………….………...198 7.6.4 程序举例……………….……………….………..…..……….……….....202 7.6.5 命令行参数…………….……………….………..…..……….……….....207 第八章 结构体、联合与枚举..……………......……………...…………....…........……....211 8.1 概述…..………………………....……........…………………...…........………....211 8.2 结构体类型定义………….........…..………………………………....…......…....211 8.3 结构体变量………….........………………………………………....…......…....212 8.3.1 结构体变量的定义…………………...………………....…....………....212 8.3.2 结构体变量的引用…………..…….………………………....…......…....214 8.3.3 结构体变量初始化………..……………………………………..……….215 8.4 结构体数组…………..…..…..…..…..……......……………………...…......…....216 8.4.1 结构体数组的定义………..…..……..……......………….…....…..…....216 8.4.2 结构体数组初始化与引用…………….......…..……………......…..…....217 8.4.3 结构体数组的输入和输出.………….....…………………....…....……...217 8.5 指向结构体类型数据的指针……..…..……....……………………...…......…....218 8.5.1 定义和初始化………..…..…..…..……………..………….…....…..…....219 8.5.2 用结构体指针引用结构体成员…………….......…………......…..…....219 8.5.3 指向结构体数组的指针.………….....…………………....……………...219 8.6 结构体与函数…………..…..…..…..…..…......……………………...…......…....221 8.6.1 向函数传递结构信息………..…..…..…..……………….…....…..…....221 8.6.2 结构体指针作为函数返回值…………….......…..…………......…..…....223 8.7 单链表……..……………………………........……………………...…......…....225 8.7.1 概述………..…..…..…..……………………......………….…....…..…....225 8.7.2 结点定义…………….......…………………………………......…..…....226 8.7.3 建立链表.………….....……………………………………....…....……...226 8.7.4 输出链表.………….....……………………………………....…....……...233 8.7.5 插入结点.………….....……………………………………....…....……...234 8.7.6 删除结点.………….....……………………………………....…....……...236 8.7.7 程序举例.………….....……………………………………....…....……...238 8.7.8 其他链表结构………….....…………………....………………….……...242 8.8 联合与枚举……..…..………………………....……………………...…......…....244 8.8.1 联合类型………..…..…..…………………......………….…....…..…....244 8.8.2 枚举类型…………….......…………………………………......…..…....246 8.8.3 复杂类型举例………….....………………………………....…....……...248 8.9 用typedef定义类型……..…..…........……………………………...…......…....250 第九章 文件…..…………………………......……………...…………....…........……....252 9.1 文件概述…..………..……………..…........…………………...…........………....252 9.2 文件打开和关闭..……….………………………......…………....…......………..252 9.3 文本文件的输入与输出….........…..………………………………....…......…....255 9.3.1 读写一个字符的函数…………..……………………....…....………....255 9.3.2 字符串读写函数…………..…..…………………………....…......…....256 9.3.3 格式化读写函数……………..…………....……………………...……...258 9.4 二进制文件的输入与输出…..…..…...….........……………………...…......…....261 9.5 其他文件库函数…..…..…...…................………........……………...…......…....264 9.5.1 文件的定位函数……….....…..…..…..……......………….…....…..…....264 9.5.2 出错监测函数…………….......…..…...………………………......……...265 第十章 预处理和位运算..…………………....……………...…………....…........……....267 10.1 预处理…..……………………..……........…………………...…........………....267 10.1.1 概述………..…..…..………………………......………….…....…..…....267 10.1.2 宏定义……..…..…..…..…………………......………….…....…..…....267 10.1.3 文件包含…..…..…..…..…………………......………….…....…..…....270 10.1.4 条件编译…..…..………..…………………......………….…....…..…....271 10.2 位运算………….........…..………………………………………....…......…....272 附录Ⅰ 常用ASCII码对照表…………………………………………………………….278 附录Ⅱ C语言的关键字表…......…………………...…………….…….….………….....279 附录Ⅲ C语言的运算符表.......…………………………...…………….……..……..…..280 附录Ⅳ C常用的库函数…......…....…………..……………………...….….…..…….....281 参考资料…......…....…………..…..…..…..…..…..…………………...….….…..…….....284
"学 号 " " 课 程 设 计 "题 目 "仓库管理系统设计 " "教 学 院 "计算机学院 " "专 业 " " "班 级 "一班 " "姓 名 "** " "指导教师 " " "2010 "年"7 "月"3 "日 " 课程设计任务书 2009~2010学年 第 二 学期 学生姓名: 专业班级: 指导教师: 工作部门: 计算机学院 一、课程设计题目 仓库管理系统设计 二、设计目的 1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。 2.培养学生综合运用所学知识独立完成课题的能力。 3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考 虑问题等科学技术人员应具有的素质。 4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。 5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决 问题的新途径的悟性,初步培养工程意识和创新能力。 6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书 面及口头表达能力进行考核。 三、设计要求 1.可组成设计小组,小组成员分工协作完成。要求每个成员有自己相对独立的模块 ,同时要了解其他组员完成的内容。 2.查阅相关资料,自学具体课题中涉及到的新知识。 3.采用结构化、模块化程序设计方法,功能要完善,界面要美观。 4.所设计的系统原则上要能够运行无误,结果准确。 5.按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、 课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件 的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印 ,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用"固定值"20磅,首行缩进2字符。总体设计应配合软件 总体模块结构图来说明软件应具有的功能。详细设计应用传统或N- S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如 何解决的。 四、设计内容 任务说明:一个存放商品的仓库,每天都有商品出库和入库。每种商品都有名称、生 产厂家、型号、规格等。出入库时必须填写出入库单据,单据包括商品名称、生产厂家 、型号、规格、数量、日期、时间、入库单位(或出库单位)名称、送货(或提货)人 姓名。 设计要求: 1) 进行需求分析,编写数据字典。 2) 设计E-R图。设计数据库对象(表、视图、存储过程等) 3) 设计出入库单据的录入。 4) 实现按商品名称、出入库日期的查询。 5) 实现分别按日、月和年对出入库商品数量的统计。 三、课程设计工作计划 2010年6月21日,指导教师讲课,学生根据题目准备资料; 2010年6月21日,设计小组进行总体方案设计和任务分工; 2010年6月22日~2010年6月30日,每人完成自己承担的程序模块并通过独立编译; 2010年7月1日~2010年7月2日,将各模块集成为一个完整的系统,并录入足够的数据 进行调试运行; 2010年7月3日,验收,撰写报告,答辩及总结。 教研室主任签字: 年 月 日 目录 一.引言………………………………………………………………………….4 二.系统分析…………………………………………………………………….5 1.实验目的……………………………………………………………………5 2.数据描述……………………………………………………………………5 3.数据流图……………………………………………………………………6 4.E-R图………………………………………………………………………6 5.数据字典……………………………………………………………………7 6.功能描述……………………………………………………………………8 三.系统设计与实现…………………………………………………………….11. 1.职员操作统计………………………………………………………………….11 2.月盘点………………………………………………………………………….13 3. 入库单………………………………………………………………………..15 四.小结…………………………………………………………………………..17 . 第一章 引言 仓库在现实生活中用途十分广泛,各种商城、超市要利用仓库存放物资,药房、医院等 要利用仓库存放药品,企业、工厂等要利用仓库存放原材料、生产成品,因此仓库的管 理成了一项十分重要的工作。 人工管理仓库既费时又费力,而且容易造成混乱,严重时会影响商城、企业的正常运 作,造成恶劣的后果。随着信息技术的发展,办公自动化的普及,如何快速,高效,便 捷的管理仓库受到了高度的关注;因此为了解决这个问题我们提供这个系
攀枝花学院本科学生课程设计任务书 题 目 二叉排序树与平衡二叉树的实现 1、课程设计的目的 使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等) (1) (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”; (5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 3、主要参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社 4、课程设计工作进度计划 第1天 完成方案设计与程序框图 第2、3天 编写程序代码 第4天 程序调试分析和结果 第5天 课程设计报告和总结 指导教师(签字) 日期 年 月 日 教研室意见: 年 月 日 学生(签字): 接受任务时间: 年 月 日 注:任务书由指导教师填写。 课程设计(论文)指导教师成绩评定表 题目名称 二叉排序树与平衡二叉树的实现 评分项目 分值 得分 评价内涵 工作 表现 20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。 02 科学实践、调研 7 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。 03 课题工作量 7 按期圆满完成规定的任务,工作量饱满。 能力 水平 35% 04 综合运用知识的能力 10 能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。 05 应用文献的能力 5 能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。 06 设计(实验)能力,方案的设计能力 5 能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。 07 计算及计算机应用能力 5 具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。 08 对计算或实验结果的分析能力(综合分析能力、技术经济分析能力) 10 具有较强的数据收集、分析、处理、综合的能力。 成果 质量 45% 09 插图(或图纸)质量、篇幅、设计(论文)规范化程度 5 符合本专业相关规范或规定要求;规范化符合本文件第五条要求。 10 设计说明书(论文)质量 30 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。 11 创新 10 对前人工作有改进或突破,或有独特见解。 成绩 指导教师评语 指导教师签名: 年 月 日 摘要及关键字 本程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”。 二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。 二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 关键字:数列L,结点,二叉排序树,平衡二叉树        目录 摘要…………………………………………………………………………… 3 1 绪论………………………………………………………………………… 5 1.1 课程设计的目的…………………………………………………………… 5 1.2 相关知识的阐述…………………………………………………………… 5 1.2.1一位数组的存储结构…………………………………………………… 5 1.2.2建立二叉排序树……………………………………………………… 5 1.2.3中序遍历二叉树………………………………………………………… 5 1.2.4平均查找长度…………………………………………………………… 6 1.2.5平均二叉树(AVL树)…………………………………………………… 6 1.2.6平衡因子………………………………………………………………… 7 1.2.7平衡二叉树的调整方法…………………………………………………… 7 2 方案设计……………………………………………………………… 8 2.1 模块功能………………………………………………………………………8 3 算法设计…………………………………………………………………… 8 3.1 算法流程图…………………………………………………………………… 8 4 详细设计……………………………………………………………… 10 4.1 主程序………………………………………………………………… 10 4.2 定义二叉树结构……………………………………………………………… 11 4.3 建立二叉树…………………………………………………………………… 11 4.3.1二叉排序树的查找…………………………………………………………11 4.3.2二叉排序树的插入…………………………………………………………11 4.4 中序遍历…………………………………………………………………12 4.5 平均查找长度…………………………………………………………………12 4.6 删除节点…………………………………………………………………12 4.7 判断平衡二叉树……………………………………………………………… 13 5 调试分析………………………………………………………………………… 14 5.1 时间复杂度的分析………………………………………………………………14 5.2 运行结果………………………………………………………………… 14 5.3 结果分析………………………………………………………………… 15 6 课程设计总结…………………………………………………………………… 16 参考文献………………………………………………………………………… 17 1 绪论 1.1 课程设计的目的 (1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 (2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 (3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 1.2 相关知识的阐述 1.2.1 一维数组的存储结构 建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找边插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0” 补齐。 1.2.2 建立二叉排序树 二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。 插入算法: 首先执行查找算法,找出被插结点的父亲结点; 判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入; 若二叉树为空,则首先单独生成根结点。 注意:新插入的结点总是叶子结点。 1.2.3 中序遍历二叉树 中序遍历二叉树算法的框架是: 若二叉树为空,则空操作; 否则(1)中序遍历左子树(L); (2)访问根结点(V); (3)中序遍历右子树(R)。 中序遍历二叉树也采用递归函数的方式,先访问左子树2i,然后访问根结点i,最后访问右子树2i+1.先向左走到底再层层返回,直至所有的结点都被访问完毕。 1.2.4 平均查找长度 计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。  假设在含有n(n>=1)个关键字的序列中,i个关键字小于第一个关键字,n-i-1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为:          ASL(n,i)=[1+i*(P(i)+1)+(n-i-1)(P(n-i-1)+1)]/n 其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-1)+1为查找右子树中每个关键字时所用比较次数的平均值。又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,…,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。最终会推导出:          当n>=2时,ASL(n)<=2(1+1/n)ln(n) 由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。 另外,含有n个结点的二叉排序树其判定树不是惟一的。对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。 而在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关:  ①在最坏情况下,二叉排序树是通过把一个有序表的n个结点依次插入而生成的,此时所得的二叉排序树蜕化为棵深度为n的单支树,它的平均查找长度和单链表上的顺序查找相同,亦是(n+1)/2。  ②在最好情况下,二叉排序树在生成的过程中,树的形态比较匀称,最终得到的是一棵形态与二分查找的判定树相似的二叉排序树,此时它的平均查找长度大约是lgn。  ③插入、删除和查找算法的时间复杂度均为O(lgn)。 1.2.5 平衡二叉树( AVL树 ) ①平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高度大致相同。     ②任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。     ③平衡的二叉排序树指满足BST性质的平衡二叉树。     ④AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树高度约为lgn,AVL树是最接近最优的。 1.2.6 平衡因子 二叉树上任一结点的左子树深度减去右子树的深度称为该结点的平衡因子,易知平衡二叉树中所有结点的因子只可能为0,-1和1。 平衡二叉排序树的在平衡因子绝对值等于2时开始调整到绝对值为1或0,在平衡因子绝对值为2时,二叉排序树会出现四种不同的情况的树形,因此这时需要分别单独讨论来降低平衡因子。 1.2.7 平衡二叉树的调整方法   平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下: (1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点; (2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点; (3)判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整; (4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突; (5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。 2 方案设计 2.1 模块功能 1.建立二叉树:要求以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T。 2.中序遍历并输出结果:要求将第一步建立的二叉树进行中序遍历,并将结果输出。 3.平均查找长度并输出:要求计算二叉排序树T查找成功的平均查找长度,输出结果。 4.删除节点:要求输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 5.生成平衡二叉树:要求用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; 6.平均查找长度:计算平衡的二叉排序树BT的平均查找长度,输出结果。 3 算法设计 3.1 算法流程图 建立二叉树流程图: YES NO 主程序流程图: 中序遍历流程图: 删除节点流程图: 4 详细设计 4.1 主程序 void main() { node T=NULL; int num; int s=0,j=0,i=0; int ch=0; node p=NULL; printf("请输入一组数字并输入0为结束符:"); do{ scanf("%d",&num); if(!num) printf("你成功完成了输入!\n"); else insertBST(&T,num); }while(num); printf("\n\n---操作菜单---\n"); printf("\n 0: 退出" ); printf("\n 1: 中序遍历"); printf("\n 2: 平均查找长度"); printf("\n 3: 删除"); printf("\n 4: 判断是否是平衡二叉树"); while(ch==ch) { printf("\n 选择操作并继续:"); scanf("%d",&ch); switch(ch){ case 0: exit(0); /*0--退出*/ case 1: printf(" 中序遍历结果是:\n "); inorderTraverse(&T); break; case 2: s=0;j=0;i=0; calculateASL(&T,&s,&j,i); printf(" ASL=%d/%d",s,j); break; case 3: printf(" 请输入你想删除的数字:"); scanf("%d",&num); if(searchBST(T,num,NULL,&p)) { T=Delete(T,num); printf(" 你已成功删除该数字!\n "); inorderTraverse(&T); else printf(" 没有你想要删除的节点 %d!",num); break; case 4: i=0; balanceBST(T,&i); if(i==0) printf(" OK!这是平衡二叉树!"); else printf(" NO!"); break; default: printf("你的输入有误!请重新输入!\n"); break; } } } 4.2 定义二叉树结构 #include typedef struct Tnode { int data; struct Tnode *lchild,*rchild; }*node,BSTnode; 4.3 建立二叉树 4.3.1 二叉排序树的查找 searchBST(node t,int key,node f,node *p){ /*在根指针t所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,则指针p指向该数据元素节点,并返回(1),否则指针p指向查找路径上访问的最后一个节点并返回(0),指针f指向t的双亲,其初始调用值为NULL*/ if(!t) {*p=f;return (0);} /*查找不成功*/ else if(key==t->data) {*p=t;return (1);} /*查找成功*/ else if(keydata) searchBST(t->lchild,key,t,p); /*在左子树中继续查找*/ else searchBST(t->rchild,key,t,p); /*在右子树中继续查找*/ } 4.3.2 二叉排序树的插入 insertBST(node *t,int key){ /*当二叉排序树t中不存在关键字等于key的数据元素时,插入key并返回(1),否则返回(0)*/ node p=NULL,s=NULL; if(!searchBST(*t,key,NULL,&p)) /*查找不成功 */ { s=(node)malloc(sizeof(BSTnode)); s->data=key; s->lchild=s->rchild=NULL; if(!p) *t=s; /*被插入节点*s为新的根节点*/ else if(keydata) p->lchild=s; /*被插节点*s为左孩子*/ else p->rchild=s; /*被插节点*s为右孩子*/ return (1); } else return (0); /*树中已有关键字相同的节点,不再插入*/ } 4.4 中序遍历 inorderTraverse(node *t) /*中序遍历*/ { if(*t){ if(inorderTraverse(&(*t)->lchild)) { printf("%d ",(*t)->data); if(inorderTraverse(&(*t)->rchild)); } } else return(1); } 4.5 平均查找长度 calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/ {if(*t){ i++; *s=*s+i; if(calculateASL(&(*t)->lchild,s,j,i)) { (*j)++; if(calculateASL(&(*t)->rchild,s,j,i)) {i--; return(1);} } } else return(1); } 4.6 删除节点 node Delete(node t,int key) { /*若二叉排序树t中存在关键字等于key的数据元素时,则删除该数据元素节点 */ node p=t,q=NULL,s,f; while(p!=NULL) { if(p->data==key) break; q=p; if(p->data>key) p=p->lchild; else p=p->rchild; } if(p==NULL) return t; if(p->lchild==NULL) { if(q==NULL) t=p->rchild; else if(q->lchild==p) q->lchild=p->rchild; else q->rchild=p->rchild; free(p); } else{ f=p; s=p->lchild; while(s->rchild) { f=s; s=s->rchild; } if(f==p) f->lchild=s->lchild; else f->rchild=s->lchild; p->data=s->data; free (s); } return t; } 4.7 判断平衡二叉树 int balanceBST(node t,int *i) /*判断平衡二叉树*/ { int dep1,dep2; if(!t) return(0); else { dep1=balanceBST(t->lchild,i); dep2=balanceBST(t->rchild,i); } if((dep1-dep2)>1||(dep1-dep2)dep2) return(dep1+1); else return(dep2+1); } 5 调试分析 5.1 时间复杂度的分析 为了保证二叉排序树的高度为lgn,从而保证然二叉排序树上实现的插入、删除和查找等基本操作的时间复杂度为O(lgn)。 5.2 运行结果 图5.1.1 调试界面 在程序调试过程当中,编译时并没有报错,但是运行时总是出错,在查阅资料和同学的帮助下,发现程序未对数组初始化。添加数组初始化代码: s=(node)malloc(sizeof(BSTnode)) 输入一组数列,以结0结束: 图5.2.2运行界面一 中序遍历: 图5.2.3运行界面二 计算平均查找长度 图5.2.4运行界面三 删除已有结点: 图5.2.5运行界面四 删除失败: 图5.2.6运行界面五 判断是否是平衡二叉树: 图5.2.7运行界面六 5.3 结果分析 通过运行程序和严密的求证,运行结果无误,不过对于转换平衡二叉树和平衡二叉树平均查找长度未能实现,同时也无法实现图像显示。 6 课程设计总结 在这一周的课程设计中,其实对我来说还是收获颇多。这不光提高了我的程序设计能力,更为我的就业增加了筹码。对我们来说,独立完成这样课程设计是比较困难,其中包括模块的组成分析和模块功能的实现。最后我不得不从网上下载源程序,借助课本,困难地将几个模块串起来。最后终于完成了自己的课程设计。 这次实验中我也出现过一些比较严重的错误。在用一维数组顺序表结构编写程序时我错误的运用静态链表来实现函数功能。这是我对基本概念理解的模糊不清造成的。我原以为只要采用一维数组作为存储结构它就一定也是顺序表结构,而实质上这根本是两个不相干的概念。后来在同学的指点下我意识到自己的错误。不过收获也很不少。至少我又练习了运用静态链表来实现同样的功能,同时我也发现两者在很多函数上是互通的,只需稍作修改即可移植。 另外程序的不足之处是不能实现对0这个数字的存储,可以通过改变数字的存储结构方式来实现,如使用二叉链表来作为数据的存储结构,即可实现该功能。还有就是可能自己学的还不够,对于最后两个要求未能完成,不得不说这是自己学艺不精。 现在觉得以前我对数据结构的认识是那么的肤浅,因此我下定决心寒假一定好好的把数据结构复习一遍。而且本次课程设计不光增强了我程序调试的能力,还有在面对一个较大的程序要冷静,不要浮躁,先分析模块要实现的功能,再把模块划分,最后到一个一个得模块实现,并且要不断地练习,这样,一个大的程序对我来说将不成问题。 参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧