2019春第十一周作业

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3201
我在这个课程的目标是 熟悉经典数论
这个作业在那个具体方面帮助我实现目标 递归函数及数论
参考文献 算法入门经典,基础数论i,ii,iii

本周题目难度算目前以来难度最高的一次了,反正的我是枯了,写了很久才写出来,咱也不敢问,咱也不知道为什么。

选择题

2-1

宏定义“#define DIV(a, b) a/b”,经DIV(x + 5, y - 5) 引用,替换展开后是()。 (1分)

  1. x + 5 / y - 5
  2. (x + 5 / y – 5)
  3. (x + 5) / (y - 5)
  4. (x + 5) / (y - 5);
作者: 张高燕
单位: 浙江大学城市学院
2-2

定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b的值进行交换,下列表述中正确的是()。 (1分)

  1. 不定义参数a和b将导致编译错误
  2. 不定义参数a、b、t将导致编译错误
  3. 不定义参数t将导致运行错误
  4. 不需要定义参数a、b、t类型
作者: 张高燕
单位: 浙江大学城市学院
2-3

如果所有的变量按照下面的程序进行定义和声明,那么在main()函数中所有可用的变量为 ()。 (2分)

void fun(int x)
{
static int y;
……
return;
}
int z;
void main( )
{
int a,b;
fun(a);
……
}
  1. x,y
  2. x,y,z
  3. a,b,z
  4. a,b,x,y,z
作者: 李克峰
单位: 山东交通学院
2-4

如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为( )。 (1分)

  1. 静态变量
  2. 动态变量
  3. 外部变量
  4. 内部变量
作者: 王从银
单位: 吉首大学
2-5

下面说法中正确的是()。 (1分)

  1. 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
  2. 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
  3. 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
  4. 静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
作者: 张高燕
单位: 浙江大学城市学院
2-6

凡是函数中未指定存储类别的局部变量,其隐含的存储类型为( )。 (1分)

  1. 自动(auto)
  2. 静态(static)
  3. 外部(extern)
  4. 寄存器(register)
作者: 张高燕
单位: 浙江大学城市学院
2-7

在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。 (1分)

  1. extern
  2. register
  3. auto
  4. static
作者: 张高燕
单位: 浙江大学城市学院
2-8

将一个函数说明为static后,该函数将 ( )。(1分)

  1. 既能被同一源文件中的函数调用,也能被其他源文件中的函数调用
  2. 只能被同一源文件中的函数调用,不能被其他源文件中的函数调用
  3. 只能被其他源文件中的函数调用,不能被同一源文件中的函数调用
  4. 既不能被同一源文件中的函数调用,也不能被其他源文件中的函数调用
作者: 张高燕
单位: 浙江大学城市学院
 

编程题:

第一题:

7-1 汉诺塔问题* (10 分)

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

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

输入格式

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

输出格式

移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。

输入样例

a c b

输出样例

: a -> c
: a -> b
: c -> b
: a -> c
: b -> a
: b -> c
: a -> c
 

实验代码:

 #include<iostream>
using namespace std; void solve(int n , char a , char b , char c)
{
if (n == )cout << n << ": " << a << " -> " << c << endl;
else{
solve(n - , a, c, b);cout << n << ": " << a << " -> " << c <<endl;solve(n - , b, a, c);}
} int main(int argc, const char * argv[])
{
int n;
char A, B, C;
cin >> n;
cin >> A >> B >> C;
solve(n, A, C, B); return ;
}

设计思路

本题调试过程中遇到的问题及解决方法

汉诺塔问题是一道经典的递归题,一开始过渡柱和目的柱交换过程出错,及时改回。

运行结果截图

第二题

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

 

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;

  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;

  • 把原文中所有大写英文字母变成小写,除了 I

  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;

  • 把原文中所有独立的 I 和 me 换成 you

  • 把原文中所有的问号 ? 换成惊叹号 !

  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式:

输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

输出格式:

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

输入样例:

Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me
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
AI: I could show you
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

实验代码

 #include<bits/stdc++.h>
