1. 本章学习总结

1.1 思维导图



1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

这几周学习了指针,指针是C语言的一个重要的概念,也是特色之一。它可以通过对地址的访问来改变值,所以它的用处也很多,例如交换数就可以通过指针来完成。可是运用指针,大多时候都要通过运行看能不能通过编译来判断是否要加*或者不加* 。做指针题集时,函数题还有些用到指针,但是编程题就没有用到了,还是用之前的老方法做(不大会用指针)。知道指针是很重要的一部分,等到掌握得更熟练再回来重新做一遍吧。还学习了字符串处理的一些函数,之前赋值都是直接用等号,判断用大于小于,但是字符串的判断就要调用函数了,刚开始用还真是很容易出错。PTA的题目,将之前对数据的处理变成了对字符串的处理,可以对这些函数多些运用吧

1.2.2 代码累计

2. PTA总分

2.1 截图PTA中指针题目集的排名得分

2.2 我的总分:110

3. PTA实验作业

3.1 PTA题目1

求子串在母串中最后一次出现的地址
给定程序中函数fun的功能是:求出在字符串中最后一次出现的子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。
函数接口定义:
char *fun (char *s, char *t );
其中 s和t 是用户传入的参数。函数求 t指针所指的字符串在s指针所指的字符串中最后一次出现的地址,并返回,若未找到,则函数值为NULL。

3.1.1 算法分析

定义整型变量i,j,k,n,用来判断是否出现子串的flag=0
定义字符指针变量p
for 从i=0到t数组为空字符 do
i++
将i的值赋给n
end for
for 从i=0到s数组为空字符 do
for 从i=j,k=0开始到s数组结束,并且s数组和t数组中的字符一样时 do
if t数组最后一个字符不为空字符 do
指针p指向s数组中第j-n个字符即最后一次出现t串时的位置减去t串的长度
flag=1
end if
end for
end for
if flag==0
返回 p 为空指针
否则返回 p

3.1.2 代码截图

3.1.3 PTA提交列表及说明表及说明

Q1:一开始没有定义指针让它来指向要输出的数组,直接把s数组return回去了,调试过程中发现它并没有按我所想的情况发展

A1:加了个字符指针,让它指向要输出的首地址,最后把这个指针返回回去就可以了

4.大作业

4.1改造函数介绍

4.1.1函数1

  • 伪代码
定义存放随机数num1,num2,num3,随机运算符operation_1,operation_2
operation_1=rand()%4
operation_2=rand()%2//产生范围内的随机数,用于switch
switch(level)//level是主函数传参进来的数
case 1:
num1=rand()%10
num2=rand()%10
itoa(num1,exp,10)//将整型数据转化为字符数据并存在数组中char *itoa( int value, char *string,int radix); 原型说明:value:欲转换的数据。string:目标字符串的地址。radix:转换后的进制数,可以是
10进制、16进制等。
switch(operation_1)
case 0:strcat(exp,"+");break;//将符号接到数组里
......
end switch
strcat(exp,itoa(num2,exp+3,10))//将第二个数也接到数组里,因为前一个数和运算符占了2个字节,所以exp从第3个开始存放进去
break;
case 2:
.......
case 3:
.......
//等级二,等级三均同理可得到一个式子
end switch
strcat(exp,"=")//接上等于号
输出exp
  • 截图函数代码
void CreateExp(char *exp,int level)
{
int num1,num2,num3;
int operation_1,operation_2;
srand(time(NULL));
operation_1=rand()%4;
operation_2=rand()%2;
switch(level)
{
case 1:
srand(time(NULL));
num1=rand()%10;
num2=rand()%10;
itoa(num1,exp,10);
switch(operation_1)
{
case 0:strcat(exp,"+");break;
case 1:strcat(exp,"-");break;
case 2:strcat(exp,"*");break;
case 3:strcat(exp,"/");break;
}
strcat(exp,itoa(num2,exp+3,10));
break;
case 2:
num1=rand()%100;
num2=rand()%100;
num3=rand()%100;
itoa(num1,exp,10);
switch(operation_2)
{
case 0:strcat(exp,"+");break;
case 1:strcat(exp,"-");break;
}
strcat(exp,itoa(num2,exp+4,10));
switch(operation_2)
{
case 0:strcat(exp,"+");break;
case 1:strcat(exp,"-");break;
}
strcat(exp,itoa(num3,exp+7,10));
break;
case 3:
num1=rand()%1000;
num2=rand()%1000;
num3=rand()%1000;
itoa(num1,exp,10);
switch(operation_2)
{
case 0:strcat(exp,"+");break;
case 1:strcat(exp,"-");break;
}
strcat(exp,itoa(num2,exp+5,10));
switch(operation_2)
{
case 0:strcat(exp,"+");break;
case 1:strcat(exp,"-");break;
}
strcat(exp,itoa(num3,exp+9,10));
break;
}strcat(exp,"=");
puts(exp);
}

4.1.2函数2

  • 伪代码
