1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
怎么说,自己对自己这几周关于数组的学习是非常不满意的。是,准备线代考试,题目难度的提高还有每天的作业都让我安慰自己说,这次写不完题集很正常。但是当我打开PTA的排名时,满分的大有人在。不禁反思自己,这样的自我安慰真的好吗?为什么别人可以按时按点写完题集而我不可以?我真的每天忙的没有时间打题吗?题目真的有难得我写不下去吗?好多好多个疑问就这样冒出来,这让我有些恐慌,每个疑问背后的答案都在告诉我“还能为什么,不就是你没好好读书”。希望自己这次不是再单单喊口号,而是真的可以重新拿起对C的态度。
1.2.2 代码累计
2.PTA总分
2.1截图PTA三次题目集:一维数组、二维数组和字符数组共3次题目集的排名得分
2.2 我的总分:
总分:297
3.PTA实验作业
3.1 PTA题目1
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
3.1.1 算法分析
- 定义两个整型数组a[an],b[an];
- 输入an,并给输入an个整数;
- 输入bn,并给输入bn个整数;
- 定义len=an+bn;
- 定义数组c[len];
- 定义循环变量i,j;
-
for i=0 to len-1 do
-
if i<an then
- end if
-
if i>=an then
- end if
- end for
- 定义数组flag[41],并将其初始化为0;
- 定义k=0; * //k为不是两个数组共有的元素的个数*
-
for i=0 to len-1 do
-
if flag[i]=0 then
- end if
-
for j=i+1 to len-1 do
-
if c[i]=c[j]且i<an且j>an then //找出两组共有的数
- end if
-
if c[i]=c[j]且j<an then //找出数组a[an]中重复的数,取第一次出现时的下标
- end if
-
if c[i]=c[j]且j>an then //找出数组b[bn]中重复的数,取第一次出现时的下标
- end if
- end for
-
if flag[i]=0 then //将不是两个数组共有的元素存放在数组c[k]中
- end if
- end for
- 输出数组c[k];
3.1.2 代码截图
3.1.3 PTA提交列表及说明
- Q1:在N最大,且只有一个数不同时,答案错误。
- A1:在寻找b[bn]中的重复数据时,判断条件漏了j=an的情况(当j=an时c[an]是b[]中的第一个元素)
- Q2:会运行超时
- A2:在第一层for循环内,加上if(flag[i]==1) continue;以减少循环次数。
3.2 PTA题目2
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
3.2.1 算法分析
- 定义N;
- 输入N;
- 定义数组a[10][10],并将数组内的元素初始化为0;
- 定义循环变量i,j;
- 定义num=1; //num用于控制螺旋阵中的数
- 令a[0][0]=1;
-
while num!=n*n do
-
while j+1<n且!a[i][j+1]存在 do //将每层螺旋圈的上边输赋给对应的数组元素
- end while
-
while i+1<n且!a[i+1][j]存在 do //将每层螺旋圈的右边输赋给对应的数组元素
- end while
-
while j-1>=0且!a[i][j-1]存在 do //将每层螺旋圈的下边输赋给对应的数组元素
- end while
-
while i-1>=且!a[i-1][j]存在 do //将每层螺旋圈的左边输赋给对应的数组元素
- end while
- end while
- 输出数组并使每个数字占3位
3.2.2 代码
3.2.3 PTA提交列表及说明
- Q1:为什么定义为a[n][n]时PTA就显示运行超时??
- A1:
- Q2:为什么要将a[10][10]内的全部元素初始化为0?
- A2:
3.3 PTA题目3
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:
书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)
每一天的纪录保证按时间递增的顺序给出。
输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
3.3.1 算法分析
- 定义天数n,并输入n;
- 定义书号num,书的借阅状态key,小时,分钟;
- 定义借阅记录数组record[2000][3]; //由题意可得为3列
- 定义循环变量i,j;
-
for i=1 to n do
- j=0;
-
while 1 do
- 输入书号,借阅状态,时间;
-
if num不等于0 then
- record[j][1]=key; //将字符转换为ASCⅡ值,存在record[][1]中
- record[j][2]=hour*60+minute; //将时间转换为分钟数
- end if
-
if num=0 then
- end if
- end while
- 调用AverageTime函数,传入record数组,和行数;
- end for
- 结束
- 在AverageTime函数中,row为record数组的行数
- 定义循环变量i,j;
- 定义count=0,平均时间averageTime,总时间sumTime=0; //count为在一天之内借还书的次数
-
for i=0 to row-1 do
-
if record[i][1]='S' then
-
for j=i+1 to n-1 do
-
if record[j][0]=record[i][0]并且record[j][1]='E' then
- count++;
- sumTime=sumTime+(record[j][2]-record[i][2]);
- break;
- end if
-
if record[j][0]=record[i][0]并且record[j][1]='S' then
- end if
- end for
- end if
- end for
-
if count不等于0 then
- end if
-
if count=0 then
- end if
3.3.2 代码
3.3.3 PTA提交列表及说明
- Q1:在纠结字符的处理,数组必须是相同类型的数据,那么里面的‘S’,’E‘应该怎么处理?
- A1:其实因为‘S’,‘E’可以转换为ASCⅡ值,所以也可以存到int 定义的record数组中。
- Q2:当出现不完整记录(有'S'没有‘E’,)时,答案错误。
- A2:在AverageTime函数中的内层for循环,加入同一本书但为‘S’的错误记录的特判。
4.代码互评
4.1 代码截图
陈玲清同学的代码:
我的代码:
4.2 二者的不同
1.陈玲清同学利用switch语句,通过螺旋方阵的输出规律,按次数输出,而我的代码是通过螺旋方阵自增规律进行的。
2.陈玲清同学的思路更加偏向于图形问题方面的规律。
|
请发表评论