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. SQL中where in的用法

    首先我们要知道where是什么:一个判断符.在SQL操作中,控制只选择指定的行. in的其实归类于特殊的比较运算符 expr1 between expr2 and expr3:表示expr1的值在ex ...

  2. nginx 入门实战

    nginx入门实战 nginx 安装与卸载 下载安装 进入 http://nginx.org/en/download.html 下载自己想要的版本,我选择的stable版本 tar -zxvf ngi ...

  3. 查找:find、locate、which、whereis

    有find . locate . which . whereis 一.find 命令格式:[root@localhost ~]# find 搜索路径 [选项] 搜索内容 find是比较特殊的命令,它有 ...

  4. Linux之防火墙iptables

    一.检查iptables服务状态 1.首先检查iptables服务的状态 [root@bogon ~]# service iptables status iptables: Firewall is n ...

  5. CSP2019游(AFO?)记

    Day 1 不知道为啥一看到\(T1\)就想到\(longlong\)可能存不下,试了下果然. \(T2\)想了半个小时胡出个\(O(n)\)算法,但是假了.冷静了一下,做了前缀和之后,合法的子区间\ ...

  6. JAVA中随机生成确定范围内的随机数

    最近工作中的一个业务需要再确定范围内取出一个随机数,网上到时搜出来一堆可以实现的方法,但是鄙人仍是理解不了,虽说已经copy方法直接完成工作了.今天抽时间整理下,希望能够帮助大家更好的理解随机数的实现 ...

  7. oracle查看表空间的大小及使用情况sql语句

    --------------------------tablespace------------------------------------------------ 1.//查看表空间的名称及大小 ...

  8. Python3并发写文件

    使用python2在进行并发写的时候,发现文件会乱掉,就是某一行中间会插入其他行的内容. 但是在使用python3进行并发写的时候,无论是多进程,还是多线程,都没有出现这个问题,难道是python3的 ...

  9. Anaconda 改为国内镜像的方法

    Anaconda的conda 特别好用 但如果用国外的镜像,慢的出奇 可以改为了国内镜像会好很多 conda config --add channels https://mirrors.tuna.ts ...

  10. windos批处理启动redis与哨兵

    为各个启动单独建立脚本后用总的bat调用 创建脚本,redis6379.bat脚本内容:@echo offtitle redis-serverset ENV_HOME6379="G:\Red ...