问题 回答
这个作业属于那个课程 C语言程序设计
这个作业要求在哪里 第十一周作业
我在这个课程的目标是 掌握编写程序的框架和递归算法,了解一些自定义头文件
这个作业在哪个具体方面帮助我实现目标 递归算法和函数结构
参考文献 C语言程序设计

汉诺塔问题

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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

输入格式

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

输出格式

移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 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)流程图

2019春季第十一周作业 随笔 第2张

3)本题调试过程碰到的问题及解决办法

2019春季第十一周作业 随笔 第3张

问题:就是递归的那个函数不知道怎么搞
解决办法:书上有一个例题和这个一样,就对照着写了一下

4)运行结果截图

2019春季第十一周作业 随笔 第4张

5)评价

这个题目其实运动的过程我是清楚的,但是代码不是怎么会实现,这个题我是看书写的,总的来说递归这种算法我不是很会用
用时:半个小时

估值一亿的AI核心代码

2019春季第十一周作业 随笔 第5张

2019春季第十一周作业 随笔 第6张

以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 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)错误截图

2019春季第十一周作业 随笔 第7张

问题:不知道到底哪里错了,我在dev里调试运行了无数次,但我不知道我是不是忽略了什么,在pta上怎么都不对,是我少了什么吗

4)运行结果截图

2019春季第十一周作业 随笔 第8张

5)评价

这道题做的我想死,刚一看题的时候觉得还好,就是要求有点多,感觉有点麻烦,但没想到的是我写出来后怎么都找不到错,关键是在dev上运行调试我发现不了错,导致我不知道要改哪里才好

挑战作业

关于挑战作业貌似都是关于递归的吧,一方面这次我把时间都用在了第二题上,关键还没做出来,内心崩溃,没有精力,也没有时间去写了,另一方面就是递归这种算法我不太会,所以没做,之后会再看的。

预习作业

请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)
数组指针:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
2019春季第十一周作业 随笔 第9张

课本194页
指针数组:是由指针变量构成的数组。(如果数组的各个元素都是指针类型,用于存放内存地址,则这个数组就是指针数组)
一般格式:类型名 *数组名 [数组长度];
课本264页 奥运五环色
2019春季第十一周作业 随笔 第10张

指针函数:使用指针作为函数的参数或数组名
课本188页,角色互换
2019春季第十一周作业 随笔 第11张

函数指针:指向函数的指针,在C语言中,函数名代表函数的入口地址,,可以定义一个指针变量,接收函数的入口地址,让它指向函数。
一般格式:类型名(*变量名)(参数类型表);
课本279页
2019春季第十一周作业 随笔 第12张

二级指针:指向指针的指针。
一般格式:类型名* *变量名;
课本269页
2019春季第十一周作业 随笔 第13张

单向链表:一种常见而重要的动态存储分布的数据结构。链表变量一般用指针head表示,用来存放链表首结点的地址,链表每个结点由数据部分和下一个结点的地址部分组成,链表中的最后一个结点称为表尾,其下一个结点的地址部分的值为NULL。
课本286页
2019春季第十一周作业 随笔 第14张

学习进度条

周/日期 这周所花的时间 代码行数 学到的知识点简介 目前比较迷惑大问题
5/5-5/10 30个小时 500行 递归算法,编程结构,头文件编写 递归算法

累计代码行数和博客字数

时间 博客字数 代码行数
第一周 0 80
第二周 100 100
第三周 300 150
第四周 200 150
第五周 300 240
第六周 350 170
第七周 360 175
第八周 400 230
第九周 470 200
第十一周 600 500

2019春季第十一周作业 随笔 第15张

学习感悟

1)总是莫名其妙的写错一些不该写错的地方,可能还是因为不够专注吧,感觉这次的题目有点难,尤其是那个递归算法,我觉得好抽象,递归式子我找不到,所以还是要多练练吧
2)疑惑:就是那个递归啊,不知道怎么用代码实现递归的这个过程

结对编程

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

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