using namespace std; #define MAXN 1001
void solve(string str)
{
vector<string> str_word;
cout<<str<<endl;
cout<<"AI: ";
for(int i = ; i < str.length() ; i++)
{
if(str[i]>='A'&&str[i]<='Z'){if(str[i]!='I')str[i]=str[i]-'A'+'a';}
else if((str[i]>=''&&str[i]<='')||(str[i]>='a'&&str[i]<='z'))continue;
else if(str[i]!=' '){str.insert(i," ");i++;}
if(str[i]=='?'){str[i]='!';}
}
str_word.clear();
string word="";
for(int i = ; i < str.size() ; i++)
{
if(str[i]!=' ')word+=str[i];
else if(str[i]==' '){if(word!=""){str_word.push_back(word);word="";}}
}
if(word!="")
{
str_word.push_back(word);
word="";
}
int lens_str_word = str_word.size();
for(int i=;i<lens_str_word;i++)
{
if(str_word[i]=="I"||str_word[i]=="me")str_word[i]="you";
else if(str_word[i]=="you")
{
if(i<||str_word[i-].size()==)continue;
if(str_word[i-]=="can"||str_word[i-]=="could")
{
str_word[i]=str_word[i-];
str_word[i-]="I";
}
}
} for(int i = ; i < lens_str_word ; i++){
cout<<str_word[i];
if(i==lens_str_word-)continue;
if((str_word[i+][]>='a'&&str_word[i+][]<='z')||(str_word[i+][]>=''&&str_word[i+][]<='')||(str_word[i+][]=='I'))cout<<" "; }
cout<<endl; } int main ( int argc , const char * argv[])
{
int n;
cin>>n;
getchar();
while(n--){
string str;
getline(cin,str);
solve(str);
} return ;
}

设计思路

本体调试过程中遇到的问题及解决方法

一开始don 't  和 prime! 由于都是符号在字母后面的情况且处理方式不同,所以总是出错,但发现可以将符号和字母分开单独处理,输出的时候用条件限制即可输出正确格式。

运行结果截图

第三题

7-3 ***八皇后问题 (20 分)
 

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

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

输入格式

正整数 n (0 < n ≤ 12)

输出格式

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

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

输入样例1

 

输出样例1

None

输入样例2

 

输出样例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 . . . .

这道题很神奇,答案是对的,格式一模一样,PTA提交却一直格式错误,就很迷~

实验代码

 #include<bits/stdc++.h>
using namespace std;
#define MAXN 12 int _map[MAXN][MAXN] = {};
bool flag = false ;
void print(int n)
{
for(int i=;i<=n;i++){
for(int j=;j<n;j++){
if(_map[i][j]==)
cout<<'.'<<' ';
else
cout<<'Q'<<' ';
}
if(_map[i][n]==)
cout<<'.'<<endl;
else
cout<<'Q'<<endl;
}
cout<<endl;
} bool queen_pd(int x , int y ,int n)
{
for(int i=;i<=x;i++){
if(_map[i][y]){return ;}
else{
for(int j=;j<=n;j++){
if(_map[i][j]){if(abs(i-x)==abs(j-y)){return ;}else{break;}}}
}
}
return ; } void solve(int n,int num_queen)
{
if(num_queen>n){print(n);flag = true;} else
for(int i = ; i <= n ; i++)
{ if(queen_pd(num_queen,i,n))
{
_map[num_queen][i]=;
solve(n,num_queen+);
_map[num_queen][i]=;
} } } int main ( int argc , const char * argv[])
{
int n;
cin>>n;
if(n==)cout<<'Q'<<endl;
else if(n==)cout<<"None"; else{
solve(n,);
if(!flag) cout<<"None";
}
return ;
}

设计思路

本题调试过程中遇到的问题及解决方法

格式总是错误,答案是对的。。

运行结果截图

(nmslPTA)

结对编程感想:这次题目只能靠自己理解,合作编辑代码基本靠个人能力..

学习总结: 存在的问题 心得 完成作业消耗时间 本周学习内容
第一周 对文件读取数据的运用不是很熟练 多去看关于刷题的书籍,有助于提高自己写题能力,实在不会的可以参考大佬的代码,加以自己理解之后去默写几遍 半个小时左右 文件输入,BFS,DFS,PARTITION算法及简单的贪心算法
第二周 对单纯用数组完成双向链表的操作还是太生疏了,说明对双向链表的运作原理不熟 推荐两本比较好的书《挑战程序设计》《算法竞赛》 半个小时左右 vector数组及list双向链表操作

