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)疑惑:就是那个递归啊,不知道怎么用代码实现递归的这个过程

结对编程

过程:就是一起思考该怎么做,讨论解题的的思路
我觉得结对编程的好处就是可以给对方提供一个思路,一个做题的不一样的方向
缺点就是结对编程不如自己编程那么的时间灵活

posted @ 2019-05-10 21:18  H-Alice  阅读(245)  评论(1编辑  收藏  举报