2019春第十一周作业
这个作业属于那个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3201 |
我在这个课程的目标是 | 希望可以掌握递归函数 |
这个作业在那个具体方面帮助我实现目标 | 有几个题目需要通过熟练使用递归函数去解决(但是题目太难了,我也没有很好的掌握递归函数) |
参考文献 | C语言程序设计 |
选择题
汉诺塔问题
实验代码
#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);
}
}
设计思路流程图
调试过程中遇到的问题及解决方法
这个题可能是这次包括我在内的很多人唯一会写的题了吧,因为是一个经典的递归函数问题书上也有讲解,所以我个人是没有什么问题的
实验结果截图
估值一亿的AI核心代码
实验代码
#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语言居然没有这么方便的函数,没办法,只能自己设计一个函数去实现该功能。
第一步(输入):将输入的一句话先逐个读入字符数组中,把改字符数组的地址赋给一个指针,读入的过程顺便把大写改小写,多余的空格去掉,?号改!号。
第二步:将替换的单词与被替换的单词放到一些数组里面,再将指针,替换的单词,被替换的单词传给自定义函数。
第三步(自定义函数的设计):把指针逐个与需被替换的单词对比,如果相同则继续对比直到对比完所有的字母在进入下一步替换,否则把指针+1,继续对比,直到对比完所有的字母
第四步(替换):这一步是最难的,因为分成了3种情况,一个是替换的单词数>被替换的单词数,一个是替换的单词数<被替换的单词数,一个是替换的单词数=被替换的单词数,
①当替换的单词数>被替换的单词数时,先将该单词后面的字母往后面移(替换的单词数-被替换的单词数)的距离,具体是通过指针去实现,然后把替换的单词直接一个字母一个字母赋到被替换的单词的位置。
②当替换的单词数<被替换的单词数时,先将该单词后面的字母往前面移(被替换的单词数-替换的单词数)的距离,具体也是通过指针去实现,然后把替换的单词直接一个字母一个字母赋到被替换的单词的位置。
③当替换的单词数=被替换的单词数时,这里就直接把替换的单词直接一个字母一个字母赋到被替换的单词的位置就可以了。
第五步(输出):直接一个个的输出就可以了。
调试过程中遇到的问题及解决方法
这个题目遇到的问题太多太多了,具体的我也都忘记了。
运行结果截图
没办法,只能有这样的截图了
后面那个题和挑战题我是真的毫无思路啊啊啊啊
周/日期 | 这周所花时间 | 代码行数 | 学到的知识点 | 目前比较迷惑的问题 |
---|---|---|---|---|
3月4-3月10 | 4天 | 130行 | 如何读取文件中的数据并写入数据 | |
3/11-3/17 | 2天 | 66行 | 一些有关文件的函数 | |
3/18-3/24 | 2天 | 103行 | 二维数组的定义与使用 | |
3/25-3/31 | 2天 | 140行 | 与字符串有关的函数strlen,strcpy | 一些与字符串有关的函数使用方法 |
4/1-4/7 | 2天 | 56行 | 指针函数的定义与使用 | |
4/8-4/14 | 2天 | 69行 | gets,puts,strcat,strcmp函数 | |
4/13-4/19 | 2天 | 162行 | 地址结构内存的动态分配 | |
4/20-4/26 | 3天 | 108行 | 结构的定义与使用 | |
4/27-5/3 | 2天 | 229行 | 小球的移动与简单飞机游戏的设计 | 不清楚COORD,HANDLE是什么还有不知道GetStdHandle函数 |
5/4-5/10 | 4天 | 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 */
二级指针:
表示的是指向指针的指针。
一级指针与二级指针的比较:一级指针的值为地址,地址需要空间来存放,是空间就具有地址 ,二级指针就是为了获取这一空间的地址。一级指针所关联的是其值(一个地址)名下空间里 的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,那就是地址。
指针的用途:提供目标的读取或改写,而二级指针就是对于内存地址的读取和改写。
单向链表:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据
学习感悟
这一周的作业让我感触最深的就是自己知道的还是太少了,看了好多大佬的代码,思路差不多都是往哪方面去想,但是一些函数却不知道导致我的代码就复杂了好多好多,还是要多去做做题呀
结对编程感悟
这一周因为作业太难,我和搭档也没有什么讨论的地方。。。。。