c语言课程设计--汉诺塔
- 格式:doc
- 大小:110.00 KB
- 文档页数:15
《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语言程序设计》课程设计课题表一、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.要求:使用文件方式存储数据。
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语言程序设计实训报告姓名专业班级指导教师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,从而完成盘子的移动。
汉诺塔的演示界面:本系统显示的是汉诺塔的演示效果,分别有播放,暂停,和停止,右边显示的是每一步的动作,同时记录操作次数,可以调节演示的速度。
汉诺塔界面代码: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) {}}}如果在自己电脑上面操作有问题的可以发消息给我。
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)按学号,专业输出学生籍贯表。
有趣的c语言代码在计算机编程领域中,C语言无疑是居于重要地位的一种语言。
它简洁明了,具有高度的灵活性,其语法规范和基本结构也有着非常强的适用性,依旧是很多应用领域的首选语言。
但是,除了作为一门实用的编程语言外,C语言也具备着不少有趣的面向场景和实现思路。
有时候我们不妨放开心态,花一点时间去探索一些优美、神奇或者古怪的代码,或许不仅可以带来好玩的游戏体验,还可以深刻领略计算机编程这一领域的魅力所在。
以下是几个有趣的C语言代码:1. Hello World!这是许多人接触编程时会碰到的第一行代码,既简单又经典。
用C 语言实现只需一行:include <stdio.h>int main(){printf("Hello, World!");return 0;}这段代码的功能很简单,输出 "Hello, World!"。
2. 回文字检测给定一个字符串,判断其是否为回文字符串。
这也是许多入门程序员接触的练手题。
bool isPalindrome(char *s){int len = strlen(s);for (int i = 0; i < len / 2; ++i)if (s[i] != s[len - 1 - i])return false;return true;}这段代码通过比较字符串中左右两端字符是否相同,完成回文检测。
3. 汉诺塔游戏汉诺塔是一个经典的数学谜题,至今仍是计算机课程和聚会游戏的热门选择之一。
在C语言中实现汉诺塔游戏的代码不仅具备实用价值,同时也挑战了程序设计师的算法思考能力。
void hanoi(int n, char A, char B, char C){if (n == 1)printf("%c -> %c\n", A, C);else{hanoi(n - 1, A, C, B);hanoi(1, A, B, C);hanoi(n - 1, B, A, C);}}这段代码通过递归实现了汉诺塔游戏的具体操作,将汉诺塔复杂的问题转化为简单的递归关系。
汉诺塔问题的算法设计及C++语言实现
俞哲明;樊艳芬
【期刊名称】《福建电脑》
【年(卷),期】2012(028)009
【摘要】汉诺塔问题是递归算法最为典型的例子。
对多柱汉诺塔问题进行了研究,采用动态规划的想法,给出了解决汉诺塔问题的C++程序。
通过C++语言实现,可以使阅读者清晰地了解解决问题的全过程。
【总页数】2页(P138-138,150)
【作者】俞哲明;樊艳芬
【作者单位】湖州师范学院信息与工程学院,湖州313000;湖州师范学院信息与工程学院,湖州313000
【正文语种】中文
【中图分类】TP301.6
【相关文献】
1.汉诺塔问题的非递归算法设计及可视化实现 [J], 彭伟
2.汉诺塔问题的算法分析及C语言实现 [J], 周敏
3.用Java语言实现八皇后问题的递归和非递归算法设计 [J], 樊艳芬;周琪云;吴帅
4.汉诺塔问题的算法分析及C语言演示程序的实现 [J], 白会波; 高瑞平
5.基于c++语言的汉诺塔微课设计与实现 [J], 幺连福
因版权原因,仅展示原文概要,查看原文内容请购买。
汉诺塔论⽂⽬录⽬录 (1)摘要 (2)⼀、背景知识 (3)⼆、问题重述 (3)三、算法分析 (3)四、流程及程序设计 (5)(1)、流程图 (5)(2)、模块及其功能介绍 (6)五、调试与算法复杂度分析 (7)(1)、运⾏结果 (7)(2)、H ANOI塔问题复杂度分析 (9)总结 (10)参考⽂献 (11)附录 (12)摘要汉诺威塔是⼀款集娱乐与运算的智⼒游戏,它不仅能使⼈在休闲的时候放松⼼情,⽽且还能在玩的过程中不断的提⾼你的思维能⼒。
有三个柱⼦A, B, C。
A柱⼦上叠放有n个盘⼦,每个盘⼦都⽐它下⾯的盘⼦要⼩⼀点,可以从上到下⽤1, 2, ..., n编号。
要求借助柱⼦C,把柱⼦A上的所有的盘⼦移动到柱⼦B上。
移动条件为:1、⼀次只能移⼀个盘⼦2、移动过程中⼤盘⼦不能放在⼩盘⼦上,只能⼩盘⼦放在⼤盘⼦上本⽂的主要算法是利⽤函数的递归调⽤算法。
⾸先,想办法将A座上的前n-1个盘借助C座移动到B座上,然后将A组上的第n个盘移动到C座上。
然后再将B座上的n-1个盘借助A座移动到C座上,此次移动也和第⼀次移动⼀样,重复递归,直到最后⼀个盘为⽌。
关键词:汉诺塔递归思想函数调⽤数组指针⼀、背景知识汉诺塔(⼜称河内塔)问题来⾃中东地区⼀个古⽼的传说:在世界刚被创建的时候有⼀座钻⽯宝塔(塔A),其上有64个⾦碟。
所有碟⼦按从⼤到⼩的次序从塔底堆放⾄塔顶。
紧挨着这座塔有另外两个钻⽯宝塔(塔B和塔C)。
从世界创始之⽇起,婆罗门的牧师们就⼀直在试图把塔A上的碟⼦移动到塔C上去,其间借助于塔B 的帮助。
每次只能移动⼀个碟⼦,任何时候都不能把⼀个碟⼦放在⽐它⼩的碟⼦上⾯。
当牧师们完成任务时,世界末⽇也就到了。
19世纪的法国⼤数学家鲁卡曾经研究过这个问题,他正确地指出,要完成这个任务,僧侣们搬动⾦盘的总次数(把1个⾦盘从某个塔柱转移到另1个塔柱叫做1次)为:18,446,744,073,709,551,615次。
假设僧侣们个个⾝强⼒壮,每天24⼩时不知疲倦地不停⼯作,⽽且动作敏捷快速,1秒钟就能移动1个⾦盘,那么,完成这个任务也得花5800亿年!⼆、问题重述有三个柱⼦A, B, C。
c语言十大算法案例C语言是一种广泛应用于编程的高级语言,具有简单、灵活、高效等特点。
在C语言中,有许多经典的算法案例,这些算法案例不仅有助于提高编程能力,还能帮助我们理解计算机科学的基本原理。
下面列举了十个C语言的经典算法案例。
1. 冒泡排序算法:冒泡排序是一种简单但效率较低的排序算法,它通过多次比较和交换相邻元素的方式将最大或最小的元素逐步移动到数组的一端。
2. 快速排序算法:快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分成两个子数组,然后对子数组进行递归排序。
3. 二分查找算法:二分查找是一种高效的查找算法,它通过将查找范围缩小一半来快速定位目标元素。
4. 链表反转算法:链表反转是一种常见的操作,它可以将链表中的节点顺序逆转。
5. 汉诺塔算法:汉诺塔是一种经典的递归问题,它通过将圆盘从一个柱子移动到另一个柱子来演示递归的思想。
6. 最大公约数算法:最大公约数是指能够同时被两个或多个整数整除的最大正整数,求最大公约数的算法有多种,如辗转相除法和欧几里德算法。
7. 斐波那契数列算法:斐波那契数列是一个数列,其中每个数字都是前两个数字之和,求斐波那契数列的算法有多种,如递归和循环。
8. 图的深度优先搜索算法:深度优先搜索是一种用于遍历图的算法,它通过递归的方式依次访问图中的每个节点。
9. 图的广度优先搜索算法:广度优先搜索也是一种用于遍历图的算法,它通过队列的方式依次访问图中的每个节点。
10. 最短路径算法:最短路径算法用于找到图中两个节点之间的最短路径,常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
这些算法案例涵盖了排序、查找、链表操作、递归、图算法等多个方面,是C语言学习中不可或缺的部分。
通过学习和理解这些经典算法案例,我们可以提高自己的编程能力,并在解决实际问题时能够选择合适的算法。
希望本文能够对读者有所帮助,激发他们对C 语言算法的兴趣,并在编程的道路上不断进步。
n阶汉诺塔问题(Hanoi)问题描述假设有3个分别命名为X、Y、Z的塔座在塔座X上插有n个直径⼤⼩各不相同、依⼩到⼤编号为1,2,...,n的圆盘。
现要求将X轴上的n个圆盘移⾄塔座Z上并仍按同样顺序叠排圆盘移动时必须遵循下列规则:1. 每次只能移动⼀个圆盘2. 圆盘可以插在X、Y、Z中的任⼀塔座上3. 任何时刻都不能将⼀个较⼤的圆盘压在较⼩的圆盘之上算法思想当n=1时问题⽐较简单,只要将编号为1的圆盘从塔座X直接移⾄塔座Z上即可;当n>1时需利⽤塔座Y作辅助塔座,若能设法将压在编号为n的盘之上的n-1个圆盘从塔座X移⾄塔座Y上然后将编号为n的圆盘从塔座X移⾄塔座Z上最后再将塔座Y上的n-1个圆盘移⾄塔座Z上⽽将n-1个圆盘移⾄塔座Z上⼜相当于⼀个新的汉诺塔问题,这⼀次是以X为辅助塔座循环往复,总是以X和Y这两个为辅助塔座简⾔之()⾸先以Z为辅助塔座将n-1个圆盘移动Y将编号为n的圆盘移⾄塔座Z再将剩余的n-1个圆盘移⾄塔座ZC语⾔伪代码表⽰的算法void hanoi(int n, char x, char y, char z){// 将塔座x上按直径由⼩到⼤且⾃上⽽下编号为1⾄n的n个圆盘按规则搬到// 塔座z上,y可⽤作辅助塔座// 搬动操作move(x, n, z)可定义为(c是初值为0的全局变量,对搬动计数):// printf("%i. Move disk % i from %c to %c\n", ++c, n, x, z);if(n == 1)move(x, 1, z); // 将编号为1的圆盘从x移到zelse{hanoi(n-1, x, z, y); // 将x上编号为1⾄n-1的圆盘移到y, z作辅助塔move(x, n, z); // 将编号为n的圆盘从x移到zhanoi(n-1, y, x, z); // 将y上编号为1⾄n-1的圆盘移到z, x作辅助塔}}Java源码/*** 汉诺塔算法实现* @param n 圆盘的数量* @param x X塔座* @param y Y塔座* @param z Z塔座*/public void hanoi (int n, char x, char y, char z) {if (1 == n) {move(x, 1, z);} else {hanoi(n-1, x, z, y);move(x, n, z);hanoi(n-1, y, x, z);}}/*** 打印出移动过程* @param x X塔座* @param n Y塔座* @param z Z塔座*/public static final void move (char x, int n, char z) {System.out.println("将编号为" + n + "的圆盘从" + x + "塔座放到" + z + "塔座"); }测试⽤例@Testpublic void testHanoi () {hanoi (3, 'X', 'Y', 'Z');}测试结果将编号为1的圆盘从X塔座放到Z塔座将编号为2的圆盘从X塔座放到Y塔座将编号为1的圆盘从Z塔座放到Y塔座将编号为3的圆盘从X塔座放到Z塔座将编号为1的圆盘从Y塔座放到X塔座将编号为2的圆盘从Y塔座放到Z塔座将编号为1的圆盘从X塔座放到Z塔座Python源码def move(n, a, b, c):if n == 1:print a, '-->', celse:move(n-1, a, c, b)print a, '-->', cmove(n-1, b, a, c)测试⽤例move(3, 'A', 'B', 'C')测试结果A --> CA --> BC --> BA --> CB --> AB --> CA --> C。
课程设计报告课程设计名称: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();}沈阳航空航天大学课程设计报告。