将exp和level传入该函数里面
if 等级为1并且是除号
while 除数为0
清屏//将非法式子清除
调用函数CreateExp
if 不是除号或者除数不为0
跳出while
end if
end while
while num1取余num2不为0//即不能整除属于非法式子
清屏
调用函数CreateExp
if num1取余num2为0
跳出while
end if
end while
end if
  • 截图函数代码
int IsExp(char *exp,int level)
{
srand(time(NULL));
if(level==1&&exp[1]=='/')
{
while(exp[2]=='0')
{
system("cls");//调用清屏函数将非法函数去掉
CreateExp(exp,level);
if(exp[1]!='/'||exp[2]!='0')
break;
}
while((exp[0]-'0')%(exp[2]-'0')!=0)
{
system("cls");
CreateExp(exp,level);
if((exp[0]-'0')%(exp[2]-'0')==0)
break;
}
}
}

4.1.3函数3

  • 伪代码
定义整型变量m来存放数据,sum做整个式子的结果,i
定义字符型变量oldc为+
do
if exp数组的第i个数据是大于0并且小于9
m=10*m+exp[i]-'0'//将字符数据转化为数字数据
else
if oldc为加号
sum+=m
else if oldc为减号
sum-=m
else if oldc为乘号
sum*=m
else
sum/=m
end if
i++//字符数组exp往后移
while 最后一个数据时不为=
return sum//将sum的值返回到主函数
  • 截图函数代码
int ComputeExp(char *exp)
{
int m=0, sum=0,i=0;
char oldc='+';
do
{
if(exp[i]<='9'&&exp[i]>='0' )
m=10*m+exp[i]-'0';
else
{
if(oldc=='+' )
sum += m;
else if(oldc=='-')
sum -= m;
else if(oldc=='*')
sum*=m;
else
sum/=m;
m = 0;
oldc =exp[i];
}
i++;
}while(exp[i-1]!='=');
return sum;
}

4.2与原有函数代码进行比较

  • 改造前函数1和改造后的函数1

    改造前
void Number()
{
switch(level)
{
case 1:
srand(time(NULL));
num1=rand()%9+1;
num2=rand()%9+1;
break;
case 2:
srand(time(NULL));
num1=rand()%90+10;
num2=rand()%90+10;
num3=rand()%90+10;
break;
case 3:
srand(time(NULL));
num1=rand()%900+100;
num2=rand()%900+100;
num3=rand()%900+100;
break;
}
}
void Operation()
{
int operation_1,operation_2;
srand(time(NULL));
operation_1=rand()%4;
operation_2=rand()%2;
if(level==1)
{
switch(operation_1)
{
case 0:ch1='+';break;
case 1:ch1='-';break;
case 2:ch1='*';break;
case 3:ch1='/';break;
}
}
else
{
switch(operation_2)
{
case 0:ch2='+';ch3='+';break;
case 1:ch2='-';ch3='-';break;
}
}
}
void GameBegin()
{
int response;
if(level==1)
{
printf("你的题目是%.0f %c %.0f =\n",num1,ch1,num2);
}
else if(level==2)
{
printf("你的题目是%.0f %c %.0f %c %.0f =\n",num1,ch2,num2,ch3,num3);
}
else
{
printf("你的题目是%.0f %c %.0f %c %.0f =\n",num1,ch2,num2,ch3,num3);
}
}
改造前用了三个函数来完成得出随机的式子,一个函数用来产生随机数,一个函数用来产生随机运算符,另一个用来将它们连接并且输出
改造后的代码将这三个函数共同完成的内容并到同一个里面来完成,就不用定义那么多全局变量,让不同函数共用一个变量。而且代码量也少了,看起来比较简洁
  • 改造前函数2和改造后的函数2
改造前得到随机数时直接使用rand()%9+1,这样就不会得到0,所以就没有判断除数为0的情况。但是之前的除法都认为不能整除也是正常的式子,所以还要考虑用户输入的答案和计算机给出的答案会不一致,考虑的就比较多
改造后将式子都控制在可以整除的情况下,所以在下一个计算结果的函数就可以比较轻松了
  • 改造前函数3和改造后的函数3

    改造前
double Gameresult()
{
double result;
switch(ch1)//一级难度的一步运算i
{
case '+':
result=num1+num2;break;
case '-':
result=num1-num2;break;
case '*':
result=num1*num2;break;
case '/':
result=num1/num2+0.005;
result=1.0*((int)(result*100))/100;
break;
}
switch(ch2)//二,三级难度的两步运算
{
case '+':result=num1+num2;break;
case '-':result=num1-num2;break;
}
switch(ch3)
{
case '+':result=result+num3;break;
case '-':result=result-num3;break;
}
return result;
}
改造前一级难度和二三级难度在计算结果时分开讨论,因为一级是一步运算,而二三级是两步运算
改造后不用判断是一级难度还是二三级难度了,可以共有一个代码来完成,提高了代码的效率

