c语言课程设计--汉诺塔

合集下载

C语言程序设计案例式教程(第2版)教学大纲

C语言程序设计案例式教程(第2版)教学大纲

《C语言程序设计案例式教程(第2版)》课程教学大纲(课程英文名称)
课程编号:
学分:5学分学时:94 (其中:讲课60上机34时)
先修课程:计算机操作系统适用专业课程:计算机
一、课程的性质与目标
本课程使用案例驱动教学,几乎每个案例通过案例描述、知识需求、知识讲解、案例实现四个部分,不仅详细讲解了C语言的相关知识,而且通过有趣实用的案例加强对知识的理解和应用。

通过本书的学习,读者既可以深刻理解C语言理论知识,又能牢固掌握编程实践能力。

二.教学要求
开发环境:
1.Windows 7操作系统及以上Visual Studio 2019
三、课程的主要内容及基本要求
第一章初识C语言
本课程为考试课程,期末考试采用百分制的闭卷考试模式。

学生的考试成绩由平时成绩(30%)和期末考试(70%)组成,其中,平时成绩包括出勤(5%)、作业(5%)、实验和上机成绩(20%)。

六、选用教材和主要参考书
本大纲是根据黑马程序员编著的教材《C语言程序设计案例式教程(第2版)》所设计。

七、大纲说明
本课程的授课模式为:课堂授课+上机,其中,课堂主要采用多媒体的方式进行授课,并且会通过测试题阶段测试学生的掌握程度;上机主要是编写程序,要求学生动手完成指定的程序设计或验证。

撰写人:
执行时间:审定人:
批准人:
端IT教育品牌
黑马程序员
传智教育旗下高
第二章C语言基础知识
第三章运算符与表达式
第五章数组
第六章函数
第七章指针
第九章结构体
第十一章文件。

c语言程序设计课程设计选题 (1)

c语言程序设计课程设计选题 (1)

《C语言程序设计》课程设计课题表一、A类1.职工信息管理系统设计2.职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。

试设计一职工信息管理系统,使之能提供以下功能:3.1、职工信息录入功能(职工信息用文件保存)--输入4.2、职工信息浏览功能--输出5.3、职工信息查询功能--算法6.查询方式:按学历查询、按职工号查询、条件组合查询7.职工信息删除、修改功能(可选项)8.图书信息管理系统设计9.图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。

10.试设计一图书信息管理系统,使之能提供以下功能:11.1、图书信息录入功能(图书信息用文件保存)--输入12.2、图书信息浏览功能--输出13.3、图书信息查询功能--算法14.查询方式:按书名查询、按作者名查询、条件组合查询15.图书信息的删除与修改(可选项)16.图书管理系统设计17.图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等18.功能描述:19.1、新进图书基本信息的输入。

20.2、图书基本信息的查询。

21.3、对撤消图书信息的删除。

22.4、为借书人办理注册。

23.5、办理借书手续。

24.6、办理还书手续25.要求:使用文件方式存储数据。

26.实验设备管理系统设计27.实验设备信息包括:设备编号,设备种类(如:微机、打印机、扫描仪等等),设备名称,设备价格,设备购入日期,是否报废,报废日期等。

28.主要功能:29.1、能够完成对设备的录入和修改30.2、对设备进行分类统计31.3、设备的破损耗费和遗损处理32.4、设备的查询33.要求:使用文件方式存储数据。

34.学生信息管理系统设计35.学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。

试设计一学生信息管理系统,使之能提供以下功能:36.1、系统以菜单方式工作37.2、学生信息录入功能(学生信息用文件保存)--输入38.3、学生信息浏览功能--输出39.4、学生信息查询功能--按学号查询、按姓名查询、40.5、学生信息的删除与修改(可选项)41.要求:使用文件方式存储数据。

汉诺塔

汉诺塔

4
演示:移动3个盘子的分解
move (2, A, C, B)
move (3, A, B, C)
move (1, A, B, C) move (2, B, A, C)A1 2 3BC5
move (1, A, B, C)
move (2, A, C, B) move (3, A, B, C) move (1, A, C, B)
9
move(3,A,B,C)
move(2,A,C,B) 输出 3:A to C
move(2,B,A,C)
move(1,A,B,C) move(1,C,A,B) move(1,B,C,A)
move(1,A,B,C)
输出 1:A to C
输出 输出 1:C to B 2:A to B
输出 1:B to A
当n > 1
参考代码
#include <stdio.h> void Move(int n, char a, char b) {//a移到b printf("Move disk %d from %c to %c\n", n, a, b); } void Hanoi(int n,char a, char b, char c){ if(n==0)return; Hanoi(n-1, a, c, b);//a借助c移到b Move(n, a, c); A Hanoi(n-1,b, a, c); } int main(){ B int n; while(scanf("%d", &n)!=EOF) Hanoi(n, 'A', 'B', 'C'); C }
汉诺塔(Haono)故事:

scratch汉诺塔递归算法

scratch汉诺塔递归算法

Scratch汉诺塔递归算法1. 引言汉诺塔(Hanoi Tower)是一种经典的数学问题,它可以帮助我们理解递归算法的原理和应用。

在这个任务中,我们将使用Scratch编程语言来实现汉诺塔递归算法。

2. 汉诺塔问题简介汉诺塔问题源于印度传说中的一个故事。

据说,在一个庙里有三根针,第一根针上套着64个不同大小的金盘子,大的在下面,小的在上面。

庙里的和尚每天都要将这些金盘子从第一根针移动到第三根针上,但是移动时必须遵守以下规则:1.每次只能移动一个盘子;2.每次移动必须将较小的盘子放在较大的盘子上面;3.可以借助第二根针作为中转。

3. 算法设计思路要解决汉诺塔问题,我们可以使用递归算法。

递归是一种函数调用自身的方法。

对于汉诺塔问题来说,我们可以将其分解为三个步骤:1.将n-1个盘子从第一根针移动到第二根针(借助第三根针作为中转);2.将第n个盘子从第一根针移动到第三根针;3.将n-1个盘子从第二根针移动到第三根针(借助第一根针作为中转)。

这样,我们可以通过递归调用这三个步骤来解决汉诺塔问题。

4. Scratch实现在Scratch中实现汉诺塔递归算法,我们需要创建以下角色和代码块:4.1 角色设计我们需要创建三个角色来表示三根针,以及一个角色来表示金盘子。

每个角色都应该有一个变量来表示当前所在的位置。

4.2 代码块设计我们需要设计以下代码块来实现汉诺塔递归算法:4.2.1 初始化代码块在初始化时,我们需要将金盘子放置在第一根针上,并设置好每个金盘子的大小。

当绿旗被点击时把金盘子放置在第一根针上设置金盘子大小4.2.2 移动代码块移动一个金盘子的过程可以分为以下几步:1.判断当前金盘子是否在目标针上;2.如果在目标针上,结束移动;3.如果不在目标针上,找到下一个需要移动到的位置(借助另外一根针);4.将当前金盘子移动到下一个位置;5.递归调用移动代码块,将剩余的金盘子移动到目标针上。

当收到 [移动金盘子 v] 消息时如果 [当前位置 v] = [目标位置 v] ?那么结束此脚本否则设置 [下一个位置 v] 为 (3 - [当前位置 v] - [目标位置 v])把金盘子放置在第 [下一个位置 v] 根针上把金盘子移到第 [目标位置 v] 根针上发送消息 (移动金盘子) 给自己并等待 (0.5) 秒4.2.3 触发移动代码块为了触发整个移动过程,我们可以创建一个按钮,并在其点击事件中调用移动代码块。

C语言程序设计实训报告

C语言程序设计实训报告

青岛大学软件技术学院C语言程序设计实训报告姓名专业班级指导教师2011 年 7月14日目录一.实训目的和要求 (1)1. 实训目的 (1)2. 实训要求 (1)二.试训任务内容 (1)1.问题定义 (1)2.问题分析 (2)三. 总体设计 (2)1.设计思想 (2)2.实现方法 (2)3.主要模块 (2)4.模块关系 (3)5.详细设计 (3)四.软件使用说明 (7)五.实训心得与体会 (8)参考文献 (9)附录代码 (10)一.实训目的和要求1. 实训目的本实训是软件技术专业重要的实践性环节之一,是在学生学习完《C语言程序设计》课程后进行的一次全面的综合练习。

本实训的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力2. 实训要求1. 分析实训题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交实训报告二.试训任务内容1.问题定义汉诺塔问题(Towers of Hanoi)2.问题分析假设有三根木桩A、B和C。

在木桩A上放置了N个圆盘,由上到下编号为1,2,,…,N,编号越大的圆盘直径越大。

而我们必须将圆盘由木桩A通过木桩B全部搬到木桩C 。

