2019春第十一周作业

这个作业属于那个课程C语言程序设计II
这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3201
我在这个课程的目标是希望可以掌握递归函数
这个作业在那个具体方面帮助我实现目标有几个题目需要通过熟练使用递归函数去解决(但是题目太难了,我也没有很好的掌握递归函数)
参考文献C语言程序设计

选择题

1580460-20190510163414375-988122412.png

1580460-20190510163417905-1290192786.png

1580460-20190510163422486-1976903787.png

汉诺塔问题

1580460-20190510163845515-1882997698.png

实验代码

#include<stdio.h> 
void hanio (int n,char a,char b,char c);
int main()
{
    int n;
    char ch,op,xy;
    scanf("%d\n",&n);
    scanf("%c %c %c",&ch,&op,&xy);
    hanio(n,ch,op,xy);
    
    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);   
    }
}

设计思路流程图

1580460-20190510171312636-746279315.jpg

调试过程中遇到的问题及解决方法

这个题可能是这次包括我在内的很多人唯一会写的题了吧1580460-20190510171535253-1883885861.png,因为是一个经典的递归函数问题书上也有讲解,所以我个人是没有什么问题的

实验结果截图

1580460-20190510172134160-132335362.png

估值一亿的AI核心代码

1580460-20190510173604278-482638894.png

1580460-20190510172527213-142108014.png

1580460-20190510172447835-1298022100.png

实验代码

#include<stdio.h>
#include<string.h>
void replace(char *a,char *b,char *c);
int len1,len2,len3=0;
int main()
{
    int n,flag=0,j=0,r=0;
    char str1[1000];
    char *p=str1;
    char ch;
    char cxd1[8]={'c','a','n',' ','y','o','u'},cxd2[10]={'c','o','u','l','d',' ','y','o','u'},cxd3[2]={'I'},cxd4[3]={'m','e'};
    char thd1[6]={'l', ' ','c','a','n'},thd2[8]={'l',' ','c','o','u','l','d'},thd3[4]={'y','o','u'};
    scanf("%d\n",&n);
    for(int i=0;i<n;i++){
        while(ch=getchar(),ch!='\n')
        {   
        if('A'<=ch&&ch<='H'||'J'<=ch&&ch<='Z'){
            *(p+j)=ch+32;
            j++;
            flag=1;
        }
            
        else if(ch=='?'){
            if(*(p+j-1)==' ')
            *(p+j-1)='!';
            else
            *(p+j)='!';
            j++;
        }
        
        else if(ch==39){
            if(*(p+j-1)==' ')
            *(p+j-1)=39;
            else
            *(p+j-1)=39;
            j++;
        }
                                    
        else if(ch==' '){
            if(flag==1){
                *(p+j)=ch;
                j++;
                flag=0;
            }
        }
            
        else{
            *(p+j)=ch;
            j++;
            flag=1;
        }
        len3++;
        }
        *(p+j)='\0';
        j=0;

        len1=strlen(cxd3);len2=strlen(thd3);
        replace(str1,cxd3,thd3);
        
        len1=strlen(cxd4);
        replace(str1,cxd4,thd3);
        
        len1=strlen(cxd1);len2=strlen(thd1);
        replace(str1,cxd1,thd1);
        
        len1=strlen(cxd2);len2=strlen(thd2);
        replace(str1,cxd2,thd2);
        
        printf("AI: ");
        while(*(p+j)!='\0'){
            if(*(p+j)!=39)
                printf("%c",*(p+j));
            else {
                printf("%c",*(p+j));
                j++;
            }
            j++;
        }
        j=0;
        if(i+1<n)
            printf("\n");
        
    }
    
    return 0;
} 
 void replace(char *a,char *b,char *c)
 {
    int i=0,j=0,item=0,m,n=len3;
    while(*(a+i)!='\0'){
        while(*(b+j)==*(a+i+j)){
            if(*(b+j+1)=='\0')
                item=1;
            j++;
        }       
        if(item){
            if(len1>len2){
                for(m=0;m<len2;m++)
                    *(a+i+m)=*(c+m);
                while(*(a+i+j)!='\0'){
                    *(a+i+m)=*(a+i+j);
                    j++;m++;
                }
                *(a+i+m)='\0';
            }
            else if(len1<len2){
                if(*(a+i-1)==' '&&*(a+i+len1)==' '||*(a+i-1)==' '&&*(a+i+len1)==','){
                for(m=0;m<len1;m++)
                    *(a+i+m)=*(c+m);
                while(i+j<=n){
                    *(a+n+(len2-len1)-1)=*(a+n-1);
                    n--;
                }
                for(m=0;m<(len2-len1);m++)
                    *(a+i+j+m)=*(c+len1+m);
            }
        }
            else{
                for(m=0;m<len2;m++)
                    *(a+i+m)=*(c+m);
            }
        }
        i++;item=0;j=0;
    }
}

设计思路

因为没有通过PTA,只有输出符合题目给的样例,我也不知道哪里错了,所以还是只讲一下我的大概思路算了(不知道是不是对的)。
这个题目相信很多人跟我一样,第一眼看上去觉得应该很简单,直接判断单词再替换呗,不就可以了,但是当我写到一半的时候百度发现c语言居然没有这么方便的函数1580460-20190510174921835-1133855557.png,没办法,只能自己设计一个函数去实现该功能。
第一步(输入):将输入的一句话先逐个读入字符数组中,把改字符数组的地址赋给一个指针,读入的过程顺便把大写改小写,多余的空格去掉,?号改!号。
第二步:将替换的单词与被替换的单词放到一些数组里面,再将指针,替换的单词,被替换的单词传给自定义函数。
第三步(自定义函数的设计):把指针逐个与需被替换的单词对比,如果相同则继续对比直到对比完所有的字母在进入下一步替换,否则把指针+1,继续对比,直到对比完所有的字母
第四步(替换):这一步是最难的,因为分成了3种情况,一个是替换的单词数>被替换的单词数,一个是替换的单词数<被替换的单词数,一个是替换的单词数=被替换的单词数,
①当替换的单词数>被替换的单词数时,先将该单词后面的字母往后面移(替换的单词数-被替换的单词数)的距离,具体是通过指针去实现,然后把替换的单词直接一个字母一个字母赋到被替换的单词的位置。
②当替换的单词数<被替换的单词数时,先将该单词后面的字母往前面移(被替换的单词数-替换的单词数)的距离,具体也是通过指针去实现,然后把替换的单词直接一个字母一个字母赋到被替换的单词的位置。
③当替换的单词数=被替换的单词数时,这里就直接把替换的单词直接一个字母一个字母赋到被替换的单词的位置就可以了。
第五步(输出):直接一个个的输出就可以了。

调试过程中遇到的问题及解决方法

这个题目遇到的问题太多太多了1580460-20190510183747926-476670101.png,具体的我也都忘记了。

运行结果截图

没办法,只能有这样的截图了1580460-20190510183703470-966963302.png
1580460-20190510183645679-2092423903.png

后面那个题和挑战题我是真的毫无思路啊啊啊啊

周/日期这周所花时间代码行数学到的知识点目前比较迷惑的问题
3月4-3月104天130行如何读取文件中的数据并写入数据
3/11-3/172天66行一些有关文件的函数
3/18-3/242天103行二维数组的定义与使用
3/25-3/312天140行与字符串有关的函数strlen,strcpy一些与字符串有关的函数使用方法
4/1-4/72天56行指针函数的定义与使用
4/8-4/142天69行gets,puts,strcat,strcmp函数
4/13-4/192天162行地址结构内存的动态分配
4/20-4/263天108行结构的定义与使用
4/27-5/32天229行小球的移动与简单飞机游戏的设计不清楚COORD,HANDLE是什么还有不知道GetStdHandle函数
5/4-5/104天248行递归函数好多好多。。。

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

数组指针
一个指向数组的指针。
举例:int (*p)();
指针数组
一个元素为指针的数组。
举例:int *p[10];
           char *p[10];
它表示大小为10元素的数组,里面分别存放着元素为int*,char* 类型的指针数组
[]的优先级要高于*
指针函数
指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。
类型标识符 *函数名(参数表)
int *f(x,y);
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
函数指针
函数指针是指向函数的指针变量,即本质是一个指针变量。

int (*f) (int x); /*声明一个函数指针 */

   f=func; /* 将func函数的首地址赋给指针f */
二级指针:
表示的是指向指针的指针。
一级指针与二级指针的比较:一级指针的值为地址,地址需要空间来存放,是空间就具有地址 ,二级指针就是为了获取这一空间的地址。一级指针所关联的是其值(一个地址)名下空间里 的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,那就是地址。

指针的用途:提供目标的读取或改写,而二级指针就是对于内存地址的读取和改写。
单向链表:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据

学习感悟

这一周的作业让我感触最深的就是自己知道的还是太少了,看了好多大佬的代码,思路差不多都是往哪方面去想,但是一些函数却不知道导致我的代码就复杂了好多好多,还是要多去做做题呀

结对编程感悟

这一周因为作业太难,我和搭档也没有什么讨论的地方。。。。。

学习折线图

1580460-20190510204127046-1697417784.png

转载于:https://www.cnblogs.com/pzbangbangdai/p/10845563.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值