2019 第十一周作业

2019 第十一周作业

这个作业属于哪个课程 C语言程序设计ll
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3201)
我在这个课程的目标是 了解并学会使用递归函数
这个作业在哪个具体方面帮助我实现目标 理解递归函数
参考文献 https://jingyan.baidu.com/article/0f5fb099d9ae7e6d8334eae1.html##1)

单选题:

一、基础题

1、汉诺塔问题* (10 分)

汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。

题图1.jpg

请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。

输入格式

圆盘数 起始柱 目的柱 过度柱

输出格式

移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 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()
{
    int n;
    char a,b,c;
	scanf("%d
",&n);
	scanf("%c %c %c",&a,&b,&c);
    hanio(n,a,b,c);
    
    return 0;
}

   //搬动n个盘,从a到b,c为中间过渡// 
void hanio (int n,char a,char b,char c)
{
    if(n==1)
    {
    printf("%d: %c -> %c
",n,a,b);
    }
    else{
        hanio (n-1,a,c,b);
        printf("%d: %c -> %c
",n,a,b);
        hanio(n-1,c,b,a);
        }
}

(2)设计思路

(3)本题调试过程中碰到问题及解决方法

问题:本题是参照书上 的例题写的,所以一开始没有单独定义字符串,导致答案错误

解决方法:编译过程中发现错误及时改过之后调试过程中没出现什么问题

(4)运行结果截图

2、估值一亿的AI核心代码 (20 分)

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 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

(1)实验代码

本题不会写,看了这位博主的代码 (https://blog.csdn.net/Bob__Huang/article/details/88923743) ,表示一脸懵。

3、***八皇后问题 (20 分)

在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。

现在我们把棋盘扩展到 n × n 的棋盘上摆放 n 个皇后,请问该怎么摆?请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两格之间空一格)。

输入格式

正整数 n (0 < n ≤ 12)

输出格式

若问题有解,则输出全部摆法(两种摆法之间空一行),否则输出 None。

要求:试探的顺序逐行从左往右的顺序进行,请参看输出样例2。

输入样例1

3

输出样例1

None

输入样例2

6

输出样例2

. Q . . . .
. . . Q . .
. . . . . Q
Q . . . . .
. . Q . . .
. . . . Q .

. . Q . . .
. . . . . Q
. Q . . . .
. . . . Q .
Q . . . . .
. . . Q . .

. . . Q . .
Q . . . . .
. . . . Q .
. Q . . . .
. . . . . Q
. . Q . . .

. . . . Q .
. . Q . . .
Q . . . . .
. . . . . Q
. . . Q . .
. Q . . . .

(1)实验代码

本题照样不会写,然后也搜了一些百度,看了该博主的代码(http://www.cnblogs.com/cnnnnnn/p/8506883.html),依旧很懵。。。

二、预习题

请大家查阅资料,思考如下问题:

请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)

1.数组指针
数组指针强调的是指针,并且这个指针指向一个数组,即指针变量存放的是数组地址。
eg:int (*a)[10],其中a是一个指针,并且指向一个含有10个整型元素的数组。

2.指针数组
指针数组强调的是数组,并且数组元素是指针类型。
eg:int a[10],其中a是一个数组,数组元素是指针(int)。

3.指针函数
指针函数指带有指针的函数,即其本质是一个函数,只不过这种函数返回的是一个对应类型的地址。
eg: int *function(int *m)
{
printf("this is a function");
return m;
}
int main()
{
int *p, data = 5;
p = function(&data);
printf("%d ", *p); //打印出data的值
 }

4.函数指针
函数指针是指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针是将函数当做普通数据那样存储和管理。
eg:void test(char* str);
void (p)(char),其中p是一个指针,并且指向一个函数,这个函数参数是char*,返回类型是void型。

5.二级指针
二级指针指的是A(即B的地址)是指向指针的指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
eg:int i,*p,**pi;
p=&i; pi=π

6.单向链表
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 通过指针连接起来,但是只能单向遍历的内存块。
eg:这里有一个单向链表的经典示例( https://wenku.baidu.com/view/e880d93483c4bb4cf7ecd130.html

三、学习感悟

本周学习了第10章函数与程序结构,在C语言中,递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。所以递归要有两个要素,结束条件与递推关系。递归有两个基本要素:(1)边界条件:确定递归到何时终止,也称为递归出口。(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果 。
在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。

感悟:感觉这周的作业好难啊,严重超出了我的能力范围。唉,身为菜鸟的我继续努力吧!加油!

四、结对编程感想

本周三晚自习依旧是我们结对编程的时间,感觉这次作业比较难,我和搭档相对来说都比较菜,都不会做,这周感觉没有多大的收获。

五、学习进度条

周/日期 这周所花的时间 代码行数 学到的知识点简介 目前比较迷惑的问题
2/25-3/3 三天 45 数组的认识及用法 数组长度的理解
3/4-3/10 两天 37 编写程序时处理文件 fscanf与fprintf的具体用法
3/11-3/17 三天 53 二维数组的使用及文件插入 二维数组的用法、上三角的判断及文件的处理
3/18-3/24 两天 113 选择排序法、二分查找法、二维数组的引用与矩阵 不清楚选择排序法和冒泡排序法的区别
3/25-3/31 两天 78 判断回文、一维字符数组的用法、使用字符串编程 使用字符串编程
4/1-4/7 两天 88 指针变量的基本运算,内存单元和地址之间的关系 不太了解指针数组
4/8-4/14 两天 96 指针、数组和地址之间的关系 对于指针数组和数组指针的区别不是特别清楚
4/15-4/21 两天 128 字符串和字符指针、常用的字符串处理函数 及用指针实现内存动态分配 对于指针都不是特别懂
4/22-4/28 两天 120 定义结构,使用结构变量与结构数组进行编程 结构体参与判断
4/29-5/4 一天 0 结构数组及结构指针 结构指针
5/5-5/11 两天 26 递归函数的定义及使用 递归函数的使用

六、表格和折线图

时间 代码行数 博客字数
第一周 45 870
第二周 37 1055
第三周 112 1158
第四周 113 1696
第五周 78 1854
第六周 114 2977
第七周 96 3019
第八周 128 3264
第九周 120 3540
第十周 0 3216
第十一周 26 3186

原文地址:https://www.cnblogs.com/zmzhang/p/10841925.html