第三周

指针的概念太久没记有点生疏了 对vector数组使用愈加熟练 一小时左右 数据结构
第四周 对联通二维数组的最大子数和自闭了 多看些算法,不然写题目用什么方法去解决都弄不清 基础题目10分钟,挑战作业现在都在自闭中 迭代器
第五周 最小权值路径最优解该用什么解法 多思考一下如何优化自己的代码,会有新的收获 一个小时 递归和分治法
第六周 指针类型的转换 能用数据结构解决的问题就用数据结构 半小时 windows函数
第七周 指针结构体 对地址的概念要熟悉才能更好的运用指针和结构体 十分钟 依然是windows函数
第八周 数论,递归 多看数论就会变得很牛B 2天

经典数论

系列一:代码函数  系列二:博客字数

题目---汉诺塔及AI代码及八皇后的更多相关文章

  1. 关于汉诺塔,C++代码,代码效果演算

     1.故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  2. python3汉诺塔简单实现代码

    小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1 ...

  3. 杭电oj1995——汉诺塔V(java实现)

    正文之前,先说下做这题的心路历程(简直心累) 这是今天下午的第一道题 第一次看到题目标题——汉诺塔 内心OS:wc,汉诺塔诶,听名字就很难诶,没做过诶,肯定很难实现吧,不行,我得去看看讲解 然后就上b ...

  4. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  5. 题目1458:汉诺塔III(不一样的汉诺塔递归算法)

    题目链接:http://ac.jobdu.com/problem.php?pid=1458 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  6. 九度oj 题目1458:汉诺塔III

    题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...

  7. Hanio汉诺塔代码递归实现

    1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  8. java笔记--代码实现汉诺塔移动过程和移动次数

    汉诺塔 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方. --如果朋友 ...

  9. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

随机推荐

  1. removeAttr(name)

    removeAttr(name) 概述 从每一个匹配的元素中删除一个属性 1.6以下版本在IE6使用JQuery的removeAttr方法删除disabled是无效的.解决的方法就是使用$(" ...

  2. .net大文件上传断点续传源码

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  3. Windows:打印为PDF(PDF转换器)

    造冰箱的大熊猫@cnblogs 2019/4/17 文中图片可通过点击鼠标右键查看大图 Windows下实现PDF打印的几个办法: 1.Foxit Reader(福昕PDF浏览器) 安装Foxit R ...

  4. 计算机HDMI端口与电视机相连

     造冰箱的大熊猫@cnblogs 2019/2/27 打算通过HDMI接口将计算机桌面投影到电视机上,结果遇到问题,折腾了好一阵才搞定.现将这些问题记录下来 1.设备环境 计算机:使用Ubuntu 1 ...

  5. Centos 7禁止ftdi_sio模块

    $ dmesg[ 3305.097301] usb 1-1: USB disconnect, device number 7[ 3306.883704] usb 1-1: new high-speed ...

  6. 3.Linux系统文件名字体不同的颜色都代表什么

    在Linux中,文件的颜色都是有含义的.其中, Linux中文件名颜色不同,代表文件类型不一样.如下所示: 白色:表示普通文件浅蓝色:表示链接文件: 灰色:表示其他文件: 绿色:表示可执行文件: 红色 ...

  7. AJAX-基础-1

    概述 AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML) AJAX 是 Asynchronous JavaScript And XM ...

  8. [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)

    题目传送门(内部题3) 输入格式 每个测试点有多组测试数据.第一行有一个正整数T表示数据组数.接下来对于每组数据,第一行有两个正整数n,m分别代表图的点数和边数.接下来有m行,每行三个整数u,v,d表 ...

  9. 微信小程序获得unionid

    一.微信小程序中app.js中: wx.login({ success: res => { if(res.code){ var code = res.code; wx.getSetting({ ...

  10. SpringMVC接收请求参数和页面传参

    接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServ ...