zoukankan      html  css  js  c++  java
  • 第十一周作业

    这个作业属于哪个课程 C语言程序设计II
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/MS/homework/3206
    我在这个课程的目标是 能够对相对复杂的问题,合理定义程序的多函数结构;能够使用递归函数进行编程;掌握宏的基本用法;掌握编译预处理的概念。
    这个作业在哪个具体方面帮助我实现目标 PTA习题
    参考文献 C语言程序设计第10章

    题目一 7-1 汉诺塔问题*

    汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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

    源代码

    #include<stdio.h>
    void Hanio(int n,char a,char c,char b);
    int main(void)
    {
        int n;
        char a,c,b;
        scanf("%d %c %c %c",&n,&a,&c,&b);
        Hanio(n,a,c,b);
        
        return 0; 
     } 
     
     void Hanio(int n,char a,char c,char b)
     {
        if(n==1)
               printf("1: %c -> %c
    ",a,c);
        else{
            Hanio(n-1,a,b,c);
            printf("%d: %c -> %c
    ",n,a,c);
            Hanio(n-1,b,c,a);
         }
     }
    

    设计思路

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


    模仿书上245页的写法,忽略了调换顺序,于是答案错误。此题,三根柱子顺序为a,c,b,从a到c,b为中间过渡。

    pta运行结果截图

    题目二 7-2 估值一亿的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

    别人的源代码

    #include<stdio.h>
    #include<string.h>
    int main(void)
    {
        char str1[1001];
        static int i,a,x,y,N,b;
        
        scanf("%d
    ",&N);
        char str[N][1001];
        for(i=0;i<N;i++){              /*输入对话,存入二维数组*/ 
            gets(str[i]);
        }
        
        for(b=0;b<N;b++){               /*对输入的对话一行一行 进行改造*/ 
        i=0;
        a=0;
        x=0;
        while(str[b][i]!=''){               /*改造开始,以单个字母进行改变*/ 
            if(str[b][i]==' '&&x==1){          /*多个空格变成一个*/ 
                str1[a]=' ';
                a++;
                x=0;
            }
            
            if(str[b][i]!=' '){               /*清除符号前的空格*/ 
                if((str1[a-1]==' ')&&((str[b][i]<'a'||str[b][i]>'z')&&(str[b][i]<'A'||str[b][i]>'Z'))&&((str[b][i]<'0')||(str[b][i]>'9'))){
                    if(str[b][i]=='?'){                       /*改变问号为叹号*/ 
                        str1[--a]='!';
                        a++;
                        x=1;
                    }
                    else{
                        str1[--a]=str[b][i];
                        a++;
                        x=1;
                    }
                }
                else{
                    if(str[b][i]<='Z'&&str[b][i]>='A'&&str[b][i]!='I'){       /*改大写为小写*/
                        str1[a]=str[b][i]-'A'+'a';
                        a++;
                        x=1;
                    }
                    else{
                        if(str[b][i]=='?'){                     /*改变问号为叹号*/
                            str1[a]='!';
                            a++;
                            x=1;
                        }
                        else{                               /*其他字母正常存入*/ 
                            str1[a]=str[b][i];
                            a++;
                            x=1;
                        }
                    }
                }
            }
            i++;                      /*下一个字母*/ 
        }
        
        str1[a]='';                 /*添加字符串结束标记*/ 
        if(str1[a-1]==' '){           /*去掉字符串最后的空格*/ 
            str1[a-1]='';
        }
        
        i=0;
        while(str1[i]!=''){
            /*判断是否为can you*/
            if(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'){     
                if(((str1[i-1]<'a'||str1[i-1]>'z')&&(str1[i-1]<'A'||str1[i-1]>'Z'))&&((str1[i+7]<'a'||str1[i+7]>'z')&&(str1[i+7]<'A'||str1[i+7]>'Z'))){ 
                    str1[i]='I';                        /*判断can you是否独立(“独立”是指被空格或标点符号分隔开的单词)*/ 
                    str1[i+1]=' ';
                    str1[i+2]='c';
                    str1[i+3]='a';
                    str1[i+4]='n';
                    str1[i+5]='8';
                    str1[i+6]='8';
                    i+=7;                             /*减少判断量,从can you后的字符继续判断*/ 
                    continue;
                }
            }
            /*判断是否为could you*/
            if(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'){
                if(((str1[i-1]<'a'||str1[i-1]>'z')&&(str1[i-1]<'A'||str1[i-1]>'Z'))&&((str1[i+9]<'a'||str1[i+9]>'z')&&(str1[i+9]<'A'||str1[i+9]>'Z'))){
                    str1[i]='I';                        /*判断could you是否独立(“独立”是指被空格或标点符号分隔开的单词)*/
                    str1[i+1]=' ';
                    str1[i+2]='c';
                    str1[i+3]='o';
                    str1[i+4]='u';
                    str1[i+5]='l';
                    str1[i+6]='d';
                    str1[i+7]='8';
                    str1[i+8]='8';
                    i+=7;                             /*减少判断量,从could you后的字符继续判断*/
                    continue;
                }
            }
             /*判断I是否独立(“独立”是指被空格或标点符号分隔开的单词)*/
            if(str1[i]=='I'&&((str1[i-1]<'a'||str1[i-1]>'z')&&(str1[i-1]<'A'||str1[i-1]>'Z'))&&((str1[i+1]<'a'||str1[i+1]>'z')&&(str1[i+1]<'A'||str1[i+1]>'Z'))){
                str1[i]='7';
            }
             /*判断me是否独立(“独立”是指被空格或标点符号分隔开的单词)*/
            if((str1[i]=='m'&&str1[i+1]=='e')&&((str1[i-1]<'a'||str1[i-1]>'z')&&(str1[i-1]<'A'||str1[i-1]>'Z'))&&((str1[i+2]<'a'||str1[i+2]>'z')&&(str1[i+2]<'A'||str1[i+2]>'Z'))){
                str1[i]='5';
                str1[i+1]='6';
                i++;
            }
            i++;
        }
        /*输出改变后的字符串,'8'转义为空,('5''6')转义为you,'7'转义为you*/ 
        printf("%s
    AI: ",str[b]);
        y=strlen(str1);
        for(i=0;i<y;i++){
            if(str1[i]=='8')
                continue;
            else if(str1[i]=='5'&&str1[i+1]=='6'){
                printf("you");
                i++;
                continue;
            }
            else if(str1[i]=='7'){
                printf("you");
            }
            else
                printf("%c",str1[i]);
        }
        printf("
    ");
        }
        
    }
    

    设计思路

    这一个亿我是赚不了了,太复杂了,不会。

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

    细分成一个个的小模块,然后再合起来也还是蛮难的。

    pta运行结果截图

    题目三 7-3 ***八皇后问题

    在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。
    现在我们把棋盘扩展到 n × n 的棋盘上摆放 n 个皇后,请问该怎么摆?请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两格之间空一格)。

    输入格式

    正整数 n (0 < n ≤ 12)

    输出格式

    若问题有解,则输出全部摆法(两种摆法之间空一行),否则输出 None。
    要求:试探的顺序逐行从左往右的顺序进行,请参看输出样例2。

    输入样例1

    3

    输出样例1

    None

    输入样例2

    6

    输出样例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运行结果截图

    题目四 7-1 求迷宫最短通道

    递归求解迷宫最短通道的总步长。输入一个迷宫,求从入口通向出口的可行路径中最短的路径长度。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径上经历的最短的总步长。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走。

    输入格式:

    输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)

    输出格式:

    若有可行的通道则输出一个整数,代表求出的通道的最短步长;若没有通道则输出"No solution"

    输入样例:

    10
    1 1 1 1 1 1 1 1 1 1
    1 0 0 1 0 0 0 1 0 1
    1 0 0 1 0 0 0 1 0 1
    1 0 0 0 0 1 1 0 0 1
    1 0 1 1 1 0 0 0 0 1
    1 0 0 0 1 0 0 0 0 1
    1 0 1 0 0 0 1 0 0 1
    1 0 1 1 1 0 1 1 0 1
    1 1 0 0 0 0 0 0 0 1
    1 1 1 1 1 1 1 1 1 1
    上述输入代表的是如下这样一个迷宫:

    其中红色的小方块是障碍物,蓝色的小方块是空位,白色的小圆连起来是一条从入口到出口的通道,两个圆之间代表一个步长。

    输出样例:

    14

    源代码

    设计思路

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

    pta运行结果截图

    预习作业

    第十二周的教学内容是:第十一章 指针进阶
    请大家查阅资料,思考如下问题:
    请举实例解释以下几个概念:数组指针,指针数组,指针函数,函数指针,二级指针,单向链表。(无实例不给分)
    请用自己的理解回答。如果有引用他人的文字,请一定要标出出处(使用Markdown的链接方式)。

    本周代码行数和博客字数记录

    时间 代码行 博客字数 用时(h) 知识点
    3.19~3.20 100 500 10h 二维数组的使用;选择排序和冒泡排序法
    3.26~3.29 150 1200 6h 如何定义和使用指针;掌握字符串的基本概念及使用方法,重点理解字符串与一维字符数组的区别、字符串的存储以及字符串的操作方法。
    4.2~4.5 85 1862 6h 理解变量、内存单元和地址之间的关系;掌握如何定义指针变量,怎样使用指针变量,怎样进行指针变量的初始化;掌握指针变量的基本运算;理解指针作为函数参数的作用;掌握如何使用指针实现函数调用返回多个值。
    4.10~4.12 109 2068 6h 掌握数组名作为函数参数的用法,理解指针、数组和地址之间的关系,理解指针和数组可以实现相同的操作。
    4.17~4.19 128 1892 10h 掌握常用字符串函数以及使用指针操作字符串的方法,掌握动态内存分配
    4.24~4.26 84 1884 8h 能够根据实际情况合理定义结构,能够使用结构变量与结构数组进行熟练编程,掌握结构指针的操作,并应用于函数传递。
    5.7~5.10 200 3000 6h 能够对相对复杂的问题,合理定义程序的多函数结构;能够使用递归函数进行编程;掌握宏的基本用法;掌握编译预处理的概念。

    我的感想

    本周学习了多函数结构,递归函数,宏,还是不怎么了解,题目好复杂。

    结对编程感想

    一个问题两人做不动的话,就问题蛮大了。

  • 相关阅读:
    Vue路由机制
    谷歌浏览器打不开应用商店的解决方法
    Vue报错——Component template should contain exactly one root element. If you are using vif on multiple elements, use velseif to chain them instead.
    Vue.js学习之——安装
    Vue使用axios无法读取data的解决办法
    关于localstorage存储JSON对象的问题
    2013年整体计划
    个人喜欢的警语收集
    Linux防火墙的关闭和开启
    Flex修改title 转载
  • 原文地址:https://www.cnblogs.com/clayLJX/p/10846159.html
Copyright © 2011-2022 走看看