C语言博客作业04--数组

C语言博客作业04--数组

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
      • c[i]=a[i];
    • end if
    • if i>=an then
      • c[i]=b[i-an];
    • end if
  • end for
  • 定义数组flag[41],并将其初始化为0;
  • 定义k=0; * //k为不是两个数组共有的元素的个数*
  • for i=0 to len-1 do
    • if flag[i]=0 then
      • continue;
    • end if
    • for j=i+1 to len-1 do
      • if c[i]=c[j]且i<an且j>an then //找出两组共有的数
        • flag[i[=1;
        • flag[j]=1;
      • end if
      • if c[i]=c[j]且j<an then //找出数组a[an]中重复的数,取第一次出现时的下标
        • flag[j]=1;
      • end if
      • if c[i]=c[j]且j>an then //找出数组b[bn]中重复的数,取第一次出现时的下标
        • flag[j]=1;
      • end if
    • end for
    • if flag[i]=0 then //将不是两个数组共有的元素存放在数组c[k]中
      • c[k]=c[i];
      • 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 //将每层螺旋圈的上边输赋给对应的数组元素
      • j++;
      • num++;
      • a[i][j]=num;
    • end while
    • while i+1<n且!a[i+1][j]存在 do //将每层螺旋圈的右边输赋给对应的数组元素
      • i++;
      • num++;
      • a[i][j]=num;
    • end while
    • while j-1>=0且!a[i][j-1]存在 do //将每层螺旋圈的下边输赋给对应的数组元素
      • j--;
      • num++;
      • a[i][j]=num;
    • end while
    • while i-1>=且!a[i-1][j]存在 do //将每层螺旋圈的左边输赋给对应的数组元素
      • i--;
      • num++;
      • a[i][j]=num;
    • 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][0]=num;
      • record[j][1]=key; //将字符转换为ASCⅡ值,存在record[][1]中
      • record[j][2]=hour*60+minute; //将时间转换为分钟数
        • j++;
        • break;
      • end if
      • if num=0 then
        • break; //输入0时,表示一天的记录结束
      • 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
          • break;
        • 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.陈玲清同学的思路更加偏向于图形问题方面的规律。

posted on 2018-12-08 21:44  杨鸿漾  阅读(976)  评论(1编辑  收藏  举报

levels of contents