1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
- 通过数组的学习懂得对整组数据的存放与调用,解决了针对录入一串数据的问题。通过数组的学习可以解决很多之前碰到的问题,并且可以对之前写过的题目进行修改,简化程序。
- 数组的定义在刚开始碰到时还是比较模糊的,常碰到越界或者忘记初始化的问题,这可能会导致程序错误或者崩溃。需要进行调试,规定好数组的边界,或者是可以通过定义更大一些的数组,保障程序的弹性。
- 从这章开始整体的学习节奏都加快了,pta题目的难度也加大了,常出现就是一题卡很久。像螺旋方阵、阅览室、身份证这种题目时常会出现卡带。在做题的过程当中,如果遇到死结(写阅览室写一晚上都不对)就要学会适时的重新整理框架,或者休息一下整理思路再来,否则就会在先入为主的思维上陷入死循环。接下来碰到的题目只会更难更灵活,要多思考多整理。
1.2.2 代码累计
2.PTA总分(2分)
2.1
2.2 我的总分:
- 200+105+150=455
3.PTA实验作业
3.1 PTA题目1
7-11(集美大学程序设计赛题--选做) 除法运算 (25 分)
趣航的上机题
给定两个整数a,b,计算a/b
要求:
若能除尽,则直接输出,若为循环小数,将循环节用括号括起来
如输入1 3,则输出0.(3)
如输入12 5,则输出2.4
3.1.1 算法分析
定义 num1 num2 循环节开始和结束的位置 position1,position2
定义 整数位integer 小数位 remainder ,i,j,flag用于控制循环
定义两个数组 a[10000],b[10000]
integer=num1/num2;//求解整数位
remainder=num1%num2; //判断是否能整除
if remainder!=0 //不能整除有小数位
for i=0 To 9999
remainder*=10;
a[i]=remainder/num2;//求小数位
b[i]=remainder%num2;
if b[i]%num2 整除
end for
end if
for j=0 To i
if a[i]=a[j] && b[i]=b[j]//当所得商和对应的余数再次出现时,循环节出现
position1=i,position2=j;
break;
end if;
end for;
输出 整数位
输出 小数位
3.1.2 代码截图
3.1.3 PTA提交列表及说明
- Q:如果没有循环节或者直接整除,答案出现错误
- A:对于除法的答案进行判断,分为整除,循环和能除尽的小数。
3.2 PTA题目2
7-4 阅览室 (20 分)
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
3.2.1 算法分析
定义 days 天数 times 次数 number 编号 choice 类别
定义 sendTime 借阅时间
定义 a[1001][3] 书号 借阅情况 flag[1001][3]
输入 days
for times=1 To days
输入 书号 状态 时间
while !=0
if choice=S
flag[number]=1;//借阅标记
a[number][1]=60*hour+min;
end if
if choice=E
if flag[number]==1 //被标记状态为借阅
a[number][2]=60*hour+min;
flag[number]=0;//初始化
sendTime+=(a[number][2]-a[number][1]);//两时间差的累加
count++;//记录册数
end if
end if
再次录入信息
end while
if count!=0 输出 count sendTime
else 输出0 0
全部初始化
end for
3.2.2 代码
3.2.3 PTA提交列表及说明
- Q:连续借阅出现问题
- A:利用赋值,更新数据
- Q:最大边界值出现问题,测试点过不了
- A:书号最大时1000,但是在数组当中的计数是从0开始的,所以第1000号是1001位,越界了。改大数组即可。
- Q:如果只有借阅或者只有归还,需要自动过滤掉相关信息。
- A:引用flag[]数组,标记每一本书籍是否被借阅的状态,如果被借阅,则归还有效,反之无效。在此要注意每一天都要对于书籍的借阅情况清空处理。
3.3 PTA题目3
7-7 判断E-mail地址是否合法
输入一个字符串,判断是否是合法邮箱(格式正确即可,不管是否真的存在)输入的只能是字母、数字、下划线、@以及.五种, @前后只能是字母或者数字,而且.后只能是com, 是则输出YES ,否则输出NO。
3.3.1 算法分析
定义 position1 @出现的位置 position2 .出现的位置
定义 i,flag,len数组长度 a[100]存放邮箱的字符型数组
gets(a);
len=strlen(a)
for i=0 To len-4
if a[i]=@ position1=i flag=1
end if
end for
if flag=1;
for i=0 To position1;
if 有非法字符 flag=0 break;
end if
end for;
if flag=1;
if 结尾!=.com flag=0 break;
end if
if flag=1;
if @前后为非法字符 flag=0 break;
end if
if flag=1 printf yes;
else printf no;
3.3.2 代码
3.3.3 PTA提交列表及说明
- 一开始没找到测试点的位置,没弄清楚邮件地址的定义 出现123@1.234.com 也是正确的邮箱的情况
- 判断第一个.出现的位置,如果不是在.com的时候出现,就是错误的邮箱。
4.代码互评
4.1 代码截图
康友煌同学的代码
07的代码
4.2 二者的不同
- 康友煌同学所采用的思路是,当数字自增至所要的数值之后,结束程序。而我是通过螺旋方阵的输出规律,按次数输出。如找到的规律是,一共上下左右需要转2n-1次,再通过次数,进行相应的变化。
- 两端代码在中间数据的处理上是差不多的,主要就是控制变化的方法上不太一样。(刚开始我尝试的也是康友煌同学的这种写法,但是输出上总是出现问题,后来发现是我行列不分emmmm,所以才用了后来的这种比较赘余的方法)。
- 康友煌同学的代码比较简洁,但是从直观上来讲我的代码思路会更加“暴力”一些,适合我这种没办法比较直接写出比较便捷的方法的同学。但是我的这种方法如果碰到图形输出,是需要经常去思考的一个途径。两种途径都需要掌握叭。