在移动过程中,必须按照下述移动规则:1.直径较小的圆盘永远置于直径较大的圆盘上;2.圆盘可任意地由任何一个木桩移到其他的木桩上;3.每一次仅能移动一个圆盘。

三.总体设计1.设计思想如果盘子为1,则将这个盘子从塔座A移动到塔座C;如果不为1,则采用递归思想。

将塔座A的前n-1个盘子借助C盘(即目的盘)移到塔座B,移后,此时C为空座,那我们就可以将塔座A的第n个盘子移到塔座C了。

接下来就将塔座B的n-1个盘子借助A移到塔座C,从而完成盘子的移动。

C#汉诺塔演示和代码

C#汉诺塔演示和代码

汉诺塔的演示界面:本系统显示的是汉诺塔的演示效果,分别有播放,暂停,和停止,右边显示的是每一步的动作,同时记录操作次数,可以调节演示的速度。

汉诺塔界面代码:namespace honio4{partial class Form1{/// <summary>/// 必需的设计器变量。

/// </summary>ponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。

/// </summary>/// <param name="disposing">如果应释放托管资源,为true;否则为false。

</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法- 不要/// 使用代码编辑器修改此方法的内容。

/// </summary>private void InitializeComponent(){ponents = new ponentModel.Container();this.panel1 = new System.Windows.Forms.Panel();this.panel2 = new System.Windows.Forms.Panel();this.panel3 = new System.Windows.Forms.Panel();bel1 = new bel();this.udLevels = new System.Windows.Forms.NumericUpDown();this.btnStart = new System.Windows.Forms.Button();this.btnPause = new System.Windows.Forms.Button();this.btnStop = new System.Windows.Forms.Button();bel2 = new bel();this.trackSpeed = new System.Windows.Forms.TrackBar();bel3 = new bel();this.progress = new System.Windows.Forms.ProgressBar();this.tmrPlay = new System.Windows.Forms.Timer(ponents);this.listBox1 = new System.Windows.Forms.ListBox();bel4 = new bel();bel5 = new bel();bel6 = new bel();bel7 = new bel();bel8 = new bel();((ponentModel.ISupportInitialize)(this.udLevels)).BeginInit();((ponentModel.ISupportInitialize)(this.trackSpeed)).BeginInit(); this.SuspendLayout();//// panel1//this.panel1.Location = new System.Drawing.Point(16, 16); = "panel1";this.panel1.Size = new System.Drawing.Size(96, 144);this.panel1.TabIndex = 7;this.panel1.Paint += newSystem.Windows.Forms.PaintEventHandler(this.panel1_Paint);//// panel2//this.panel2.Location = new System.Drawing.Point(136, 16); = "panel2";this.panel2.Size = new System.Drawing.Size(96, 144);this.panel2.TabIndex = 8;this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint);//// panel3//this.panel3.Location = new System.Drawing.Point(256, 16); = "panel3";this.panel3.Size = new System.Drawing.Size(96, 144);this.panel3.TabIndex = 8;this.panel3.Paint += new System.Windows.Forms.PaintEventHandler(this.panel3_Paint);//// label1//bel1.Location = new System.Drawing.Point(16, 168); = "label1";bel1.Size = new System.Drawing.Size(42, 21);bel1.TabIndex = 1;bel1.Text = "层数:";bel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;//// udLevels//this.udLevels.Location = new System.Drawing.Point(51, 166);this.udLevels.Maximum = new decimal(new int[] {5,0,0,0});this.udLevels.Minimum = new decimal(new int[] {1,0,0,0}); = "udLevels";this.udLevels.Size = new System.Drawing.Size(32, 21);this.udLevels.TabIndex = 9;this.udLevels.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.udLevels.Value = new decimal(new int[] {3,0,0,0});//// btnStart//this.btnStart.Location = new System.Drawing.Point(89, 164); = "btnStart";this.btnStart.Size = new System.Drawing.Size(48, 23);this.btnStart.TabIndex = 10;this.btnStart.Text = "播放";this.btnStart.Click += new System.EventHandler(this.btnStart_Click_1);//// btnPause//this.btnPause.Enabled = false;this.btnPause.Location = new System.Drawing.Point(143, 163); = "btnPause";this.btnPause.Size = new System.Drawing.Size(48, 23);this.btnPause.TabIndex = 11;this.btnPause.Text = "暂停";this.btnPause.Click += new System.EventHandler(this.btnPause_Click_1);//// btnStop//this.btnStop.Enabled = false;this.btnStop.Location = new System.Drawing.Point(197, 164); = "btnStop";this.btnStop.Size = new System.Drawing.Size(48, 23);this.btnStop.TabIndex = 12;this.btnStop.Text = "停止";this.btnStop.Click += new System.EventHandler(this.btnStop_Click_1);//// label2//bel2.Location = new System.Drawing.Point(251, 163); = "label2";bel2.Size = new System.Drawing.Size(32, 23);bel2.TabIndex = 13;bel2.Text = "慢速";bel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;//// trackSpeed//this.trackSpeed.Location = new System.Drawing.Point(278, 163);this.trackSpeed.Minimum = 1; = "trackSpeed";this.trackSpeed.Size = new System.Drawing.Size(56, 45);this.trackSpeed.TabIndex = 14;this.trackSpeed.TickStyle = System.Windows.Forms.TickStyle.None;this.trackSpeed.Value = 1;this.trackSpeed.Scroll += new System.EventHandler(this.trackSpeed_Scroll_1);//// label3//bel3.Location = new System.Drawing.Point(329, 168); = "label3";bel3.Size = new System.Drawing.Size(32, 23);bel3.TabIndex = 15;bel3.Text = "快速";bel3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;//// progress//this.progress.Location = new System.Drawing.Point(25, 200); = "progress";this.progress.Size = new System.Drawing.Size(336, 8);this.progress.TabIndex = 16;//// tmrPlay//this.tmrPlay.Interval = 1000;this.tmrPlay.Tick += new System.EventHandler(this.tmrPlay_Tick_1);//// listBox1//this.listBox1.FormattingEnabled = true;this.listBox1.ItemHeight = 12;this.listBox1.Location = new System.Drawing.Point(379, -1); = "listBox1";this.listBox1.Size = new System.Drawing.Size(219, 256);this.listBox1.TabIndex = 17;//// label4bel4.AutoSize = true;bel4.Location = new System.Drawing.Point(56, 1); = "label4";bel4.Size = new System.Drawing.Size(17, 12);bel4.TabIndex = 18;bel4.Text = "甲";//// label5//bel5.AutoSize = true;bel5.Location = new System.Drawing.Point(182, 1); = "label5";bel5.Size = new System.Drawing.Size(17, 12);bel5.TabIndex = 19;bel5.Text = "乙";//// label6//bel6.AutoSize = true;bel6.Location = new System.Drawing.Point(299, 1); = "label6";bel6.Size = new System.Drawing.Size(17, 12);bel6.TabIndex = 20;bel6.Text = "丙";//// label7//bel7.AutoSize = true;bel7.Location = new System.Drawing.Point(242, 232); = "label7";bel7.Size = new System.Drawing.Size(65, 12);bel7.TabIndex = 21;bel7.Text = "操作次数:";//// label8//bel8.AutoSize = true;bel8.Location = new System.Drawing.Point(315, 232); = "label8";bel8.Size = new System.Drawing.Size(17, 12);bel8.TabIndex = 22;bel8.Text = " ";bel8.Click += new System.EventHandler(bel8_Click);// Form1//this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(601, 262);this.Controls.Add(bel8);this.Controls.Add(bel7);this.Controls.Add(bel6);this.Controls.Add(bel5);this.Controls.Add(bel4);this.Controls.Add(this.listBox1);this.Controls.Add(this.progress);this.Controls.Add(bel3);this.Controls.Add(this.trackSpeed);this.Controls.Add(bel2);this.Controls.Add(this.btnStop);this.Controls.Add(this.btnPause);this.Controls.Add(this.btnStart);this.Controls.Add(this.udLevels);this.Controls.Add(bel1);this.Controls.Add(this.panel3);this.Controls.Add(this.panel2);this.Controls.Add(this.panel1); = "Form1";this.Text = "hanoi tower";((ponentModel.ISupportInitialize)(this.udLevels)).EndInit();((ponentModel.ISupportInitialize)(this.trackSpeed)).EndInit(); this.ResumeLayout(false);this.PerformLayout();}#endregionprivateSystem.Windows.Forms.Panel panel1;privateSystem.Windows.Forms.Panel panel2;privateSystem.Windows.Forms.Panel panel3;bel label1;privateSystem.Windows.Forms.NumericUpDownudLevels;privateSystem.Windows.Forms.ButtonbtnStart;privateSystem.Windows.Forms.ButtonbtnPause;privateSystem.Windows.Forms.ButtonbtnStop;bel label2;privateSystem.Windows.Forms.TrackBartrackSpeed;bel label3;privateSystem.Windows.Forms.ProgressBar progress;privateSystem.Windows.Forms.TimertmrPlay;privateSystem.Windows.Forms.ListBox listBox1;bel label4;bel label5;bel label6;bel label7;bel label8;}}C#程序代码:using System;usingSystem.Collections.Generic;ponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;using System.IO;using System.Drawing.Drawing2D;namespace honio4{public partial class Form1 : Form{public Form1(){InitializeComponent();}privateMemoryStreamms;privateint levels;int index = 0;int index1 = 0;int index2= 0;int goon = 1;int index9 = 0;private void WriteInstructions(intsrc, intheight,inthelp,intdest){if (height <= 1) // 如果塔高1,则将碟片从src移到dest即可{ms.WriteByte((byte)src);ms.WriteByte((byte)dest);//sta.Push(src);//index3++;//sta.Push(dest);//index3++;}else // 否则,就{// 将src上的高度=height-1的部分从src移到不用的位置上WriteInstructions(src, height - 1,dest ,3-src-dest);// 然后将src上剩下的最大的碟片移到dest//WriteInstructions(src, 1, 3-dest-src ,dest );ms.WriteByte((byte)src);ms.WriteByte((byte)dest);WriteInstructions(3-src-dest , height - 1,src , dest );}}private void WriteInstructions(){ms = new MemoryStream();WriteInstructions(0, levels,1,2);ms.Seek(0, SeekOrigin.Begin);}private Panel[] panels;private Label[] labels;public object[] stacks;public object[] stackss;public object[] stacksss;public object Pop(object[] ob){if (ob == stacks){index--;returnob[index];}if (ob == stackss){returnob[--index1];}if (ob == stacksss){returnob[--index2];}else{ return -1; }}public void Push(object[] ob, object a){if (ob == stacks){ob[index] = a;index++;}if (ob == stackss){ob[index1] = a;index1++;}if (ob == stacksss){ob[index2] = a;index2++;}}private void trackSpeed_Scroll_1(object sender, System.EventArgs e) {tmrPlay.Interval = 1500 / trackSpeed.Value;}private void PrepareUIElements(){goon = 0;stacks=new object[20];stackss= new object[20];stacksss = new object[20];// 获取层数levels = (int)udLevels.Value;// 准备panels,清空上次创建的labels if (panels == null)panels = new Panel[] { panel1, panel2, panel3 };if (labels != null)for (int i = 0; i <labels.Length; i++){labels[i].Parent.Controls.Remove(labels[i]);labels[i].Dispose();}// 创建labels 并全部放入panels[0] labels = new Label[levels];for (int i = 0; i < levels; i++){labels[i] = new Label();labels[i].Text = new string(' ', i);labels[i].AutoSize = false;labels[i].BackColor = Color.Blue;labels[i].Font = new Font("Courier New ", 9);labels[i].TextAlign = ContentAlignment.TopCenter;labels[i].Size = new Size(90-20*i, 6);labels[i].Location = new Point(10+10*i, 130-10*i);}panels[0].Controls.AddRange(labels);for (int i = 0; i <=levels-1; i++){Push(stacks,labels[i]);}}private void tmrPlay_Tick_1(object sender, System.EventArgs e) {// 获取一个步骤intsrc = ms.ReadByte(), dest = ms.ReadByte();if (src == -1){btnStop_Click_1(null, null);return;}// 在内部堆栈之间移动labelif (src == 0){Label lbl = (Label)Pop(stacks);if (dest == 0){ Push(stacks, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index) * 16;}if (dest == 1){ Push(stackss, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index1) * 16; listBox1.Items.Add("甲------------->乙"); index9++; label8.Text = index9.ToString(); }if (dest == 2){ Push(stacksss, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index2) * 16; listBox1.Items.Add("甲------------->丙"); index9++; label8.Text = index9.ToString(); }}else if (src == 1){Label lbl = (Label)Pop(stackss);if (dest == 0){ Push(stacks, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index) * 16; listBox1.Items.Add("乙------------->甲"); index9++; label8.Text = index9.ToString(); }if (dest == 1){ Push(stackss, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index1 ) * 16; }if (dest == 2){ Push(stacksss, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index2) * 16; listBox1.Items.Add("乙------------->丙"); index9++; label8.Text = index9.ToString(); }}else{Label lbl = (Label)Pop(stacksss);if (dest == 0){ Push(stacks, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index) * 16; listBox1.Items.Add("丙------------->甲"); index9++; label8.Text = index9.ToString(); }if (dest == 1){ Push(stackss, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index1) * 16; listBox1.Items.Add("丙------------->乙"); index9++; label8.Text = index9.ToString(); }if (dest == 2){ Push(stacksss, lbl); lbl.Parent = panels[dest]; lbl.Top = (9 - index2) * 16; }}progress.Value = (int)ms.Position;}private void btnStart_Click_1(object sender, EventArgs e){if(goon==2){ index = index1 = index2 = index9=0; goon = 1; listBox1.Items.Clear() ; }if (goon ==1){tmrPlay.Interval = 1500 / trackSpeed.Value; PrepareUIElements();WriteInstructions();btnPause.Enabled = btnStop.Enabled = true;udLevels.Enabled = btnStart.Enabled = false;progress.Maximum = (int)ms.Length;tmrPlay.Start();}else { tmrPlay.Start(); udLevels.Enabled = btnStart.Enabled = false; } }private void btnPause_Click_1(object sender, EventArgs e){tmrPlay.Enabled = false ;btnStart.Enabled = true;}private void btnStop_Click_1(object sender, EventArgs e){tmrPlay.Stop();goon = 2;progress.Value = 0;btnStart.Enabled = udLevels.Enabled = true;btnPause.Enabled = btnStop.Enabled = false;btnStart.Focus();}private void panel1_Paint(object sender, PaintEventArgs e){Graphics g = panel1.CreateGraphics();g.DrawRectangle(Pens.Black ,54,40,2,92);g.Dispose();}private void panel2_Paint(object sender, PaintEventArgs e){Graphics g = panel2.CreateGraphics();g.DrawRectangle(Pens.Black, 54, 40, 2, 92);g.Dispose();}private void panel3_Paint(object sender, PaintEventArgs e){Graphics g = panel3.CreateGraphics(); g.DrawRectangle(Pens.Black, 54, 40, 2, 92);g.Dispose();}private void label8_Click(object sender, EventArgs e) {}}}如果在自己电脑上面操作有问题的可以发消息给我。

汉诺塔问题实验报告

汉诺塔问题实验报告
1.实验目的: 通过本实验,掌握复杂性问题的分析方法,了解汉诺塔
游戏的时间复杂性和空间复杂性。 2.问题描述:
汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有 一座钻石宝塔(塔 A),其上有 64 个金碟。所有碟子按从大到小的次 序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔 B 和 塔 C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔 A 上的碟子移动到塔 C 上去,其间借助于塔 B 的帮助。每次只能移 动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。 当牧师们完成任务时,世界末日也就到了。 3.算法设计思想:
8、总结
5
缓存大小
通过对汉诺塔算法的分析让我更清楚的认识到了不同的算法对 程序性能的影响,也让我明白掌握了算法将会有助于提高软件的开 发。
6
2)Hanoi 塔问题递归程序的复杂度分析
① 运行 hanoi 程序的时间
程序 hanoi.c 在硬件环境为赛扬 400MHz、内存 128M 的计算平台 (不同机器运行时间有一定差别)运行,可得出如下时间结果:
盘子数
时间结果
<=12 个
<=1 秒
14 个
2秒
16 个
13 秒
20 个
204 秒
② 时间复杂度
自定义头文件 :#pragma once
#include "targetver.h" #include <stdio.h> #include <tchar.h>
结果如下:
2
6.递归应用中的 Hanoi 塔问题分析 1)Hanoi 塔问题中函数调用时系统所做工作
一个函数在运行期调用另一个函数时,在运行被调用函数之前,系 统先完成 3 件事:

