这个作业属于的课程 |
第十一周编程总结 |
我在这个课程的目标是 |
学习递归函数和用递归进行程序设计 |
这个课程在哪个具体方面帮我实现目标 |
通过汉诺塔问题学习递归在实际问题的作用 |
参考文献 |
<<C语言程序设计>> |
汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。
请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。
输入格式
圆盘数 起始柱 目的柱 过度柱
输出格式
移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。
输入样例
3
a c b
输出样例
1: a -> c 2: a -> b 1: c -> b 3: a -> c 1: b -> a 2: b -> c 1: a -> c
1).实验代码
#include<stdio.h> void hanio (int n, char a, char b, char c); int main (void) { int n; char a,b,c; scanf("%d %c %c %c",&n,&a,&b,&c); hanio (n,a,c,b); return 0; } void hanio (int n, char a, char b, char c) { if (n==1) printf ("1: %c -> %c\n",a,c); else{ hanio (n-1,a,c,b); /将a柱上n-1个圆盘通过c柱过度以移到b柱上/ printf ("%d: %c -> %c\n",n,a,c); /将a柱上的第n个圆盘移到c柱上/ hanio (n-1,b,a,c); } }
2)设计思路
3)本题做对过程碰到问题及解决办法
开始对汉诺塔问题不太明白,便看了书并参照245页的程序进行了编写,但后来发现有许多的不同,在输出格式和目的柱上出现了错误。改正之后,编程软件上输出结果正确,但pta上答案错误,耽误了许多时间,后来将hanio (n,'a','b','c')改为
正确截图
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
- 无论用户说什么,首先把对方说的话在一行中原样打印出来;
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了
I
; - 把原文中所有独立的
can you
、could you
对应地换成I can
、I could
—— 这里“独立”是指被空格或标点符号分隔开的单词; - 把原文中所有独立的
I
和me
换成you
; - 把原文中所有的问号
?
换成惊叹号!
; - 在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI:
和一个空格。
输入样例:
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
输出样例:
Hello ? AI: hello! Good to chat with you AI: good to chat with you can you speak Chinese? AI: I can speak chinese! Really? AI: really! Could you show me 5 AI: I could show you 5 What Is this prime? I,don 't know AI: what Is this prime! you,don't know
本题做对过程碰到问题及解决办法
本题没有做出来,根据题目的规则将其中的条件逐一用程序实现,再将它们组装成一个程序。用这个方法编程很复杂,我尝试编写了前面几个条件的程序,但将它们综合在一起便出现了错误,而且太多的字符也容易搞混,后来上百度查找了这题,结果也没怎么看懂,所以也就没有复制粘贴了,打算再仔细研究下,毕竟题目难在代码长和变量多,需要时间解决。
预习作业
第十二周的教学内容是:第十一章 指针进阶
请大家查阅资料,思考如下问题:
请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)
请用自己的理解回答。如果有引用他人的文字,请一定要标出出处(使用Markdown的链接方式)。
数组指针:是指向数组地址的指针, 比如: int (*p)[5]; p即为指向数组的指针;
指针数组:是数组元素为指针的数组, 如int *p[3],定义了p[0],p[1],p[2]三个指针,本质为数组。
指针函数:是指带指针的函数,即本质是一个函数,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。如float
*find(
float
(*pionter)[4],
int
n);
函数指针:函数指针是指向函数的指针变量,赋给函数指针的函数应该和函数指针所指的函数原型是一致的;int
(*ptr)(
int
,
int
);
二级指针:是指向指针的指针,用于存放二级指针的变量称为二级指针变量.如int i ; int*pi=&i; int*ppi=&*pi;
单向链表:
1,什么叫单向循环链表。单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空。
2,由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头。
3,链表的结点表示
1 struct LNode 2 { 3 int data; 4 struct LNode * next; 5 }; 6 typedef struct LNode * linklist
4,单向循环链表的操作集合,仍是defs.h里的操作集合,这里就不给出了。
5,单循环链表的初始化操作。示意图
实现:
1 #include"defs.h" 2 3 void InitList(linklist *L) //改变尾指针 4 { 5 *L = (linklist)malloc(sizeof(struct LNode)); //分配头结点 6 if (*L == NULL) //分配失败 7 exit(0); 8 (*L)->next = *L; //指针域指向它本身 9 }
链接:https://www.cnblogs.com/rookiefly/p/3451310.html
作业评价
本周题目难度很大,在参照书上代码并与队友讨论的基础上完成了第一题,后面的一题尝试了多次还是没有做出来,更别说后面的挑战题了,题目难是事实,但自己不行是主要原因,要加油呀。
结对编程
本周我和结对的队员在一起进行了编程,在书上列子的基础上两个人在一起讨论第一题的解决方法,但第二题过于复杂没能解决。结对编程能使两个人沟通起来,得到1+1>2的效果,但也要在两个人相互配合,一起努力,这次还不错,希望下次有更好的表现。
学习进度条
周 |
这周所花的时间 |
代码行 |
学到的知识点 |
遇到的问题 |
第二周 |
8h |
51 |
文件指针的定义 |
指针的具体用法 |
第三周 |
12h |
74 |
二维数组的定义和用其编程 |
如何使用指针对二维数组进行处理。 |
第四周 |
12h |
98 |
利用数组对一组数进行排序 |
把一些简单的问题复杂化,不能找到最佳的方法。 |
第五周 |
10h |
125 |
综合利用指针和数组解决问题 |
指针在编程中的作用 |
第六周 |
12h |
150 |
学习指针的定义和作用 |
指针在问题中如何体现出简便 |
第七周 |
10h |
128 |
学习指针和数组的关系 |
什么时候该用指针 |
第八周 |
13h |
167 |
学习字符指针和字符串处理函数 |
内存动态分配的用法 |
第九周 |
12h |
135 |
学习结构的使用 |
如何综合使用结构和指针 |
第十一周 |
12h |
148 |
学习递归函数 |
如何利用递归函数进行程序设计 |