4.3改进大作业总结

  • 这次的改进大作业,因为一直拖着,到了最后一天才在匆匆忙忙的赶,匆匆忙忙的交了上去,在交之前bug超多的,都还没来得及改完。再也不这么匆忙了,真的是作业不能一直拖着
  • 这次在测试数据时,用了字符进去测试就崩了,所以我把等级等之类的数据改为了字符型,这样输入字符型的数据时就不会崩掉了
  • 在构造式子时,愣了一下,然后根据老师的推荐去看了曾俊伟同学的博客,就有了些思路,也调用了itoa这个函数然后用strcat把它们连接起来
  • 第二个函数,判断是否合法,如果不合法就重构一个,然后就调用了stdilb.h里的清屏函数让不合法的式子被清掉
  • 第三个函数里,一开始测试第一级难度数据时答案是错的,最后一个数据总是进不去,后来发现是exp这个数组溢出来了,于是把最后等号所在的位置改了,就对了

C博客作业05--指针的更多相关文章

  1. C语言博客作业05——指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量 1.2.1学习体会 可能因为之前数组那块儿的作业拖得太久了,以至于我觉得指针学的好快,还没反应过来就教完了,然后一开始做题的时候,就是一脸 ...

  2. C博客作业05—指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1 学习体会 理解了指针在代码中的使用方法,学会使用指针进行参数操作 学会了结构体的定义方式与结构体的使用 经过持续一个周 ...

  3. C语言l博客作业05

    问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9830 我在这 ...

  4. C语言I博客作业05

    内容 答案 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 C语言I作业05 我在这个课程的目标是 更熟练的运用编译函数问题 这个作业在哪个具体方面帮助我实现目标 PTA实验作业 参考文 ...

  5. C语言|博客作业05

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9825 我在这个课程的 ...

  6. c语言1博客作业05

    一.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/9831 我 ...

  7. C语言Ⅰ博客作业05

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9827 我在这个课程的目 ...

  8. C语言博客作业05

    这个作业属于哪个课程 C语言程序设计II 这个作业要求在那里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9827 我在这个课程的目 ...

  9. DS博客作业05——树

    1.本周学习总结 1.1思维导图 1.2学习体会 学习:相比于之前的数据结构,树多了很多性质,相应的也多了很多计算题,不得不说,专有名词也是颇多.觉得树最独特的地方就是它的兄弟.孩子结点,用以组成了它 ...

  10. DS博客作业05—树

    1.本周学习总结 1.1思维导图 1.2学习体会 本周学习了树的相关知识,了解了树结构体的应用和基本操作 学习了二叉树的遍历,创建以及哈夫曼树的相关操作 通过树的构建等操作熟练了递归的使用 2.PTA ...

随机推荐

  1. __x__(23)0907第四天__浏览器默认样式

    浏览器默认样式:         为了美观,浏览器为了在页面没有样式时,也可以有一个较好的显示效果,默认设置若干 margin,padding. 作为开发人员,在CSS编写最初,一般都会清除默认样式, ...

  2. matplotlib 三维旋转

    # 当elevation=0时,视角为沿x1负方向看,当elevation=90时,视角沿x3负方向看.# 当azimuth=0时,视角为沿x1负方向看,当azimuth=90时,视角沿x2负方向看. ...

  3. Docker 试用

    Docker还是从.net core 了解的 百度百科 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可 ...

  4. Java中“==”和“equals()”的区别

    “==”比较的是变量所指向的对象,当S1在内存中定义以后,再定义s2的时候s2所指向的值是定义s1时候所创建的,而不是又在内存创建了一个“Monday”. “equals”比较的是对象所指向的值,所以 ...

  5. Python全栈-magedu-2018-笔记10

    第三章 - Python 内置数据结构 集set 约定 set 翻译为集合 collection 翻译为集合类型,是一个大概念 set 可变的.无序的.不重复的元素的集合 set定义 初始化 set( ...

  6. SQL 序列-DML-DML-数据类型-用户管理、权限-事务-视图

    --DML--insert关键字--作用:往表中插入一条(多条)记录 --元祖(tuple)值式的插入(一次插入一条记录)--语法1:insert into tablename(column1,col ...

  7. 基于hortonworks的大数据集群环境部署流水

    一.ambari及HDP安装文件下载地址: 1.系统 操作系统:CentOS7 2.软件 本次安装采用最新版本: ambari-2.7.0.0 hdp-3.0.0.0 详细信息及下载地址如下: Amb ...

  8. CentOS7 FTP安装与配置

    1.FTP的安装 #安装yum install -y vsftpd #设置开机启动systemctl enable vsftpd.service #启动systemctl start vsftpd.s ...

  9. tableview Footerview有多余的间距

    调整footerView的高度 UIView *footerV = [[UIView alloc] initWithFrame:CGRectMake(, , Main_Screen_Width, )] ...

  10. SSZipArchive解压乱码

    https://www.twblogs.net/a/5b7e01e22b7177683854b7b8/zh-cn 搜索   CFStringConvertEncodingToNSStringEncod ...