C语言程序设计实训题目

C语言程序设计实训题目

C语言程序课程设计题目题目1:年历显示功能要求:(1)输入一个年份,输出是在屏幕上显示该年的日历。

假定输入的年份在1940-2040年之间。

(2)输入年月,输出该月的日历。

(3)输入年月日,输出距今天还有多少天,星期几,是否是公历节日。

题目2:小学生测验面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。

功能要求:(1)电脑随机出10道题,每题10分,程序结束时显示学生得分;(2)确保算式没有超出1~2年级的水平,只允许进行50以内的加减法,不允许两数之和或之差超出0~50的范围,负数更是不允许的;(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;(5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。

题目3 运动会比赛计分系统要求:初始化输入:N-参赛学校总数,M-男子竞赛项目数,W-女子竞赛项目数各项目名次取法有如下几种:取前5名:第一名得分7分,第二名得分5,第三名得分3,第四名得分2,第五名得分1;取前3名:第一名得分5,第二名得分3,第三名得分2;功能要求:(1)系统以菜单方式工作(2)由程序提醒用户填写比赛结果,输入各项目获奖运动员信息。

(3)所有信息记录完毕后,用户可以查询各个学校的比赛成绩(4)查看参赛学校信息和比赛项目信息等。

题目4:学生学籍管理系统(限2人)用数据文件存放学生的学籍,可对学生学籍进行注册,登录,修改,删除,查找,统计,学籍变化等操作。

(用文件保存)功能要求:(1)系统以菜单方式工作。

(2)登记学生的学号,姓名,性别,年龄,籍贯,系别,专业,班级;修改已知学号的学生信息;(3)删除已知学号的学生信息;(4)查找已知学号的学生信息;(5)按学号,专业输出学生籍贯表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程设计名称:C语言课程设计课程设计题目:汉诺塔问题求解演示院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:完成时间:2010年3月18日沈阳航空航天大学课程设计报告目录第1章需求分析 (3)1.1 课程设计的题目及要求 (3)1.2 总体分析 (3)第2章系统设计 (4)2.1 主要函数和函数功能描述 (4)2.2 功能模块图 (4)第3章详细设计 (5)3.1主函数流程图 (5)3.2各功能模块具体流程图 (6)第4章调试分析 (10)4.1.调试初期 (10)4.2.调试中期 (10)4.3.调试后期 (10)参考文献 (11)附录 (12)第1章需求分析1.1 课程设计的题目及要求题目:汉诺塔问题求解演示内容:在屏幕上绘出三根针,其中一根针上放着N个从大到小的盘子。

要求将这些盘子从这根针经过一个过渡的针移到另外一根针上,移动的过程中大盘子不能压在小盘子上面,且一次只能移动一个盘子。

要求形象直观地演示盘子移动的方案和过程。

要求:1)独立完成系统的设计,编码和调试。

2)系统利用C语言实现。

