2019春季第十一周作业
问题 | 回答 |
---|---|
这个作业属于那个课程 | C语言程序设计 |
这个作业要求在哪里 | 第十一周作业 |
我在这个课程的目标是 | 掌握编写程序的框架和递归算法,了解一些自定义头文件 |
这个作业在哪个具体方面帮助我实现目标 | 递归算法和函数结构 |
参考文献 | 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\n",&n);
scanf("%c %c %c",&a,&b,&c);
hanio(n,a,b,c);
return 0;
}
void hanio(int n,char a,char b,char c)
{
if(n==1){
printf("%d: %c -> %c\n",n,a,b);
}
else{
hanio(n-1,a,c,b);
printf("%d: %c -> %c\n",n,a,b);
hanio(n-1,c,b,a);
}
}
2)流程图
3)本题调试过程碰到的问题及解决办法
问题:就是递归的那个函数不知道怎么搞
解决办法:书上有一个例题和这个一样,就对照着写了一下
4)运行结果截图
5)评价
这个题目其实运动的过程我是清楚的,但是代码不是怎么会实现,这个题我是看书写的,总的来说递归这种算法我不是很会用
用时:半个小时
估值一亿的AI核心代码
以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 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)实验代码
#include<stdio.h>
#include<string.h>
int unsign(char a);
int main(void)
{
int i,N,l,s,j,m,count,k,len;
char str[10][1001],str2[1001];
scanf("%d",&N);
getchar();
for(i=0;i<N;i++){
gets(str[i]);
}
for(l=0;l<N;l++){
puts(str[l]);
printf("AI: ");
k=0;
strcpy(str2,str[l]);
len=strlen(str2);
if(str2[0]==' '){
for(j=1;j<len;j++){
if(str2[j]!=' '&&unsign(str2[j+1])==0){
str[l][k]=str2[j];
k++;
count=j+1;
break;
}
if(str2[j]!=' '&&unsign(str2[j+1])==1){
str[l][k]=str2[j];
if(str[l][k]=='?'){
str[l][k]='!';
}
k++;
count=j+1;
break;
}
}
for(j=count;j<len;j++){
if(str2[j]!=' '){
str[l][k]=str2[j];
if(str[l][k]=='?'){
str[l][k]='!';
}
k++;
}
if(str2[j]==' '&&str2[j+1]!=' '&&unsign(str2[j+1])==1){
str[l][k]=str2[j];
k++;
}
if(str2[j]==' '&&str2[j+1]!=' '&&unsign(str2[j+1])==0){
str[l][k]=str2[j+1];
if(str[l][k]=='?'){
str[l][k]='!';
}
k++;
j++;
}
}
}
if(str2[0]!=' '){
k=0;
for(j=0;j<len;j++){
if(str2[j]!=' '){
str[l][k]=str2[j];
if(str[l][k]=='?'){
str[l][k]='!';
}
k++;
}
if(str2[j]==' '&&str2[j+1]!=' '&&unsign(str2[j+1])==1){
str[l][k]=str2[j];
k++;
}
if(str2[j]==' '&&str2[j+1]!=' '&&unsign(str2[j+1])==0){
str[l][k]=str2[j+1];
if(str[l][k]=='?'){
str[l][k]='!';
}
k++;
j++;
}
}
}
str[l][k]='\0';
len=strlen(str[l]);
for(i=0;i<len;i++){
if(str[l][i]>='A'&&str[l][i]<='Z'&&str[l][i]!='I'){
str[l][i]=str[l][i]+32;
}
}
char str1[1001];
int flag[1000];
strcpy(str1,str[l]);
len=strlen(str1);
j=0;
m=0;
for(i=0;i<len;i++){
if(unsign(str1[i-1])==0&&str1[i]=='c'&&str1[i+1]=='a'&&str1[i+2]=='n'&&str1[i+3]==' '&&str1[i+4]=='y'&&str1[i+5]=='o'&&str1[i+6]=='u'&&unsign(str1[i+7])==0){
str[l][j]='I';
str[l][j+1]=' ';
str[l][j+2]='c';
str[l][j+3]='a';
str[l][j+4]='n';
flag[m]=j;
m++;
j=j+5;
i=i+6;
continue;
}
if(unsign(str1[i-1])==0&&str1[i]=='c'&&str1[i+1]=='o'&&str1[i+2]=='u'&&str1[i+3]=='l'&&str1[i+4]=='d'&&str1[i+5]==' '&&str1[i+6]=='y'&&str1[i+7]=='o'&&str1[i+8]=='u'&&unsign(str1[i+9])==0){
str[l][j]='I';
str[l][j+1]=' ';
str[l][j+2]='c';
str[l][j+3]='o';
str[l][j+4]='u';
str[l][j+5]='l';
str[l][j+6]='d';
flag[m]=j;
m++;
j=j+7;
i=i+8;
continue;
}
str[l][j]=str1[i];
j++;
}
str[l][j]='\0';
strcpy(str1,str[l]);
len=strlen(str1);
j=0;
int b;
for(i=0;i<len;i++){
if(unsign(str1[i-1])==0&&str1[i]=='I'&&unsign(str1[i+1])==0){
b=0;
for(s=0;s<=m;s++){
if(flag[s]!=i){
b=1;
str[l][j]='y';
str[l][j+1]='o';
str[l][j+2]='u';
j=j+3;
break;
}
}
if(b==0){
str[l][j]=str1[i];
j++;
}
continue;
}
if(unsign(str1[i-1])==0&&str1[i]=='m'&&str1[i+1]=='e'&&unsign(str1[i+2])==0){
b=2;
for(s=0;s<=m;s++){
if(flag[s]!=i){
b=3;
str[l][j]='y';
str[l][j+1]='o';
str[l][j+2]='u';
j=j+3;
i=i+1;
break;
}
}
if(b==2){
str[l][j]=str1[i];
j++;
}
continue;
}
str[l][j]=str1[i];
j++;
}
str[l][j]='\0';
puts(str[l]);
}
return 0;
}
int unsign(char a)
{
if(a>='0'&&a<='9'){
return 1;
}
if(a>='A'&&a<='Z'){
return 1;
}
if(a>='a'&&a<='z'){
return 1;
}
return 0;
}
2)思路
因为这个题我在pta上怎么都通过不了,就不画流程图了
思路就是按照题目的要求,分块一步一步的实现,首先我是想着先把所有的不合格的空格消掉,顺带把?改成!,然后再去把除了I之外的所有大写改成小写,然后就去把can /could you改了,顺带标记一下,之后把没有标记的me/I改成you,就可以输出了。
3)错误截图
问题:不知道到底哪里错了,我在dev里调试运行了无数次,但我不知道我是不是忽略了什么,在pta上怎么都不对,是我少了什么吗
4)运行结果截图
5)评价
这道题做的我想死,刚一看题的时候觉得还好,就是要求有点多,感觉有点麻烦,但没想到的是我写出来后怎么都找不到错,关键是在dev上运行调试我发现不了错,导致我不知道要改哪里才好
挑战作业
关于挑战作业貌似都是关于递归的吧,一方面这次我把时间都用在了第二题上,关键还没做出来,内心崩溃,没有精力,也没有时间去写了,另一方面就是递归这种算法我不太会,所以没做,之后会再看的。
预习作业
请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)
数组指针:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
课本194页
指针数组:是由指针变量构成的数组。(如果数组的各个元素都是指针类型,用于存放内存地址,则这个数组就是指针数组)
一般格式:类型名 *数组名 [数组长度];
课本264页 奥运五环色
指针函数:使用指针作为函数的参数或数组名
课本188页,角色互换
函数指针:指向函数的指针,在C语言中,函数名代表函数的入口地址,,可以定义一个指针变量,接收函数的入口地址,让它指向函数。
一般格式:类型名(*变量名)(参数类型表);
课本279页
二级指针:指向指针的指针。
一般格式:类型名* *变量名;
课本269页
单向链表:一种常见而重要的动态存储分布的数据结构。链表变量一般用指针head表示,用来存放链表首结点的地址,链表每个结点由数据部分和下一个结点的地址部分组成,链表中的最后一个结点称为表尾,其下一个结点的地址部分的值为NULL。
课本286页
学习进度条
周/日期 | 这周所花的时间 | 代码行数 | 学到的知识点简介 | 目前比较迷惑大问题 |
---|---|---|---|---|
5/5-5/10 | 30个小时 | 500行 | 递归算法,编程结构,头文件编写 | 递归算法 |
累计代码行数和博客字数
时间 | 博客字数 | 代码行数 |
---|---|---|
第一周 | 0 | 80 |
第二周 | 100 | 180 |
第三周 | 400 | 330 |
第四周 | 600 | 480 |
第五周 | 900 | 720 |
第六周 | 1250 | 890 |
第七周 | 1610 | 1065 |
第八周 | 2010 | 1295 |
第九周 | 2480 | 1495 |
第十一周 | 3080 | 1995 |
学习感悟
1)总是莫名其妙的写错一些不该写错的地方,可能还是因为不够专注吧,感觉这次的题目有点难,尤其是那个递归算法,我觉得好抽象,递归式子我找不到,所以还是要多练练吧
2)疑惑:就是那个递归啊,不知道怎么用代码实现递归的这个过程
结对编程
过程:就是一起思考该怎么做,讨论解题的的思路
我觉得结对编程的好处就是可以给对方提供一个思路,一个做题的不一样的方向
缺点就是结对编程不如自己编程那么的时间灵活