C语言博客作业04--数组
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
本章学习相对指针来说好理解,但想对前面的知识来说就有一个新的提升,有一定的挑战,
pta作业也比较多,题型也多,但基本都是一些基础的东西,数组在学之前有过一定的使用,
所以在使用时也不会感觉很陌生,总之本章学习比较顺利,一些比较难理解的题目通过一
定时间的研究后也顺利解决。
1.2.2 代码累计
2.PTA总分
2.1截图PTA三次题目集
2.2 我的总分
一维数组:200
二维数组:105 字符数组:150 我的总分:455
3.PTA实验作业
3.1 PTA题目1
7-8 找出不是两个数组共有的元素 (20 分) 给定两个整型数组,本题要求找出不是两者共有的元素。 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。 输出格式: 在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
3.1.1 算法分析
```c 定义数组c[40],m,n,i,j,count=-1,flag 输入第一行个数m 定义数组a[m]用于存放第一行的数 for i=0 to i=m-1 do 输入第一行的数 end for 输入第二行个数n 定义数组b[n]用于存放第二行的数 for i=0 to i=n-1 do 输入第二行的数 end for for i=0 to i=m-1 do //将a数组中有b数组中没有的数存入c数组中 flag=0 for j=0 to j=n-1 do if a[i]=b[j] then flag=1 break end for if flag=0 then count++ c[count]=a[i] end for for i=0 to i=n-1 do //将b数组中有a数组中没有的数存入c数组中 flag=0 for j=0 to j=m-1 do if b[i]=a[j] then flag=1 break end for if flag=0 then count++ c[count]=a[i] end for for i=0 to i=count-1 do //c数组中有重复的数据不多输出 for j=0 to j=i-1 do if c[j]=c[i] then flag=1 break end for if c[i]=c[count] then //与最后一个数据相等的都不输出 flag=1 if flag=0 then 输出c[i] end for 输出c[count] ```
3.1.2 代码截图
3.1.3 PTA提交列表及说明
Q1:刚开始题目较长,以为没有对重复数据只输出一个进行规定
A1:后来发现进行解决
Q2:后来的代码输出最后一个会带有一个空格
A2:用了多个方法及时解决
3.2 PTA题目2
7-4 阅览室 (20 分) 天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。 注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。 输入格式: 输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为: 书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数) 每一天的纪录保证按时间递增的顺序给出。 输出格式: 对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
3.2.1 算法分析
```c 定义静态数组time1[1001],book[1001] 定义i,N,num,r,hour,min,count=0 定义 time=0 输入天数N for N to N=1 do 输入 书号num,借还标志r,点数hour,分钟数min while num!=0 do if r=='S' then book[num]=1 time1[num]=hour*60+min //记录借的时间 else if r=='E'&&book[num]==1 then book[num]=0 count++ //计算有效总次数 time=hour*60+min-time1[num]+time //计算总时间 输入 书号num,借还标志r,点数hour,分钟数min end for if count!=0 then 输出次数和时间 else 输出0 0 time=0,count=0
```
3.2.2 代码
3.2.3 PTA提交列表及说明
Q1:刚开始的时候用二维数组去尝试
A1:作了挺久感觉并没有什么思路,一直有部分错误
Q2:后来改为用一维数组尝试
A2:经过了几番敲推后终于get了
3.3 PTA题目3
7-4 查验身份证 (15 分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2 现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。 输入格式: 输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。 输出格式: 按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
3.3.1 算法分析
```c 定义 N,i,k,sum,flag=0,c[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2} 输入身份证数N getchar() 定义 a[20],b[11]={'1','0','X','9','8','7','6','5','4','3','2'} for k=1 to k=N do sum=0,i=0 while 输入a[i]!='\n' do i++ a[i]='\0' for i=0 to i=16 do if a[i]>'9'||a[i]<'0' then 输出字符串a 换行 flag=2 break if flag=2 then flag=1 continue for i=0 to i=16 do sum=sum+(a[i]-'0')*c[i] end for sum=sum%11 if b[sum]!=a[17] then 输出字符串a 换行 flag=1 end for if flag=0 then 输出 All passed ```
3.3.2 代码
3.3.3 PTA提交列表及说明
Q1:题目所说的无法理解
A1:用百度去查了,明白意思
Q2:flag搞混乱了
A2:对代码进行逐条分析,找到了关系
4.代码互评
4.1 代码截图
同学代码
我的代码
4.2 二者的不同
1.这位同学定义的变量多,看起来比较不直观
2.这位同学用a,b,c,d来作为每行或者每列来赋值的个数,我是用从1到M再从M到1的方式来
赋值,所以减少了变量的定义
3.我们都利用了规律对每圈进行拆分后,进行赋值