3)安照课程设计规范书写课程设计报告。

4)熟练掌握基本的调试方法,并将程序调试通过1.2总体分析本题目需要使用C语言绘制图形,所以需要turbo C,需要绘图函数,而汉诺塔的函数属于经典的函数,在书本上都学习过,所以这个题目的难点在于需要绘制汉诺塔图形。

攻克这一点其他的问题都迎刃而解。

但是我个人以前也没有学过一些关于turboC 方面的知识。

所以我将重点放在了对#include<graphics.h>下的一系列绘图函数的研究与应用,对屏幕上的图像坐标分析是一个难点。

其中用到了graphics.h头文件中的bar, outtextxy, setfillstyle,closegraph函数。

进行了画图(利用bar函数进行画框的操作),填充颜色(利用setfillstyle函数填充白色和黑色,以分辨图形与图形背景),在特定位置输出特定字符等操作(利用outtextxy函数)。

第2章系统设计2.1 主要函数和函数功能描述1):递归函数:void hanoi(char x,char y,char z,int n,struct H num[3]); ,根据递归的方法,实现汉诺塔的运行;2):用来进行移动的函数:void move(char x,char y,struct H num[3]);3):初始化函数:void kaishi()4):图形关闭:void close()5):系统主函数:main()2.2 功能模块图图2.1 功能模块图本程序共分为两个模块,分为图形模块与递归模块,其中图形模块中有kaishi函数,主要功能为绘制出初始化的图形。

填色函数,填色函数承担着将移走的盘子的原位置填充成为黑色,将移到的盘子的位置填充为白色。

画图函数的主要功能是在相应的位置使用bar函数画出相应的图形,创造出汉诺塔的图形轮廓。

第二部分为递归部分,包含两个主要函数,其中有Hanoi函数,本函数的主要功能是实现递归操作。

Move函数的主要功能是实现盘子移动的操作,并指导图形函数在什么位置画出图形,为图形函数提供准确的坐标。

第3章详细设计3.1主函数设计图3.1主函数流程图3.2 各功能模块具体流程图1)递归函数hanoi函数void hanoi(char x,char y,char z,int n,struct H num[3])函数实现递归,是汉诺塔程序中的最精髓部分,实现了汉诺塔的流程部分,由于汉诺塔游戏的步骤每部有相似之处,所以可是使用递归函数进行。

本函数内含有一个递归函数。

下面是具体流程图:图3.2递归函数hanoi函数流程图(2)盘子移动函数move函数void move(char x,char y,struct H num[3])函数主要承担着对汉诺塔移动的任务,与上面的函数同属于递归模块,同时画图的一部分函数也嵌入其中。

在移动的同时,将图像画出,主要为将原来的图像用填充颜色的函数将其填成黑色,将要移动到的函数的位置填为白色,实现汉诺塔运行的图形演示。

图3.3盘子移动函数move函数流程图2.图形模块(1)初始化函数:void kaishi()函数根据用户输入的汉诺塔盘子数,绘制出相应的汉诺塔图形,是一个初始化的函数。

下面是具体的流程图图3.4初始化函数:void kaishi()流程图(2)图形关闭:void close();将图形关闭的函数,是绘制图形的必须的函数。

沈阳航空航天大学课程设计报告第4章调试分析第4章调试分析4.1.调试初期由于编写的程序具有模块化的特性,且我们之前学的运行环境多为VC6.0,所以我在VC下完成了除了图像外的程序代码,在TC上绘制图形,添加了画图函数后,我就不得不使用TC编程环境。

将图形模块的函数嵌入到递归模块时出现了错误,出现了图像出现了不规则的现象,原因在于函数的形参与汉诺塔图像的位置间的转换出现差错。

4.2.调试中期1)由于这个程序要绘制图形,刚开始的时候对显示位置研究的不是很透彻,由于自己以前没有这方面的经验,导致图形不是出现在自己想要的位置。

但后来经过多时实验,最终掌握了图像坐标的定位的方法。

2)对于函数initgraph(&gdriver,&gmode,"c:\\tc");的掌握不够,刚开始的时候将turbo C的文件安装在了E盘里,导致运行不了,将其安装在C盘后,修改后程序可正常运行。

3)对于num[i].top刚开始赋的初值为0,但是与后面的num[i].top++矛盾,造成最后一行没有,使程序从num[i].top=1开始,但是如果将num[i].top++放在程序的后面又会使得后面的程序行数增加。

解决的方法是将num[i].top的初值作为-1。

4.3.调试后期对颜色的涂黑除理出现了错误,汉诺塔的盘子移走后,没有涂黑,移去的地方没有涂白,造成程序的运行出现问题,原因是setfillstyle函数的使用错误,没有在移去后将原来的位置涂色。

参考文献[1]张长海.C语言程序设计[M].北京:高等教育出版社,2006[2]肖金生,龚斌.C语言精要例解[M]. 北京:中国铁道出版社,1997年[3]谭浩强.C语言程序设计[M].北京:清华大学出版社.2000年[4] 耿彩凤石祥滨.C语言程序设计基础与实践[M].辽宁:辽宁大学出版社2004年[5]谢明与.Borland C++/Turbo C++ 编程实例剖析[M].北京.科学出版社,1993年附录源程序代码:#include<graphics.h>#include<stdio.h>struct TA{int data[15];int top;}num[3];void move(char x,char y,struct TA num[3]);void hanoi(char x,char y,char z,int n,struct TA num[3]); void kaishi();void close(void);void main(void){kaishi();close();exit(0);}void kaishi(void){int gdriver=DETECT,gmode;int i,n;clrscr();printf("please input n(n<=10): ");scanf("%d",&n);if(n<1||n>10)n=10;initgraph(&gdriver,&gmode,"c:\\tc");cleardevice();for(i=0;i<3;i++)num[i].top=-1;for(i=0;i<n;i++){num[0].top++;num[0].data[num[0].top]=i;bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+(33-3*num[0].data[num[0].top]),400-20*i+8);}outtextxy(150,450,"any key to continue");settextstyle(0,0,2);outtextxy(90,420,"A");outtextxy(240,420,"B");outtextxy(390,420,"C");getch();hanoi('a','b','c',n,num);}void move(char x,char y,struct TA num[3]){int i;setfillstyle(SOLID_FILL,BLACK);bar(0,0,640,60);bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]), 400-20*num[x-97].top-8,100+150*(x-97)+(33-3*num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);num[y-97].top++;num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];num[x-97].top--;setfillstyle(SOLID_FILL,WHITE);bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]), 400-20*num[y-97].top-8,100+150*(y-97)+(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);getch();}void hanoi(char one,char two,char three,int n,struct TA num[3]) {if(n==1)move(one,three,num);else{hanoi(one,three,two,n-1,num);move(one,three,num);hanoi(two,one,three,n-1,num);}}void close(void){getch();closegraph();}沈阳航空航天大学课程设计报告。

相关文档
最新文档